我有一个CMake项目,我想从版本控制中排除生成的项目文件。据我所知,没有办法强制CMake使用某个构建目录。用户可以指定他们想要的任何目录,因此我不能在我的. gitignore中排除它。通常用户会将它放在源目录中名为build的目录中,我会将其放在. gitignore中。但是我有一个疯狂的想法,把它叫做meta_build,这导致了我的这个问题。此外,没有经验的用户可能会进行源代码内构建。有人不小心签入生成的项目文件只是时间问题。任何想法或变通办法,这件事是非常赞赏。
build
meta_build
tjjdgumg1#
有几个选项可以处理此问题:教育你的用户。清楚地记录不应提交生成的构建文件,并且建议使用源代码外的构建。这不是一个技术解决方案,但可能是有效的。使用pre-commit钩子来检查生成的文件。您可以编写一个脚本在预提交时运行,以检查常见的构建文件名并警告用户。他们仍然需要手动删除文件,但它会提醒他们这个问题。使用CMake的EXCLUDE_FROM_ALL目标属性。您可以将生成构建文件的目标标记为EXCLUDE_FROM_ALL,这意味着默认情况下不会构建该目标。用户必须显式地构建该目标以生成构建文件。这使得它们不太可能被意外地提交。在子目录中生成构建文件。让顶级CMakeLists.txt在build_files子目录中生成构建文件。然后可以将build_files/添加到. gitignore。用户必须从build_files中运行CMake来进行源代码内构建,这清楚地表明应该忽略该目录。考虑根本不生成项目文件。如果您构建并发布了一个二进制库,您可以只提供一个CMakeLists.txt供人们链接到该库。不会生成可能意外提交的项目文件。当然,如果您需要项目文件来实际构建项目,那么这就不起作用了!
pqwbnv8z2#
我假设这对您来说是一个问题,因为其他用户正在项目上进行协作,并且可能会推送到共享远程。在这种情况下,您可以选择:
build/
out/build/<build_name>
$XDG_CONFIG_HOME/git/ignore
$GIT_DIR/info/exclude
binaryDir
*.exe
CMAKE_EXECUTABLE_SUFFIX
2条答案
按热度按时间tjjdgumg1#
有几个选项可以处理此问题:
教育你的用户。清楚地记录不应提交生成的构建文件,并且建议使用源代码外的构建。这不是一个技术解决方案,但可能是有效的。
使用pre-commit钩子来检查生成的文件。您可以编写一个脚本在预提交时运行,以检查常见的构建文件名并警告用户。他们仍然需要手动删除文件,但它会提醒他们这个问题。
使用CMake的EXCLUDE_FROM_ALL目标属性。您可以将生成构建文件的目标标记为EXCLUDE_FROM_ALL,这意味着默认情况下不会构建该目标。用户必须显式地构建该目标以生成构建文件。这使得它们不太可能被意外地提交。
在子目录中生成构建文件。让顶级CMakeLists.txt在build_files子目录中生成构建文件。然后可以将build_files/添加到. gitignore。用户必须从build_files中运行CMake来进行源代码内构建,这清楚地表明应该忽略该目录。
考虑根本不生成项目文件。如果您构建并发布了一个二进制库,您可以只提供一个CMakeLists.txt供人们链接到该库。不会生成可能意外提交的项目文件。当然,如果您需要项目文件来实际构建项目,那么这就不起作用了!
pqwbnv8z2#
我假设这对您来说是一个问题,因为其他用户正在项目上进行协作,并且可能会推送到共享远程。在这种情况下,您可以选择:
build/
。我个人将我所有的构建放在一个out/build/<build_name>
目录中。然后你可以只gitignore一个目录。$XDG_CONFIG_HOME/git/ignore
,或者本地克隆的$GIT_DIR/info/exclude
(docs)。binaryDir
属性)。*.exe
等),但这听起来像是一个真实的的痛苦-特别是考虑到不同的buildsystem生成器将具有不同的构建工件和特定的buildsystem配置文件,并且不同的平台具有不同的目标输出文件名的前缀和后缀(例如,请参见CMAKE_EXECUTABLE_SUFFIX
)。