- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
也许这是不可能的,我误读了 cmake 3.2 documentation ,但我虽然创建一个自定义命令会在 Makefile 中创建一个自定义“目标”,以便我可以通过调用输出文件的名称来构建目标。 CMake 文档说:
In makefile terms this creates a new target in the following form:
OUTPUT: MAIN_DEPENDENCY DEPENDS
COMMAND
make OUTPUT
.也许文档将 CMake 目标与 Makefile 目标混淆了?
add_custom_command(OUTPUT foo_out
COMMAND post_process foo_in > foo_out
DEPENDS foo_in
)
make foo_out
foo_out
.但是,如果我这样做,我会得到
make: **** No rule to make target `foo_out`. Stop.
add_custom_target(bar DEPENDS foo_out)
add_custom_command(OUTPUT foo_out COMMAND post_process foo_in > foo_out)
make bar
make foo_in
make foo_out
make bar
的问题是它不直观,因为实际的文件输出是
foo_out
不是
bar
.
foo_in: foo.c
$(CC) $< -o $@
foo_out: foo_in
post_process $< > $@
make foo_in
和
make foo_out
.
最佳答案
文档不清楚
CMake 的文档在这里不清楚。 CMake 的 Makefiles 生成器确实在子 Makefile 中创建源文件 make 规则,这些规则在主 Makefile 中不可见。在主 Makefile 中,您只会找到 PHONY CMake 目标的规则。我知道的唯一异常(exception)是 Ninja
Makefiles 生成器将所有构建规则放入单个文件中。
将后处理步骤转换为 CMake
根据我的经验 - 如果 post_process
是一个脚本 - 您可能应该考虑使用/在 CMake 脚本中重写您的后处理步骤,因为 CMake 应该知道用于后处理的所有文件依赖项和变量(然后它将例如处理所有必要的重新构建或为您清理步骤)。
这是我所做的简化/修改版本:
function(my_add_elf _target)
set(_source_list ${ARGN})
add_executable(${_target}_in ${_source_list})
set_target_properties(
${_target}_in
PROPERTIES
POSITION_INDEPENDENT_CODE 0
SUFFIX .elf
)
add_custom_command(
OUTPUT ${_target}_step1.elf
COMMAND some_conversion_cmd $<TARGET_FILE:${_target}_in> > ${_target}_step1.elf
DEPENDS ${_target}_in
)
add_custom_target(
${_target}_step1
DEPENDS
${_target}_step1.elf
)
add_custom_command(
OUTPUT ${_target}_out.elf
COMMAND final_post_process_cmd ${_target}_step1.elf > ${_target}_out.elf
DEPENDS ${_target}_step1
)
add_custom_target(
${_target}_out
DEPENDS
${_target}_out.elf
)
# alias / PHONY target
add_custom_target(${_target} DEPENDS ${_target}_out)
endfunction(my_add_elf)
my_add_elf(foo foo.c)
make foo
对于最终的 ELF 输出,
make foo_in
或
make foo_step1
对于其他步骤之一。而且我认为所有步骤对用户和 CMake 都是透明的。
add_executable(foo_in foo.c)
add_custom_command(
OUTPUT foo_out
COMMAND post_process foo_in > foo_out
DEPENDS foo_in
)
add_custom_target(foo_out DEPENDS foo_out)
CMake is not intended to produce specific content in a Makefile. Top-level target names created by add_custom_target are always logical (i.e. phony) names. It is simply not allowed to have a file of the same name.
macro(my_add_elf_we _target)
add_executable(${_target}_in ${ARGN})
add_custom_target(
${_target}_out
COMMAND post_process $<TARGET_FILE:${_target}_in> > ${_target}_out
DEPENDS ${_target}_in
)
set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${_target}_out)
endmacro(my_add_elf_we)
OUTPUT
s 在
add_custom_target()
本身,但在这种情况下你不想(因为你不想有任何命名混淆)。但是如果你不声明任何输出:
clean
构建规则 macro(my_add_elf_in_out _target_in _target_out)
add_executable(${_target_in} ${ARGN})
set_target_properties(
${_target_in}
PROPERTIES
SUFFIX ""
OUTPUT_NAME "${_target_in}"
)
add_custom_target(
${_target_out}
COMMAND post_process ${_target_in} > ${_target_out}
DEPENDS ${_target_in}
)
set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${_target_out})
endmacro(my_add_elf_in_out)
my_add_elf_in_out(foo_in.elf foo_out.elf foo.c)
foo_in
目标联动:
macro(my_add_elf_obj_in_out _target_in _target_out)
add_library(${_target_in}_obj OBJECT ${ARGN})
add_executable(${_target_in} $<TARGET_OBJECTS:${_target_in}_obj>)
set_target_properties(
${_target_in}
PROPERTIES
SUFFIX ""
OUTPUT_NAME "${_target_in}"
)
add_executable(${_target_out} $<TARGET_OBJECTS:${_target_in}_obj>)
set_target_properties(
${_target_out}
PROPERTIES
SUFFIX ""
OUTPUT_NAME "${_target_out}"
EXCLUDE_FROM_ALL 1
)
add_custom_command(
TARGET ${_target_out}
POST_BUILD
COMMAND post_process ${_target_in} > ${_target_out}
)
endmacro(my_add_elf_obj_in_out)
macro(my_add_elf_ext_in_out _target_in _target_out)
add_executable(${_target_in} ${ARGN})
set_target_properties(
${_target_in}
PROPERTIES
SUFFIX ""
OUTPUT_NAME "${_target_in}"
)
add_executable(${_target_out} NotExisting.c)
set_source_files_properties(
NotExisting.c
PROPERTIES
GENERATED 1
HEADER_FILE_ONLY 1
)
set_target_properties(
${_target_out}
PROPERTIES
SUFFIX ""
OUTPUT_NAME "${_target_out}"
RULE_LAUNCH_LINK "# "
)
add_custom_command(
TARGET ${_target_out}
POST_BUILD
COMMAND post_process ${_target_in} > ${_target_out}
)
add_dependencies(${_target_out} ${_target_in})
endmacro(my_add_elf_ext_in_out)
关于cmake - add_custom_command 没有生成目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30719275/
我遇到的问题是 add_custom_command 总是过时的,因此在每次构建时都会运行。自定义命令运行作为同一项目目标的工具来生成另一个目标使用的文件: add_executable(Genera
我有一个关于 CMake 的问题,这似乎在这里很常见,但似乎没有一个答案能解决我的问题。 在 details子目录,有一个CMakeLists.txt其中包含: add_custom_command(
我在为add_custom_command苦苦挣扎。让我详细解释这个问题。 我有这些cxx文件和hxx文件集。我对它们每个运行一个perl脚本,以生成某种类型的翻译文件。该命令看起来像 perl tr
也许这是不可能的,我误读了 cmake 3.2 documentation ,但我虽然创建一个自定义命令会在 Makefile 中创建一个自定义“目标”,以便我可以通过调用输出文件的名称来构建目标。
我正在尝试使用 add_custom_command在构建期间生成文件。该命令似乎从未运行过,所以我制作了这个测试文件。 cmake_minimum_required( VERSION 2.6 ) a
查看最新状态更新 初始条件 代码生成器以一组输入文件作为参数生成一组c++源代码 输入文件可能包括其他输入文件 已经解决了获取输出文件列表,解析输入codegen文件以获得完整的codegen输入列表
我正在尝试运行 gperf来自 cmake文件。 我创建了一个非常小的 CMakeLists.txt以下。 当我运行它时 $ cmake . $ make 它不会创建 example.hpp文件 以下
我目前正在尝试使用两个可执行文件设置一个 CMake 项目,其中一个是用于为另一个生成代码的简单实用程序。 CMakeLists.txt 的相关位: add_executable(lua2c lua2
使用 Cmake v3.8,我需要我的自定义命令仅在生成新构建的 .hex、.map 和 .elf 文件后运行。但是,在生成所有 *.hex、*.map 和 *.elf 文件后,该命令并未真正运行。这
我有一个包含许多子项目的 CMake 项目。 他们每个人都可以使用我提供的函数来生成一个包含某些信息的小文本文件(通过调用 add_custom_command)。 在最后一步,我想将所有这些文件合并
对于我的项目,我想运行一个命令来生成一个已安装的文件(换句话说,生成的文件只是一个数据文件,而不是源代码)。 我目前在我的 CMakeLists.txt 中有以下内容 add_custom_comma
我有一个工具可以生成一些 cpp 和头文件,并想用 ADD_CUSTOM_COMMAND 添加它在构建期间自动执行它并将文件添加到项目中。问题是(大部分)输出文件的名称事先不知道。我如何添加这些文件?
我想要一个 Cmake 函数来将一些二进制文件复制到特定位置。为此,我有以下函数定义: function ( collect_binaries TARGET_NAME DEST_DIR ) se
出于多种原因,我必须通过自定义命令手动生成静态库。 但是,似乎自定义命令仅在目标明确请求其输出文件时才执行。 如果我尝试将生成的静态库与 target_link_libraries 链接起来, CMa
我需要过滤某个目录下的 *.h 和 *.cpp 文件,然后使用一些脚本对其进行格式化,因此我编写了以下代码: add_custom_command( DEPENDS ${GENERATED_S
我有一些 protobuf 文件,它们位于我的 cmake 项目之外的目录中(它们位于 旁边 ${CMAKE_SOURCE_DIR} 的根目录中,我们的主要 CMakeLists .txt 文件是)。
我正在尝试向我的 添加一些自定义构建命令vc2010 项目使用 ADD_CUSTOM_COMMAND .但: [1] 我只是发现 CMAKE 会自动插入比我预期的多得多的代码。 例如,我希望命令完全是
我正在尝试将 cmake 生成的所有二进制文件复制到特定目录。我不想使用 EXECUTABLE_OUTPUT_PATH,将它们保留在构建树中使开发更容易。 所以我使用 add_custom_comma
我想创建一个自定义命令,使用 Apple 的 libtool 将所有静态库合并到一个胖静态库中。构建期间的命令。我正在使用 Xcode 生成器和 CMake 3.19.1。我的脚本是这样的: set(
我遇到了自定义目标(使用 add_custom_target 创建)的 add_custom_command 问题。 我的总体想法是将静态代码分析工具合并到 cmake 工具链中。我的解决方案基于此处
我是一名优秀的程序员,十分优秀!