Date: Saturday, September 26, 2015 @ 22:34:58 Author: lcarlier Revision: 141646
upgpkg: lib32-llvm 3.7.0-2 Build with CMake Added: lib32-llvm/trunk/llvm-3.7.0-export-more-symbols.patch lib32-llvm/trunk/llvm-3.7.0-link-tools-against-libLLVM.patch Modified: lib32-llvm/trunk/PKGBUILD ---------------------------------------------+ PKGBUILD | 131 +++---- llvm-3.7.0-export-more-symbols.patch | 11 llvm-3.7.0-link-tools-against-libLLVM.patch | 440 ++++++++++++++++++++++++++ 3 files changed, 512 insertions(+), 70 deletions(-) Modified: PKGBUILD =================================================================== --- PKGBUILD 2015-09-26 19:39:31 UTC (rev 141645) +++ PKGBUILD 2015-09-26 20:34:58 UTC (rev 141646) @@ -11,21 +11,26 @@ pkgname=('lib32-llvm' 'lib32-llvm-libs' 'lib32-clang') pkgver=3.7.0 -pkgrel=1 +pkgrel=2 arch=('x86_64') url="http://llvm.org/" license=('custom:University of Illinois/NCSA Open Source License') -makedepends=('lib32-libffi' 'lib32-zlib' 'python2' 'gcc-multilib') +makedepends=('cmake' 'lib32-libffi' 'lib32-zlib' 'python2' 'gcc-multilib' + 'lib32-libxml2') options=('staticlibs') source=(http://llvm.org/releases/$pkgver/llvm-$pkgver.src.tar.xz{,.sig} http://llvm.org/releases/$pkgver/cfe-$pkgver.src.tar.xz{,.sig} - http://llvm.org/releases/$pkgver/compiler-rt-$pkgver.src.tar.xz{,.sig}) + http://llvm.org/releases/$pkgver/compiler-rt-$pkgver.src.tar.xz{,.sig} + llvm-3.7.0-link-tools-against-libLLVM.patch + llvm-3.7.0-export-more-symbols.patch) sha256sums=('ab45895f9dcdad1e140a3a79fd709f64b05ad7364e308c0e582c5b02e9cc3153' 'SKIP' '4ed740c5a91df1c90a4118c5154851d6a475f39a91346bdf268c1c29c13aa1cc' 'SKIP' '227fa998520bc94974a428dc8e7654d9bdf277e5bc70d4064ebc05691bd62b0b' - 'SKIP') + 'SKIP' + 'cf9c8b4d70b4547eda162644658c5c203c3139fcea6c75003b6cd7dc11a8cccc' + 'a1c9f36b97c639666ab6a1bd647a08a027e93e3d3cfd6f5af9c36e757599ce81') validpgpkeys=('11E521D646982372EB577A1F8F0871F202119294' 'B6C8F98282B944E3B0D5C2530FC3042E345AD05D') @@ -32,23 +37,18 @@ prepare() { cd "$srcdir/llvm-$pkgver.src" + # At the present, clang must reside inside the LLVM source code tree to build + # See http://llvm.org/bugs/show_bug.cgi?id=4840 mv "$srcdir/cfe-$pkgver.src" tools/clang + mv "$srcdir/compiler-rt-$pkgver.src" projects/compiler-rt - # Fix compiler-rt build on i686 - # https://llvm.org/bugs/show_bug.cgi?id=22661 - sed -i '/ifeq.*CompilerTargetArch/s/i386/i686/g' \ - projects/compiler-rt/make/platform/clang_linux.mk + # Backport LLVM_LINK_LLVM_DYLIB option + # https://bugs.archlinux.org/task/46392 + patch -Np1 -i ../llvm-3.7.0-link-tools-against-libLLVM.patch - # Fix installation directories, ./configure doesn't seem to set them right - sed -i -e 's:\$(PROJ_prefix)/lib:$(PROJ_prefix)/lib32:' \ - -e 's:\$(PROJ_prefix)/docs/llvm:$(PROJ_prefix)/share/doc/llvm:' \ - Makefile.config.in - sed -i '/ActiveLibDir = ActivePrefix/s:lib:lib32:' \ - tools/llvm-config/llvm-config.cpp - sed -i 's:LLVM_LIBDIR="${prefix}/lib":LLVM_LIBDIR="${prefix}/lib32":' \ - autoconf/configure.ac \ - configure + # https://llvm.org/bugs/show_bug.cgi?id=24157 + patch -Np2 -i ../llvm-3.7.0-export-more-symbols.patch mkdir build } @@ -56,31 +56,34 @@ build() { cd "$srcdir/llvm-$pkgver.src/build" - export CC="gcc -m32" - export CXX="g++ -m32" export PKG_CONFIG_PATH="/usr/lib32/pkgconfig" - # Include location of libffi headers in CPPFLAGS - CPPFLAGS+=" $(pkg-config --cflags libffi)" + cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DLLVM_LIBDIR_SUFFIX=32 \ + -DCMAKE_C_FLAGS:STRING=-m32 \ + -DCMAKE_CXX_FLAGS:STRING=-m32 \ + -DLLVM_TARGET_ARCH:STRING=i686 \ + -DLLVM_DEFAULT_TARGET_TRIPLE="i686-unknown-linux-gnu" \ + -DLLVM_BUILD_LLVM_DYLIB=ON \ + -DLLVM_DYLIB_EXPORT_ALL=ON \ + -DLLVM_LINK_LLVM_DYLIB=ON \ + -DLLVM_ENABLE_RTTI=ON \ + -DLLVM_ENABLE_FFI=ON \ + -DLLVM_BUILD_DOCS=OFF \ + -DLLVM_ENABLE_SPHINX=OFF \ + -DLLVM_ENABLE_DOXYGEN=OFF \ + -DFFI_INCLUDE_DIR=$(pkg-config --cflags-only-I libffi | cut -c3-) \ + -DLLVM_BINUTILS_INCDIR=/usr/include \ + .. - # We had to force host and target to get - # a proper triplet reported by llvm + make - ../configure \ - --prefix=/usr \ - --libdir=/usr/lib32 \ - --sysconfdir=/etc \ - --enable-shared \ - --enable-optimized \ - --enable-libffi \ - --enable-targets=all \ - --disable-assertions \ - --with-binutils-include=/usr/include \ - --with-python=/usr/bin/python2 \ - --build=i686-pc-linux-gnu \ - --host=i686-pc-linux-gnu \ - - make REQUIRES_RTTI=1 + # Disable automatic installation of components that go into subpackages + sed -i '/\(clang\|lldb\)\/cmake_install.cmake/d' tools/cmake_install.cmake + sed -i '/extra\/cmake_install.cmake/d' tools/clang/tools/cmake_install.cmake + sed -i '/compiler-rt\/cmake_install.cmake/d' projects/cmake_install.cmake } package_lib32-llvm() { @@ -89,44 +92,29 @@ cd "$srcdir/llvm-$pkgver.src" - # Temporarily rename clang and lldb directories so they don't get installed - for tool in clang; do - mv build/tools/$tool{,.hidden} - mv tools/$tool{,.hidden} - done - make -C build DESTDIR="$pkgdir" install - # Restore original tool directory names - for tool in clang; do - mv build/tools/$tool{.hidden,} - mv tools/$tool{.hidden,} - done - # The runtime library goes into lib32-llvm-libs - mv "$pkgdir/usr/lib32/libLLVM-$pkgver.so" "$srcdir/" - mv "$pkgdir/usr/lib32/libLLVM-${pkgver%.*}.so" "$srcdir/" + mv "$pkgdir"/usr/lib32/lib{LLVM,LTO}.so* "$srcdir" + mv -f "$pkgdir"/usr/lib32/{LLVMgold,BugpointPasses}.so "$srcdir" # Fix permissions of static libs chmod -x "$pkgdir"/usr/lib32/*.a mv "$pkgdir/usr/bin/llvm-config" "$pkgdir/usr/lib32/llvm-config" + mv "$pkgdir/usr/include/llvm/Config/llvm-config.h" \ + "$pkgdir/usr/lib32/llvm-config-32.h" # Get rid of example Hello transformation rm "$pkgdir"/usr/lib32/*LLVMHello.* - # Symlink LLVMgold.so from /usr/lib32/bfd-plugins - # https://bugs.archlinux.org/task/28479 - install -d "$pkgdir/usr/lib32/bfd-plugins" - ln -s ../LLVMgold.so "$pkgdir/usr/lib32/bfd-plugins/LLVMgold.so" - - mv "$pkgdir"/usr/include/llvm/Config/*config.h "$pkgdir/" rm -rf "$pkgdir"/usr/{bin,include,share/{doc,man,llvm}} + # Needed for multilib (https://bugs.archlinux.org/task/29951) + # Header stub is taken from Fedora install -d "$pkgdir/usr/include/llvm/Config" - mv "$pkgdir/config.h" "$pkgdir/usr/include/llvm/Config/config-32.h" - mv "$pkgdir/llvm-config.h" "$pkgdir/usr/include/llvm/Config/llvm-config-32.h" - + mv "$pkgdir/usr/lib32/llvm-config-32.h" "$pkgdir/usr/include/llvm/Config/" + mkdir "$pkgdir"/usr/bin mv "$pkgdir/usr/lib32/llvm-config" "$pkgdir/usr/bin/llvm-config32" @@ -135,13 +123,20 @@ package_lib32-llvm-libs() { pkgdesc="Low Level Virtual Machine (runtime library)(32-bit) " - depends=('lib32-libffi' 'lib32-zlib' 'lib32-gcc-libs') + depends=('lib32-libffi' 'lib32-zlib' 'lib32-ncurses' 'lib32-gcc-libs') - cd "$srcdir" - install -d "$pkgdir/usr/lib32" - cp -P libLLVM-$pkgver.so libLLVM-${pkgver%.*}.so "$pkgdir/usr/lib32/" + cp -P \ + "$srcdir"/lib{LLVM,LTO}.so* \ + "$srcdir"/{LLVMgold,BugpointPasses}.so \ + "$pkgdir/usr/lib32/" + + # Symlink LLVMgold.so from /usr/lib/bfd-plugins + # https://bugs.archlinux.org/task/28479 + install -d "$pkgdir/usr/lib32/bfd-plugins" + ln -s ../LLVMgold.so "$pkgdir/usr/lib32/bfd-plugins/LLVMgold.so" + install -Dm644 llvm-$pkgver.src/LICENSE.TXT "$pkgdir/usr/share/licenses/$pkgname/LICENSE" } @@ -154,11 +149,7 @@ make -C build/tools/clang DESTDIR="$pkgdir" install - mv -v "$pkgdir"/usr/lib/* "$pkgdir"/usr/lib32/ - rm -r "$pkgdir"/usr/{bin,include,lib,share} - - # Fix permissions of static libs - chmod -x "$pkgdir"/usr/lib32/*.a + rm -r "$pkgdir"/usr/{bin,include,share} install -Dm644 LICENSE.TXT "$pkgdir/usr/share/licenses/$pkgname/LICENSE" } Added: llvm-3.7.0-export-more-symbols.patch =================================================================== --- llvm-3.7.0-export-more-symbols.patch (rev 0) +++ llvm-3.7.0-export-more-symbols.patch 2015-09-26 20:34:58 UTC (rev 141646) @@ -0,0 +1,11 @@ +--- src/llvm/tools/llvm-shlib/CMakeLists.txt.orig 2015-09-06 12:31:21.765250429 +0300 ++++ src/llvm/tools/llvm-shlib/CMakeLists.txt 2015-09-06 13:17:10.820174432 +0300 +@@ -64,7 +64,7 @@ + + if (LLVM_DYLIB_EXPORT_ALL) + add_custom_command(OUTPUT ${LLVM_EXPORTED_SYMBOL_FILE} +- COMMAND echo \"LLVM*\" > ${LLVM_EXPORTED_SYMBOL_FILE} && echo \"_Z*llvm*\" >> ${LLVM_EXPORTED_SYMBOL_FILE} ++ COMMAND echo -e \"LLVM*\\n_Z*llvm*\\nConvertUTF*\\ngetNumBytesForUTF8\\nisLegalUTF8*\" > ${LLVM_EXPORTED_SYMBOL_FILE} + WORKING_DIRECTORY ${LIB_DIR} + DEPENDS ${LLVM_DYLIB_REQUIRED_EXPORTS} + COMMENT "Generating combined export list...") Added: llvm-3.7.0-link-tools-against-libLLVM.patch =================================================================== --- llvm-3.7.0-link-tools-against-libLLVM.patch (rev 0) +++ llvm-3.7.0-link-tools-against-libLLVM.patch 2015-09-26 20:34:58 UTC (rev 141646) @@ -0,0 +1,440 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index ac3b978..dd50236 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -342,9 +342,21 @@ option (LLVM_ENABLE_SPHINX "Use Sphinx to generate llvm documentation." OFF) + option (LLVM_BUILD_EXTERNAL_COMPILER_RT + "Build compiler-rt as an external project." OFF) + +-option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" OFF) +-option(LLVM_DYLIB_EXPORT_ALL "Export all symbols from libLLVM.dylib (default is C API only" OFF) +-option(LLVM_DISABLE_LLVM_DYLIB_ATEXIT "Disable llvm-shlib's atexit destructors." ON) ++# You can configure which libraries from LLVM you want to include in the ++# shared library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited ++# list of LLVM components. All component names handled by llvm-config are valid. ++if(NOT DEFINED LLVM_DYLIB_COMPONENTS) ++ set(LLVM_DYLIB_COMPONENTS "all" CACHE STRING ++ "Semicolon-separated list of components to include in libLLVM, or \"all\".") ++endif() ++option(LLVM_LINK_LLVM_DYLIB "Link tools against the libllvm dynamic library" OFF) ++option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" ${LLVM_LINK_LLVM_DYLIB}) ++option(LLVM_DYLIB_EXPORT_ALL "Export all symbols from libLLVM.dylib (default is C API only" ${LLVM_LINK_LLVM_DYLIB}) ++set(LLVM_DISABLE_LLVM_DYLIB_ATEXIT_DEFAULT ON) ++if (LLVM_LINK_LLVM_DYLIB) ++ set(LLVM_DISABLE_LLVM_DYLIB_ATEXIT_DEFAULT OFF) ++endif() ++option(LLVM_DISABLE_LLVM_DYLIB_ATEXIT "Disable llvm-shlib's atexit destructors." ${LLVM_DISABLE_LLVM_DYLIB_ATEXIT_DEFAULT}) + if(LLVM_DISABLE_LLVM_DYLIB_ATEXIT) + set(DISABLE_LLVM_DYLIB_ATEXIT 1) + endif() +diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake +index 45f6746..6b6e6e0 100644 +--- a/cmake/modules/AddLLVM.cmake ++++ b/cmake/modules/AddLLVM.cmake +@@ -41,7 +41,7 @@ function(llvm_update_compile_flags name) + # Assume that; + # - LLVM_COMPILE_FLAGS is list. + # - PROPERTY COMPILE_FLAGS is string. +- string(REPLACE ";" " " target_compile_flags "${LLVM_COMPILE_FLAGS}") ++ string(REPLACE ";" " " target_compile_flags " ${LLVM_COMPILE_FLAGS}") + + if(update_src_props) + foreach(fn ${sources}) +@@ -303,6 +303,9 @@ endfunction(set_windows_version_resource_properties) + # MODULE + # Target ${name} might not be created on unsupported platforms. + # Check with "if(TARGET ${name})". ++# DISABLE_LLVM_LINK_LLVM_DYLIB ++# Do not link this library to libLLVM, even if ++# LLVM_LINK_LLVM_DYLIB is enabled. + # OUTPUT_NAME name + # Corresponds to OUTPUT_NAME in target properties. + # DEPENDS targets... +@@ -316,7 +319,7 @@ endfunction(set_windows_version_resource_properties) + # ) + function(llvm_add_library name) + cmake_parse_arguments(ARG +- "MODULE;SHARED;STATIC" ++ "MODULE;SHARED;STATIC;DISABLE_LLVM_LINK_LLVM_DYLIB" + "OUTPUT_NAME" + "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS" + ${ARGN}) +@@ -444,10 +447,14 @@ function(llvm_add_library name) + # property has been set to an empty value. + get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${name}) + +- llvm_map_components_to_libnames(llvm_libs +- ${ARG_LINK_COMPONENTS} +- ${LLVM_LINK_COMPONENTS} +- ) ++ if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_STATIC AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB) ++ set(llvm_libs LLVM) ++ else() ++ llvm_map_components_to_libnames(llvm_libs ++ ${ARG_LINK_COMPONENTS} ++ ${LLVM_LINK_COMPONENTS} ++ ) ++ endif() + + if(CMAKE_VERSION VERSION_LESS 2.8.12) + # Link libs w/o keywords, assuming PUBLIC. +@@ -562,7 +569,22 @@ endmacro(add_llvm_loadable_module name) + + + macro(add_llvm_executable name) +- llvm_process_sources( ALL_FILES ${ARGN} ) ++ cmake_parse_arguments(ARG "DISABLE_LLVM_LINK_LLVM_DYLIB" "" "" ${ARGN}) ++ llvm_process_sources( ALL_FILES ${ARG_UNPARSED_ARGUMENTS} ) ++ ++ # Generate objlib ++ if(LLVM_ENABLE_OBJLIB) ++ # Generate an obj library for both targets. ++ set(obj_name "obj.${name}") ++ add_library(${obj_name} OBJECT EXCLUDE_FROM_ALL ++ ${ALL_FILES} ++ ) ++ llvm_update_compile_flags(${obj_name}) ++ set(ALL_FILES "$<TARGET_OBJECTS:${obj_name}>") ++ ++ set_target_properties(${obj_name} PROPERTIES FOLDER "Object Libraries") ++ endif() ++ + add_windows_version_resource_file(ALL_FILES ${ALL_FILES}) + + if( EXCLUDE_FROM_ALL ) +@@ -588,9 +610,13 @@ macro(add_llvm_executable name) + add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} ) + endif(LLVM_EXPORTED_SYMBOL_FILE) + ++ if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB) ++ set(USE_SHARED USE_SHARED) ++ endif() ++ + set(EXCLUDE_FROM_ALL OFF) + set_output_directory(${name} ${LLVM_RUNTIME_OUTPUT_INTDIR} ${LLVM_LIBRARY_OUTPUT_INTDIR}) +- llvm_config( ${name} ${LLVM_LINK_COMPONENTS} ) ++ llvm_config( ${name} ${USE_SHARED} ${LLVM_LINK_COMPONENTS} ) + if( LLVM_COMMON_DEPENDS ) + add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} ) + endif( LLVM_COMMON_DEPENDS ) +@@ -651,7 +677,7 @@ endmacro(add_llvm_example name) + + + macro(add_llvm_utility name) +- add_llvm_executable(${name} ${ARGN}) ++ add_llvm_executable(${name} DISABLE_LLVM_LINK_LLVM_DYLIB ${ARGN}) + set_target_properties(${name} PROPERTIES FOLDER "Utils") + if( LLVM_INSTALL_UTILS ) + install (TARGETS ${name} +@@ -785,8 +811,13 @@ function(llvm_add_go_executable binary pkgpath) + 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 "cc=${cc}" "cxx=${cxx}" "cppflags=${cppflags}" "ldflags=${ldflags}" ++ COMMAND ${CMAKE_BINARY_DIR}/bin/llvm-go "go=${GO_EXECUTABLE}" "cc=${cc}" "cxx=${cxx}" "cppflags=${cppflags}" "ldflags=${ldflags}" "linkmode=${linkmode}" + ${ARG_GOFLAGS} build -o ${binpath} ${pkgpath} + DEPENDS llvm-config ${CMAKE_BINARY_DIR}/bin/llvm-go${CMAKE_EXECUTABLE_SUFFIX} + ${llvmlibs} ${ARG_DEPENDS} +diff --git a/cmake/modules/LLVM-Config.cmake b/cmake/modules/LLVM-Config.cmake +index 22ac714..aa68b40 100644 +--- a/cmake/modules/LLVM-Config.cmake ++++ b/cmake/modules/LLVM-Config.cmake +@@ -31,7 +31,23 @@ endfunction(is_llvm_target_library) + + + macro(llvm_config executable) +- explicit_llvm_config(${executable} ${ARGN}) ++ cmake_parse_arguments(ARG "USE_SHARED" "" "" ${ARGN}) ++ set(link_components ${ARG_UNPARSED_ARGUMENTS}) ++ ++ if(USE_SHARED) ++ # If USE_SHARED is specified, then we link against libLLVM, ++ # but also against the component libraries below. This is ++ # done in case libLLVM does not contain all of the components ++ # the target requires. ++ # ++ # TODO strip LLVM_DYLIB_COMPONENTS out of link_components. ++ # To do this, we need special handling for "all", since that ++ # may imply linking to libraries that are not included in ++ # libLLVM. ++ target_link_libraries(${executable} LLVM) ++ endif() ++ ++ explicit_llvm_config(${executable} ${link_components}) + endmacro(llvm_config) + + +diff --git a/cmake/modules/TableGen.cmake b/cmake/modules/TableGen.cmake +index 85d720e..fcb445a 100644 +--- a/cmake/modules/TableGen.cmake ++++ b/cmake/modules/TableGen.cmake +@@ -73,6 +73,10 @@ endfunction() + macro(add_tablegen target project) + set(${target}_OLD_LLVM_LINK_COMPONENTS ${LLVM_LINK_COMPONENTS}) + set(LLVM_LINK_COMPONENTS ${LLVM_LINK_COMPONENTS} TableGen) ++ ++ # FIXME: It leaks to user, callee of add_tablegen. ++ set(LLVM_ENABLE_OBJLIB ON) ++ + add_llvm_utility(${target} ${ARGN}) + set(LLVM_LINK_COMPONENTS ${${target}_OLD_LLVM_LINK_COMPONENTS}) + +diff --git a/tools/llvm-go/llvm-go.go b/tools/llvm-go/llvm-go.go +index c5c3fd2..ed79ca6 100644 +--- a/tools/llvm-go/llvm-go.go ++++ b/tools/llvm-go/llvm-go.go +@@ -24,6 +24,11 @@ import ( + "strings" + ) + ++const ( ++ linkmodeComponentLibs = "component-libs" ++ linkmodeDylib = "dylib" ++) ++ + type pkg struct { + llvmpath, pkgpath string + } +@@ -66,11 +71,12 @@ var components = []string{ + func llvmConfig(args ...string) string { + configpath := os.Getenv("LLVM_CONFIG") + if configpath == "" { +- // strip llvm-go, add llvm-config +- configpath = os.Args[0][:len(os.Args[0])-7] + "llvm-config" ++ bin, _ := filepath.Split(os.Args[0]) ++ configpath = filepath.Join(bin, "llvm-config") + } + + cmd := exec.Command(configpath, args...) ++ cmd.Stderr = os.Stderr + out, err := cmd.Output() + if err != nil { + panic(err.Error()) +@@ -78,11 +84,21 @@ func llvmConfig(args ...string) string { + + outstr := string(out) + outstr = strings.TrimSuffix(outstr, "\n") +- return strings.Replace(outstr, "\n", " ", -1) ++ outstr = strings.Replace(outstr, "\n", " ", -1) ++ return outstr + } + +-func llvmFlags() compilerFlags { +- ldflags := llvmConfig(append([]string{"--ldflags", "--libs", "--system-libs"}, components...)...) ++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") + if runtime.GOOS != "darwin" { + // OS X doesn't like -rpath with cgo. See: + // https://code.google.com/p/go/issues/detail?id=7293 +@@ -117,8 +133,8 @@ func printComponents() { + fmt.Println(strings.Join(components, " ")) + } + +-func printConfig() { +- flags := llvmFlags() ++func printConfig(linkmode string) { ++ flags := llvmFlags(linkmode) + + fmt.Printf(`// +build !byollvm + +@@ -137,7 +153,7 @@ type (run_build_sh int) + `, flags.cpp, flags.cxx, flags.ld) + } + +-func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags string) { ++func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags, linkmode string) { + args = addTag(args, "byollvm") + + srcdir := llvmConfig("--src-root") +@@ -166,7 +182,7 @@ func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags, cxxflags, l + newgopathlist = append(newgopathlist, filepath.SplitList(os.Getenv("GOPATH"))...) + newgopath := strings.Join(newgopathlist, string(filepath.ListSeparator)) + +- flags := llvmFlags() ++ flags := llvmFlags(linkmode) + + newenv := []string{ + "CC=" + cc, +@@ -178,7 +194,7 @@ func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags, cxxflags, l + "PATH=" + newpath, + } + if llgo != "" { +- newenv = append(newenv, "GCCGO=" + llgo) ++ newenv = append(newenv, "GCCGO="+llgo) + } + + for _, v := range os.Environ() { +@@ -234,45 +250,44 @@ func main() { + ldflags := os.Getenv("CGO_LDFLAGS") + gocmd := "go" + llgo := "" ++ linkmode := linkmodeComponentLibs ++ ++ flags := []struct { ++ name string ++ dest *string ++ }{ ++ {"cc", &cc}, ++ {"cxx", &cxx}, ++ {"go", &gocmd}, ++ {"llgo", &llgo}, ++ {"cppflags", &cppflags}, ++ {"ldflags", &ldflags}, ++ {"linkmode", &linkmode}, ++ } + + args := os.Args[1:] +- DONE: for { +- switch { +- case len(args) == 0: ++LOOP: ++ for { ++ if len(args) == 0 { + usage() +- case strings.HasPrefix(args[0], "cc="): +- cc = args[0][3:] +- args = args[1:] +- case strings.HasPrefix(args[0], "cxx="): +- cxx = args[0][4:] +- args = args[1:] +- case strings.HasPrefix(args[0], "go="): +- gocmd = args[0][3:] +- args = args[1:] +- case strings.HasPrefix(args[0], "llgo="): +- llgo = args[0][5:] +- args = args[1:] +- case strings.HasPrefix(args[0], "cppflags="): +- cppflags = args[0][9:] +- args = args[1:] +- case strings.HasPrefix(args[0], "cxxflags="): +- cxxflags = args[0][9:] +- args = args[1:] +- case strings.HasPrefix(args[0], "ldflags="): +- ldflags = args[0][8:] +- args = args[1:] +- default: +- break DONE + } ++ for _, flag := range flags { ++ if strings.HasPrefix(args[0], flag.name+"=") { ++ *flag.dest = args[0][len(flag.name)+1:] ++ args = args[1:] ++ continue LOOP ++ } ++ } ++ break + } + + switch args[0] { + case "build", "get", "install", "run", "test": +- runGoWithLLVMEnv(args, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags) ++ runGoWithLLVMEnv(args, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags, linkmode) + case "print-components": + printComponents() + case "print-config": +- printConfig() ++ printConfig(linkmode) + default: + usage() + } +diff --git a/tools/llvm-shlib/CMakeLists.txt b/tools/llvm-shlib/CMakeLists.txt +index 54d71d3..d9bd15f 100644 +--- a/tools/llvm-shlib/CMakeLists.txt ++++ b/tools/llvm-shlib/CMakeLists.txt +@@ -2,42 +2,6 @@ + # library is enabled by setting LLVM_BUILD_LLVM_DYLIB=yes on the CMake + # commandline. By default the shared library only exports the LLVM C API. + +- +-# You can configure which libraries from LLVM you want to include in the shared +-# library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited list of +-# LLVM components. All compoenent names handled by llvm-config are valid. +- +-if(NOT DEFINED LLVM_DYLIB_COMPONENTS) +- set(LLVM_DYLIB_COMPONENTS +- ${LLVM_TARGETS_TO_BUILD} +- Analysis +- BitReader +- BitWriter +- CodeGen +- Core +- DebugInfoDWARF +- DebugInfoPDB +- ExecutionEngine +- IPA +- IPO +- IRReader +- InstCombine +- Instrumentation +- Interpreter +- Linker +- MCDisassembler +- MCJIT +- ObjCARCOpts +- Object +- ScalarOpts +- Support +- Target +- TransformUtils +- Vectorize +- native +- ) +-endif() +- + add_definitions( -DLLVM_VERSION_INFO=\"${PACKAGE_VERSION}\" ) + + set(SOURCES +@@ -46,6 +10,29 @@ set(SOURCES + + llvm_map_components_to_libnames(LIB_NAMES ${LLVM_DYLIB_COMPONENTS}) + ++if(LLVM_LINK_LLVM_DYLIB) ++ if(NOT LLVM_DYLIB_EXPORT_ALL) ++ message(FATAL_ERROR "LLVM_DYLIB_EXPORT_ALL must be ON when LLVM_LINK_LLVM_DYLIB is ON") ++ endif() ++ ++ # libLLVM.so should not have any dependencies on any other LLVM ++ # shared libraries. When using the "all" pseudo-component, ++ # LLVM_AVAILABLE_LIBS is added to the dependencies, which may ++ # contain shared libraries (e.g. libLTO). ++ # ++ # Also exclude libLLVMTableGen for the following reasons: ++ # - it is only used by internal *-tblgen utilities; ++ # - it pollutes the global options space. ++ foreach(lib ${LIB_NAMES}) ++ get_target_property(t ${lib} TYPE) ++ if("${lib}" STREQUAL "LLVMTableGen") ++ elseif("x${t}" STREQUAL "xSTATIC_LIBRARY") ++ list(APPEND FILTERED_LIB_NAMES ${lib}) ++ endif() ++ endforeach() ++ set(LIB_NAMES ${FILTERED_LIB_NAMES}) ++endif() ++ + if(NOT DEFINED LLVM_DYLIB_EXPORTED_SYMBOL_FILE) + + if( WIN32 AND NOT CYGWIN ) +@@ -95,7 +82,7 @@ else() + add_custom_target(libLLVMExports DEPENDS ${LLVM_EXPORTED_SYMBOL_FILE}) + endif() + +-add_llvm_library(LLVM SHARED ${SOURCES}) ++add_llvm_library(LLVM SHARED DISABLE_LLVM_LINK_LLVM_DYLIB ${SOURCES}) + + list(REMOVE_DUPLICATES LIB_NAMES) + if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") # FIXME: It should be "GNU ld for elf"