如何通过CMake CPack仅生成tar.gz包,禁用make install安装功能?
实现仅生成tar.gz包并禁用make install命令
要达成你的需求,核心是保留CPack打包所需的安装配置,但覆盖默认的install目标使其执行时报错,具体修改如下:
修改根目录CMakeLists.txt
保留原有的install指令(CPack依赖这些指令收集打包文件),同时添加自定义的install目标覆盖默认行为:
cmake_minimum_required(VERSION 3.10.0) project(cpack_demo VERSION 0.1.0 LANGUAGES C CXX) add_subdirectory(math_lib) add_executable(${PROJECT_NAME} main.cpp) target_link_libraries(${PROJECT_NAME} math_lib) # 保留这些install指令,供CPack收集打包内容 install(TARGETS math_lib ARCHIVE DESTINATION lib COMPONENT libraries) install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin COMPONENT applications) install(FILES math_lib/lib.h DESTINATION include COMPONENT headers) # 覆盖默认install目标,执行时抛出错误 add_custom_target(install COMMAND ${CMAKE_COMMAND} -E echo "Error: No rule for installation" COMMAND ${CMAKE_COMMAND} -E exit 1 ) # Set CPack configuration set(CPACK_GENERATOR "TGZ") set(CPACK_PACKAGE_NAME ${PROJECT_NAME}) set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) set(CPACK_SET_DESTDIR "on") set(CPACK_PACKAGE_DESCRIPTION "Cpack demo") set(CPACK_PACKAGE_INSTALL_DIRECTORY ${PROJECT_NAME}) set(CPACK_COMPONENTS_ALL applications libraries headers) include(CPack)
验证效果
- 执行原有构建命令,依然能正常生成tar.gz包:
mkdir build cd build cmake .. make make package
此时build目录下会生成cpack_demo-0.1.0.tar.gz包,包含指定的二进制、库和头文件。
- 执行
make install时,会输出错误并终止:
make install
输出内容:
Error: No rule for installation make: *** [install] Error 1
原理说明
- 保留
install()指令是因为CPack会通过这些指令识别需要打包的文件和目录结构,确保打包内容完整。 - 通过
add_custom_target创建同名的install目标,CMake会优先使用自定义目标覆盖默认的install目标,从而实现执行make install时报错的效果。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

