CMake配置:自定义libgit2安装路径并禁止头文件安装
问题描述
我们在Gittyup项目中使用了经过补丁修改的libgit2,并将其作为子模块引入仓库。当前执行安装操作时,该补丁版本的libgit2会被安装到全局定义的install prefix下,在Linux等系统中会覆盖已安装的系统版libgit2文件,这是我们不希望出现的情况。
我们的需求是:
- 将libgit2安装到独立路径
/<prefix>/lib/Gittyup/...下 - 不安装libgit2目标的头文件
当前引入libgit2的CMake代码:
if(NOT USE_SYSTEM_LIBGIT2) add_subdirectory(libgit2) target_include_directories( git2 INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/libgit2/include) endif()
当前安装日志片段:
-- 正在安装:/<prefix>/lib/pkgconfig/libgit2.pc -- 正在安装:/<prefix>/lib/libgit2.a -- 正在安装:/<prefix>/include/git2 -- 正在安装:/<prefix>/include/git2/config.h -- 正在安装:/<prefix>/include/git2/pack.h ...(省略其余头文件及组件安装日志)
解决方案
修改引入libgit2的CMake代码,通过临时调整CMake变量实现需求:
if(NOT USE_SYSTEM_LIBGIT2) # 保存主项目原有的安装前缀 set(original_install_prefix "${CMAKE_INSTALL_PREFIX}") # 1. 指定libgit2的独立安装路径:主prefix下的lib/Gittyup目录 set(CMAKE_INSTALL_PREFIX "${original_install_prefix}/lib/Gittyup" CACHE PATH "Install prefix for patched libgit2" FORCE) # 2. 关闭libgit2的头文件安装开关 set(INSTALL_HEADERS OFF CACHE BOOL "Disable installing libgit2 headers" FORCE) # 引入libgit2子模块 add_subdirectory(libgit2) # 恢复主项目的安装前缀,避免影响后续编译流程 set(CMAKE_INSTALL_PREFIX "${original_install_prefix}" CACHE PATH "Install prefix for Gittyup" FORCE) target_include_directories( git2 INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/libgit2/include) endif()
关键说明
- 独立路径控制:临时修改
CMAKE_INSTALL_PREFIX为目标子路径,让libgit2的所有安装产物(库文件、pkgconfig配置等)都被隔离到/<prefix>/lib/Gittyup/下,不会覆盖系统全局文件。 - 头文件安装禁用:libgit2的CMake配置默认开启头文件安装,通过
INSTALL_HEADERS OFF直接跳过所有头文件的安装步骤。 - 前缀恢复:在引入子模块后恢复主项目原安装前缀,确保项目其他组件的安装不受影响。
验证时会看到,libgit2库文件会被安装到/<prefix>/lib/Gittyup/lib/路径下,且不会出现头文件相关的安装日志。
内容的提问来源于stack exchange,提问作者Murmi
相关产品推荐
相关产品推荐

