You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:05:31