[llvm] r257003 - tools/llvm-config: improve shared library support
Artem Belevich via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 8 16:45:01 PST 2016
On Fri, Jan 8, 2016 at 4:11 PM, Andrew Wilkins <axwalk at gmail.com> wrote:
> On Sat, 9 Jan 2016 at 02:46 Artem Belevich <tra at google.com> wrote:
>
>> This commit appears to break llvm-config when llvm/clang is built with
>> shared libraries only which in turn breaks Bindings/Go/go.test
>>
>
> Hi Artem,
>
> Indeed, it does. There's a fix up for review here:
> http://reviews.llvm.org/D15986. If this is getting too much in your way,
> I can revert in the mean time.
>
It's not a showstopper for me.
Thanks,
--Artem
>
> Cheers,
> Andrew
>
>
>> ### before r257003:
>> # bin/llvm-config --libs
>> -lLLVMLTO -lLLVMObjCARCOpts -lLLVMSymbolize -lLLVMDebugInfoPDB
>> -lLLVMDebugInfoDWARF -lLLVMXCoreDisassembler -lLLVMXCoreCodeGen
>> -lLLVMXCoreDesc -lLLVMXCoreInfo -lLLVMXCoreAsmPrinter
>> -lLLVMSystemZDisassembler -lLLVMSystemZCodeGen -lLLVMSystemZAsmParser
>> -lLLVMSystemZDesc -lLLVMSystemZInfo -lLLVMSystemZAsmPrinter
>> -lLLVMSparcDisassembler -lLLVMSparcCodeGen -lLLVMSparcAsmParser
>> -lLLVMSparcDesc -lLLVMSparcInfo -lLLVMSparcAsmPrinter
>> -lLLVMPowerPCDisassembler -lLLVMPowerPCCodeGen -lLLVMPowerPCAsmParser
>> -lLLVMPowerPCDesc -lLLVMPowerPCInfo -lLLVMPowerPCAsmPrinter
>> -lLLVMNVPTXCodeGen -lLLVMNVPTXDesc -lLLVMNVPTXInfo -lLLVMNVPTXAsmPrinter
>> -lLLVMMSP430CodeGen -lLLVMMSP430Desc -lLLVMMSP430Info
>> -lLLVMMSP430AsmPrinter -lLLVMMipsDisassembler -lLLVMMipsCodeGen
>> -lLLVMMipsAsmParser -lLLVMMipsDesc -lLLVMMipsInfo -lLLVMMipsAsmPrinter
>> -lLLVMHexagonDisassembler -lLLVMHexagonCodeGen -lLLVMHexagonAsmParser
>> -lLLVMHexagonDesc -lLLVMHexagonInfo -lLLVMCppBackendCodeGen
>> -lLLVMCppBackendInfo -lLLVMBPFCodeGen -lLLVMBPFDesc -lLLVMBPFInfo
>> -lLLVMBPFAsmPrinter -lLLVMARMDisassembler -lLLVMARMCodeGen
>> -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMInfo -lLLVMARMAsmPrinter
>> -lLLVMAMDGPUCodeGen -lLLVMAMDGPUAsmParser -lLLVMAMDGPUDesc
>> -lLLVMAMDGPUUtils -lLLVMAMDGPUInfo -lLLVMAMDGPUAsmPrinter
>> -lLLVMAArch64Disassembler -lLLVMAArch64CodeGen -lLLVMAArch64AsmParser
>> -lLLVMAArch64Desc -lLLVMAArch64Info -lLLVMAArch64AsmPrinter
>> -lLLVMAArch64Utils -lLLVMMIRParser -lLLVMLibDriver -lLLVMOption
>> -lgtest_main -lgtest -lLLVMTableGen -lLLVMLineEditor -lLLVMX86Disassembler
>> -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter
>> -lLLVMX86Desc -lLLVMMCDisassembler -lLLVMX86Info -lLLVMX86AsmPrinter
>> -lLLVMX86Utils -lLLVMMCJIT -lLLVMPasses -lLLVMipo -lLLVMVectorize
>> -lLLVMLinker -lLLVMIRReader -lLLVMAsmParser -lLLVMDebugInfoCodeView
>> -lLLVMInterpreter -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine
>> -lLLVMInstrumentation -lLLVMProfileData -lLLVMBitWriter -lLLVMOrcJIT
>> -lLLVMTransformUtils -lLLVMExecutionEngine -lLLVMTarget -lLLVMAnalysis
>> -lLLVMRuntimeDyld -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMMC
>> -lLLVMCore -lLLVMSupport
>>
>> ### after r257003:
>> # bin/llvm-config --libs
>> llvm-config: error: component libraries and shared library
>>
>> llvm-config: error: missing:
>> /usr/local/google/home/tra/work/llvm/build/gpu/debug/lib/libLLVMSupport.a
>> llvm-config: error: missing:
>> /usr/local/google/home/tra/work/llvm/build/gpu/debug/lib/libLLVMCore.a
>> llvm-config: error: missing:
>> /usr/local/google/home/tra/work/llvm/build/gpu/debug/lib/libLLVMMC.a
>> llvm-config: error: missing:
>> /usr/local/google/home/tra/work/llvm/build/gpu/debug/lib/libLLVMBitReader.a
>> llvm-config: error: missing:
>> /usr/local/google/home/tra/work/llvm/build/gpu/debug/lib/libLLVMMCParser.a
>> llvm-config: error: missing:
>> /usr/local/google/home/tra/work/llvm/build/gpu/debug/lib/libLLVMObject.a
>> llvm-config: error: missing:
>> /usr/local/google/home/tra/work/llvm/build/gpu/debug/lib/libLLVMRuntimeDyld.a
>> llvm-config: error: missing:
>> /usr/local/google/home/tra/work/llvm/build/gpu/debug/lib/libLLVMAnalysis.a
>> llvm-config: error: missing:
>> /usr/local/google/home/tra/work/llvm/build/gpu/debug/lib/libLLVMTarget.a
>> llvm-config: error: missing:
>> /usr/local/google/home/tra/work/llvm/build/gpu/debug/lib/libLLVMExecutionEngine.a
>> llvm-config: error: missing:
>> /usr/local/google/home/tra/work/llvm/build/gpu/debug/lib/libLLVMTransformUtils.a
>> llvm-config: error: missing:
>> /usr/local/google/home/tra/work/llvm/build/gpu/debug/lib/libLLVMOrcJIT.a
>> llvm-config: error: missing:
>> /usr/local/google/home/tra/work/llvm/build/gpu/debug/lib/libLLVMBitWriter.a
>> llvm-config: error: missing:
>> /usr/local/google/home/tra/work/llvm/build/gpu/debug/lib/libLLVMProfileData.a
>> llvm-config: error: missing:
>> /usr/local/google/home/tra/work/llvm/build/gpu/debug/lib/libLLVMInstrumentation.a
>> llvm-config: error: missing:
>> /usr/local/google/home/tra/work/llvm/build/gpu/debug/lib/libLLVMInstCombine.a
>> ....
>>
>>
>>
>> On Wed, Jan 6, 2016 at 4:18 PM, Andrew Wilkins via llvm-commits <
>> llvm-commits at lists.llvm.org> wrote:
>>
>>> Author: axw
>>> Date: Wed Jan 6 18:18:56 2016
>>> New Revision: 257003
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=257003&view=rev
>>> Log:
>>> tools/llvm-config: improve shared library support
>>>
>>> Summary:
>>> 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/D15033
>>>
>>> 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=257003&r1=257002&r2=257003&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/cmake/modules/AddLLVM.cmake (original)
>>> +++ llvm/trunk/cmake/modules/AddLLVM.cmake Wed Jan 6 18:18:56 2016
>>> @@ -911,13 +911,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=257003&r1=257002&r2=257003&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/tools/llvm-config/BuildVariables.inc.in (original)
>>> +++ llvm/trunk/tools/llvm-config/BuildVariables.inc.in Wed Jan 6
>>> 18:18:56 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=257003&r1=257002&r2=257003&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/tools/llvm-config/CMakeLists.txt (original)
>>> +++ llvm/trunk/tools/llvm-config/CMakeLists.txt Wed Jan 6 18:18:56 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=257003&r1=257002&r2=257003&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/tools/llvm-config/Makefile (original)
>>> +++ llvm/trunk/tools/llvm-config/Makefile Wed Jan 6 18:18:56 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=257003&r1=257002&r2=257003&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/tools/llvm-config/llvm-config.cpp (original)
>>> +++ llvm/trunk/tools/llvm-config/llvm-config.cpp Wed Jan 6 18:18:56 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,
>>> +
>>> + // LinkModeDyLib will link with the single dynamic library if it
>>> exists,
>>> + // and return an error if it does not exist.
>>> + LinkModeDyLib = 1,
>>> +
>>> + // LinkModeStatic will link with the individual component static
>>> libraries
>>> + // if they exist, and fail if any one does not exist.
>>> + LinkModeStatic = 2,
>>> +};
>>> +
>>> /// \brief Traverse a single component adding to the topological
>>> ordering in
>>> /// \arg RequiredLibs.
>>> ///
>>> @@ -56,12 +72,13 @@ 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::string *ActiveLibDir,
>>> + std::vector<std::string> *Missing) {
>>> // Lookup the component.
>>> AvailableComponent *AC = ComponentMap.lookup(Name);
>>> assert(AC && "Invalid component name!");
>>> @@ -80,7 +97,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);
>>> + ActiveLibDir, Missing);
>>> }
>>>
>>> if (GetComponentNames) {
>>> @@ -90,8 +107,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 && ActiveLibDir) {
>>> + std::string path = *ActiveLibDir + "/" + AC->Library;
>>> + if (!sys::fs::exists(path))
>>> + Missing->push_back(path);
>>> }
>>> RequiredLibs.push_back(AC->Library);
>>> }
>>> @@ -108,12 +127,13 @@ 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::string *ActiveLibDir,
>>> + 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 +153,7 @@ ComputeLibsForComponents(const std::vect
>>>
>>> VisitComponent(ComponentLower, ComponentMap, VisitedComponents,
>>> RequiredLibs, IncludeNonInstalled, GetComponentNames,
>>> - ActiveLibDir, HasMissing);
>>> + ActiveLibDir, Missing);
>>> }
>>>
>>> // The list is now ordered with leafs first, we want the libraries to
>>> printed
>>> @@ -179,6 +199,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 a shared library.\n\
>>> + --link-static Link the components as a static libraries.\n\
>>> Typical components:\n\
>>> all All LLVM libraries (default).\n\
>>> engine Either a native JIT or a bitcode interpreter.\n";
>>> @@ -189,7 +211,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 +265,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 +327,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 +345,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 +384,22 @@ 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 ? LinkModeDyLib : LinkModeAuto;
>>>
>>> /// Get the component's library name without the lib prefix and the
>>> /// extension. Returns true if Lib is in a recognized format.
>>> @@ -501,6 +534,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 = LinkModeDyLib;
>>> + } else if (Arg == "--link-static") {
>>> + LinkMode = LinkModeStatic;
>>> } else {
>>> usage();
>>> }
>>> @@ -512,6 +549,11 @@ int main(int argc, char **argv) {
>>> if (!HasAnyOption)
>>> usage();
>>>
>>> + if (LinkMode == LinkModeDyLib && !DyLibExists) {
>>> + errs() << "llvm-config: error: " << DyLibName << " is missing\n\n";
>>> + usage();
>>> + }
>>> +
>>> if (PrintLibs || PrintLibNames || PrintLibFiles || PrintSystemLibs ||
>>> PrintSharedMode) {
>>>
>>> @@ -525,11 +567,31 @@ 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> MissingLibs;
>>> std::vector<std::string> RequiredLibs =
>>> ComputeLibsForComponents(Components,
>>>
>>> /*IncludeNonInstalled=*/IsInDevelopmentTree,
>>> - false, &ActiveLibDir, &HasMissing);
>>> + false, &ActiveLibDir, &MissingLibs);
>>> + if (!MissingLibs.empty()) {
>>> + switch (LinkMode) {
>>> + case LinkModeDyLib:
>>> + break;
>>> + case LinkModeAuto:
>>> + if (DyLibExists) {
>>> + LinkMode = LinkModeDyLib;
>>> + 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 +611,7 @@ int main(int argc, char **argv) {
>>> }
>>> FullDyLibComponents.clear();
>>>
>>> - if (HasMissing && DyLibExists) {
>>> + if (LinkMode == LinkModeDyLib) {
>>> OS << "shared\n";
>>> return 0;
>>> } else {
>>> @@ -581,7 +643,7 @@ int main(int argc, char **argv) {
>>> }
>>> };
>>>
>>> - if (HasMissing && DyLibExists) {
>>> + if (LinkMode == LinkModeDyLib) {
>>> PrintForLib(DyLibName, true);
>>> } else {
>>> for (unsigned i = 0, e = RequiredLibs.size(); i != e; ++i) {
>>>
>>> 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=257003&r1=257002&r2=257003&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/tools/llvm-go/llvm-go.go (original)
>>> +++ llvm/trunk/tools/llvm-go/llvm-go.go Wed Jan 6 18:18:56 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
>>>
>>
>>
>>
>> --
>> --Artem Belevich
>>
>
--
--Artem Belevich
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160108/bdd380cc/attachment-0001.html>
More information about the llvm-commits
mailing list