Browse Source

Per-language Win32/Console flags

Allows using different compilers with different flags for different languages.
For example Clang with GNU-like commandline for CXX and MSVC as host compiler
for CUDA.

Should help with #21914.
Raul Tambre 4 years ago
parent
commit
56c759b000

+ 1 - 1
Modules/Platform/CYGWIN-GNU.cmake

@@ -10,7 +10,6 @@ set(__CYGWIN_COMPILER_GNU 1)
 
 # TODO: Is -Wl,--enable-auto-import now always default?
 string(APPEND CMAKE_EXE_LINKER_FLAGS_INIT " -Wl,--enable-auto-import")
-set(CMAKE_CREATE_WIN32_EXE  "-mwindows")
 
 set(CMAKE_GNULD_IMAGE_VERSION
   "-Wl,--major-image-version,<TARGET_VERSION_MAJOR>,--minor-image-version,<TARGET_VERSION_MINOR>")
@@ -23,6 +22,7 @@ macro(__cygwin_compiler_gnu lang)
     "<CMAKE_${lang}_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_${lang}_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS> -o <TARGET> -Wl,--out-implib,<TARGET_IMPLIB> ${CMAKE_GNULD_IMAGE_VERSION} <OBJECTS> <LINK_LIBRARIES>")
   set(CMAKE_${lang}_LINK_EXECUTABLE
     "<CMAKE_${lang}_COMPILER> <FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> -Wl,--out-implib,<TARGET_IMPLIB> ${CMAKE_GNULD_IMAGE_VERSION} <LINK_LIBRARIES>")
+  set(CMAKE_${lang}_CREATE_WIN32_EXE "-mwindows")
 
    # No -fPIC on cygwin
   set(CMAKE_${lang}_COMPILE_OPTIONS_PIC "")

+ 2 - 2
Modules/Platform/Windows-Clang.cmake

@@ -71,8 +71,8 @@ macro(__windows_compiler_clang_gnu lang)
   set(CMAKE_${lang}_LINK_EXECUTABLE
     "<CMAKE_${lang}_COMPILER> -fuse-ld=lld-link -nostartfiles -nostdlib <FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> -Xlinker /implib:<TARGET_IMPLIB> -Xlinker /pdb:<TARGET_PDB> -Xlinker /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR> ${CMAKE_GNULD_IMAGE_VERSION} <LINK_LIBRARIES>")
 
-  set(CMAKE_CREATE_WIN32_EXE "-Xlinker /subsystem:windows")
-  set(CMAKE_CREATE_CONSOLE_EXE "-Xlinker /subsystem:console")
+  set(CMAKE_${lang}_CREATE_WIN32_EXE "-Xlinker /subsystem:windows")
+  set(CMAKE_${lang}_CREATE_CONSOLE_EXE "-Xlinker /subsystem:console")
 
   if(NOT "${lang}" STREQUAL "ASM")
     set(CMAKE_${lang}_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreaded         -Xclang -flto-visibility-public-std -D_MT -Xclang --dependent-lib=libcmt)

+ 3 - 5
Modules/Platform/Windows-Embarcadero.cmake

@@ -51,11 +51,6 @@ set(CMAKE_FIND_LIBRARY_SUFFIXES "-bcc.lib" ".lib")
 # Borland cannot handle + in the file name, so mangle object file name
 set (CMAKE_MANGLE_OBJECT_FILE_NAMES "ON")
 
-# extra flags for a win32 exe
-set(CMAKE_CREATE_WIN32_EXE "${_tW}" )
-# extra flags for a console app
-set(CMAKE_CREATE_CONSOLE_EXE "${_tC}" )
-
 set (CMAKE_BUILD_TYPE Debug CACHE STRING
      "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel.")
 
@@ -124,6 +119,9 @@ macro(__embarcadero_language lang)
     "tlib ${CMAKE_START_TEMP_FILE}/p512 <LINK_FLAGS> /a <TARGET_QUOTED> <OBJECTS>${CMAKE_END_TEMP_FILE}"
     )
 
+  set(CMAKE_${lang}_CREATE_WIN32_EXE "${_tW}")
+  set(CMAKE_${lang}_CREATE_CONSOLE_EXE "${_tC}")
+
   # Precompile Headers
   if (EMBARCADERO)
     set(CMAKE_PCH_EXTENSION .pch)

