From f8aca827dbcbc6f56f1617413cf570d6c986dd93 Mon Sep 17 00:00:00 2001 From: JF Bastien Date: Fri, 10 Jul 2015 20:24:17 +0000 Subject: [PATCH] Fix `llvm-config` to emit the linker flag for the combined shared object built by autoconfig/make instead of the individual components. Summary: This fixes `llvm-config` instead of fixing the makefiles because, AIUI, LLVM's autoconfig/make build system is on the way out anyway. This change only affects builds that use autoconfig/make. Reviewers: jfb Subscribers: echristo, dschuff, llvm-commits Differential Revision: http://reviews.llvm.org/D10716 llvm-svn: 241938 --- tools/llvm-config/BuildVariables.inc.in | 2 ++ tools/llvm-config/CMakeLists.txt | 1 + tools/llvm-config/Makefile | 6 ++++ tools/llvm-config/llvm-config.cpp | 43 +++++++++++++++++++++++-- 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/tools/llvm-config/BuildVariables.inc.in b/tools/llvm-config/BuildVariables.inc.in index 3f51f491a7a..66f7a16a4ce 100644 --- a/tools/llvm-config/BuildVariables.inc.in +++ b/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@" diff --git a/tools/llvm-config/CMakeLists.txt b/tools/llvm-config/CMakeLists.txt index d2ef45a1681..3d5c9e68e11 100644 --- a/tools/llvm-config/CMakeLists.txt +++ b/tools/llvm-config/CMakeLists.txt @@ -20,6 +20,7 @@ set(LLVM_CXXFLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_ 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) diff --git a/tools/llvm-config/Makefile b/tools/llvm-config/Makefile index 1ff8b6f0406..11e5d338771 100644 --- a/tools/llvm-config/Makefile +++ b/tools/llvm-config/Makefile @@ -65,6 +65,12 @@ $(ObjDir)/BuildVariables.inc: $(BUILDVARIABLES_SRCPATH) Makefile $(ObjDir)/.dir >> 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 diff --git a/tools/llvm-config/llvm-config.cpp b/tools/llvm-config/llvm-config.cpp index 879b9ab0945..c007d71baf1 100644 --- a/tools/llvm-config/llvm-config.cpp +++ b/tools/llvm-config/llvm-config.cpp @@ -349,6 +349,30 @@ int main(int argc, char **argv) { /*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 @@ int main(int argc, char **argv) { 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; }