Cmake 每个应用程序有多个目标
我是cmake的新手,我想实现以下行为。我有一个子目录Cmake 每个应用程序有多个目标,cmake,Cmake,我是cmake的新手,我想实现以下行为。我有一个子目录programs,其中包含多个独立的程序。对于每个程序,我希望添加不同的目标(例如,分析或测试),并使用前缀命名。 这应该允许我像执行make prog1 analyze或make prog2 test那样执行它们 此外,我还希望同时执行相同类型的所有目标(例如测试目标)(例如通过进行测试) 为此,我有以下目录结构,其中包含两个CMakeLists.txt文件 CMakeLists.txt programs |-- prog1.c |
programs
,其中包含多个独立的程序。对于每个程序,我希望添加不同的目标(例如,分析或测试),并使用前缀命名。
这应该允许我像执行make prog1 analyze
或make prog2 test
那样执行它们
此外,我还希望同时执行相同类型的所有目标(例如测试
目标)(例如通过进行测试
)
为此,我有以下目录结构,其中包含两个CMakeLists.txt
文件
CMakeLists.txt
programs
|-- prog1.c
|-- prog2.c
|-- CMakeLists.txt
顶层文件包含宏定义add_应用程序
,而programs/CMakeLists.txt
为每个程序调用此宏。但是,如何编写宏,使我有多个目标和一个全局目标,用于相同类型的所有目标
macro(add_application NAME SOURCE_FILES)
endmacro()
在add_application()
macro body中,您可以像往常一样为每个应用程序目标添加,使用宏参数名称构造它们的名称
对于全局目标,您可以在宏之外创建一次。在宏体内部,您可以调用add_dependencies()
,以使全局目标从每个应用程序依赖:
CMakeLists.txt:
add_custom_target(analize) # Create global target
macro(add_application NAME SOURCE_FILES)
... # Create application target itself
add_custom_target(${NAME}-analize ...) # Create per-application target
add_dependencies(analize ${NAME}-analize) # Dependency between global and per-application targets.
endmacro()
示例使用“analize”目标,因为“test”目标由CTest保留。最好不要将其用于其他目的。这不是您想要的答案,但您应该真正了解一下
add\u test()
命令和ctest
。另外,从架构的角度来看,您不应该测试可执行文件。那些prog1.c
和prog2.c
应该是库中实现的函数的精简包装。(解析命令行选项,设置所需参数,调用库函数。)库函数可以通过专用的测试可执行文件轻松测试。(您猜对了,您应该使用add_test()
添加它,并可以通过ctest
运行)