+ 1 - 1
Modules/Platform/Windows-GNU.cmake

@@ -35,7 +35,6 @@ set(CMAKE_LIBRARY_PATH_FLAG "-L")
 set(CMAKE_LINK_LIBRARY_FLAG "-l")
 set(CMAKE_LINK_DEF_FILE_FLAG "") # Empty string: passing the file is enough
 set(CMAKE_LINK_LIBRARY_SUFFIX "")
-set(CMAKE_CREATE_WIN32_EXE  "-mwindows")
 
 set(CMAKE_GNULD_IMAGE_VERSION
   "-Wl,--major-image-version,<TARGET_VERSION_MAJOR>,--minor-image-version,<TARGET_VERSION_MINOR>")
@@ -105,6 +104,7 @@ macro(__windows_compiler_gnu lang)
     "<CMAKE_${lang}_COMPILER> <CMAKE_SHARED_LIBRARY_${lang}_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS> -o <TARGET> -Wl,--out-implib,<TARGET_IMPLIB> ${CMAKE_GNULD_IMAGE_VERSION} <OBJECTS> <LINK_LIBRARIES>")
   set(CMAKE_${lang}_LINK_EXECUTABLE
     "<CMAKE_${lang}_COMPILER> <FLAGS> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> -Wl,--out-implib,<TARGET_IMPLIB> ${CMAKE_GNULD_IMAGE_VERSION} <LINK_LIBRARIES>")
+  set(CMAKE_${lang}_CREATE_WIN32_EXE "-mwindows")
 
   list(APPEND CMAKE_${lang}_ABI_FILES "Platform/Windows-GNU-${lang}-ABI")
 

+ 8 - 4
Modules/Platform/Windows-MSVC.cmake

@@ -27,12 +27,8 @@ else()
 endif()
 
 if(CMAKE_SYSTEM_NAME STREQUAL "WindowsCE")
-  set(CMAKE_CREATE_WIN32_EXE "/entry:WinMainCRTStartup")
-  set(CMAKE_CREATE_CONSOLE_EXE "/entry:mainACRTStartup")
   set(_PLATFORM_LINK_FLAGS " /subsystem:windowsce")
 else()
-  set(CMAKE_CREATE_WIN32_EXE "/subsystem:windows")
-  set(CMAKE_CREATE_CONSOLE_EXE "/subsystem:console")
   set(_PLATFORM_LINK_FLAGS "")
 endif()
 
@@ -351,6 +347,14 @@ macro(__windows_compiler_msvc lang)
   set(CMAKE_${lang}_LINK_EXECUTABLE
     "${_CMAKE_VS_LINK_EXE}<CMAKE_LINKER> ${CMAKE_CL_NOLOGO} <OBJECTS> ${CMAKE_START_TEMP_FILE} /out:<TARGET> /implib:<TARGET_IMPLIB> /pdb:<TARGET_PDB> /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR>${_PLATFORM_LINK_FLAGS} <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES>${CMAKE_END_TEMP_FILE}")
 
+  if(CMAKE_SYSTEM_NAME STREQUAL "WindowsCE")
+    set(CMAKE_${lang}_CREATE_WIN32_EXE "/entry:WinMainCRTStartup")
+    set(CMAKE_${lang}_CREATE_CONSOLE_EXE "/entry:mainACRTStartup")
+  else()
+    set(CMAKE_${lang}_CREATE_WIN32_EXE "/subsystem:windows")
+    set(CMAKE_${lang}_CREATE_CONSOLE_EXE "/subsystem:console")
+  endif()
+
   set(CMAKE_PCH_EXTENSION .pch)
   set(CMAKE_LINK_PCH ON)
   if (CMAKE_${lang}_COMPILER_ID STREQUAL "Clang")

+ 1 - 0
Modules/Platform/Windows-OpenWatcom-C.cmake

@@ -1 +1,2 @@
 include(Platform/Windows-OpenWatcom)
+__windows_open_watcom(C)

+ 1 - 0
Modules/Platform/Windows-OpenWatcom-CXX.cmake

@@ -1 +1,2 @@
 include(Platform/Windows-OpenWatcom)
+__windows_open_watcom(CXX)

+ 5 - 2
Modules/Platform/Windows-OpenWatcom.cmake

@@ -6,8 +6,6 @@ include_guard()
 
 set(CMAKE_BUILD_TYPE_INIT Debug)
 
