• CMake中configure_file的使用


          CMake中的configure_file命令用于将一个文件拷贝到另一个位置并修改其内容,其格式如下:

    1. configure_file(
    2. [NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |
    3. FILE_PERMISSIONS ...]
    4. [COPYONLY] [ESCAPE_QUOTES] [@ONLY]
    5. [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])

          将文件拷贝到文件,并在输入文件内容中替换@VAR@或${VAR}变量值。每个变量引用将被替换为变量的当前值,如果未定义该变量则替换为空字符串。
          在#cmakedefine01 VAR形式的行中,VAR本身将扩展为VAR 0 或 VAR 1,如果定义了VAR,将被替换为:#define VAR 1
          如果输入文件被修改,构建系统(build system)将重新运行CMake来重新配置文件并再次生成构建系统。只有当生成的文件内容发生改变时,生成的文件才会被修改,并在后续的cmake运行中更新它的时间戳。
          参数:
          (1).:输入文件的路径。相对路径是根据CMAKE_CURRENT_SOURCE_DIR的值来处理的。输入路径必须是文件,而不能是目录。
          (2).:输出文件或目录的路径。相对路径是根据CMAKE_CURRENT_SOURCE_DIR的值来处理的。如果路径命名为一个已存在的目录,则输出文件将存放在该目录中,文件名与输入文件相同。如果路径中包含不存在的目录,则会创建它们。
          (3).NO_SOURCE_PERMISSIONS:不要将输入文件的权限转移到输出文件中。拷贝的文件权限默认为标准的644(-rw-r--r--)。
          (4).USE_SOURCE_PERMISSIONS:将输入文件的权限转移到输出文件中。如果没有给出与权限相关的三个关键字(NO_SOURCE_PERMISSIONS, USE_SOURCE_PERMISSIONS or FILE_PERMISSIONS),这已经是默认行为。
          (5).FILE_PERMISSIONS:忽略输入文件的权限并使用指定的作为输出文件的权限。
          (6).COPYONLY:拷贝文件,但不替换任何变量引用或其它内容。此选项不能与NEWLINE_STYLE一起使用。
          (7).ESCAPE_QUOTES:用反斜杠(backslashes)转义任何替换的引号(C风格)。
          (8).@ONLY:将变量替换限制为@VAR@形式的引用。这对于配置使用${VAR}语法的脚本很有用。
          (9).NEWLINE_STYLE:指定输出文件的换行样式。为\n换行符指定UNIX或LF,或者为\r\n换行符指定DOS, WIN32, or CRLF。此选项不能用于COPYONLY。

          执行上述测试代码需要4个文件:build.sh, CMakeLists.txt, test_configure_file.cmake, include/foo.h.in

          build.sh内容如下:

    1. #! /bin/bash
    2. # supported input parameters(cmake commands)
    3. params=(function macro cmake_parse_arguments \
    4. find_library find_path find_file find_program find_package \
    5. cmake_policy cmake_minimum_required project include \
    6. string list set foreach message option if while return \
    7. math file configure_file \
    8. include_directories)
    9. usage()
    10. {
    11. echo "Error: $0 needs to have an input parameter"
    12. echo "supported input parameters:"
    13. for param in ${params[@]}; do
    14. echo " $0 ${param}"
    15. done
    16. exit -1
    17. }
    18. if [ $# != 1 ]; then
    19. usage
    20. fi
    21. flag=0
    22. for param in ${params[@]}; do
    23. if [ $1 == ${param} ]; then
    24. flag=1
    25. break
    26. fi
    27. done
    28. if [ ${flag} == 0 ]; then
    29. echo "Error: parameter \"$1\" is not supported"
    30. usage
    31. exit -1
    32. fi
    33. if [[ ! -d "build" ]]; then
    34. mkdir build
    35. cd build
    36. else
    37. cd build
    38. fi
    39. echo "==== test $1 ===="
    40. # test_set.cmake: cmake -DTEST_CMAKE_FEATURE=$1 --log-level=verbose ..
    41. # test_option.cmake: cmake -DTEST_CMAKE_FEATURE=$1 -DBUILD_PYTORCH=ON ..
    42. cmake -DTEST_CMAKE_FEATURE=$1 ..
    43. # It can be executed directly on the terminal, no need to execute build.sh, for example: cmake -P test_set.cmake
    44. make

          CMakeLists.txt内容如下:

    1. cmake_minimum_required(VERSION 3.22)
    2. project(cmake_feature_usage)
    3. message("#### current cmake version: ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}")
    4. include(test_${TEST_CMAKE_FEATURE}.cmake)
    5. message("==== test finish ====")

          test_configure_file.cmake内容如下:

    1. message("#### test_${TEST_CMAKE_FEATURE}.cmake ####")
    2. set(FLAG 2 CACHE STRING "Values that can be specified: [1, 2]" FORCE) # 设置FLAG,用来指定测试哪个代码段
    3. message("CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}")
    4. message("CMAKE_CURRENT_BINARY_DIR: ${CMAKE_CURRENT_BINARY_DIR}")
    5. if(${FLAG} STREQUAL "1")
    6. # 注意:FOO_ENABLE的值会写入CMakeCache.txt
    7. option(FOO_ENABLE "Enable Foo" ON)
    8. if(FOO_ENABLE)
    9. set(FOO_STRING "foo")
    10. endif()
    11. set(VAR 1)
    12. configure_file(include/foo.h.in foo.h @ONLY) # 生成的foo.h在build目录下
    13. # foo.h内容:
    14. # #define FOO_ENABLE
    15. # #define FOO_STRING "foo"
    16. # #define VAR 1
    17. elseif(${FLAG} STREQUAL "2")
    18. option(FOO_ENABLE "Enable Foo" OFF)
    19. if(FOO_ENABLE)
    20. set(FOO_STRING "foo")
    21. endif()
    22. set(VAR 0)
    23. if(DEFINED VAR)
    24. message("defined VAR") # print
    25. endif()
    26. configure_file(include/foo.h.in foo.h @ONLY) # 生成的foo.h在build目录下
    27. # foo.h内容:
    28. # /* #undef FOO_ENABLE */
    29. # /* #undef FOO_STRING */
    30. # #define VAR 0
    31. endif()

          include/foo.h.in内容如下:

    1. #cmakedefine FOO_ENABLE
    2. #cmakedefine FOO_STRING "@FOO_STRING@"
    3. #cmakedefine01 VAR

          可能的执行结果如下图所示:

          GitHubhttps://github.com/fengbingchun/Linux_Code_Test

  • 相关阅读:
    【漏洞复现】大华智慧园区综合管理平台信息泄露漏洞
    echarts点击事件、柱状图设置区间颜色
    Hadoop学习记录5--YARN学习1
    经典的网站系统架构(入门级)
    不删除D盘的情况下扩容c盘(扩容成功
    【C语言】解决 “address of stack memory associated with local variable ‘num‘ returned”
    M1芯片Mac安装OC渲染器中文汉化版(C4D)教程汇总
    自定义mvc框架复习
    Java Map类的简介说明
    网络解析(二)
  • 原文地址:https://blog.csdn.net/fengbingchun/article/details/128052019