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

Hei*_*nzi 6 c++ install cmake googletest cpack

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

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

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

Tim*_*mmm 11

所以提到的@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)
Run Code Online (Sandbox Code Playgroud)

注意${ARGV}并且${ARGN}是相同的,但目前建议使用的文档${ARGN}.此外,宏记录前缀_为原始宏名称的事实没有记录,但它仍然是行为.请参阅此处的代码.

但是,我从来没有让上面的代码正常工作.它真的很奇怪,经常打install()两次电话.

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

add_subdirectory(external EXCLUDE_FROM_ALL)
Run Code Online (Sandbox Code Playgroud)

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


Tsy*_*rev 8

如果您不需要在项目的发布中进行测试(您希望使用CPack提供),那么googletest有条件地包含子目录,并在打包时将条件设置为false:

...
if(NOT DISABLE_TESTS)
    add_subdirectory(googletest)
endif()
Run Code Online (Sandbox Code Playgroud)

包装用

cmake -DDISABLE_TESTS=ON <source-dir>
cpack
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要测试,但又不想安装测试基础结构,则可以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()
Run Code Online (Sandbox Code Playgroud)

CMake邮件中也提出了这种方法.

  • 这不太奏效.由于某种原因,它使我的另一个`install(DIRECTORY ...)`在一个不同的子目录中没有安装. (2认同)

小智 8

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

在 googletests 的特定情况下,在顶级 CMakeLists.txt 中指定这一点可以解决问题。

option(INSTALL_GMOCK "Install Googletest's GMock?" OFF)
option(INSTALL_GTEST "Install Googletest's GTest?" OFF)
add_subdirectory(googletest)
Run Code Online (Sandbox Code Playgroud)

我在 CMake 邮件列表上读到(我认为),在包内部设置安装条件INSTALL_<package name>是一种事实上的标准(从现在开始我肯定会遵循这个标准!)。但我现在找不到那个链接了。