如何用CMake指定troff格式man手册页的生成与安装?
用CMake处理TROFF格式man页:构建处理与安装
1. 构建时处理man页(压缩等操作)
CMake没有内置的man页处理工具,但可以通过自定义命令和目标实现压缩(这是man页的标准可安装形式),确保和可执行文件同步构建:
单man页处理示例
# 定义你的TROFF格式man页源文件 set(MAN_SRC myapp.1) # 定义生成的压缩文件路径 set(MAN_GZ ${MAN_SRC}.gz) # 用gzip压缩源文件到构建目录 add_custom_command( OUTPUT ${MAN_GZ} COMMAND gzip -c --best ${CMAKE_CURRENT_SOURCE_DIR}/${MAN_SRC} > ${CMAKE_CURRENT_BINARY_DIR}/${MAN_GZ} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${MAN_SRC} COMMENT "Compressing man page ${MAN_SRC}" ) # 创建自定义目标,标记为ALL会在默认构建流程中执行 add_custom_target(man_compress ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${MAN_GZ}) # 让可执行目标依赖该man页目标,保证构建顺序 add_dependencies(myapp man_compress)
如果你的系统不需要压缩(极少情况),直接跳过压缩步骤即可。
批量处理多个man页
如果有多个不同章节的man页,用循环简化配置:
set(MAN_PAGES myapp.1 myapp-config.5 libmyapp.3) foreach(MAN_PAGE ${MAN_PAGES}) # 从文件名后缀提取man页章节(如.1对应章节1) get_filename_component(MAN_SECTION ${MAN_PAGE} EXT) string(REGEX REPLACE "^\\." "" MAN_SECTION ${MAN_SECTION}) set(MAN_GZ ${MAN_PAGE}.gz) # 生成压缩文件 add_custom_command( OUTPUT ${MAN_GZ} COMMAND gzip -c --best ${CMAKE_CURRENT_SOURCE_DIR}/${MAN_PAGE} > ${CMAKE_CURRENT_BINARY_DIR}/${MAN_GZ} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${MAN_PAGE} COMMENT "Compressing ${MAN_PAGE}" ) list(APPEND MAN_GZ_FILES ${CMAKE_CURRENT_BINARY_DIR}/${MAN_GZ}) endforeach() # 创建批量处理目标 add_custom_target(man_pages ALL DEPENDS ${MAN_GZ_FILES}) add_dependencies(myapp man_pages)
2. 将man页安装到标准位置
CMake提供CMAKE_INSTALL_MANDIR变量,对应系统标准的man页根目录(默认值为share/man),根据man页章节安装到对应子目录:
单man页安装示例
# 安装压缩后的man页到man1目录(对应章节1) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${MAN_GZ} DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 ) # 如果是未压缩的源文件,直接安装: # install( # FILES ${CMAKE_CURRENT_SOURCE_DIR}/${MAN_SRC} # DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 # )
批量安装多个man页
foreach(MAN_PAGE ${MAN_PAGES}) get_filename_component(MAN_SECTION ${MAN_PAGE} EXT) string(REGEX REPLACE "^\\." "" MAN_SECTION ${MAN_SECTION}) set(MAN_GZ ${MAN_PAGE}.gz) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${MAN_GZ} DESTINATION ${CMAKE_INSTALL_MANDIR}/man${MAN_SECTION} ) endforeach()
补充说明
CMAKE_INSTALL_MANDIR遵循系统路径规范,默认安装前缀/usr/local下,man页会被安装到/usr/local/share/man/man1/这类路径。- 如需自定义安装路径,运行
cmake时通过-DCMAKE_INSTALL_MANDIR=your/custom/path修改即可。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

