mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-29 00:22:00 +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:
parent
ca0e82b79f
commit
77710ff01c
@ -11,11 +11,20 @@ platform:
|
|||||||
environment:
|
environment:
|
||||||
matrix:
|
matrix:
|
||||||
- CONDA: 36
|
- CONDA: 36
|
||||||
|
CPP: 14
|
||||||
- CONDA: 27
|
- CONDA: 27
|
||||||
|
CPP: 14
|
||||||
|
- CONDA: 36
|
||||||
|
CPP: latest
|
||||||
matrix:
|
matrix:
|
||||||
exclude:
|
exclude:
|
||||||
- image: Visual Studio 2015
|
- image: Visual Studio 2015
|
||||||
platform: x86
|
platform: x86
|
||||||
|
- image: Visual Studio 2015
|
||||||
|
CPP: latest
|
||||||
|
- image: Visual Studio 2017
|
||||||
|
CPP: latest
|
||||||
|
platform: x86
|
||||||
install:
|
install:
|
||||||
- ps: |
|
- ps: |
|
||||||
if ($env:PLATFORM -eq "x64") { $env:CMAKE_ARCH = "x64" }
|
if ($env:PLATFORM -eq "x64") { $env:CMAKE_ARCH = "x64" }
|
||||||
@ -37,7 +46,7 @@ install:
|
|||||||
7z x 3.3.3.zip -y > $null
|
7z x 3.3.3.zip -y > $null
|
||||||
$env:CMAKE_INCLUDE_PATH = "eigen-eigen-67e894c6cd8f"
|
$env:CMAKE_INCLUDE_PATH = "eigen-eigen-67e894c6cd8f"
|
||||||
build_script:
|
build_script:
|
||||||
- cmake -G "%CMAKE_GENERATOR%" -A "%CMAKE_ARCH%" -DPYBIND11_WERROR=ON -DCMAKE_SUPPRESS_REGENERATION=1
|
- cmake -G "%CMAKE_GENERATOR%" -A "%CMAKE_ARCH%" -DPYBIND11_CPP_STANDARD=/std:c++%CPP% -DPYBIND11_WERROR=ON -DCMAKE_SUPPRESS_REGENERATION=1
|
||||||
- set MSBuildLogger="C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
|
- set MSBuildLogger="C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
|
||||||
- cmake --build . --config Release --target pytest -- /v:m /logger:%MSBuildLogger%
|
- cmake --build . --config Release --target pytest -- /v:m /logger:%MSBuildLogger%
|
||||||
- cmake --build . --config Release --target test_cmake_build -- /v:m /logger:%MSBuildLogger%
|
- cmake --build . --config Release --target test_cmake_build -- /v:m /logger:%MSBuildLogger%
|
||||||
|
@ -92,17 +92,28 @@ regular LTO if ``-flto=thin`` is not available.
|
|||||||
Configuration variables
|
Configuration variables
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
By default, pybind11 will compile modules with the latest C++ standard
|
By default, pybind11 will compile modules with the C++14 standard, if available
|
||||||
available on the target compiler. To override this, the standard flag can
|
on the target compiler, falling back to C++11 if C++14 support is not
|
||||||
be given explicitly in ``PYBIND11_CPP_STANDARD``:
|
available. Note, however, that this default is subject to change: future
|
||||||
|
pybind11 releases are expected to migrate to newer C++ standards as they become
|
||||||
|
available. To override this, the standard flag can be given explicitly in
|
||||||
|
``PYBIND11_CPP_STANDARD``:
|
||||||
|
|
||||||
.. code-block:: cmake
|
.. code-block:: cmake
|
||||||
|
|
||||||
|
# Use just one of these:
|
||||||
|
# GCC/clang:
|
||||||
set(PYBIND11_CPP_STANDARD -std=c++11)
|
set(PYBIND11_CPP_STANDARD -std=c++11)
|
||||||
|
set(PYBIND11_CPP_STANDARD -std=c++14)
|
||||||
|
set(PYBIND11_CPP_STANDARD -std=c++1z) # Experimental C++17 support
|
||||||
|
# MSVC:
|
||||||
|
set(PYBIND11_CPP_STANDARD /std:c++14)
|
||||||
|
set(PYBIND11_CPP_STANDARD /std:c++latest) # Enables some MSVC C++17 features
|
||||||
|
|
||||||
add_subdirectory(pybind11) # or find_package(pybind11)
|
add_subdirectory(pybind11) # or find_package(pybind11)
|
||||||
|
|
||||||
Note that this and all other configuration variables must be set **before** the
|
Note that this and all other configuration variables must be set **before** the
|
||||||
call to ``add_subdiretory`` or ``find_package``. The variables can also be set
|
call to ``add_subdirectory`` or ``find_package``. The variables can also be set
|
||||||
when calling CMake from the command line using the ``-D<variable>=<value>`` flag.
|
when calling CMake from the command line using the ``-D<variable>=<value>`` flag.
|
||||||
|
|
||||||
The target Python version can be selected by setting ``PYBIND11_PYTHON_VERSION``
|
The target Python version can be selected by setting ``PYBIND11_PYTHON_VERSION``
|
||||||
|
@ -19,20 +19,24 @@ include(CheckCXXCompilerFlag)
|
|||||||
include(CMakeParseArguments)
|
include(CMakeParseArguments)
|
||||||
|
|
||||||
function(select_cxx_standard)
|
function(select_cxx_standard)
|
||||||
if(NOT MSVC AND NOT PYBIND11_CPP_STANDARD)
|
if(NOT PYBIND11_CPP_STANDARD)
|
||||||
check_cxx_compiler_flag("-std=c++14" HAS_CPP14_FLAG)
|
if(NOT MSVC)
|
||||||
check_cxx_compiler_flag("-std=c++11" HAS_CPP11_FLAG)
|
check_cxx_compiler_flag("-std=c++14" HAS_CPP14_FLAG)
|
||||||
|
check_cxx_compiler_flag("-std=c++11" HAS_CPP11_FLAG)
|
||||||
|
|
||||||
if (HAS_CPP14_FLAG)
|
if (HAS_CPP14_FLAG)
|
||||||
set(PYBIND11_CPP_STANDARD -std=c++14)
|
set(PYBIND11_CPP_STANDARD -std=c++14)
|
||||||
elseif (HAS_CPP11_FLAG)
|
elseif (HAS_CPP11_FLAG)
|
||||||
set(PYBIND11_CPP_STANDARD -std=c++11)
|
set(PYBIND11_CPP_STANDARD -std=c++11)
|
||||||
else()
|
else()
|
||||||
message(FATAL_ERROR "Unsupported compiler -- pybind11 requires C++11 support!")
|
message(FATAL_ERROR "Unsupported compiler -- pybind11 requires C++11 support!")
|
||||||
|
endif()
|
||||||
|
elseif(MSVC)
|
||||||
|
set(PYBIND11_CPP_STANDARD /std:c++14)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(PYBIND11_CPP_STANDARD ${PYBIND11_CPP_STANDARD} CACHE STRING
|
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()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
@ -162,10 +166,8 @@ function(pybind11_add_module target_name)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
select_cxx_standard()
|
select_cxx_standard()
|
||||||
if(NOT MSVC)
|
# Make sure C++11/14 are enabled
|
||||||
# Make sure C++11/14 are enabled
|
target_compile_options(${target_name} PUBLIC ${PYBIND11_CPP_STANDARD})
|
||||||
target_compile_options(${target_name} PUBLIC ${PYBIND11_CPP_STANDARD})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(ARG_NO_EXTRAS)
|
if(ARG_NO_EXTRAS)
|
||||||
return()
|
return()
|
||||||
|
Loading…
Reference in New Issue
Block a user