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

时间:2014-11-06 14:42:31

标签: c++ makefile cmake

我有以下文件结构:

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

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

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

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

但那......让我哭泣。是不是有更好的方法?

1 个答案:

答案 0 :(得分: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 ...)

有关详细信息,请参阅