如何使用传递给编译器的相同参数在cmake中运行命令?

时间:2020-06-18 09:55:22

标签: c++ cmake

使用cmake构建项目后,我需要运行一些命令。 这些命令将对源文件进行一些转换,以生成新的二进制文件。 整个过程是这样的:

  1. 编译目标(可执行文件或库)并链接它(原样) 现在)
  2. 在已编译的二进制文件上运行工具A并产生中间输出
  3. 使用中间输出在源文件上运行工具B
  4. 编译目标(可执行文件或库)并链接它(原样) 现在)

因此,我需要使用同一命令编译两次,但是在两次编译之间,我需要运行工具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

1 个答案:

答案 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})

即。保持源目录干净整洁,所有已更改的内容都保留在二进制目录中,这样您可以轻松地在配置之间进行切换,并且自动修改文件不会让您感到惊讶。

相关问题