从构建中排除文件(自定义和临时)

Files exclusion (custom and transient) from build

本文关键字:自定义 构建 排除 文件      更新时间:2023-10-16

我的Visual Studio解决方案中有许多c++ (Google Test)源文件,我希望有可能只保留一些用于构建(专注于问题),但也要足够快(一天两次)回到初始配置。

我们正在使用,或多或少,大约三种解决方案:Visual Studio, CMakeQT(但我可以添加另一个)。我从未使用过QT,所以我看到的其他两个解决方案是:

  • Visual Studio:文件夹是无用的,但我可以选择文件并从构建中排除它们。但是这些更改保存在vcproj中,所以我必须注意不要将它们保存在版本控制上,这很烦人。
  • CMake:很容易改变CMakeLists.txt(注释行与源文件夹),但我总是有版本控制问题…也许我可以在自定义(用户)文件中配置排除的文件。优点:我可以只生成我想要的东西,更灵活,不像以前那样无聊。

例如,如果我不想要src_2中的源:

file(GLOB_RECURSE SRC_FILES_1
${SOURCE_BASE_DIR}/src_1/*.cpp
${SOURCE_BASE_DIR}/src_1/*.h
)
file(GLOB_RECURSE SRC_FILES_2
${SOURCE_BASE_DIR}/src_2/*.cpp
${SOURCE_BASE_DIR}/src_2/*.h
)
file(GLOB_RECURSE SRC_FILES_3
${SOURCE_BASE_DIR}/src_3/*.cpp
${SOURCE_BASE_DIR}/src_3/*.h
)
add_executable(${PROJECT_TEST_NAME}
${SRC_FILES_1}
# next line is commented
# ${SRC_FILES_2}
${SRC_FILES_3}
)

是否有其他解决方案或方法来改进这里提出的其中一个?

你可以用cmake变量来控制它。

option(BUILD_TESTS "builds test cpp files" ON)

为你的cmake文件添加一个选项。在这种情况下默认为ON,但您可以更改它。现在我们开始吧:

if(BUILD_TESTS)
    set(TEST_CPP_FILES test1.cpp test2.cpp)
endif(BUILD_TESTS)
add_executabe(foo bar.cpp bar1.cpp $(TEST_CPP_FILES))

在这里,您用测试的源文件(或者当BUILD_TESTSON时您想要构建的任何源文件)定义了一个变量。然后将它们添加到目标中。如果BUILD_TESTS关闭,这个变量将为空。

现在要更改值,可以运行

cmake <...>  -DBUILD_TESTS=OFF

ON,如果你想再次打开它们。您还可以将更改保留在版本控制中,因为它将默认为ON,您需要显式禁用它。

如果你不只是想要排除源文件,你也可以在if语句中使用this来排除整个子目录或目标。

编辑:

对于您的示例,它可能看起来像这样:

if(BUILD_TESTS)
    file(GLOB_RECURSE SRC_FILES_2
    ${SOURCE_BASE_DIR}/src_2/*.cpp
    ${SOURCE_BASE_DIR}/src_2/*.h
    )
endif(BUILD_TESTS)
之后

SRC_FILES_2应该为空。