-set(CMAKE_CREATE_WIN32_EXE "system nt_win" )
-set(CMAKE_CREATE_CONSOLE_EXE "system nt" )
 string(APPEND CMAKE_SHARED_LINKER_FLAGS_INIT " system nt_dll")
 string(APPEND CMAKE_MODULE_LINKER_FLAGS_INIT " system nt_dll")
 
@@ -30,3 +28,8 @@ if(CMAKE_CROSSCOMPILING)
     set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES $ENV{WATCOM}/h $ENV{WATCOM}/h/nt)
   endif()
 endif()
+
+macro(__windows_open_watcom lang)
+  set(CMAKE_${lang}_CREATE_WIN32_EXE "system nt_win")
+  set(CMAKE_${lang}_CREATE_CONSOLE_EXE "system nt")
+endmacro()

+ 2 - 2
Modules/Platform/Windows-df.cmake

@@ -27,8 +27,8 @@ set(CMAKE_Fortran_COMPILE_OBJECT
 set(CMAKE_Fortran_LINK_EXECUTABLE
     "<CMAKE_Fortran_COMPILER> ${CMAKE_CL_NOLOGO} ${CMAKE_START_TEMP_FILE} <FLAGS> /exe:<TARGET> <OBJECTS> /link <CMAKE_Fortran_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES>${CMAKE_END_TEMP_FILE}")
 
-set(CMAKE_CREATE_WIN32_EXE /winapp)
-set(CMAKE_CREATE_CONSOLE_EXE )
+set(CMAKE_Fortran_CREATE_WIN32_EXE /winapp)
+set(CMAKE_Fortran_CREATE_CONSOLE_EXE )
 
 # does the compiler support pdbtype and is it the newer compiler
 

+ 4 - 4
Source/cmLocalGenerator.cxx

@@ -1527,12 +1527,12 @@ void cmLocalGenerator::GetTargetFlags(
         }
 
         if (target->IsWin32Executable(config)) {
-          exeFlags +=
-            this->Makefile->GetSafeDefinition("CMAKE_CREATE_WIN32_EXE");
+          exeFlags += this->Makefile->GetSafeDefinition(
+            cmStrCat("CMAKE_", linkLanguage, "_CREATE_WIN32_EXE"));
           exeFlags += " ";
         } else {
-          exeFlags +=
-            this->Makefile->GetSafeDefinition("CMAKE_CREATE_CONSOLE_EXE");
+          exeFlags += this->Makefile->GetSafeDefinition(
+            cmStrCat("CMAKE_", linkLanguage, "_CREATE_CONSOLE_EXE"));
           exeFlags += " ";
         }
 

+ 5 - 2
Source/cmMakefileExecutableTargetGenerator.cxx

@@ -384,11 +384,14 @@ void cmMakefileExecutableTargetGenerator::WriteExecutableRule(bool relink)
   if (this->GeneratorTarget->IsWin32Executable(
         this->Makefile->GetSafeDefinition("CMAKE_BUILD_TYPE"))) {
     this->LocalGenerator->AppendFlags(
-      linkFlags, this->Makefile->GetSafeDefinition("CMAKE_CREATE_WIN32_EXE"));
+      linkFlags,
+      this->Makefile->GetSafeDefinition(
+        cmStrCat("CMAKE_", linkLanguage, "_CREATE_WIN32_EXE")));
   } else {
     this->LocalGenerator->AppendFlags(
       linkFlags,
-      this->Makefile->GetSafeDefinition("CMAKE_CREATE_CONSOLE_EXE"));
+      this->Makefile->GetSafeDefinition(
+        cmStrCat("CMAKE_", linkLanguage, "_CREATE_CONSOLE_EXE")));
   }
 
   // Add symbol export flags if necessary.

+ 1 - 1
Tests/Fortran/CMakeLists.txt

@@ -131,7 +131,7 @@ else()
   # as a language, cmake needs language specific versions
   # of these variables....
   if(WIN32 AND CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
-    set(CMAKE_CREATE_CONSOLE_EXE )
+    set(CMAKE_Fortran_CREATE_CONSOLE_EXE )
     set(CMAKE_LIBRARY_PATH_FLAG "-L")
     set(CMAKE_LINK_LIBRARY_FLAG "-l")
     set(CMAKE_LINK_LIBRARY_SUFFIX )