Brad King wrote:
> Steve, please explain your proposal in more detail. How does the list of
> requested features get mapped to the proper -std=cxx11 or equivalent flag?
>
In my branch that is determined by which list the feature appears in. Eg,
from GNU-CXX.cmake:
if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7)
list(APPEND CMAKE_CXX11_COMPILER_FEATURES
final
override
)
endif()
if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)
list(APPEND CMAKE_CXX14_COMPILER_FEATURES
generalized_lambda_capture
return_type_deduction
)
endif()
Then, in the implementation of target_compiler_feature,
list(FIND CMAKE_CXX11_COMPILER_FEATURES ${FEATURE_NAME} needs11)
list(FIND CMAKE_CXX14_COMPILER_FEATURES ${FEATURE_NAME} needs14)
list(FIND CMAKE_CXX17_COMPILER_FEATURES ${FEATURE_NAME} needs17)
if(NOT needs17 EQUAL -1)
set(standard 17)
elseif(NOT needs14 EQUAL -1)
set(standard 14)
elseif(NOT needs11 EQUAL -1)
set(standard 11)
endif()
# ...
set_property(TARGET ${TARGET_NAME} PROPERTY CXX_STANDARD ${standard})
Then, in cmLocalGenerator:
const char *standard = target->GetProperty("CXX_STANDARD");
std::string compile_option =
"CMAKE_CXX" + std::string(standard) + "_STANDARD_COMPILE_OPTION";
if (const char *opt =
target->GetMakefile()->GetDefinition(compile_option.c_str()))
{
this->AppendFlags(flags, opt);
}
This is where I have an open question in the branch:
# TODO: Gnu extensions supported by -std=gnu++98 ?
# And others.
http://gcc.gnu.org/onlinedocs/gcc-4.8.0/gcc/C-Dialect-Options.html#C-Dialect-Options
# TODO: Maybe instead we should define like this:
#
# set(CMAKE_C_COMPILE_OPTIONS_STD "-std=")
# set(CMAKE_CXX_COMPILE_OPTIONS_STD "-std=")
#
# so that the CXX_STANDARD target property can contain the argument string
# (including possibly extensions).
# That might call for some kind of mapping though because XL uses different
# values (eg extended0x)
if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7)
set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-std=c++11")
endif()
if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9
# AND VERSION_LESS 4.11 # Speculative
)
set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std=c++1y")
endif()
# if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.11) # Speculative
# set(CMAKE_CXX14_STANDARD_COMPILE_OPTION -std=c++14)
# endif()
--
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Please keep messages on-topic and check the CMake FAQ at:
http://www.cmake.org/Wiki/CMake_FAQ
Follow this link to subscribe/unsubscribe:
http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers