CPack:从子目录(googletest 目录)中排除 INSTALL 命令
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中禁用这些安装?
所以这里提到了最初建议@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>
为条件是一种事实上的标准(从现在开始我肯定会遵循!但是我现在找不到那个链接。
- CMake "--target install"无需"--build"命令行
- Geeksforgeeks C 程序故障排除:IEE 754 表示法为十进制
- 如何将C++11旗帜传递给"npm install"?
- 如何从整个磁盘中排除要装载的一个文件
- 如何进行故障排除:未定义对"非虚拟 thunk to ..."的引用
- 如何在 C++ 的输出中排除 SENTINEL 值?
- Install libpcap
- 针对代码::块设置的 SFML 故障排除
- CMake 错误,在构建 VTK 'INSTALL'项目
- 如何在 boost::spirit::qi 中将某些语义操作排除在 AST 之外
- C++:如何在从给定缓存中排除数字的同时生成随机数
- pip install uwsgi 失败,出现 /usr/local/include/string/string.h:7:10:致命错误:找不到'sstream'文件?
- 遍历列表包含排除最后一个元素的内容
- "pip install openexr"上的语法错误:错误的编译器?
- C++排除通过派生类中的基类继承的类
- 在创建共享库时,是否可以明确地排除某些类
- 对"无效的抽象返回类型"进行故障排除
- 需要帮助对内存泄漏源进行故障排除 - C++
- 可视C++ - 从链接器>输入>其他依赖项中排除文件
- CPack:从子目录(googletest 目录)中排除 INSTALL 命令