上一节,我们学习了项目构建后、目标的安装,本节学习的内容是 对于一般文件,文件夹以及源代码的安装
本节的文件依然使用 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
)
注意事项
-
installl(FILES 文件名 DESTINATION 目标位置)
可以使用 OPTIONAL ,当文件不存在时,不报错;否则会报错 -
FILES 提供的类型 通过TYPE 指定,有 DOC LIB INCLUDE ,其中 include(GNUInstallDirs) # 引入后 才能使用CMAKE_INSTALL_DATAROOTDIR
-
文件权限问题==【只针对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
)
注意事项
- 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 这三种
这一块的学习,可以找一些著名的项目 参考他们的写法,进行学习,根据自己的情况进行设置