从构建中排除文件(自定义和临时)
Files exclusion (custom and transient) from build
我的 Visual Studio
解决方案中有很多 C++ (Google Test
) 源文件,我希望只保留一些用于构建(以专注于问题),但是还可以足够快地(一天两次)返回初始配置。
我们或多或少地使用了大约三个解决方案:Visual Studio
、CMake
和 QT
(但我可以添加另一个)。我从来没有用过QT
,所以我看到的其他两个解决方案是:
Visual Studio
:文件夹没用,但我可以 select 文件并将它们从构建中排除。但是这些更改保存在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_TESTS
为 ON
时要构建的任何源文件)定义一个变量。然后将这些添加到目标中。如果 BUILD_TESTS
关闭此变量将为空。
现在可以更改值 运行
cmake <...> -DBUILD_TESTS=OFF
或者如果您想再次打开它们,请使用 ON
。您还可以保留版本控制中的更改,因为它将默认为 ON
并且您需要明确禁用它。
如果您不只是想排除源文件,您也可以在 if 语句中使用此排除整个子目录或目标。
编辑:
对于您的示例,它可能如下所示:
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
之后应该是空的。
我的 Visual Studio
解决方案中有很多 C++ (Google Test
) 源文件,我希望只保留一些用于构建(以专注于问题),但是还可以足够快地(一天两次)返回初始配置。
我们或多或少地使用了大约三个解决方案:Visual Studio
、CMake
和 QT
(但我可以添加另一个)。我从来没有用过QT
,所以我看到的其他两个解决方案是:
Visual Studio
:文件夹没用,但我可以 select 文件并将它们从构建中排除。但是这些更改保存在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_TESTS
为 ON
时要构建的任何源文件)定义一个变量。然后将这些添加到目标中。如果 BUILD_TESTS
关闭此变量将为空。
现在可以更改值 运行
cmake <...> -DBUILD_TESTS=OFF
或者如果您想再次打开它们,请使用 ON
。您还可以保留版本控制中的更改,因为它将默认为 ON
并且您需要明确禁用它。
如果您不只是想排除源文件,您也可以在 if 语句中使用此排除整个子目录或目标。
编辑:
对于您的示例,它可能如下所示:
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
之后应该是空的。