使用我们的CMake构建系统,我构建了一些库和一些可执行文件。构建产品都输出到特定文件夹。
现在的问题是我有VS2010和VS2008工具链,但我只需要VS2008工具链用于VS2008库。输出可执行文件是两个工具链的win32目标,所以我只需要通过VS2010工具链构建一次可执行文件,而VS2008工具链应该只跳过可执行文件并只构建所需的库(这样可以节省构建时间)。
CMake基础脚本和整体设置也可能在未来交付给客户,因此如果CMake中有一种方法可以禁用某些目标,例如通用方式的所有可执行文件,那将是非常好的。否则我必须在我的CMakeLists.txt中编写许多大的IF(BUILD_EXECUTABLES)... ENDIF()构造我的可执行文件设置,而当我忘记它时没有CMake给我错误。
通过一些批处理文件触发构建。理想情况下,我想通过-D选项将变量传递给cmake(例如“-D BUILD_EXECUTABLES = false”)
我试图包装ADD_EXECUTABLE宏但由于我有类似的调用,这不起作用 TARGET_LINK_LIBRARIES然后抱怨不存在的目标。
我还可以将输出目录设置为一些可以在之后删除的垃圾文件夹,但是(如前所述)不会节省构建时间(我们有一个非常庞大的项目)
如何以干净和通用的方式实现这一目标?
答案 0 :(得分:24)
CMake目标有两个属性,用于控制默认情况下是否构建目标。第一个是EXCLUDE_FROM_ALL
。它指示目标是否从默认构建目标中排除。对于Makefile生成器,键入make
不会触发EXCLUDE_FROM_ALL
属性设置为1的目标的构建。
另一个是EXCLUDE_FROM_DEFAULT_BUILD
,仅适用于Visual Studio生成器。如果设置为1,则在调用“Build Solution”菜单命令时,目标将不会成为默认构建的一部分。
您可以根据选项BUILD_EXECUTABLES
设置可执行目标的两个属性的值:
if (NOT BUILD_EXECUTABLES)
set_target_properties(exe1 exe2 PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1)
endif()