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

CPack: Exclude INSTALL commands from subdirectory (googletest directory)

本文关键字:排除 INSTALL 命令 目录 googletest 子目录 CPack      更新时间:2023-10-16

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

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

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

所以这里提到了最初建议@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()命令,这些命令也可能执行您想要的操作。我还没有真正测试过它,值得一试。

注意:下面的方法是您应该尝试的最后一件事。虽然它本身可以工作,但它会阻止您的项目与其他项目集成,这会重新定义install命令,并防止您的项目配置一些工具链,这些工具链会执行此类重新定义。

<小时 />

主要思想:重新定义install命令,以便它仅在特定变量不是 TRUE 时才安装东西。当您想要包含子目录并在其中禁用安装命令时,可以将该变量设置为 TRUE。

在顶级 CMakeList 中.txt放置这些命令。它们不会禁用安装,但允许进一步的代码以可控的方式执行此操作。

# By using such 'if' we allow integration of our project
# with other projects, which use the **same approach**
# for disabling installation.
if(NOT DEFINED _DISABLE_INSTALLATION)
  # This variable is responsible for installation disabling.
  set(_DISABLE_INSTALLATION FALSE)
  # Replace install() with conditional installation.
  macro(install)
    if (NOT _DISABLE_INSTALLATION)
      _install(${ARGN})
    endif()
  endmacro()
endif()

当需要包含禁用安装的googletest(或其他项目(时,请按以下方式包装它:

# Store old value of flag for the case the external project already disables installation of current one.
set(_DISABLE_INSTALLATION_OLD ${_DISABLE_INSTALLATION})
set(_DISABLE_INSTALLATION TRUE)
add_subdirectory(googletest)
# Restore original install() behavior.
set(_DISABLE_INSTALLATION ${_DISABLE_INSTALLATION_OLD})

CMake 邮件中已经提出了install编辑的方法。但是上面的代码避免了install双重重定义,在这种情况下,原始install行为将丢失(_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>为条件是一种事实上的标准(从现在开始我肯定会遵循!但是我现在找不到那个链接。