【CMake系列】09-cmake install 一般文件 文件夹 代码文件

上一节,我们学习了项目构建后、目标的安装,本节学习的内容是 对于一般文件,文件夹以及源代码的安装

本节的文件依然使用 file(WRITE xxx.xx) 来创建,不依赖额外的文件

本专栏的实践代码全部放在 github 上,欢迎 star !!!

如有问题,欢迎留言、或加群【392784757】交流

文件安装

CMakeLists.txt


cmake_minimum_required(VERSION 3.20)

project(install_file)

file(WRITE a.h "")
file(WRITE b.h "")

# 文件安装到指定目录
install(FILES a.h b.h DESTINATION include)

# 不存在 不报错, 目标可选 
install(FILES c.h DESTINATION inc OPTIONAL)

# 文件类型 TYPE DOC LIB INCLUDE
include(GNUInstallDirs) # 引入后 才能使用CMAKE_INSTALL_DATAROOTDIR
message("{CMAKE_INSTALL_DATAROOTDIR}")
install(FILES a.h TYPE DOC) # dataroot_dir /doc
install(FILES b.h TYPE LIB) # lib
install(FILES c.h TYPE INCLUDE) # include


# 文件权限  windows 目录无效
# 默认权限 OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ
install(FILES a.h DESTINATION pub
PERMISSIONS
OWNER_WRITE OWNER_READ OWNER_EXECUTE
GROUP_READ GROUP_WRITE GROUP_EXECUTE
WORLD_READ WORLD_WRITE WORLD_EXECUTE
)

注意事项

  1. installl(FILES 文件名 DESTINATION 目标位置)
    可以使用 OPTIONAL ,当文件不存在时,不报错;否则会报错

  2. FILES 提供的类型 通过TYPE 指定,有 DOC LIB INCLUDE ,其中 include(GNUInstallDirs) # 引入后 才能使用CMAKE_INSTALL_DATAROOTDIR

  3. 文件权限问题【只针对linux,windows 无效】
    文件的权限分为三级 owner 、group、 world,具体分 read writer execute,
    默认权限只有 OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ,可读
    因此在安装某些文件时,如需指定可执行,需要指定 PERMISSIONS 进行添加

文件夹安装

cmake_minimum_required(VERSION 3.22)

project(install_dir)

file(WRITE doc/index.html "")
file(WRITE doc/doc.html "")
file(WRITE doc/doc2.htm "")
file(WRITE doc/doc.cc "")
file(WRITE doc/doc.c "")
file(WRITE doc/sub/doc.html "")
file(WRITE doc/include/doc.h "")
file(WRITE doc/.svn/config "")
file(WRITE doc/.git/config "")

# doc 类型 指定安装路径 share/doc
# 安装doc目录下所有文件,包含子目录中 空子目录也创建
install(DIRECTORY doc TYPE DOC)
install(DIRECTORY doc DESTINATION doc2)

# 过滤只复制 *.html 并且创建所有子目录
install(DIRECTORY doc DESTINATION html_doc
FILES_MATCHING
PATTERN "*.html"
PATTERN "*.html"
)

# 排除.git 和 .svn
install(DIRECTORY doc DESTINATION no_git_doc
PATTERN ".git" EXCLUDE

)

install(DIRECTORY doc DESTINATION src 
FILES_MATCHING
PATTERN "*.cc"
PATTERN "*.c"
PATTERN ".git" EXCLUDE
PATTERN ".svn" EXCLUDE
)

注意事项

  1. install(DIRECTORY 文件夹名 DESTINATION 路径)
    可以通过
    FILES_MATCHING
    PATTERN "xx.xx"
    PATTERN "xx.xx" EXCLUE
    来细化 安装的 文件夹,如使用EXCLUE 排除 无关文件夹, 常见 如 .git .svn 等
    以及过滤文件夹中的文件

安装代码

CMakeLists.txt

cmake_minimum_required(VERSION 3.20)

project(install_code)

FILE(WRITE a.h "")
FILE(WRITE b.h "")

install(CODE "message(\"begin install\")")
install(FILES a.h TYPE INCLUDE)
install(CODE "message(\"a.h install success\")")
install(FILES b.h TYPE INCLUDE)
install(CODE "message(\"b.h install success\")")

# 写入安装的时间
install(CODE [=[

string(TIMESTAMP now "%Y-%m-%d %H:%M:%S")
message(${now})
FILE(APPEND install_log.txt "${now}\n")
]=])

可以通过 install(CODE )输出安装过程中的状态
安装代码的具体安装类型 依然是 INCLUDE LIB DOC 这三种

这一块的学习,可以找一些著名的项目 参考他们的写法,进行学习,根据自己的情况进行设置

posted @ 2024-06-12 13:34  蔡不菜和他的uU们  阅读(45)  评论(0编辑  收藏  举报