[llvm] r258283 - tools/llvm-config: improve shared library support
Evgenii Stepanov via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 20 16:55:17 PST 2016
libLLVMGlobalISel.a can not be built because LLVM_BUILD_GLOBAL_ISEL is OFF.
It's a clean build on Linux with
-DCMAKE_BUILD_TYPE=Release
-DLLVM_ENABLE_ASSERTIONS=ON
-DLLVM_ENABLE_WERROR=ON
-DLLVM_BINUTILS_INCDIR=...
In cmake cache,
BUILD_SHARED_LIBS:BOOL=OFF
LLVM_LINK_LLVM_DYLIB:BOOL=OFF
LLVM_BUILD_LLVM_DYLIB:BOOL=OFF
On Wed, Jan 20, 2016 at 4:42 PM, Andrew Wilkins <axwalk at gmail.com> wrote:
> On Thu, 21 Jan 2016 at 06:01 Evgenii Stepanov <eugeni.stepanov at gmail.com>
> wrote:
>>
>> Hi,
>>
>> with this, I get the following failure in Bindings/Go/go.test:
>>
>> llvm-config: error: component libraries and shared library
>>
>> llvm-config: error: missing: /code/build-llvm/lib/libLLVMGlobalISel.a
>> llvm-config: error: missing:
>> /code/build-llvm/lib/libLLVMDebugInfoCodeView.a
>
>
> - Is this a clean build?
> - Do you have BUILD_SHARED_LIBRARIES set?
> - LLVM_LINK_LLVM_DYLIB?
> - LLVM_BUILD_LLVM_DYLIB?
>
> It's probably due to missing dependencies in CMake. I'll try to look into
> this later today.
>
> Cheers,
> Andrew
>
>> panic: exit status 1
>>
>> goroutine 1 [running]:
>> main.llvmConfig(0xc8200757e0, 0x3, 0x3, 0x0, 0x0)
>> /code/llvm/tools/llvm-go/llvm-go.go:82 +0x2c3
>> main.llvmFlags(0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
>> /code/llvm/tools/llvm-go/llvm-go.go:92 +0xd3
>> main.runGoWithLLVMEnv(0xc8200a8060, 0x4, 0x6, 0xc820012043, 0x1b,
>> 0xc82000e0c4, 0x1d, 0x7fff14e00cb1, 0x1d, 0x0, ...)
>> /code/llvm/tools/llvm-go/llvm-go.go:176 +0x8aa
>> main.main()
>> /code/llvm/tools/llvm-go/llvm-go.go:275 +0x6c5
>>
>> On Tue, Jan 19, 2016 at 8:03 PM, Andrew Wilkins via llvm-commits
>> <llvm-commits at lists.llvm.org> wrote:
>> > Author: axw
>> > Date: Tue Jan 19 22:03:09 2016
>> > New Revision: 258283
>> >
>> > URL: http://llvm.org/viewvc/llvm-project?rev=258283&view=rev
>> > Log:
>> > tools/llvm-config: improve shared library support
>> >
>> > Summary:
>> >
>> > This is a re-commit of r257003, which was reverted,
>> > along with the fixes from http://reviews.llvm.org/D15986.
>> >
>> > r252532 added support for reporting the monolithic library
>> > when LLVM_BUILD_LLVM_DYLIB is used. This would only be done
>> > if the individual components were not found, and the dynamic
>> > library is found.
>> >
>> > This diff extends this as follows:
>> > - If LLVM_LINK_LLVM_DYLIB is set, then prefer the shared
>> > library, even if all component libraries exist.
>> > - Two flags, --link-shared and --link-static are introduced
>> > to provide explicit guidance. If --link-shared is passed
>> > and the shared library does not exist, an error results.
>> >
>> > Additionally, changed the expected shared library names from
>> > (e.g.) LLVM-3.8.0 to LLVM-3.8. The former exists only in an
>> > installation (and then only in CMake builds I think?), and not
>> > in the build tree; this breaks usage of llvm-config during
>> > builds, e.g. by llvm-go.
>> >
>> > Reviewers: DiamondLovesYou, beanz
>> >
>> > Subscribers: llvm-commits
>> >
>> > Differential Revision: http://reviews.llvm.org/D15986
>> >
>> >
>> > Modified:
>> > llvm/trunk/cmake/modules/AddLLVM.cmake
>> > llvm/trunk/tools/llvm-config/BuildVariables.inc.in
>> > llvm/trunk/tools/llvm-config/CMakeLists.txt
>> > llvm/trunk/tools/llvm-config/Makefile
>> > llvm/trunk/tools/llvm-config/llvm-config.cpp
>> > llvm/trunk/tools/llvm-go/llvm-go.go
>> >
>> > Modified: llvm/trunk/cmake/modules/AddLLVM.cmake
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/cmake/modules/AddLLVM.cmake?rev=258283&r1=258282&r2=258283&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/cmake/modules/AddLLVM.cmake (original)
>> > +++ llvm/trunk/cmake/modules/AddLLVM.cmake Tue Jan 19 22:03:09 2016
>> > @@ -913,13 +913,8 @@ function(llvm_add_go_executable binary p
>> > set(cppflags "${cppflags} -I${d}")
>> > endforeach(d)
>> > set(ldflags "${CMAKE_EXE_LINKER_FLAGS}")
>> > - if (LLVM_LINK_LLVM_DYLIB)
>> > - set(linkmode "dylib")
>> > - else()
>> > - set(linkmode "component-libs")
>> > - endif()
>> > add_custom_command(OUTPUT ${binpath}
>> > - COMMAND ${CMAKE_BINARY_DIR}/bin/llvm-go "go=${GO_EXECUTABLE}"
>> > "cc=${cc}" "cxx=${cxx}" "cppflags=${cppflags}" "ldflags=${ldflags}"
>> > "linkmode=${linkmode}"
>> > + COMMAND ${CMAKE_BINARY_DIR}/bin/llvm-go "go=${GO_EXECUTABLE}"
>> > "cc=${cc}" "cxx=${cxx}" "cppflags=${cppflags}" "ldflags=${ldflags}"
>> > ${ARG_GOFLAGS} build -o ${binpath} ${pkgpath}
>> > DEPENDS llvm-config
>> > ${CMAKE_BINARY_DIR}/bin/llvm-go${CMAKE_EXECUTABLE_SUFFIX}
>> > ${llvmlibs} ${ARG_DEPENDS}
>> >
>> > Modified: llvm/trunk/tools/llvm-config/BuildVariables.inc.in
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-config/BuildVariables.inc.in?rev=258283&r1=258282&r2=258283&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/tools/llvm-config/BuildVariables.inc.in (original)
>> > +++ llvm/trunk/tools/llvm-config/BuildVariables.inc.in Tue Jan 19
>> > 22:03:09 2016
>> > @@ -29,5 +29,7 @@
>> > #define LLVM_BUILD_SYSTEM "@LLVM_BUILD_SYSTEM@"
>> > #define LLVM_HAS_RTTI "@LLVM_HAS_RTTI@"
>> > #define LLVM_ENABLE_DYLIB "@LLVM_BUILD_LLVM_DYLIB@"
>> > +#define LLVM_LINK_DYLIB "@LLVM_LINK_LLVM_DYLIB@"
>> > #define LLVM_ENABLE_SHARED "@LLVM_ENABLE_SHARED@"
>> > #define LLVM_DYLIB_COMPONENTS "@LLVM_DYLIB_COMPONENTS@"
>> > +#define LLVM_DYLIB_VERSION "@LLVM_DYLIB_VERSION@"
>> >
>> > Modified: llvm/trunk/tools/llvm-config/CMakeLists.txt
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-config/CMakeLists.txt?rev=258283&r1=258282&r2=258283&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/tools/llvm-config/CMakeLists.txt (original)
>> > +++ llvm/trunk/tools/llvm-config/CMakeLists.txt Tue Jan 19 22:03:09 2016
>> > @@ -26,6 +26,7 @@ set(LLVM_CFLAGS "${CMAKE_C_FLAGS} ${CMAK
>> > set(LLVM_CXXFLAGS "${CMAKE_CXX_FLAGS}
>> > ${CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${COMPILE_FLAGS}
>> > ${LLVM_DEFINITIONS}")
>> > set(LLVM_BUILD_SYSTEM cmake)
>> > set(LLVM_HAS_RTTI ${LLVM_CONFIG_HAS_RTTI})
>> > +set(LLVM_DYLIB_VERSION
>> > "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}${LLVM_VERSION_SUFFIX}")
>> >
>> > # Use the C++ link flags, since they should be a superset of C link
>> > flags.
>> > set(LLVM_LDFLAGS "${CMAKE_CXX_LINK_FLAGS}")
>> >
>> > Modified: llvm/trunk/tools/llvm-config/Makefile
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-config/Makefile?rev=258283&r1=258282&r2=258283&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/tools/llvm-config/Makefile (original)
>> > +++ llvm/trunk/tools/llvm-config/Makefile Tue Jan 19 22:03:09 2016
>> > @@ -44,6 +44,8 @@ else
>> > LLVM_HAS_RTTI := YES
>> > endif
>> >
>> > +LLVM_DYLIB_VERSION :=
>> > $(LLVM_VERSION_MAJOR).$(LLVM_VERSION_MINOR)$(LLVM_VERSION_SUFFIX)
>> > +
>> > # This is blank for now. We need to be careful about adding stuff
>> > here:
>> > # LDFLAGS tend not to be portable, and we don't currently require the
>> > # user to use libtool when linking against LLVM.
>> > @@ -83,6 +85,8 @@ $(ObjDir)/BuildVariables.inc: $(BUILDVAR
>> > >> temp.sed
>> > $(Verb) $(ECHO) 's/@LLVM_HAS_RTTI@/$(LLVM_HAS_RTTI)/' \
>> > >> temp.sed
>> > + $(Verb) $(ECHO) 's/@LLVM_DYLIB_VERSION@/$(LLVM_DYLIB_VERSION)/'
>> > \
>> > + >> temp.sed
>> > $(Verb) $(SED) -f temp.sed < $< > $@
>> > $(Verb) $(RM) temp.sed
>> >
>> >
>> > Modified: llvm/trunk/tools/llvm-config/llvm-config.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-config/llvm-config.cpp?rev=258283&r1=258282&r2=258283&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/tools/llvm-config/llvm-config.cpp (original)
>> > +++ llvm/trunk/tools/llvm-config/llvm-config.cpp Tue Jan 19 22:03:09
>> > 2016
>> > @@ -29,8 +29,8 @@
>> > #include "llvm/Support/raw_ostream.h"
>> > #include <cstdlib>
>> > #include <set>
>> > -#include <vector>
>> > #include <unordered_set>
>> > +#include <vector>
>> >
>> > using namespace llvm;
>> >
>> > @@ -46,6 +46,22 @@ using namespace llvm;
>> > // create entries for pseudo groups like x86 or all-targets.
>> > #include "LibraryDependencies.inc"
>> >
>> > +// LinkMode determines what libraries and flags are returned by
>> > llvm-config.
>> > +enum LinkMode {
>> > + // LinkModeAuto will link with the default link mode for the
>> > installation,
>> > + // which is dependent on the value of LLVM_LINK_LLVM_DYLIB, and fall
>> > back
>> > + // to the alternative if the required libraries are not available.
>> > + LinkModeAuto = 0,
>> > +
>> > + // LinkModeShared will link with the dynamic component libraries if
>> > they
>> > + // exist, and return an error otherwise.
>> > + LinkModeShared = 1,
>> > +
>> > + // LinkModeStatic will link with the static component libraries if
>> > they
>> > + // exist, and return an error otherwise.
>> > + LinkModeStatic = 2,
>> > +};
>> > +
>> > /// \brief Traverse a single component adding to the topological
>> > ordering in
>> > /// \arg RequiredLibs.
>> > ///
>> > @@ -56,12 +72,14 @@ using namespace llvm;
>> > /// libraries.
>> > /// \param GetComponentNames - Get the component names instead of the
>> > /// library name.
>> > -static void VisitComponent(const std::string& Name,
>> > - const StringMap<AvailableComponent*>
>> > &ComponentMap,
>> > - std::set<AvailableComponent*>
>> > &VisitedComponents,
>> > +static void VisitComponent(const std::string &Name,
>> > + const StringMap<AvailableComponent *>
>> > &ComponentMap,
>> > + std::set<AvailableComponent *>
>> > &VisitedComponents,
>> > std::vector<std::string> &RequiredLibs,
>> > bool IncludeNonInstalled, bool
>> > GetComponentNames,
>> > - const std::string *ActiveLibDir, bool
>> > *HasMissing) {
>> > + const std::function<std::string(const
>> > StringRef &)>
>> > + *GetComponentLibraryPath,
>> > + std::vector<std::string> *Missing) {
>> > // Lookup the component.
>> > AvailableComponent *AC = ComponentMap.lookup(Name);
>> > assert(AC && "Invalid component name!");
>> > @@ -80,7 +98,7 @@ static void VisitComponent(const std::st
>> > for (unsigned i = 0; AC->RequiredLibraries[i]; ++i) {
>> > VisitComponent(AC->RequiredLibraries[i], ComponentMap,
>> > VisitedComponents,
>> > RequiredLibs, IncludeNonInstalled,
>> > GetComponentNames,
>> > - ActiveLibDir, HasMissing);
>> > + GetComponentLibraryPath, Missing);
>> > }
>> >
>> > if (GetComponentNames) {
>> > @@ -90,8 +108,10 @@ static void VisitComponent(const std::st
>> >
>> > // Add to the required library list.
>> > if (AC->Library) {
>> > - if (!IncludeNonInstalled && HasMissing && !*HasMissing &&
>> > ActiveLibDir) {
>> > - *HasMissing = !sys::fs::exists(*ActiveLibDir + "/" +
>> > AC->Library);
>> > + if (Missing && GetComponentLibraryPath) {
>> > + std::string path = (*GetComponentLibraryPath)(AC->Library);
>> > + if (!sys::fs::exists(path))
>> > + Missing->push_back(path);
>> > }
>> > RequiredLibs.push_back(AC->Library);
>> > }
>> > @@ -108,12 +128,14 @@ static void VisitComponent(const std::st
>> > static std::vector<std::string>
>> > ComputeLibsForComponents(const std::vector<StringRef> &Components,
>> > bool IncludeNonInstalled, bool
>> > GetComponentNames,
>> > - const std::string *ActiveLibDir, bool
>> > *HasMissing) {
>> > + const std::function<std::string(const
>> > StringRef &)>
>> > + *GetComponentLibraryPath,
>> > + std::vector<std::string> *Missing) {
>> > std::vector<std::string> RequiredLibs;
>> > std::set<AvailableComponent *> VisitedComponents;
>> >
>> > // Build a map of component names to information.
>> > - StringMap<AvailableComponent*> ComponentMap;
>> > + StringMap<AvailableComponent *> ComponentMap;
>> > for (unsigned i = 0; i != array_lengthof(AvailableComponents); ++i) {
>> > AvailableComponent *AC = &AvailableComponents[i];
>> > ComponentMap[AC->Name] = AC;
>> > @@ -133,7 +155,7 @@ ComputeLibsForComponents(const std::vect
>> >
>> > VisitComponent(ComponentLower, ComponentMap, VisitedComponents,
>> > RequiredLibs, IncludeNonInstalled,
>> > GetComponentNames,
>> > - ActiveLibDir, HasMissing);
>> > + GetComponentLibraryPath, Missing);
>> > }
>> >
>> > // The list is now ordered with leafs first, we want the libraries to
>> > printed
>> > @@ -179,6 +201,8 @@ Options:\n\
>> > --build-system Print the build system used to build LLVM (autoconf
>> > or cmake).\n\
>> > --has-rtti Print whether or not LLVM was built with rtti (YES
>> > or NO).\n\
>> > --shared-mode Print how the provided components can be
>> > collectively linked (`shared` or `static`).\n\
>> > + --link-shared Link the components as shared libraries.\n\
>> > + --link-static Link the component libraries statically.\n\
>> > Typical components:\n\
>> > all All LLVM libraries (default).\n\
>> > engine Either a native JIT or a bitcode interpreter.\n";
>> > @@ -189,7 +213,7 @@ Typical components:\n\
>> > std::string GetExecutablePath(const char *Argv0) {
>> > // This just needs to be some symbol in the binary; C++ doesn't
>> > // allow taking the address of ::main however.
>> > - void *P = (void*) (intptr_t) GetExecutablePath;
>> > + void *P = (void *)(intptr_t)GetExecutablePath;
>> > return llvm::sys::fs::getMainExecutable(Argv0, P);
>> > }
>> >
>> > @@ -243,8 +267,8 @@ int main(int argc, char **argv) {
>> > // Create an absolute path, and pop up one directory (we expect to be
>> > inside a
>> > // bin dir).
>> > sys::fs::make_absolute(CurrentPath);
>> > - CurrentExecPrefix = sys::path::parent_path(
>> > - sys::path::parent_path(CurrentPath)).str();
>> > + CurrentExecPrefix =
>> > +
>> > sys::path::parent_path(sys::path::parent_path(CurrentPath)).str();
>> >
>> > // Check to see if we are inside a development tree by comparing to
>> > possible
>> > // locations (prefix style or CMake style).
>> > @@ -305,8 +329,8 @@ int main(int argc, char **argv) {
>> > }
>> >
>> > // We need to include files from both the source and object trees.
>> > - ActiveIncludeOption = ("-I" + ActiveIncludeDir + " " +
>> > - "-I" + ActiveObjRoot + "/include");
>> > + ActiveIncludeOption =
>> > + ("-I" + ActiveIncludeDir + " " + "-I" + ActiveObjRoot +
>> > "/include");
>> > } else {
>> > ActivePrefix = CurrentExecPrefix;
>> > ActiveIncludeDir = ActivePrefix + "/include";
>> > @@ -323,25 +347,25 @@ int main(int argc, char **argv) {
>> > /// in the first place. This can't be done at configure/build time.
>> >
>> > StringRef SharedExt, SharedVersionedExt, SharedDir, SharedPrefix,
>> > StaticExt,
>> > - StaticPrefix, StaticDir = "lib";
>> > + StaticPrefix, StaticDir = "lib";
>> > const Triple
>> > HostTriple(Triple::normalize(LLVM_DEFAULT_TARGET_TRIPLE));
>> > if (HostTriple.isOSWindows()) {
>> > SharedExt = "dll";
>> > - SharedVersionedExt = PACKAGE_VERSION ".dll";
>> > + SharedVersionedExt = LLVM_DYLIB_VERSION ".dll";
>> > StaticExt = "a";
>> > SharedDir = ActiveBinDir;
>> > StaticDir = ActiveLibDir;
>> > StaticPrefix = SharedPrefix = "lib";
>> > } else if (HostTriple.isOSDarwin()) {
>> > SharedExt = "dylib";
>> > - SharedVersionedExt = PACKAGE_VERSION ".dylib";
>> > + SharedVersionedExt = LLVM_DYLIB_VERSION ".dylib";
>> > StaticExt = "a";
>> > StaticDir = SharedDir = ActiveLibDir;
>> > StaticPrefix = SharedPrefix = "lib";
>> > } else {
>> > // default to the unix values:
>> > SharedExt = "so";
>> > - SharedVersionedExt = PACKAGE_VERSION ".so";
>> > + SharedVersionedExt = LLVM_DYLIB_VERSION ".so";
>> > StaticExt = "a";
>> > StaticDir = SharedDir = ActiveLibDir;
>> > StaticPrefix = SharedPrefix = "lib";
>> > @@ -362,11 +386,23 @@ int main(int argc, char **argv) {
>> >
>> > bool DyLibExists = false;
>> > const std::string DyLibName =
>> > - (SharedPrefix + "LLVM-" + SharedVersionedExt).str();
>> > + (SharedPrefix + "LLVM-" + SharedVersionedExt).str();
>> > +
>> > + // If LLVM_LINK_DYLIB is ON, the single shared library will be
>> > returned
>> > + // for "--libs", etc, if they exist. This behaviour can be overridden
>> > with
>> > + // --link-static or --link-shared.
>> > + bool LinkDyLib = (std::strcmp(LLVM_LINK_DYLIB, "ON") == 0);
>> >
>> > if (BuiltDyLib) {
>> > DyLibExists = sys::fs::exists(SharedDir + "/" + DyLibName);
>> > + if (!DyLibExists) {
>> > + // The shared library does not exist: don't error unless the user
>> > + // explicitly passes --link-shared.
>> > + LinkDyLib = false;
>> > + }
>> > }
>> > + LinkMode LinkMode =
>> > + (LinkDyLib || BuiltSharedLibs) ? LinkModeShared : LinkModeAuto;
>> >
>> > /// Get the component's library name without the lib prefix and the
>> > /// extension. Returns true if Lib is in a recognized format.
>> > @@ -392,11 +428,11 @@ int main(int argc, char **argv) {
>> > };
>> > /// Maps Unixizms to the host platform.
>> > auto GetComponentLibraryFileName = [&](const StringRef &Lib,
>> > - const bool ForceShared) {
>> > + const bool Shared) {
>> > std::string LibFileName = Lib;
>> > StringRef LibName;
>> > if (GetComponentLibraryNameSlice(Lib, LibName)) {
>> > - if (BuiltSharedLibs || ForceShared) {
>> > + if (Shared) {
>> > LibFileName = (SharedPrefix + LibName + "." + SharedExt).str();
>> > } else {
>> > // default to static
>> > @@ -407,10 +443,9 @@ int main(int argc, char **argv) {
>> > return LibFileName;
>> > };
>> > /// Get the full path for a possibly shared component library.
>> > - auto GetComponentLibraryPath = [&](const StringRef &Name,
>> > - const bool ForceShared) {
>> > - auto LibFileName = GetComponentLibraryFileName(Name, ForceShared);
>> > - if (BuiltSharedLibs || ForceShared) {
>> > + auto GetComponentLibraryPath = [&](const StringRef &Name, const bool
>> > Shared) {
>> > + auto LibFileName = GetComponentLibraryFileName(Name, Shared);
>> > + if (Shared) {
>> > return (SharedDir + "/" + LibFileName).str();
>> > } else {
>> > return (StaticDir + "/" + LibFileName).str();
>> > @@ -501,6 +536,10 @@ int main(int argc, char **argv) {
>> > OS << ActivePrefix << '\n';
>> > } else if (Arg == "--src-root") {
>> > OS << LLVM_SRC_ROOT << '\n';
>> > + } else if (Arg == "--link-shared") {
>> > + LinkMode = LinkModeShared;
>> > + } else if (Arg == "--link-static") {
>> > + LinkMode = LinkModeStatic;
>> > } else {
>> > usage();
>> > }
>> > @@ -512,6 +551,11 @@ int main(int argc, char **argv) {
>> > if (!HasAnyOption)
>> > usage();
>> >
>> > + if (LinkMode == LinkModeShared && !DyLibExists && !BuiltSharedLibs) {
>> > + errs() << "llvm-config: error: " << DyLibName << " is missing\n";
>> > + return 1;
>> > + }
>> > +
>> > if (PrintLibs || PrintLibNames || PrintLibFiles || PrintSystemLibs ||
>> > PrintSharedMode) {
>> >
>> > @@ -525,11 +569,40 @@ int main(int argc, char **argv) {
>> > Components.push_back("all");
>> >
>> > // Construct the list of all the required libraries.
>> > - bool HasMissing = false;
>> > - std::vector<std::string> RequiredLibs =
>> > - ComputeLibsForComponents(Components,
>> > -
>> > /*IncludeNonInstalled=*/IsInDevelopmentTree,
>> > - false, &ActiveLibDir, &HasMissing);
>> > + std::function<std::string(const StringRef &)>
>> > + GetComponentLibraryPathFunction = [&](const StringRef &Name) {
>> > + return GetComponentLibraryPath(Name, LinkMode ==
>> > LinkModeShared);
>> > + };
>> > + std::vector<std::string> MissingLibs;
>> > + std::vector<std::string> RequiredLibs = ComputeLibsForComponents(
>> > + Components,
>> > + /*IncludeNonInstalled=*/IsInDevelopmentTree, false,
>> > + &GetComponentLibraryPathFunction, &MissingLibs);
>> > + if (!MissingLibs.empty()) {
>> > + switch (LinkMode) {
>> > + case LinkModeShared:
>> > + if (DyLibExists && !BuiltSharedLibs)
>> > + break;
>> > + // Using component shared libraries.
>> > + for (auto &Lib : MissingLibs)
>> > + errs() << "llvm-config: error: missing: " << Lib << "\n";
>> > + return 1;
>> > + case LinkModeAuto:
>> > + if (DyLibExists) {
>> > + LinkMode = LinkModeShared;
>> > + break;
>> > + }
>> > + errs()
>> > + << "llvm-config: error: component libraries and shared
>> > library\n\n";
>> > + // fall through
>> > + case LinkModeStatic:
>> > + for (auto &Lib : MissingLibs)
>> > + errs() << "llvm-config: error: missing: " << Lib << "\n";
>> > + return 1;
>> > + }
>> > + } else if (LinkMode == LinkModeAuto) {
>> > + LinkMode = LinkModeStatic;
>> > + }
>> >
>> > if (PrintSharedMode) {
>> > std::unordered_set<std::string> FullDyLibComponents;
>> > @@ -549,7 +622,7 @@ int main(int argc, char **argv) {
>> > }
>> > FullDyLibComponents.clear();
>> >
>> > - if (HasMissing && DyLibExists) {
>> > + if (LinkMode == LinkModeShared) {
>> > OS << "shared\n";
>> > return 0;
>> > } else {
>> > @@ -560,11 +633,12 @@ int main(int argc, char **argv) {
>> >
>> > if (PrintLibs || PrintLibNames || PrintLibFiles) {
>> >
>> > - auto PrintForLib = [&](const StringRef &Lib, const bool
>> > ForceShared) {
>> > + auto PrintForLib = [&](const StringRef &Lib) {
>> > + const bool Shared = LinkMode == LinkModeShared;
>> > if (PrintLibNames) {
>> > - OS << GetComponentLibraryFileName(Lib, ForceShared);
>> > + OS << GetComponentLibraryFileName(Lib, Shared);
>> > } else if (PrintLibFiles) {
>> > - OS << GetComponentLibraryPath(Lib, ForceShared);
>> > + OS << GetComponentLibraryPath(Lib, Shared);
>> > } else if (PrintLibs) {
>> > // If this is a typical library name, include it using -l.
>> > StringRef LibName;
>> > @@ -572,24 +646,24 @@ int main(int argc, char **argv) {
>> > if (GetComponentLibraryNameSlice(Lib, LibName)) {
>> > OS << "-l" << LibName;
>> > } else {
>> > - OS << "-l:" << GetComponentLibraryFileName(Lib,
>> > ForceShared);
>> > + OS << "-l:" << GetComponentLibraryFileName(Lib, Shared);
>> > }
>> > } else {
>> > // Otherwise, print the full path.
>> > - OS << GetComponentLibraryPath(Lib, ForceShared);
>> > + OS << GetComponentLibraryPath(Lib, Shared);
>> > }
>> > }
>> > };
>> >
>> > - if (HasMissing && DyLibExists) {
>> > - PrintForLib(DyLibName, true);
>> > + if (LinkMode == LinkModeShared && !BuiltSharedLibs) {
>> > + PrintForLib(DyLibName);
>> > } else {
>> > for (unsigned i = 0, e = RequiredLibs.size(); i != e; ++i) {
>> > auto Lib = RequiredLibs[i];
>> > if (i)
>> > OS << ' ';
>> >
>> > - PrintForLib(Lib, false);
>> > + PrintForLib(Lib);
>> > }
>> > }
>> > OS << '\n';
>> >
>> > Modified: llvm/trunk/tools/llvm-go/llvm-go.go
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-go/llvm-go.go?rev=258283&r1=258282&r2=258283&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/tools/llvm-go/llvm-go.go (original)
>> > +++ llvm/trunk/tools/llvm-go/llvm-go.go Tue Jan 19 22:03:09 2016
>> > @@ -88,17 +88,8 @@ func llvmConfig(args ...string) string {
>> > return outstr
>> > }
>> >
>> > -func llvmFlags(linkmode string) compilerFlags {
>> > - ldflags := llvmConfig("--ldflags")
>> > - switch linkmode {
>> > - case linkmodeComponentLibs:
>> > - ldflags += " " + llvmConfig(append([]string{"--libs"},
>> > components...)...)
>> > - case linkmodeDylib:
>> > - ldflags += " -lLLVM"
>> > - default:
>> > - panic("invalid linkmode: " + linkmode)
>> > - }
>> > - ldflags += " " + llvmConfig("--system-libs")
>> > +func llvmFlags() compilerFlags {
>> > + ldflags := llvmConfig("--ldflags", "--libs", "--system-libs")
>> > if runtime.GOOS != "darwin" {
>> > // OS X doesn't like -rpath with cgo. See:
>> > // https://code.google.com/p/go/issues/detail?id=7293
>> > @@ -133,8 +124,8 @@ func printComponents() {
>> > fmt.Println(strings.Join(components, " "))
>> > }
>> >
>> > -func printConfig(linkmode string) {
>> > - flags := llvmFlags(linkmode)
>> > +func printConfig() {
>> > + flags := llvmFlags()
>> >
>> > fmt.Printf(`// +build !byollvm
>> >
>> > @@ -153,7 +144,7 @@ type (run_build_sh int)
>> > `, flags.cpp, flags.cxx, flags.ld)
>> > }
>> >
>> > -func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags,
>> > cxxflags, ldflags, linkmode string) {
>> > +func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags,
>> > cxxflags, ldflags string) {
>> > args = addTag(args, "byollvm")
>> >
>> > srcdir := llvmConfig("--src-root")
>> > @@ -182,7 +173,7 @@ func runGoWithLLVMEnv(args []string, cc,
>> > newgopathlist = append(newgopathlist,
>> > filepath.SplitList(os.Getenv("GOPATH"))...)
>> > newgopath := strings.Join(newgopathlist,
>> > string(filepath.ListSeparator))
>> >
>> > - flags := llvmFlags(linkmode)
>> > + flags := llvmFlags()
>> >
>> > newenv := []string{
>> > "CC=" + cc,
>> > @@ -250,7 +241,6 @@ func main() {
>> > ldflags := os.Getenv("CGO_LDFLAGS")
>> > gocmd := "go"
>> > llgo := ""
>> > - linkmode := linkmodeComponentLibs
>> >
>> > flags := []struct {
>> > name string
>> > @@ -262,7 +252,6 @@ func main() {
>> > {"llgo", &llgo},
>> > {"cppflags", &cppflags},
>> > {"ldflags", &ldflags},
>> > - {"linkmode", &linkmode},
>> > }
>> >
>> > args := os.Args[1:]
>> > @@ -283,11 +272,11 @@ LOOP:
>> >
>> > switch args[0] {
>> > case "build", "get", "install", "run", "test":
>> > - runGoWithLLVMEnv(args, cc, cxx, gocmd, llgo, cppflags,
>> > cxxflags, ldflags, linkmode)
>> > + runGoWithLLVMEnv(args, cc, cxx, gocmd, llgo, cppflags,
>> > cxxflags, ldflags)
>> > case "print-components":
>> > printComponents()
>> > case "print-config":
>> > - printConfig(linkmode)
>> > + printConfig()
>> > default:
>> > usage()
>> > }
>> >
>> >
>> > _______________________________________________
>> > llvm-commits mailing list
>> > llvm-commits at lists.llvm.org
>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list