8

我将 CMake 用于项目,将 googletest 用于我的测试用例。环顾互联网,将 googletest 源代码复制到存储库的子文件夹中并将其包含在“add_subdirectory(googletest)”中似乎是一种常见的做法。我这样做了。

现在我正在使用 CPack 为我的项目生成 debian 包。不幸的是,CPack 生成的包与我的项目一起安装了 googletest。这当然不是我想要的。

查看 googletest 目录,我在那里发现了一些 INSTALL cmake 命令,所以很清楚,为什么会发生。现在的问题是 - 我怎样才能避免它?我不喜欢从 googletest 修改 CMakeLists.txt 文件,因为我必须记住在更新时重新应用我的修改。是否有另一种方法可以在 CPack 中禁用这些安装?

4

3 回答 3

13

所以这里提到了最初建议的宏选项@Tsyvarev :

# 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}. 此外,没有记录宏覆盖添加到原始宏名称的事实_,但它仍然是行为。请参阅此处的代码。

但是,我从来没有让上面的代码正常工作。它会做一些奇怪的事情,并且经常调用install()两次。

另一种选择 - 也没有记录 - 是使用EXCLUDE_FROM_ALL

add_subdirectory(external EXCLUDE_FROM_ALL)

根据一些评论,我发现某处禁用install()了该子目录。我认为它的实际作用是EXCLUDE_FROM_ALL默认为所有install()可能执行您想要的命令的命令设置的。我还没有真正测试过,但值得一试。

于 2017-03-27T09:45:27.667 回答
8

更新:如另一个答案中所述,似乎该选项是在子目录中的子项目中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。

于 2016-02-11T17:20:47.503 回答
4

回复有点晚,但我花了太长时间才弄清楚这一点。

在 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>是一种事实上的标准(从现在开始我肯定会遵循这个标准!)。但我现在找不到那个链接。

于 2018-08-08T12:10:03.870 回答