[llvm] r258283 - tools/llvm-config: improve shared library support

Andrew Wilkins via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 20 17:41:59 PST 2016


On Thu, 21 Jan 2016 at 08:55 Evgenii Stepanov <eugeni.stepanov at gmail.com>
wrote:

> libLLVMGlobalISel.a can not be built because LLVM_BUILD_GLOBAL_ISEL is OFF.
>

I see, thanks. In that case, I think it needs to be marked as optional then.

Fixes:
 - http://reviews.llvm.org/D16386
 - http://reviews.llvm.org/D16387

Cheers,
Andrew

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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160121/893ab816/attachment-0001.html>


More information about the llvm-commits mailing list