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

本节的文件依然使用 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 这三种

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

【CMake系列】09-cmake install 一般文件 文件夹 代码文件的更多相关文章

  1. 解决C# 转到定义时打开的是元数据文件而非源代码文件的问题

    原因:添加引用时 使用的是“浏览"选项卡,选择了项目生成的dll作为引用的内容. 解决:添加引用时 使用的是"项目"选项卡,选择了项目本身作为引用的内容.

  2. Qt ui 文件转换为python代码文件

    python -m PyQt5.uic.pyuic -o ui_xxx.py xxx.ui

  3. 2. CMake 系列 - 编译多文件项目

    目录 1. 编译不使用第三方库的项目 1.1 项目目录结构 1.2 相关代码 1.3 编译 2. 编译使用第三方库的项目 2.1 项目目录结构 2.2 相关代码 2.3 编译 1. 编译不使用第三方库 ...

  4. Linux系列教程(四)——Linux常用命令之文件和目录处理命令

    这个系列教程的前面我们讲解了如何安装Linux系统,以及学习Linux系统的一些方法.那么从这篇博客开始,我们就正式进入Linux命令的学习.学习命令,首先要跟大家纠正的一点就是,我们不需要记住每一条 ...

  5. 使用 PySide2 开发 Maya 插件系列二:继承 uic 转换出来的 py 文件中的类 Ui_Form

    使用 PySide2 开发 Maya 插件系列二:继承 uic 转换出来的 py 文件中的类 Ui_Form 开发环境: Wing IDE 6.1 步骤1: 打开 Wing IDE,创建一个新的 pr ...

  6. Linux系列教程(六)——Linux常用命令之文件搜索命令

    前一篇博客我们讲解了Linux链接命令和权限管理命令, 通过 ln -s  链接名 表示创建软链接,不加-s表示创建硬链接:还有三个更改权限的命令,chmod命令可以更改文件或目录权限,chown命令 ...

  7. 微软BI 之SSIS 系列 - 在 SSIS 中将指定目录下的所有文件分类输出到不同文件夹

    开篇介绍 比如有这样的一个需求,旧的一个业务系统通常将产出的文件输出到同一个指定的目录下的不同子目录,输出的文件类型有 XML,EXCEL, TXT 这些不同后缀的文件.现在需要在 SSIS 中将它们 ...

  8. 【等待事件】等待事件系列(3+4)--System IO(控制文件)+日志类等待

     [等待事件]等待事件系列(3+4)--System IO(控制文件)+日志类等待   1  BLOG文档结构图     2  前言部分   2.1  导读和注意事项 各位技术爱好者,看完本文后,你可 ...

  9. 【ABAP系列】SAP ABAP下载带密码的Excel文件

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP下载带密码的Ex ...

  10. Selenium系列(十一) - 针对两种上传文件方式的实现方案

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

随机推荐

  1. 一招解决github访问慢的问题

    ​ 之前我在网上搜过解决办法,其中一个是修改 hosts 文件,但是效果不太理想.我在这里给大家推荐github上的一个开源项目:FastGithub .用了这个之后,效果就比较理想了,次次都能访问到 ...

  2. Redis的几种应用实战

    1.分布式锁: 实现:用set key value ex time nx指令实现,这个指令以及其参数是原子性的操作.释放锁用del key,释放之前先比较一下value是否与当前的value一样,原因 ...

  3. vba--将excel单元格格式改为常规格式

    Sub 改格式() ActiveWorkbook.activesheet.Select For Each Rng In ActiveSheet.UsedRange With Rng .NumberFo ...

  4. 实现Quartz.NET的HTTP作业调度

    Quartz.NET作为一个开源的作业调度库,广泛应用于.NET应用程序中,以实现复杂的定时任务,本次记录利用Quartz.NET实现HTTP作业调度,通过自定义HTTP作业,实现对外部API的定时调 ...

  5. 写给rust初学者的教程(一):枚举、特征、实现、模式匹配

    这系列RUST教程一共三篇.这是第一篇,介绍RUST语言的入门概念,主要有enum\trait\impl\match等语言层面的东西. 安装好你的rust开发环境,用cargo创建一个空项目,咱们直接 ...

  6. AT_abc317_f 题解

    调了一小时结果发现爆 long long 了. 考虑数位 dp,具体来说,设计状态 \(dp_{i,r_1,r_2,r_3,mx_1,mx_2,mx3_,c_1,c_2,c_3}\) 表示当前考虑到第 ...

  7. P7086 题解

    考虑把每个字符串的前 \(k\) 位和后 \(k\) 位看成点,字符串看成边,那么一个字符串前缀后缀至少有一个是相似群体的前缀后缀,看成这条边的两个端点至少有一个被选中. 那么这就变成了一个最小点覆盖 ...

  8. Mybatis 一级缓存

    Mybatis一级缓存介绍 什么是缓存 程序经常要调用的对象存在内容中,方法其使用时可以快速调用,不必去数据库或者其他持久化设备中查询,主要就是提高性能 Mybatis一级缓存 简介:一级缓存的作用域 ...

  9. Go微服务开发指南

    在这篇深入探讨Go语言在微服务架构中的应用的文章中,我们介绍了选择Go构建微服务的优势.详细分析了主要的Go微服务框架,并探讨了服务发现与注册和API网关的实现及应用. 关注TechLead,复旦博士 ...

  10. [oeasy]python0128_unicode_字符集_character_set_八卦_星座

    unicode 回忆上次内容 中国的简体和繁体汉字 字符数量都超级大 彼此还认对方为乱码   如果有一种编码所有的字符都能编进去就好了 中日韩(CJK) 欧洲拼音 梵文 阿拉伯文 卢恩字符 等等等都包 ...