从 CMake 中的自定义目标运行目标

Posted

技术标签:

【中文标题】从 CMake 中的自定义目标运行目标【英文标题】:Run a target from a custom target in CMake 【发布时间】:2014-11-06 14:42:30 【问题描述】:

我的文件结构如下:

├── Generator/
│   ├── output/
│   └── script.py
│
└── FinalProgram/
    ├── build/
    ├── src/
    │   └── main.cpp
    ├── include/
    │   └── MyClass.h
    └── CMakeLists.txt

Generator/script.py 文件是在Generator/output 文件夹中生成 c++ 文件的脚本。该脚本可以使用两个不同的参数(SimA 和 SimB)启动,每个参数生成一组不同的文件。

另一方面,FinalProgram 需要使用那组生成的文件,所以每次我想用SimA 组文件编译FinalProgram 时,我都必须

cd Generator 
./script.py SimA
cp output/*.cpp ../FinalProgram/src
cp output/*.h   ../FinalProgram/include
cd ../FinalProgram/build && cmake ..
make

我想要的是能够打字

make SimA

或者

make SimB

所以一切都会自动发生。在这两种情况下可执行文件必须相同,所以显然我不能有两个不同的add_executable 块。我想我应该创建两个add_custom_target 块,一个用于每个可能的值,在那里完成所有工作,最后调用编译所有内容的目标。因此,真正的问题是,我如何在 add_custom_target 块内运行另一个目标?当然,我想我可以使用

COMMAND make

但是……这让我哭了。没有更好的办法吗?

【问题讨论】:

我对你的要求有点困惑。为什么你可以只使用 add_custom_command 设置文件级别的依赖关系,然后添加一个 add_custom_target 并使用 cmake.org/cmake/help/v3.0/command/add_dependencies.html 作为***目标? 为了澄清,您应该列出所有(可能是简化的)输入、输出和依赖项,您可能就可以根据这些编写脚本。 我已经重新表述了整个问题,也许现在更清楚了。 【参考方案1】:

正如 MadScienceDreams 所说,您可以使用add_custom_command 生成 c++ 文件,然后您可以在add_executable 命令中使用生成的文件。

add_custom_command(OUTPUT $CMAKE_SOURCE_DIR/../Generator/output/SimA.cpp
                   COMMAND $PYTHON_EXECUTABLE script.py SimA
                   DEPENDS $CMAKE_SOURCE_DIR/../Generator/script.py
                   WORKING_DIRECTORY $CMAKE_SOURCE_DIR/../Generator)

set_property(SOURCE $CMAKE_SOURCE_DIR/../Generator/output/SimA.cpp PROPERTY GENERATED TRUE)

add_executable(SimA $CMAKE_SOURCE_DIR/../Generator/output/SimA.cpp ...)

add_custom_command(OUTPUT $CMAKE_SOURCE_DIR/../Generator/output/SimB.cpp
                   COMMAND $PYTHON_EXECUTABLE script.py SimB
                   DEPENDS $CMAKE_SOURCE_DIR/../Generator/script.py
                   WORKING_DIRECTORY $CMAKE_SOURCE_DIR/../Generator)

set_property(SOURCE $CMAKE_SOURCE_DIR/../Generator/output/SimB.cpp PROPERTY GENERATED TRUE)

add_executable(SimB $CMAKE_SOURCE_DIR/../Generator/output/SimB.cpp ...)

有关详细信息,请参阅

http://www.cmake.org/cmake/help/v3.0/command/add_custom_command.html http://www.cmake.org/cmake/help/v3.0/prop_sf/GENERATED.html

【讨论】:

我想我没有正确解释自己。恰好有两个不同的add_executable 块是我不想要的,因为可执行文件必须相同。在给定的时间,它与一组或另一组一起编译。这就是为什么我需要能够调用从自定义目标实际编译可执行文件的目标。

以上是关于从 CMake 中的自定义目标运行目标的主要内容,如果未能解决你的问题,请参考以下文章

CMake基础教程(30)CMake构建系统概览

使用 Piwik + Ruby on Rails 跟踪目标转换中的自定义变量

在 CMake 中默认构建自定义目标

CMake:如何添加仅针对一种配置执行的自定义命令?

在自定义目标运行后重建依赖目标

如何将交叉验证目标输入管道中的自定义转换器