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不工作,甚至以下 installs 被禁用。

所以有@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。