mirror of
https://github.com/pybind/pybind11.git
synced 2026-03-14 20:27:47 +00:00
Make PYBIND11_CPP_STANDARD work under MSVC
Under MSVC we were ignoring PYBIND11_CPP_STANDARD and simply not passing any standard (which makes MSVC default to its C++14 mode). MSVC 2015u3 added the `/std:c++14` and `/std:c++latest` flags; the latter, under MSVC 2017, enables some C++17 features (such as `std::optional` and `std::variant`), so it is something we need to start supporting under MSVC. This makes the PYBIND11_CPP_STANDARD cmake variable work under MSVC, defaulting it to /std:c++14 (matching the default -std=c++14 for non-MSVC). It also adds a new appveyor test running under MSVC 2017 with /std:c++latest, which runs (and passes) the `std::optional`/`std::variant` tests. Also updated the documentation to clarify the c++ flags and add show MSVC flag examples.
This commit is contained in:
@@ -19,20 +19,24 @@ include(CheckCXXCompilerFlag)
|
||||
include(CMakeParseArguments)
|
||||
|
||||
function(select_cxx_standard)
|
||||
if(NOT MSVC AND NOT PYBIND11_CPP_STANDARD)
|
||||
check_cxx_compiler_flag("-std=c++14" HAS_CPP14_FLAG)
|
||||
check_cxx_compiler_flag("-std=c++11" HAS_CPP11_FLAG)
|
||||
if(NOT PYBIND11_CPP_STANDARD)
|
||||
if(NOT MSVC)
|
||||
check_cxx_compiler_flag("-std=c++14" HAS_CPP14_FLAG)
|
||||
check_cxx_compiler_flag("-std=c++11" HAS_CPP11_FLAG)
|
||||
|
||||
if (HAS_CPP14_FLAG)
|
||||
set(PYBIND11_CPP_STANDARD -std=c++14)
|
||||
elseif (HAS_CPP11_FLAG)
|
||||
set(PYBIND11_CPP_STANDARD -std=c++11)
|
||||
else()
|
||||
message(FATAL_ERROR "Unsupported compiler -- pybind11 requires C++11 support!")
|
||||
if (HAS_CPP14_FLAG)
|
||||
set(PYBIND11_CPP_STANDARD -std=c++14)
|
||||
elseif (HAS_CPP11_FLAG)
|
||||
set(PYBIND11_CPP_STANDARD -std=c++11)
|
||||
else()
|
||||
message(FATAL_ERROR "Unsupported compiler -- pybind11 requires C++11 support!")
|
||||
endif()
|
||||
elseif(MSVC)
|
||||
set(PYBIND11_CPP_STANDARD /std:c++14)
|
||||
endif()
|
||||
|
||||
set(PYBIND11_CPP_STANDARD ${PYBIND11_CPP_STANDARD} CACHE STRING
|
||||
"C++ standard flag, e.g. -std=c++11 or -std=c++14. Defaults to latest available." FORCE)
|
||||
"C++ standard flag, e.g. -std=c++11, -std=c++14, /std:c++14. Defaults to C++14 mode." FORCE)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
@@ -162,10 +166,8 @@ function(pybind11_add_module target_name)
|
||||
endif()
|
||||
|
||||
select_cxx_standard()
|
||||
if(NOT MSVC)
|
||||
# Make sure C++11/14 are enabled
|
||||
target_compile_options(${target_name} PUBLIC ${PYBIND11_CPP_STANDARD})
|
||||
endif()
|
||||
# Make sure C++11/14 are enabled
|
||||
target_compile_options(${target_name} PUBLIC ${PYBIND11_CPP_STANDARD})
|
||||
|
||||
if(ARG_NO_EXTRAS)
|
||||
return()
|
||||
|
||||
Reference in New Issue
Block a user