CMake:如何排除给定构建配置的目录?

时间:2012-03-12 16:23:55

标签: visual-studio-2008 cmake

我在使用CMake配置的Visual Studio 2008下有一个项目。对于这个项目,我有三个构建配置:“debug”,“release”,“test”。我的所有C ++文件根据其功能(Model,View,Controller,...)分成几个目录。一个目录称为“test”,包含仅用于配置“test”的文件。

因此,我与CMake的关系是编译所有目录中的文件(如果配置为“test”),但如果配置为“debug”或“release”,则排除目录“test”。

2 个答案:

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

答案 1 :(得分:1)

通常情况下,“测试”将是目标或目标,而不是构建配置。

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

如果“tests”是CMake目标,您可以在Debug Release模式下构建和运行它。要做到这一点,我想它会是这样的:

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的回答是可行的。