From 5dd6716ee9a51ae10fe195987e4a17db20a6774f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Camilla=20L=C3=B6wy?= Date: Mon, 12 Apr 2021 20:56:53 +0200 Subject: [PATCH] Win32: Fix compilation with standalone LLVM The /clang: suffix passed to Clang-CL was accidentally also passed to the regular standalone Clang, which caused compilation to fail. We now pass /W3 to Clang-CL, which it interprets as -Wall. The _CRT_SECURE_NO_WARNINGS macro is now defined for both Clang and Clang-CL. The /entry: flag passed to link.exe is now also passed to lld-link, letting the windows subsystem tests and examples link. Fixes #1807. Closes #1824. Closes #1874. (cherry picked from commit 061a0263a9783c1442ad96a061c717c167ab4a76) --- README.md | 1 + examples/CMakeLists.txt | 9 +++++++-- src/CMakeLists.txt | 20 ++++++++------------ tests/CMakeLists.txt | 9 +++++++-- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index fe1d6634..7db24057 100644 --- a/README.md +++ b/README.md @@ -120,6 +120,7 @@ information on what to include when reporting a bug. - [Win32] Bugfix: `USE_MSVC_RUNTIME_LIBRARY_DLL` had no effect on CMake 3.15 or later (#1783,#1796) + - [Win32] Bugfix: Compilation with LLVM for Windows failed (#1807,#1824,#1874) ## Contact diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index a884e6bc..0eba4e65 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -7,7 +7,8 @@ if (MATH_LIBRARY) link_libraries("${MATH_LIBRARY}") endif() -if (MSVC) +# Workaround for the MS CRT deprecating parts of the standard library +if (MSVC OR CMAKE_C_SIMULATE_ID STREQUAL "MSVC") add_definitions(-D_CRT_SECURE_NO_WARNINGS) endif() @@ -62,9 +63,13 @@ if (GLFW_USE_OSMESA) endif() if (MSVC) - # Tell MSVC to use main instead of WinMain for Windows subsystem executables + # Tell MSVC to use main instead of WinMain set_target_properties(${GUI_ONLY_BINARIES} PROPERTIES LINK_FLAGS "/ENTRY:mainCRTStartup") +elseif (CMAKE_C_SIMULATE_ID STREQUAL "MSVC") + # Tell Clang using MS CRT to use main instead of WinMain + set_target_properties(${GUI_ONLY_BINARIES} PROPERTIES + LINK_FLAGS "-Wl,/entry:mainCRTStartup") endif() if (APPLE) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a409459b..0d0f52f3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -121,18 +121,14 @@ if (CMAKE_C_COMPILER_ID STREQUAL "GNU") endif() # Enable a reasonable set of warnings -if (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR - CMAKE_C_COMPILER_ID STREQUAL "Clang" OR - CMAKE_C_COMPILER_ID STREQUAL "AppleClang") - - if (CMAKE_C_SIMULATE_ID STREQUAL "MSVC") - # Tell Clang-CL that this is a Clang flag - target_compile_options(glfw PRIVATE "/clang:-Wall") - else() - target_compile_options(glfw PRIVATE "-Wall") - endif() -elseif (MSVC) +# NOTE: The order matters here, Clang-CL matches both MSVC and Clang +if (MSVC) target_compile_options(glfw PRIVATE "/W3") +elseif (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR + CMAKE_C_COMPILER_ID STREQUAL "Clang" OR + CMAKE_C_COMPILER_ID STREQUAL "AppleClang") + + target_compile_options(glfw PRIVATE "-Wall") endif() if (WIN32) @@ -176,7 +172,7 @@ if (BUILD_SHARED_LIBS) endif() endif() -if (MSVC) +if (MSVC OR CMAKE_C_SIMULATE_ID STREQUAL "MSVC") target_compile_definitions(glfw PRIVATE _CRT_SECURE_NO_WARNINGS) endif() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5232720f..91374b2f 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -7,7 +7,8 @@ if (MATH_LIBRARY) link_libraries("${MATH_LIBRARY}") endif() -if (MSVC) +# Workaround for the MS CRT deprecating parts of the standard library +if (MSVC OR CMAKE_C_SIMULATE_ID STREQUAL "MSVC") add_definitions(-D_CRT_SECURE_NO_WARNINGS) endif() @@ -69,9 +70,13 @@ set_target_properties(${GUI_ONLY_BINARIES} ${CONSOLE_BINARIES} PROPERTIES FOLDER "GLFW3/Tests") if (MSVC) - # Tell MSVC to use main instead of WinMain for Windows subsystem executables + # Tell MSVC to use main instead of WinMain set_target_properties(${GUI_ONLY_BINARIES} PROPERTIES LINK_FLAGS "/ENTRY:mainCRTStartup") +elseif (CMAKE_C_SIMULATE_ID STREQUAL "MSVC") + # Tell Clang using MS CRT to use main instead of WinMain + set_target_properties(${GUI_ONLY_BINARIES} PROPERTIES + LINK_FLAGS "-Wl,/entry:mainCRTStartup") endif() if (APPLE)