Merge pull request #1701 from enetheru/msvc_runtime
CMake: Fix for #1699 msvc runtime selection issuespull/1650/merge
commit
847dca4792
|
@ -1,10 +1,16 @@
|
|||
#[=======================================================================[.rst:
|
||||
Windows
|
||||
-------
|
||||
|
||||
This file contains functions for options and configuration for targeting the
|
||||
Windows platform
|
||||
|
||||
Because this file is included into the top level CMakelists.txt before the
|
||||
project directive, it means that
|
||||
|
||||
* ``CMAKE_CURRENT_SOURCE_DIR`` is the location of godot-cpp's CMakeLists.txt
|
||||
* ``CMAKE_SOURCE_DIR`` is the location where any prior ``project(...)``
|
||||
directive was
|
||||
|
||||
MSVC Runtime Selection
|
||||
----------------------
|
||||
|
||||
|
@ -19,48 +25,50 @@ Default: ``CMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded$<$<CONFIG:Debug>:Debug>DLL"
|
|||
This initializes each target's ``MSVC_RUNTIME_LIBRARY`` property at the time of
|
||||
target creation.
|
||||
|
||||
it is stated in the msvc_ documentation that: "All modules passed to a given
|
||||
invocation of the linker must have been compiled with the same runtime library
|
||||
compiler option (/MD, /MT, /LD)."
|
||||
|
||||
This creates a conundrum for us, the ``CMAKE_MSVC_RUNTIME_LIBRARY`` needs to be
|
||||
correct at the time the target is created, but we have no control over the
|
||||
consumers CMake scripts, and the per-target ``MSVC_RUNTIME_LIBRARY`` property
|
||||
is not transient.
|
||||
|
||||
We need ``CMAKE_MSVC_RUNTIME_LIBRARY`` to be ``"$<1:>"`` to ensure it
|
||||
will not add any flags. And then use ``target_compile_options()`` so that our
|
||||
flags will propagate to consumers.
|
||||
It has been raised that not using ``CMAKE_MSVC_RUNTIME_LIBRARY`` can also cause
|
||||
issues_ when a dependency( independent to godot-cpp ) that doesn't set any
|
||||
runtime flags, which relies purely on the ``CMAKE_MSVC_RUNTIME_LIBRARY``
|
||||
variable will very likely not have the correct msvc runtime flags set.
|
||||
|
||||
In the interests of playing nicely we detect whether we are being consumed
|
||||
and notify the consumer that we are setting ``CMAKE_MSVC_RUNTIME_LIBRARY``,
|
||||
that dependent targets rely on it, and point them to these comments as to why.
|
||||
So we'll set ``CMAKE_MSVC_RUNTIME_LIBRARY`` as CACHE STRING so that it will be
|
||||
available for consumer target definitions, but also be able to be overridden if
|
||||
needed.
|
||||
|
||||
Additionally we message consumers notifying them and pointing to this
|
||||
documentation.
|
||||
|
||||
.. _CMP0091:https://cmake.org/cmake/help/latest/policy/CMP0091.html
|
||||
.. _property:https://cmake.org/cmake/help/latest/variable/CMAKE_MSVC_RUNTIME_LIBRARY.html
|
||||
.. https://discourse.cmake.org/t/mt-staticrelease-doesnt-match-value-md-dynamicrelease/5428/4
|
||||
.. _msvc: https://learn.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library
|
||||
.. _issues: https://github.com/godotengine/godot-cpp/issues/1699
|
||||
|
||||
]=======================================================================]
|
||||
if( PROJECT_NAME ) # we are not the top level if this is true
|
||||
if( DEFINED CMAKE_MSVC_RUNTIME_LIBRARY )
|
||||
# Warning that we are clobbering the variable.
|
||||
message( WARNING "setting CMAKE_MSVC_RUNTIME_LIBRARY to \"$<1:>\"")
|
||||
else( )
|
||||
# Notification that we are setting the variable
|
||||
message( STATUS "setting CMAKE_MSVC_RUNTIME_LIBRARY to \"$<1:>\"")
|
||||
endif()
|
||||
endif()
|
||||
set( CMAKE_MSVC_RUNTIME_LIBRARY "$<1:>" CACHE INTERNAL "Select the MSVC runtime library for use by compilers targeting the MSVC ABI." )
|
||||
|
||||
#[============================[ Windows Options ]============================]
|
||||
function( windows_options )
|
||||
|
||||
option( GODOT_USE_STATIC_CPP "Link MinGW/MSVC C++ runtime libraries statically" ON )
|
||||
|
||||
option( GODOT_DEBUG_CRT "Compile with MSVC's debug CRT (/MDd)" OFF )
|
||||
|
||||
message( STATUS "If not already cached, setting CMAKE_MSVC_RUNTIME_LIBRARY.\n"
|
||||
"\tFor more information please read godot-cpp/cmake/windows.cmake")
|
||||
|
||||
set( CMAKE_MSVC_RUNTIME_LIBRARY
|
||||
"MultiThreaded$<IF:$<BOOL:${GODOT_DEBUG_CRT}>,DebugDLL,$<$<NOT:$<BOOL:${GODOT_USE_STATIC_CPP}>>:DLL>>"
|
||||
CACHE STRING "Select the MSVC runtime library for use by compilers targeting the MSVC ABI.")
|
||||
endfunction()
|
||||
|
||||
|
||||
#[===========================[ Target Generation ]===========================]
|
||||
function( windows_generate )
|
||||
set( STATIC_CPP "$<BOOL:${GODOT_USE_STATIC_CPP}>")
|
||||
set( DEBUG_CRT "$<BOOL:${GODOT_DEBUG_CRT}>" )
|
||||
|
||||
set_target_properties( ${TARGET_NAME}
|
||||
PROPERTIES
|
||||
|
@ -76,11 +84,6 @@ function( windows_generate )
|
|||
>
|
||||
)
|
||||
|
||||
target_compile_options( ${TARGET_NAME}
|
||||
PUBLIC
|
||||
$<${IS_MSVC}:$<IF:${DEBUG_CRT},/MDd,$<IF:${STATIC_CPP},/MT,/MD>>>
|
||||
)
|
||||
|
||||
target_link_options( ${TARGET_NAME}
|
||||
PUBLIC
|
||||
|
||||
|
|
Loading…
Reference in New Issue