Browse Source

Generator: support per-language link library flag

This enables the use of MSVC and Swift on Windows in a single project.
MSVC uses no flag to indicate linked libraries while Swift uses `-l`.
Add support for a language specific link library flag which takes
precedence over the global `CMAKE_LINK_LIBRARY_FLAG` which preserves
compatibility with earlier releases.
Saleem Abdulrasool 6 years ago
parent
commit
689be6235e

+ 1 - 0
Help/manual/cmake-variables.7.rst

@@ -383,6 +383,7 @@ Variables that Control the Build
    /variable/CMAKE_LANG_CPPCHECK
    /variable/CMAKE_LANG_CPPLINT
    /variable/CMAKE_LANG_INCLUDE_WHAT_YOU_USE
+   /variable/CMAKE_LANG_LINK_LIBRARY_FLAG
    /variable/CMAKE_LANG_VISIBILITY_PRESET
    /variable/CMAKE_LIBRARY_OUTPUT_DIRECTORY
    /variable/CMAKE_LIBRARY_OUTPUT_DIRECTORY_CONFIG

+ 7 - 0
Help/release/dev/per-lang-link-library-flag.rst

@@ -0,0 +1,7 @@
+per-lang-link-library-flag
+--------------------------
+
+* The new :variable:`CMAKE_<LANG>_LINK_LIBRARY_FLAG` flag allows you to now
+  control the flag used to specify linking to a library on a per-language basis.
+  This is useful for mixed-language projects where the different drivers may use
+  different flags.

+ 7 - 0
Help/variable/CMAKE_LANG_LINK_LIBRARY_FLAG.rst

@@ -0,0 +1,7 @@
+CMAKE_<LANG>_LINK_LIBRARY_FLAG
+------------------------------
+
+Flag to be used to link a library into a shared library or executable.
+
+This flag will be used to specify a library to link to a shared library or an
+executable for the specific language.  On most compilers this is ``-l``.

+ 1 - 0
Modules/CMakeSwiftInformation.cmake

@@ -36,6 +36,7 @@ set(CMAKE_Swift_DEFINE_FLAG -D)
 set(CMAKE_Swift_FRAMEWORK_SEARCH_FLAG "-F ")
 set(CMAKE_Swift_LIBRARY_PATH_FLAG "-L ")
 set(CMAKE_Swift_LIBRARY_PATH_TERMINATOR "")
+set(CMAKE_Swift_LINK_LIBRARY_FLAG "-l")
 set(CMAKE_Swift_LINKER_WRAPPER_FLAG "-Xlinker" " ")
 set(CMAKE_Swift_RESPONSE_FILE_LINK_FLAG @)
 

+ 7 - 2
Source/cmComputeLinkInformation.cxx

@@ -285,8 +285,13 @@ cmComputeLinkInformation::cmComputeLinkInformation(
   }
 
   // Get options needed to link libraries.
-  this->LibLinkFlag =
-    this->Makefile->GetSafeDefinition("CMAKE_LINK_LIBRARY_FLAG");
+  if (const char* flag = this->Makefile->GetDefinition(
+        "CMAKE_" + this->LinkLanguage + "_LINK_LIBRARY_FLAG")) {
+    this->LibLinkFlag = flag;
+  } else {
+    this->LibLinkFlag =
+      this->Makefile->GetSafeDefinition("CMAKE_LINK_LIBRARY_FLAG");
+  }
   this->LibLinkFileFlag =
     this->Makefile->GetSafeDefinition("CMAKE_LINK_LIBRARY_FILE_FLAG");
   this->LibLinkSuffix =