You are right, so it would have to be separate target properties for each language COMPILE_<LANG>_STANDARD
:
COMPILE_C_STANDARD
COMPILE_CXX_STANDARD
COMPILE_CUDA_STANDARD
I found a (convoluted) workaround:
# "save" standard in COMPILE_DEFINITIONS
target_compile_definitions(test2 PUBLIC
$<$<COMPILE_FEATURES:cxx_std_20>:SCAPIX_CPP20>
$<$<COMPILE_FEATURES:cxx_std_23>:SCAPIX_CPP23>
)
# "extract" standard from COMPILE_DEFINITIONS
add_custom_command(
TARGET test2 POST_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "-std=$<IF:$<IN_LIST:SCAPIX_CPP23,$<TARGET_PROPERTY:test2,COMPILE_DEFINITIONS>>,c++23,$<IF:$<IN_LIST:SCAPIX_CPP20,$<TARGET_PROPERTY:test2,COMPILE_DEFINITIONS>>,c++20,c++17>>"
)
This selects between three C++ standards: c++17, c++20, c++23.
CMake selects language standard (C/C++/Cuda) to use for a particular target based on target_compile_features() specified for target and all it's dependencies, recursively.
Presently, there is no way to determine which standard CMake selected.
When using clang based tools to process target's sources (in my case: https://github.com/scapix-com/scapix) I need to know which C++ standard CMake selected for a particular target.
$<COMPILE_FEATURES:features> seems to provide this information, but it "may only be used with binary targets. It may not be used with add_custom_command or add_custom_target."
I suggest adding new target property: COMPILE_LANGUAGE_STANDARD
, which will contain one of the version values from CMAKE_C_KNOWN_FEATURES, CMAKE_CXX_KNOWN_FEATURES or CMAKE_CUDA_KNOWN_FEATURES. I suggest to use only standard version selected (like cxx_std_20
), not individual features. It has to be usable in "generator expression".
To use it, for example, like this:
add_custom_command(COMMAND clang_tool -std=$<TARGET_PROPERTY:target,COMPILE_LANGUAGE_STANDARD>)