【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 这三种

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

<think>我们正在讨论CMake构建和安装命令。用户已经了解了`cmake--build.`命令执行的文件取决于生成器,现在他们想深入了解`cmake--build.`的工作原理以及`--targetinstall`的作用。根据用户的问题,我将分两部分回答:1.`cmake--build.`的工作原理:它执行的是构建系统生成的文件(如Makefile或build.ninja),并解释其工作过程。2.`--targetinstall`的作用:它指定构建安装目标,将构建好的文件安装到指定位置。同时,用户还提到了两个引用:-引用[1]:介绍了`cmake--install`的作用,即将目标文件安装到指定位置,这正好与我们要解释的`install`目标相关。-引用[2]:一个具体的项目(python-cmake-buildsystem),该项目使用CMake构建Python,可以作为实际例子。在回答中,我将结合这些引用。另外,根据用户的问题,我们还需要注意以下几点:-用户之前已经了解了`cmake--build.`执行的文件取决于生成器,所以这里可以简要回顾,然后深入其工作原理。-关于`--targetinstall`,需要解释它是在构建`install`目标,而这个目标是由CMakeLists.txt中的`install()`命令定义的。最后,按照用户要求,我们需要在回答中自然地添加引用标识(如[^1]),并生成相关问题。现在,我将组织回答内容:###第一部分:`cmake--build.`的工作原理-回顾:根据生成器不同,执行不同的文件(Makefile/ninja等)。-详细工作流程:1.读取构建目录(.)下的CMake缓存,确定生成器类型。2.调用相应的构建工具(make、ninja等)执行构建。3.构建工具根据构建文件(如Makefile)中的规则编译源代码。###第二部分:`--targetinstall`的作用-构建系统中,`install`是一个特殊的目标,它由CMakeLists.txt中的`install()`命令定义[^1]。-使用`--targetinstall`会构建该目标,执行安装操作:将构建生成的可执行文件、库文件、头文件等复制到安装目录(默认为`/usr/local`,可通过`CMAKE_INSTALL_PREFIX`指定)。-以引用[2]中的项目为例:在构建Python时,使用`cmake--build.--targetinstall`会将编译好的Python安装到指定位置。###工作流程图(mermaid)```mermaidgraphTDA[cmake--build.--targetinstall]-->B[读取构建目录]B-->C[根据缓存确定生成器]C-->D{生成器类型}D-->|Make|E[执行makeinstall]D-->|Ninja|F[执行ninjainstall]D-->|其他|G[调用对应构建工具的install目标]E-->H[执行install规则]F-->HG-->HH-->I[将文件复制到安装目录]```###生成的问题1.如何自定义CMake安装目录?2.`install()`命令在CMakeLists.txt中如何配置?3.在跨平台构建中,`--targetinstall`的行为有何差异?4.除了`install`,还有哪些常见的构建目标?现在,我将开始撰写回答。</think> ### `cmake --build .`的工作原理 `cmake --build .`命令不直接执行特定文件,而是**调用底层构建系统**。其工作流程如下: 1. **读取缓存**: 解析`CMakeCache.txt`文件获取**生成器类型**(如`Unix Makefiles`或`Ninja`),例如: ```bash $ grep "CMAKE_GENERATOR" CMakeCache.txt CMAKE_GENERATOR:INTERNAL=Unix Makefiles # [^2] ``` 2. **调用构建工具**: 根据生成器调用对应的构建命令: ```mermaid graph TD A[cmake --build .] --> B{检查生成器类型} B -->|Unix Makefiles| C[执行 make] B -->|Ninja| D[执行 ninja] B -->|Visual Studio| E[调用 MSBuild] ``` 3. **执行构建规则**: 底层构建系统(如`Makefile`或`build.ninja`)会: - 编译源代码(调用`g++`/`clang`等) - 链接生成目标文件(可执行文件/库) - 处理依赖关系(增量构建--- ### `--target install`的作用与原理 #### 核心功能 将构建产物(可执行文件、库、头文件等)**安装到预设路径**,例如: ```bash cmake --build . --target install ``` 等效于: ```bash make install # Makefile生成器 ninja install # Ninja生成器 ``` #### 实现机制 1. **定义安装规则**: 在`CMakeLists.txt`中需明确声明安装目标: ```cmake install(TARGETS my_app DESTINATION bin) # 安装可执行文件[^1] install(DIRECTORY include/ DESTINATION include) # 安装头文件 ``` 2. **生成安装脚本**: CMake会在构建目录生成: - `install_manifest.txt`:安装文件清单 - 构建系统特定规则(如Makefile的`install`目标) 3. **执行安装操作**: ```mermaid graph LR A[--target install] --> B[复制文件] B --> C{目标目录} C -->|默认路径| D[/usr/local/bin|include|lib/] C -->|自定义路径| E[$ENV{CMAKE_INSTALL_PREFIX}/] ``` #### 关键参数 | 参数 | 作用 | 示例 | |---------------------|--------------------------------|------------------------------| | `CMAKE_INSTALL_PREFIX` | 指定安装根目录 | `cmake -DCMAKE_INSTALL_PREFIX=~/my_app` | | `--config Release` | 指定构建配置(多配置生成器) | `cmake --build . --target install --config Release` | --- ### 典型工作流示例 ```mermaid sequenceDiagram participant 用户 participant CMake participant 构建系统 用户->>CMake: cmake --build . --target install CMake->>构建系统: 读取CMakeCache.txt 构建系统-->>CMake: 返回生成器类型 CMake->>构建系统: 调用 install 目标 构建系统->>构建系统: 执行安装规则 构建系统->>文件系统: 复制文件到安装目录 文件系统-->>用户: 生成 install_manifest.txt ``` > 📌 **注意**:安装路径默认由`CMAKE_INSTALL_PREFIX`控制,未设置时Linux默认为`/usr/local`,Windows默认为`C:\Program Files`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值