一、option介绍
在我们的开发过程中,难免的需要添加一些选项以供下游选择。
option
此函数向项目添加一个选项,可以包含选项介绍及默认值。其原型为:
option(<OPTION_NAME> "<help_text>" [value])
示例:
option(ENABLE_SAMPLE_BUILD "Build the sample programs" OFF)
第一个参数为选项名称。需要注意的是,此选项不仅仅可以是boolean,也可以是string或list。
第二个参数为选项介绍,为string。
第三个参数为选项默认值,依据选项类型设置。
二、cmake_dependent_option
cmake提供了一组内置宏,用户可以自己设置。只有当该集合中的所有条件为真时,该宏才会向用户提供一个选项。
语法:
cmake_dependent_option(<OPTION_NAME> "<help_text>" <default_value> <depends> <force_value>)
示例:
CMAKE_DEPENDENT_OPTION(ENABLE_SAMPLE_TESTING "Enable sample test programs" ON
"ENABLE_SAMPLE_BUILD;NOT DISABLE_TESTING" OFF)
第一个参数为选项名称。
第二个参数为选项介绍。
第三个参数为默认值。
当第四个参数为TRUE时,开启此选项并自动设置第二个参数的值为默认值。否则,将强制设置该选项默认值为第五个参数值,使用者不能修改。
在此示例中,如果 ENABLE_SAMPLE_BUILD 为 ON,且 DISABLE_TESTING 为 OFF, 则自动设置 ENABLE_SAMPLE_TESTING 为 ON,且该值可以通过cmake传入来覆盖,否则 ENABLE_SAMPLE_TESTING 会被强制设置为 OFF 且无法通过cmake传入覆盖。
值得注意的是,第四个参数中可以用分号代表与的关系,也可以仅添加一个判断选项。
三、实例
源文件还是使用上一篇博客的cpp
# set minimum cmake version
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
# project name and language
project(recipe-05 LANGUAGES CXX)
# expose options to the user
option(USE_LIBRARY "Compile sources into a library" OFF)
message(STATUS "Compile sources into a library? ${USE_LIBRARY}")
include(CMakeDependentOption)
# second option depends on the value of the first
cmake_dependent_option(
MAKE_STATIC_LIBRARY "Compile sources into a static library" OFF
"USE_LIBRARY" ON
)
# third option depends on the value of the first
cmake_dependent_option(
MAKE_SHARED_LIBRARY "Compile sources into a shared library" ON
"USE_LIBRARY" ON
)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
# list sources
list(APPEND _sources Message.hpp Message.cpp)
if(USE_LIBRARY)
message(STATUS "Compile sources into a STATIC library? ${MAKE_STATIC_LIBRARY}")
message(STATUS "Compile sources into a SHARED library? ${MAKE_SHARED_LIBRARY}")
if(MAKE_SHARED_LIBRARY)
add_library(message SHARED ${_sources})
add_executable(hello-world hello-world.cpp)
target_link_libraries(hello-world message)
endif()
if(MAKE_STATIC_LIBRARY)
add_library(message STATIC ${_sources})
add_executable(hello-world hello-world.cpp)
target_link_libraries(hello-world message)
endif()
else()
add_executable(hello-world hello-world.cpp ${_sources})
endif()
参考: