2019-06-29 01:17:39 +08:00
## # vcpkg_check_features
##
2019-06-29 23:29:13 +08:00
## Check if one or more features are a part of the package installation.
2019-06-29 01:17:39 +08:00
##
## ## Usage
## ```cmake
## vcpkg_check_features(
## <feature1> <output_variable1>
## [<feature2> <output_variable2>]
## ...
## )
## ```
##
2019-06-29 23:29:13 +08:00
## `vcpkg_check_features` accepts a list of (feature, output_variable) pairs. If a feature is specified, the corresponding output variable will be set as `ON`, or `OFF` otherwise. The syntax is similar to the `PROPERTIES` argument of `set_target_properties`.
2019-06-29 01:17:39 +08:00
##
2019-06-29 23:29:13 +08:00
## `vcpkg_check_features` will create a variable `FEATURE_OPTIONS` in the parent scope, which you can pass as a part of `OPTIONS` argument when calling functions like `vcpkg_config_cmake`:
2019-06-29 01:17:39 +08:00
## ```cmake
## vcpkg_config_cmake(
## SOURCE_PATH ${SOURCE_PATH}
## PREFER_NINJA
## OPTIONS
## -DBUILD_TESTING=ON
## ${FEATURE_OPTIONS}
## )
## ```
##
## ## Notes
2019-06-29 23:29:13 +08:00
## ```cmake
## vcpkg_check_features(<feature> <output_variable>)
## ```
## can be used as a replacement of:
## ```cmake
## if(<feature> IN_LIST FEATURES)
## set(<output_variable> ON)
## else()
## set(<output_variable> OFF)
## endif()
## ```
##
## However, if you have a feature that was checked like this before:
## ```cmake
## if(<feature> IN_LIST FEATURES)
## set(<output_variable> OFF)
## else()
## set(<output_variable> ON)
## endif()
## ```
## then you should not use `vcpkg_check_features` instead. [```oniguruma```](https://github.com/microsoft/vcpkg/blob/master/ports/oniguruma/portfile.cmake), for example, has a feature named `non-posix` which is checked with:
## ```cmake
## if("non-posix" IN_LIST FEATURES)
## set(ENABLE_POSIX_API OFF)
## else()
## set(ENABLE_POSIX_API ON)
## endif()
## ```
## and by replacing these code with:
## ```cmake
## vcpkg_check_features(non-posix ENABLE_POSIX_API)
## ```
## is totally wrong.
##
## `vcpkg_check_features` is supposed to be called only once. Otherwise, the `FEATURE_OPTIONS` variable set by a previous call will be overwritten.
2019-06-29 01:17:39 +08:00
##
## ## Examples
##
## * [czmq](https://github.com/microsoft/vcpkg/blob/master/ports/czmq/portfile.cmake)
2019-06-29 23:29:13 +08:00
## * [xsimd](https://github.com/microsoft/vcpkg/blob/master/ports/xsimd/portfile.cmake)
2019-06-29 01:17:39 +08:00
## * [xtensor](https://github.com/microsoft/vcpkg/blob/master/ports/xtensor/portfile.cmake)
function ( vcpkg_check_features )
cmake_parse_arguments ( _vcf "" "" "" ${ ARGN } )
list ( LENGTH ARGN _vcf_ARGC )
math ( EXPR _vcf_INCORRECT_ARGN "${_vcf_ARGC} % 2" )
if ( _vcf_INCORRECT_ARGN )
message ( FATAL_ERROR "Called with incorrect number of arguments." )
endif ( )
set ( _vcf_IS_FEATURE_ARG ON )
set ( _vcf_FEATURE_OPTIONS )
# Process (feature, output_var) pairs
foreach ( _vcf_ARG ${ ARGN } )
if ( _vcf_IS_FEATURE_ARG )
set ( _vcf_FEATURE ${ _vcf_ARG } )
if ( NOT ${ _vcf_FEATURE } IN_LIST ALL_FEATURES )
message ( FATAL_ERROR "Unknown feature: ${_vcf_FEATURE}" )
endif ( )
set ( _vcf_IS_FEATURE_ARG OFF )
else ( )
set ( _vcf_FEATURE_VAR ${ _vcf_ARG } )
if ( ${ _vcf_FEATURE } IN_LIST FEATURES )
set ( ${ _vcf_FEATURE_VAR } ON PARENT_SCOPE )
2019-07-07 15:33:46 +08:00
list ( APPEND _vcf_FEATURE_OPTIONS "-D${_vcf_FEATURE_VAR}=ON" )
2019-06-29 01:17:39 +08:00
else ( )
set ( ${ _vcf_FEATURE_VAR } OFF PARENT_SCOPE )
2019-07-07 15:33:46 +08:00
list ( APPEND _vcf_FEATURE_OPTIONS "-D${_vcf_FEATURE_VAR}=OFF" )
2019-06-29 01:17:39 +08:00
endif ( )
set ( _vcf_IS_FEATURE_ARG ON )
endif ( )
endforeach ( )
if ( DEFINED FEATURE_OPTIONS )
message ( WARNING "FEATURE_OPTIONS is already defined and will be overwritten." )
endif ( )
set ( FEATURE_OPTIONS ${ _vcf_FEATURE_OPTIONS } PARENT_SCOPE )
endfunction ( )