CPack:从子目录中删除INSTALL命令(googletest目录)

时间:2016-02-11 16:01:58

标签: c++ cmake install googletest cpack

我正在使用CMake进行项目,并使用googletest进行测试用例。 通过浏览互联网,将googletest源复制到存储库的子文件夹并将其包含在“add_subdirectory(googletest)”中似乎是一种常见做法。我做到了。

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

查看googletest目录,我在那里找到了一些INSTALL cmake命令,所以很明显,为什么会发生这种情况。现在的问题是 - 我该如何避免呢?我不喜欢从googletest修改CMakeLists.txt文件,因为我必须记住在更新时重新应用我的修改。还有其他方法可以在CPack中禁用这些安装吗?

3 个答案:

答案 0 :(得分:8)

所以提到的@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()命令,它们也可能做你想要的。我还没有真正测试过它,值得一试。

答案 1 :(得分:7)

如果您不需要在项目发布中进行测试(您希望使用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中也提出了这种方法。

答案 2 :(得分:0)

回复晚了一点,但我花了很长时间解决了这个问题。

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