[PATCH] D10716: Fix `llvm-config` to emit the linker flag for the combined shared object built by autoconfig/make instead of the individual components.

Richard Diamond wichard at vitalitystudios.com
Tue Jul 7 14:47:54 PDT 2015



Restructure in response to JF's comments.


Repository:
  rL LLVM

http://reviews.llvm.org/D10716

Files:
  tools/llvm-config/BuildVariables.inc.in
  tools/llvm-config/CMakeLists.txt
  tools/llvm-config/Makefile
  tools/llvm-config/llvm-config.cpp

Index: tools/llvm-config/llvm-config.cpp
===================================================================
--- tools/llvm-config/llvm-config.cpp
+++ tools/llvm-config/llvm-config.cpp
@@ -349,6 +349,30 @@
                              /*IncludeNonInstalled=*/IsInDevelopmentTree);
 
     if (PrintLibs || PrintLibNames || PrintLibFiles) {
+      // If LLVM was built as a shared library, there will be only one thing
+      // that users should link against.
+      const bool IsSharedLib = (std::strcmp(BUILD_SHARED_LIBS, "ON") == 0);
+      const bool WasBuiltWithCMake = (std::strcmp(WAS_BUILT_WITH_CMAKE, "ON") == 0);
+      // CMake correctly builds components as separate shared libraries, however
+      // autoconfig/make builds components a static libraries and then links
+      // them all together to form a single shared library. Thus, only when
+      // `WAS_BUILT_WITH_CMAKE` is `OFF` and `BUILD_SHARED_LIBS` is `ON` do we
+      // override `RequiredLibs` with the single library name.
+      if (IsSharedLib && !WasBuiltWithCMake) {
+        RequiredLibs.clear();
+        std::string Name = "libLLVM-" PACKAGE_VERSION;
+        const Triple HostTriple(LLVM_DEFAULT_TARGET_TRIPLE);
+        if (HostTriple.isOSWindows()) {
+          Name += ".dll";
+        } else if (HostTriple.isOSDarwin()) {
+          Name += ".dylib";
+        } else {
+          // default to linux' ext:
+          Name += ".so";
+        }
+        RequiredLibs.push_back(Name);
+      }
+
       for (unsigned i = 0, e = RequiredLibs.size(); i != e; ++i) {
         StringRef Lib = RequiredLibs[i];
         if (i)
@@ -360,8 +384,23 @@
           OS << ActiveLibDir << '/' << Lib;
         } else if (PrintLibs) {
           // If this is a typical library name, include it using -l.
-          if (Lib.startswith("lib") && Lib.endswith(".a")) {
-            OS << "-l" << Lib.slice(3, Lib.size()-2);
+          if (Lib.startswith("lib")) {
+            size_t FromEnd = 0;
+            if (Lib.endswith(".a")) {
+              FromEnd = 2;
+            } else if (Lib.endswith(".so")) {
+              FromEnd = 3;
+            } else if (Lib.endswith(".dylib")) {
+              FromEnd = 6;
+            } else {
+              FromEnd = 0;
+            }
+
+            if (FromEnd != 0) {
+              OS << "-l" << Lib.slice(3, Lib.size() - FromEnd);
+            } else {
+              OS << "-l:" << Lib;
+            }
             continue;
           }
 
Index: tools/llvm-config/Makefile
===================================================================
--- tools/llvm-config/Makefile
+++ tools/llvm-config/Makefile
@@ -65,6 +65,12 @@
 	  >> temp.sed
 	$(Verb) $(ECHO) 's/@LLVM_TARGETS_BUILT@/$(subst /,\/,$(TARGETS_TO_BUILD))/' \
 	  >> temp.sed
+	$(if $(filter-out $(ENABLE_SHARED),0),\
+	  $(Verb) $(ECHO) 's/@BUILD_SHARED_LIBS@/ON/',\
+	  $(Verb) $(ECHO) 's/@BUILD_SHARED_LIBS@/OFF/') \
+	  >> temp.sed
+	$(Verb) $(ECHO) 's/@WAS_BUILT_WITH_CMAKE@/OFF/' \
+	  >> temp.sed
 	$(Verb) $(SED) -f temp.sed < $< > $@
 	$(Verb) $(RM) temp.sed
 
Index: tools/llvm-config/CMakeLists.txt
===================================================================
--- tools/llvm-config/CMakeLists.txt
+++ tools/llvm-config/CMakeLists.txt
@@ -20,6 +20,7 @@
 set(LLVM_LDFLAGS "${CMAKE_CXX_LINK_FLAGS}")
 set(LLVM_BUILDMODE ${CMAKE_BUILD_TYPE})
 set(LLVM_SYSTEM_LIBS ${SYSTEM_LIBS})
+set(WAS_BUILT_WITH_CMAKE "ON")
 string(REPLACE ";" " " LLVM_TARGETS_BUILT "${LLVM_TARGETS_TO_BUILD}")
 configure_file(${BUILDVARIABLES_SRCPATH} ${BUILDVARIABLES_OBJPATH} @ONLY)
 
Index: tools/llvm-config/BuildVariables.inc.in
===================================================================
--- tools/llvm-config/BuildVariables.inc.in
+++ tools/llvm-config/BuildVariables.inc.in
@@ -26,3 +26,5 @@
 #define LLVM_LIBDIR_SUFFIX "@LLVM_LIBDIR_SUFFIX@"
 #define LLVM_TARGETS_BUILT "@LLVM_TARGETS_BUILT@"
 #define LLVM_SYSTEM_LIBS "@LLVM_SYSTEM_LIBS@"
+#define BUILD_SHARED_LIBS "@BUILD_SHARED_LIBS@"
+#define WAS_BUILT_WITH_CMAKE "@WAS_BUILT_WITH_CMAKE@"


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D10716.29214.patch
Type: text/x-patch
Size: 4034 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150707/00597027/attachment.bin>


More information about the llvm-commits mailing list