CPack:从子目录(googletest 目录)中排除安装命令
CPack: Exclude INSTALL commands from subdirectory (googletest directory)
我在一个项目中使用 CMake,在我的测试用例中使用 googletest。
环顾互联网,将 googletest 源复制到存储库的子文件夹中并将其包含在 "add_subdirectory(googletest)" 中似乎是常见的做法。我做到了。
现在我正在使用 CPack 为我的项目生成 debian 包。不幸的是,CPack 生成的包将 googletest 与我的项目一起安装。这当然不是我想要的
查看 googletest 目录,我在那里找到了一些 INSTALL cmake 命令,所以很清楚为什么会这样。现在的问题是——我怎样才能避免呢?我不喜欢修改来自 googletest 的 CMakeLists.txt 文件,因为我必须记住在更新时重新应用我的修改。还有其他方法可以在 CPack 中禁用这些安装吗?
已更新:如 中所述,
似乎 EXCLUDE_FROM_ALL
选项是在子目录中的子项目中禁用 install
最直接和正确的方法:
add_subdirectory(googletest EXCLUDE_FROM_ALL)
以前的解决方案
如果您的项目发布不需要测试(您希望使用 CPack 交付),则有条件地包含 googletest
子目录,并在打包时将条件设置为 false:
...
if(NOT DISABLE_TESTS)
add_subdirectory(googletest)
endif()
打包
cmake -DDISABLE_TESTS=ON <source-dir>
cpack
或者,如果您想要测试,但不想安装测试基础设施,您可以通过定义具有相同名称的宏或函数来禁用 install
命令:
# Replace install() to do-nothing macro.
macro(install)
endmacro()
# Include subproject (or any other CMake code) with "disabled" install().
add_subdirectory(googletest)
# Restore original install() behavior.
macro(install)
_install(${ARGN})
endmacro()
CMake mailing 中也提出了这种方法。
根据评论,这种替换 CMake 命令的方法非常棘手,在某些情况下可能不起作用:传递给修改后的 install
的参数解析不正确或恢复 install
不工作,甚至以下 install
s 被禁用。
所以有@Tsyvarev 提到的宏选项,最初是建议的 here:
# overwrite install() command with a dummy macro that is a nop
macro (install)
endmacro ()
# configure build system for external libraries
add_subdirectory(external)
# replace install macro by one which simply invokes the CMake
install() function with the given arguments
macro (install)
_install(${ARGV})
endmacro(install)
注意 ${ARGV}
和 ${ARGN}
相同,但文档目前建议使用 ${ARGN}
。宏覆盖将 _
添加到原始宏名称的事实也没有记录,但它仍然是行为。见代码here.
但是,我从来没有让上面的代码正常工作。它确实确实 奇怪的事情并且经常调用 install()
两次。
另一种方法(同样未记录)是使用 EXCLUDE_FROM_ALL
:
add_subdirectory(external EXCLUDE_FROM_ALL)
根据我在某处发现的一些评论,这会禁用该子目录的 install()
。我认为它实际上所做的是默认设置 EXCLUDE_FROM_ALL
所有 install()
命令,这也可能做你想要的。我还没有真正测试过,不过值得一试。
回复有点晚,但我花了太长时间才弄明白。
在 googletests 的特定情况下,在顶级 CMakeLists.txt 中指定它就可以了。
option(INSTALL_GMOCK "Install Googletest's GMock?" OFF)
option(INSTALL_GTEST "Install Googletest's GTest?" OFF)
add_subdirectory(googletest)
我在(我认为)CMake 邮件列表上读到,将安装条件设置为包内的 INSTALL_<package name>
是一种事实上的标准(从现在开始我肯定会遵循这个标准! ).但是我现在找不到 link。
我在一个项目中使用 CMake,在我的测试用例中使用 googletest。 环顾互联网,将 googletest 源复制到存储库的子文件夹中并将其包含在 "add_subdirectory(googletest)" 中似乎是常见的做法。我做到了。
现在我正在使用 CPack 为我的项目生成 debian 包。不幸的是,CPack 生成的包将 googletest 与我的项目一起安装。这当然不是我想要的
查看 googletest 目录,我在那里找到了一些 INSTALL cmake 命令,所以很清楚为什么会这样。现在的问题是——我怎样才能避免呢?我不喜欢修改来自 googletest 的 CMakeLists.txt 文件,因为我必须记住在更新时重新应用我的修改。还有其他方法可以在 CPack 中禁用这些安装吗?
已更新:如 EXCLUDE_FROM_ALL
选项是在子目录中的子项目中禁用 install
最直接和正确的方法:
add_subdirectory(googletest EXCLUDE_FROM_ALL)
以前的解决方案
如果您的项目发布不需要测试(您希望使用 CPack 交付),则有条件地包含 googletest
子目录,并在打包时将条件设置为 false:
...
if(NOT DISABLE_TESTS)
add_subdirectory(googletest)
endif()
打包
cmake -DDISABLE_TESTS=ON <source-dir>
cpack
或者,如果您想要测试,但不想安装测试基础设施,您可以通过定义具有相同名称的宏或函数来禁用 install
命令:
# Replace install() to do-nothing macro.
macro(install)
endmacro()
# Include subproject (or any other CMake code) with "disabled" install().
add_subdirectory(googletest)
# Restore original install() behavior.
macro(install)
_install(${ARGN})
endmacro()
CMake mailing 中也提出了这种方法。
根据评论,这种替换 CMake 命令的方法非常棘手,在某些情况下可能不起作用:传递给修改后的 install
的参数解析不正确或恢复 install
不工作,甚至以下 install
s 被禁用。
所以有@Tsyvarev 提到的宏选项,最初是建议的 here:
# overwrite install() command with a dummy macro that is a nop
macro (install)
endmacro ()
# configure build system for external libraries
add_subdirectory(external)
# replace install macro by one which simply invokes the CMake
install() function with the given arguments
macro (install)
_install(${ARGV})
endmacro(install)
注意 ${ARGV}
和 ${ARGN}
相同,但文档目前建议使用 ${ARGN}
。宏覆盖将 _
添加到原始宏名称的事实也没有记录,但它仍然是行为。见代码here.
但是,我从来没有让上面的代码正常工作。它确实确实 奇怪的事情并且经常调用 install()
两次。
另一种方法(同样未记录)是使用 EXCLUDE_FROM_ALL
:
add_subdirectory(external EXCLUDE_FROM_ALL)
根据我在某处发现的一些评论,这会禁用该子目录的 install()
。我认为它实际上所做的是默认设置 EXCLUDE_FROM_ALL
所有 install()
命令,这也可能做你想要的。我还没有真正测试过,不过值得一试。
回复有点晚,但我花了太长时间才弄明白。
在 googletests 的特定情况下,在顶级 CMakeLists.txt 中指定它就可以了。
option(INSTALL_GMOCK "Install Googletest's GMock?" OFF)
option(INSTALL_GTEST "Install Googletest's GTest?" OFF)
add_subdirectory(googletest)
我在(我认为)CMake 邮件列表上读到,将安装条件设置为包内的 INSTALL_<package name>
是一种事实上的标准(从现在开始我肯定会遵循这个标准! ).但是我现在找不到 link。