使用cmake构建项目后,我需要运行一些命令。 这些命令将对源文件进行一些转换,以生成新的二进制文件。 整个过程是这样的:
因此,我需要使用同一命令编译两次,但是在两次编译之间,我需要运行工具A和B。
所有传递给cxx编译器的参数都应传递给工具A和B。 也就是说,这些命令看起来与我们调用编译器几乎一样, 而不是运行g ++ / clang ++ / etc,我们将运行另一个工具。
例如,如果编译步骤如下所示(简化):
g++ source1.cpp source2.cpp -I/some/include -I/some/other/include -fPIC -o target
然后,我们应该调用它:
aaa source1.cpp source2.cpp -I/some/include -I/some/other/include -fPIC -o target
bbb source1.cpp source2.cpp -I/some/include -I/some/other/include -fPIC -o target
答案 0 :(得分:1)
因为看起来您无论如何都要编译该库两次,所以我会选择两个目标。
set(srcs <list of source files>
add_library(target1 ${srcs})
add_custom_command(OUTPUTS semething_from_target1
DEPENDS target1 COMMAND
aaa $<TARGET_POPERTY ... (get command line options )> $<TARGET_FILE:target1>
)
add_library(the_real_target1 ${srcs})
add_dependencies(the_real_target1 something_from_target1)
如果任何源被修改或生成,我建议以这样的方式编写它,使其在当前二进制目录中生成。如果要将m4
预处理器等集成到管道中,通常可以完成此操作。喜欢:
set(srcs <list of source files>
add_library(target1 ${srcs})
# Generate files in BINARY_DIR for each source
foreach(file IN LISTS srcs)
add_custom_command(
OUTPUTS ${CMAKE_CURRENT_BINARY_DIR}/${file_name}.c
DEPENDS target1
COMMAND aaa $<TARGET_POPERTY ... (get command line options )> $<TARGET_FILE:target1> ${CMAKE_CURRENT_BINARY_DIR}/${file_name}.c
)
list(APPEND the_real_target1_srcs ${CMAKE_CURRENT_BINARY_DIR}/${srcs})
endforeach()
add_library(the_real_target1 ${the_real_target1_srcs})
即。保持源目录干净整洁,所有已更改的内容都保留在二进制目录中,这样您可以轻松地在配置之间进行切换,并且自动修改文件不会让您感到惊讶。