| Index: tools/llvm-config/llvm-config.cpp
|
| diff --git a/tools/llvm-config/llvm-config.cpp b/tools/llvm-config/llvm-config.cpp
|
| index 879b9ab0945ba64235584f2d1e2652bff8bc7c23..012884c971680e23582ae93c0101f4e21f66f6df 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` and `BUILD_SHARED_LIBS` are `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,9 +384,22 @@ 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);
|
| - continue;
|
| + if (Lib.startswith("lib")) {
|
| + size_t FromEnd = 0;
|
| + do {
|
| + if (Lib.endswith(".a")) {
|
| + FromEnd = 2;
|
| + } else if (Lib.endswith(".so")) {
|
| + FromEnd = 3;
|
| + } else if (Lib.endswith(".dylib")) {
|
| + FromEnd = 6;
|
| + } else {
|
| + FromEnd = 0;
|
| + break;
|
| + }
|
| + OS << "-l" << Lib.slice(3, Lib.size() - FromEnd);
|
| + } while(false);
|
| + if (FromEnd != 0) { continue; }
|
| }
|
|
|
| // Otherwise, print the full path.
|
|
|