mirror of
https://github.com/fmtlib/fmt.git
synced 2024-11-22 10:30:05 +00:00
3b2fc033d1
CMake 3.15 introduced a new way of handling MSVC CRT type definition for the build: CMAKE_MSVC_RUNTIME_LIBRARY variable. (https://cmake.org/cmake/help/latest/variable/CMAKE_MSVC_RUNTIME_LIBRARY.html) This is supposed to be the way to go with MSVC CRT selection in new projects. Using this method however breaks the current CMake script for CUDA test. The reason is the CUDA test uses "FindCUDA" CMake module to detect and set up CUDA support in CMake, which is deprecated since CMake version 3.10, and which does not support CMAKE_MSVC_RUNTIME_LIBRARY selector correctly (i.e. it does not propagate the compiler option related to the CRT). I did not find a way to "patch" in the correct compiler options, so (while knowing this feature is only available from CMake 3.15 on) I decided to change also the way CUDA is handled and instead of using FindCUDA, used enable_language. Apart from having some nice additional side-effects, it also fixed the problem with CRT selection. However, the propagation of the compiler options (and in particular the options related to C++ standard selection) is still a bit flaky on Windows+MSVC platform, so it had to be done manually. The patch makes two things in parallel: 1) Introduces MSVC_BUILD_STATIC, which, together with CMake version >= 3.15, allows building static version of the 'fmt' lib (and all the tests). 2) At the same time, for CMake >= 3.15 it switches handling of CUDA support from (old) FindCUDA to (new) enable_language, to fix the problems which the old method has with the new CRT selector for MSVC in a new CMake. Added a check for CUDA before enabling it. Using VERSION_LESS instead of VERSION_GREATER_EQUAL Since apparently VERSION_GREATER_EQUAL exists only from CMake 3.7, while Android is using CMake 3.6. Removed MSVC_RUNTIME_LIBRARY logic from the CMake file. The static build can be set on the command line with CMake >= 3.15 by defining the policy and the CMAKE_MSVC_RUNTIME_LIBARY this way: cmake -G <gen> <options> -DCMAKE_POLICY_DEFAULT_CMP0091=NEW -DMSVC_BUILD_STATIC=ON -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded$<$<CONFIG:Debug>:Debug>" When MSVC_BUILD_DEBUG is set the test 'posix-mock-test' is skipped as it does not build with the static runtime.
74 lines
3.3 KiB
CMake
74 lines
3.3 KiB
CMake
# We can find some usecases which follow the guide of CMake which uses
|
|
# `enable_language(CUDA)` instead of `find_package(CUDA)` and let the CMake
|
|
# built-in functions use NVCC.
|
|
|
|
# See: https://cmake.org/cmake/help/latest/module/FindCUDA.html#replacement
|
|
#
|
|
# However, this requires CMake version 3.10 or higher and we can't be sure most
|
|
# of the CUDA projects are using those.
|
|
#
|
|
# This test relies on `find_package(CUDA)` in the parent CMake config.
|
|
|
|
# These can be updated when NVCC becomes ready for C++ 17 features
|
|
# https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#cpp14-language-features
|
|
set(CMAKE_CUDA_STANDARD 14)
|
|
set(CMAKE_CUDA_STANDARD_REQUIRED 14)
|
|
|
|
# In this test, we assume that the user is going to compile CUDA source code
|
|
# with some libraries (fmt in this case).
|
|
#
|
|
# In addition to that, this test invokes both the C++ host compiler and NVCC
|
|
# by providing another (non-CUDA) C++ source code.
|
|
if (${CMAKE_VERSION} VERSION_LESS 3.15)
|
|
# https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html
|
|
list(APPEND CUDA_NVCC_FLAGS "-std=c++14")
|
|
if (MSVC)
|
|
# This is the solution of pytorch:
|
|
# https://github.com/pytorch/pytorch/pull/7118
|
|
list(APPEND CUDA_NVCC_FLAGS "-Xcompiler" "/std:c++14")
|
|
list(APPEND CUDA_NVCC_FLAGS "-Xcompiler" "/Zc:__cplusplus")
|
|
# for the reason of this -Xcompiler options, see below.
|
|
endif ()
|
|
cuda_add_executable(fmt-in-cuda-test cuda-cpp14.cu cpp14.cc)
|
|
target_compile_features(fmt-in-cuda-test PRIVATE cxx_std_14)
|
|
if (MSVC)
|
|
# This part is for (non-CUDA) C++ code. MSVC can define incorrect
|
|
# `__cplusplus` macro. Fix for the issue is to use additional compiler flag.
|
|
#
|
|
# See Also:
|
|
# https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
|
|
# https://github.com/Microsoft/vscode-cpptools/issues/2595
|
|
target_compile_options(fmt-in-cuda-test PRIVATE /Zc:__cplusplus /permissive-)
|
|
endif ()
|
|
else()
|
|
# now using a "new" way of handling CUDA
|
|
add_executable(fmt-in-cuda-test cuda-cpp14.cu cpp14.cc)
|
|
set_target_properties(fmt-in-cuda-test PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
|
|
target_compile_features(fmt-in-cuda-test PRIVATE cxx_std_14)
|
|
if (MSVC)
|
|
# with MSVC, 'cxx_std_14' will only propagate to the host code (MSVC), but will
|
|
# not set __cplusplus correctly anyway, while nvcc will ignore it.
|
|
# If specified for nvcc on the command line as '-std=c++14' nvcc will emit this
|
|
# message instead:
|
|
# nvcc warning : The -std=c++14 flag is not supported with the configured host
|
|
# compiler. Flag will be ignored.
|
|
set_property(SOURCE cuda-cpp14.cu APPEND PROPERTY
|
|
COMPILE_OPTIONS -Xcompiler /std:c++14 -Xcompiler /Zc:__cplusplus)
|
|
set_property(SOURCE cpp14.cc APPEND PROPERTY
|
|
COMPILE_OPTIONS /std:c++14 /Zc:__cplusplus)
|
|
endif()
|
|
endif()
|
|
|
|
get_target_property(IN_USE_CUDA_STANDARD fmt-in-cuda-test CUDA_STANDARD)
|
|
message(STATUS "cuda_standard: ${IN_USE_CUDA_STANDARD}")
|
|
|
|
get_target_property(IN_USE_CUDA_STANDARD_REQUIRED
|
|
fmt-in-cuda-test CUDA_STANDARD_REQUIRED)
|
|
message(STATUS "cuda_standard_required: ${IN_USE_CUDA_STANDARD_REQUIRED}")
|
|
|
|
# We don't use PUBLIC or other keyword for reasons explained in the
|
|
# CUDA_LINK_LIBRARIES_KEYWORD section in
|
|
# https://cmake.org/cmake/help/latest/module/FindCUDA.html
|
|
target_link_libraries(fmt-in-cuda-test fmt::fmt)
|
|
|