• CMake中option和cmake_dependent_option的使用


          CMake中的option命令为用户提供可以选择的布尔选项(boolean option),其格式如下:

    option( "" [value])

          如果未提供初始,则布尔值OFF是默认值。如果已设置为普通或缓存变量,则该命令不执行任何操作
          在CMake项目模式(project mode)下,使用选项值创建一个布尔缓存变量。在CMake脚本模式(script mode)下,使用选项值设置一个布尔变量。

    1. option(BUILD_CUDA "build cuda" ON)
    2. if(BUILD_CUDA)
    3. message("option BUILD_CUDA: ON") # print
    4. endif()
    5. option(BUILD_CAFFE "build caffe" OFF)
    6. if(BUILD_CAFFE)
    7. message("option BUILD_CAFFE: ON") # won't print
    8. endif()
    9. if(NOT BUILD_CAFFE)
    10. message("option BUILD_CAFFE: OFF") # print
    11. endif()

          CMake option在命令行上的设置:形式如: cmake -DBUILD_PYTORCH=ON ..

    1. if(BUILD_PYTORCH)
    2. message("option BUILD_PYTORCH: ON") # print
    3. endif()

          CMake中的cmake_dependent_option是一个宏,提供依赖于其它选项的选项的宏(macro to provide an option dependent on other options)。仅当一组其它条件为true时,此宏才会向用户提供一个选项。其格式如下:

    cmake_dependent_option(

          (1).如果中以分号分割的条件列表全部为true,则使

    1. option(USE_BAR "USE BAR" ON)
    2. option(USE_ZOT "use zot" OFF)
    3. include(CMakeDependentOption) # module CMakeDependentOption provides the cmake_dependent_option macro
    4. cmake_dependent_option(USE_FOO "Use Foo" ON "USE_BAR;NOT USE_ZOT" OFF)
    5. if(USE_FOO)
    6. message("cmake_dependent_option USE_FOO: ON") # print
    7. endif()

          option和cmake_dependent_option中变量的值会存储在CMakeCache.txt中。因此若调整其中变量的值需删除CMakeCache.txt后才会生效

          执行上述测试代码需要3个文件:build.sh, CMakeLists.txt, test_option.cmake

          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)
    7. usage()
    8. {
    9. echo "Error: $0 needs to have an input parameter"
    10. echo "supported input parameters:"
    11. for param in ${params[@]}; do
    12. echo " $0 ${param}"
    13. done
    14. exit -1
    15. }
    16. if [ $# != 1 ]; then
    17. usage
    18. fi
    19. flag=0
    20. for param in ${params[@]}; do
    21. if [ $1 == ${param} ]; then
    22. flag=1
    23. break
    24. fi
    25. done
    26. if [ ${flag} == 0 ]; then
    27. echo "Error: parameter \"$1\" is not supported"
    28. usage
    29. exit -1
    30. fi
    31. if [[ ! -d "build" ]]; then
    32. mkdir build
    33. cd build
    34. else
    35. cd build
    36. fi
    37. echo "==== test $1 ===="
    38. # test_set.cmake: cmake -DTEST_CMAKE_FEATURE=$1 --log-level=verbose ..
    39. # test_option.cmake: cmake -DTEST_CMAKE_FEATURE=$1 -DBUILD_PYTORCH=ON ..
    40. cmake -DTEST_CMAKE_FEATURE=$1 ..
    41. # It can be executed directly on the terminal, no need to execute build.sh, for example: cmake -P test_set.cmake

          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_option.cmake:为上面的所有示例代码

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

           GitHubhttps://github.com/fengbingchun/Linux_Code_Test

  • 相关阅读:
    什么是自动化测试,一文吃透自动化测试【实战总结/建议收藏】
    R语言随机波动模型SV:马尔可夫蒙特卡罗法MCMC、正则化广义矩估计和准最大似然估计上证指数收益时间序列...
    Camtasia Studio2023喀秋莎免费实用的屏幕录像工具
    MIPI CSI-2笔记(7) -- Low Level Protocol(C-PHY物理层校验和生成,包间隔)
    一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第n次落地时,共经过多少米?第n次反弹多高?
    Web3在新加坡,叩开世界的大门
    基于ASP.NET的旅行社信息管理系统设计与实现
    【开源日记】宿舍断电自动关灯设备(二)
    果蝇(FOA)优化算法(附完整Matlab代码,可直接复制)
    Tomcat 部署 war 包
  • 原文地址:https://blog.csdn.net/fengbingchun/article/details/127824077