【问题标题】:CMake: how to exclude a directory for a given build configuration?CMake:如何排除给定构建配置的目录?
【发布时间】:2012-03-14 21:53:50
【问题描述】:

我有一个使用 CMake 配置的 Visual Studio 2008 下的项目。对于这个项目,我有三个构建配置:“调试”、“发布”、“测试”。我所有的 C++ 文件根据它们的功能(模型、视图、控制器......)被分隔在几个目录中。一个目录称为“test”,其中包含仅用于配置“test”的文件。

因此,如果配置为“test”,我对 CMake 要做的就是编译所有目录中的文件,但如果配置为“debug”或“release”,则排除目录“test”。

【问题讨论】:

  • 你试过用if(CMAKE_BUILD_TYPE STREQUAL "test")包裹add_subdirectory(test)吗?
  • @arrowdodger。打开 CMAKE_BUILD_TYPE 是个好主意。不幸的是,对于多配置生成器,cmake 并没有真正使用这个生成器(除非在 Cmake 的命令行上明确指定)。
  • 你的意思是你有三个配置而不是目标? CMake 中的目标是您通过 ADD_LIBRARYADD_EXECUTABLE 等添加的库或 exe。
  • @Fraser 是的,事实上它是“配置”

标签: visual-studio-2008 cmake


【解决方案1】:

不幸的是,由于缺少控制 Visual Studio 的“从构建中排除”功能的属性,目前这是不可能的。有 CMake 的 EXCLUDE_FROM_ALL,但这对于您的场景来说可能太粗略了。

CMake 邮件列表中有 a hack 试图实现这一点,但这肯定不是一个很好的解决方案。

最简单的方法可能是对测试源使用预处理器保护,并且只为“测试”配置文件定义相应的预处理器标志。在您的 CMakeLists 中:

set_property( DIRECTORY test 
              APPEND PROPERTY COMPILE_DEFINITIONS_TEST DO_THE_TESTS
            )

在每个源文件中:

#ifdef DO_THE_TESTS
     ...
#endif

【讨论】:

  • Hack 正是我要避免的。我目前正在使用一个,但我不喜欢它。此外,我的项目正在定义的结构应该成为一种企业方法。
【解决方案2】:

“测试”通常是一个或多个目标,而不是构建配置。

我猜您的测试配置从 Debug 或 Release 复制了大部分设置,这意味着您要么正在测试发布代码(因此失去了有效调试的能力)要么正在测试调试代码(这意味着您不是真的测试你计划发布的代码)。

如果“测试”是 CMake 目标,您可以在调试 发布模式下构建和运行它。为此,我想它会是这样的:

SET(all_files_in_test_dir ...)
ADD_EXECUTABLE(TestAll ${all_files_in_test_dir})
TARGET_LINK_LIBRARIES(TestAll ModelLib ViewLib ControllerLib ...)

这假定包含模型、视图和控制器的目标是您之前使用 ADD_LIBRARY(ModelLib ...) 等添加的库。

如果你这样做,另一个好处是只有两种配置类型,你应该花费更少的时间来构建项目。

如果您真的确实想将“测试”作为配置类型,那么我认为 ComicSansMS 的答案是正确的选择。

【讨论】:

  • 嗨。我需要将“测试”视为 Visual Studio 的配置。但我会看看你的提议是否有可能。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多