• C++-Cmake指令:file【文件操作命令】【比如:file GLOB命令主要用于匹配规则在指定的目录内匹配到所需要的文件】


    使用cmake 文件操作时不可避免需要操作相关文件,比如读取文件内容,创建新文件的等等操作,都需要通过file命令进行操作。

    一、读文件操作

    1、file READ命令

    常用的从文件中读取操作为file(READ ),将filename文件中内容原封不动读取到variable变量中,命令行全部格式为:

    file(read <filename> <variable> [OFFSET <offset>] [LIMIT <max-in>] [HEX])
    • filename: 必选项 为要读取的文件,可以带绝对路径
    • variable: 必选项,将文件内容读取到varible变量中。
    • OFFSET :可选项,从文件中偏移位置offset 开始读取文件内容
    • HEX:可选项,可以将读取文件内容转换成十六进制。

    LIMIT : 可选项 最多读取长度的内容到变量中

    以一个例子说明,实验目录下有两个文件,使用tree命令查看:

    1. $ tree
    2. .
    3. ├── CMakeLists.txt
    4. └── test.cpp
    5. 0 directories, 2 files
    6. $

    test.cpp文件内容如下:

    1. #include
    2. #include
    3. int main(){
    4. printf("hello world!\n");
    5. }

    CMakeList.txt文件内容如下:

    1. cmake_minimum_required(VERSION 3.13.4)
    2. project(cmake_read)
    3. message("--------Proj Src Dir: " ${PROJECT_SOURCE_DIR})
    4. file(READ ${PROJECT_SOURCE_DIR}/test.cpp TEST_RESULT)
    5. message("--------TEST RESULT: " ${TEST_RESULT})

    使用file(read)命令将文件test.cpp的内容读取到TEST_RESULT变量中,并打印出来,使用cmake运行:

    1. $ /public/home/huozhikun/cmake/cmake-3.17.0/bin/cmake ..
    2. CMake Error: The source directory "/public/home/huozhikun/test/cmake/read" does not appear to contain CMakeLists.txt.
    3. Specify --help for usage, or press the help button on the CMake GUI.
    4. [huozhikun@login09 example]$ cd build/
    5. [huozhikun@login09 build]$ /public/home/huozhikun/cmake/cmake-3.17.0/bin/cmake ..
    6. -- The C compiler identification is GNU 7.3.1
    7. -- The CXX compiler identification is GNU 7.3.1
    8. -- Check for working C compiler: /opt/rh/devtoolset-7/root/usr/bin/cc
    9. -- Check for working C compiler: /opt/rh/devtoolset-7/root/usr/bin/cc - works
    10. -- Detecting C compiler ABI info
    11. -- Detecting C compiler ABI info - done
    12. -- Detecting C compile features
    13. -- Detecting C compile features - done
    14. -- Check for working CXX compiler: /opt/rh/devtoolset-7/root/usr/bin/c++
    15. -- Check for working CXX compiler: /opt/rh/devtoolset-7/root/usr/bin/c++ - works
    16. -- Detecting CXX compiler ABI info
    17. -- Detecting CXX compiler ABI info - done
    18. -- Detecting CXX compile features
    19. -- Detecting CXX compile features - done
    20. --------Proj Src Dir: /public/home/huozhikun/test/cmake/read/example
    21. --------TEST RESULT: #include
    22. #include
    23. int main(){
    24. printf("hello world!\n")
    25. }
    26. -- Configuring done
    27. -- Generating done
    28. -- Build files have been written to: /public/home/huozhikun/test/cmake/read/example/build

    将test.cpp的文件内容原封不动读取到TEST_RESULT变量中。

    2、file STRINGS命令

    file STRINGS命令是将文件的内容读取成一串ASCII字符串到变量中,其中二进制文件将会被忽略,在读取文件中 回车及\r将会被忽略:

    file(STRINGS   [ ...])

    3、file

    4、file TIMESTAMP

    二、写文件操作

    1、file WRITE命令

    2、file APPEND命令

    3、file TOUCH命令

    4、file GENERATE命令

    三、Filesystem

    1、file GLOB命令

    file GLOB命令主要用于匹配规则在指定的目录内匹配到所需要的文件,命令行格式:

    file(GLOB  [LIST_DIRECTORIES true[false]] [RELATIVE  ] [CONFIGURE_DEPENDS] [ ...])
    • LIST_DIRECTORIES true[false]: 如果为false,目录将会被省略,默认情况下返回是带目录
    • RELATIVE : 相对路径 返回的结果将不是绝对路径,而是将绝对路径中的部分去掉,返回相对路径
    • CONFIGURE_DEPENDS:如果该标记位设置,在主构建系统检查目标添加逻辑,必便在构建时重新运行标记的GLOB命令
    • :匹配表达式,表达式类似与正则匹配,如下:
    1. *.cxx - match all files with extension cxx
    2. *.vt? - match all files with extension vta,...,vtz
    3. f[3-5].txt - match files f3.txt, f4.txt, f5.txt

    用例

    1. cmake_minimum_required(VERSION 3.13.4)
    2. project(cmake_filesystem)
    3. message("--------Proj Src Dir: " ${CMAKE_CURRENT_SOURCE_DIR})
    4. file(GLOB TEST_RESULT LIST_DIRECT true RELATIVE /public/home *.cpp)
    5. message("--------TEST_RESULT: ${TEST_RESULT}")

    寻找当前路径下的cpp文件,且返回的结果中为/public/home的相对路径,结果:

    1. $ /public/home/huozhikun/cmake/cmake-3.17.0/bin/cmake ..
    2. ... ...
    3. --------Proj Src Dir: /public/home/huozhikun/test/cmake/filesystem/example_3
    4. --------TEST_RESULT: huozhikun/test/cmake/filesystem/example_3/test_2.cpp
    5. ... ...

    2、 file GLOB_RECURSE命令

    3、file RENAME命令

    4、RENAME_RECURES 

    5、file MAKE_DIRECTORY命令

    6、file COPY命令

    file COPY命令用于将文件copy到目标目录中,命令行格式如下:

    1. file(COPY ... DESTINATION
    2. [FILE_PERMISSIONS ...]
    3. [DIRECTORY_PERMISSIONS ... ]
    4. [NO_SOURCE_PERMISSIONS] [USE_SOURCE_PERMISSIONS]
    5. [FILES_MATCHING]
    6. [ [PATTERN | REGEX ]
    7. [EXCLUDE] [PERMISSIONS ... ] ]
    8. [...])
    • :要拷贝的源文件
    • DESTINATION :要将源文件拷贝到目的目录中
    • FILE_PERMISSIONS :修改源文件权限
    • DIRECTORY_PERMISSIONS :目录权限
    • NO_SOURCE_PERMISSIONS:不使用源文件权限,对文件权限重新指定
    • USE_SOURCE_PERMISSIONS:使用源文件权限,当该选项设置时,不能再使用FILE_PERMISSIONS权限,支持的权限设置有:
      • OWNER_READ

      • OWNER_WRITE

      • OWNER_EXECUTE

      • GROUP_READ

      • GROUP_WRITE

      • GROUP_EXECUTE

      • WORLD_READ

      • WORLD_WRITE

      • WORLD_EXECUTE

    • PATTERN 和REGEX:制定一些匹配规则
    • EXCLUDE: 不包括或排除调一些特殊文件

    7、file INSTALL命令

    四、路径转换(path conversion)

    1、file  RELATIVE_PATH

    2、file TO_CMAKE_PATH

    3、 file TO_NATIVE_PATH

    五、传送相关命令(transfer)

    六、锁

    CMake file文件操作命令_Huo的藏经阁的博客-CSDN博客_cmake file

  • 相关阅读:
    mPEG-Cholesterol,mPEG-CLS,甲氧基-聚乙二醇-胆固醇可用于脂质体制备
    【PyTorch】PyTorch模型定义
    【UE 材质】常用向量运算节点——点积、叉积、归一化
    Android切圆角的几种方式
    C语言进阶 文件操作知识(上)
    什么是可调CAP策略?为什么需要可调CAP策略?
    【数字IC/FPGA】Verilog中的force和release
    Unity脚本生命周期 Day02
    【Hyperledger Fabric 学习】部署智能合约到通道上
    python re模块
  • 原文地址:https://blog.csdn.net/u013250861/article/details/127936519