20

使用我们的 CMake 构建系统,我构建了一些库和一些可执行文件。构建产品都输出到特定文件夹。

现在,问题是我有一个 VS2010 和一个 VS2008 工具链,但我只需要用于 VS2008 库的 VS2008 工具链。输出的可执行文件是两个工具链的 win32 目标,所以我只需要通过 VS2010 工具链构建可执行文件一次,而 VS2008 工具链应该跳过可执行文件并只构建所需的库(这样可以节省构建时间)。

CMake 基础脚本和整体设置也可能在未来交付给客户,因此如果在 CMake 中有一种方法可以禁用某些目标,例如以通用方式禁用所有可执行文件,那就太好了。否则,我必须IF( BUILD_EXECUTABLES ) ... ENDIF()围绕我的可执行文件设置编写许多大型结构CMakeLists.txt,而当我忘记它们时,CMake 不会给我错误。

构建是通过一些批处理文件触发的。理想情况下,我想cmake通过-D选项(例如-D BUILD_EXECUTABLES=false)传递一个变量

我试图包装ADD_EXECUTABLE宏,但这不起作用,因为我有类似的调用 TARGET_LINK_LIBRARIES然后抱怨不存在的目标。

我还可以将输出目录设置为一些可以在之后删除的垃圾文件夹,但是(如前所述)不会节省构建时间。(我们有一个相当大的项目。)

关于如何以干净和通用的方式实现这一目标的任何想法?

4

1 回答 1

32

CMake 目标有两个属性,用于控制是否默认构建目标。第一个是EXCLUDE_FROM_ALL。它指示目标是否从默认构建目标中排除。对于 Makefile 生成器,键入make不会触发EXCLUDE_FROM_ALL属性设置为 1 的目标的构建。

另一个是EXCLUDE_FROM_DEFAULT_BUILD并且仅适用于 Visual Studio 生成器。如果设置为 1,当您调用“构建解决方案”菜单命令时,目标将不是默认构建的一部分。

您可以根据选项设置可执行目标的两个属性的值BUILD_EXECUTABLES

if (NOT BUILD_EXECUTABLES)
   set_target_properties(exe1 exe2 PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1)
endif()
于 2013-02-16T14:32:33.387 回答