diff options
author | Vladimir Still | 2015-10-07 11:23:47 +0200 |
---|---|---|
committer | Vladimir Still | 2015-10-07 11:23:47 +0200 |
commit | 9a7e3896ff70f7ef0a61000ceb0cf5b6cda09b7a (patch) | |
tree | 7b439c8d1e084fc80c8f4f5065d15742981f3d7d | |
download | aur-9a7e3896ff70f7ef0a61000ceb0cf5b6cda09b7a.tar.gz |
Import 3.7.0 from extra.
-rw-r--r-- | .SRCINFO | 93 | ||||
-rw-r--r-- | PKGBUILD | 272 | ||||
-rw-r--r-- | clang-tools-extra-3.7.0-install-clang-query.patch | 9 | ||||
-rw-r--r-- | lldb-3.7.0-avoid-linking-to-libLLVM.patch | 20 | ||||
-rw-r--r-- | llvm-3.7.0-export-more-symbols.patch | 11 | ||||
-rw-r--r-- | llvm-3.7.0-link-tools-against-libLLVM.patch | 440 | ||||
-rw-r--r-- | llvm-Config-llvm-config.h | 9 |
7 files changed, 854 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO new file mode 100644 index 000000000000..71f0643692ef --- /dev/null +++ b/.SRCINFO @@ -0,0 +1,93 @@ +pkgbase = llvm + pkgver = 3.7.0 + pkgrel = 4 + url = http://llvm.org/ + arch = i686 + arch = x86_64 + license = custom:University of Illinois/NCSA Open Source License + makedepends = cmake + makedepends = libffi + makedepends = python2 + makedepends = ocaml=4.02.3 + makedepends = python-sphinx + makedepends = ocaml-ctypes + makedepends = ocaml-findlib + makedepends = libedit + makedepends = swig + options = staticlibs + source = http://llvm.org/releases/3.7.0/llvm-3.7.0.src.tar.xz + source = http://llvm.org/releases/3.7.0/llvm-3.7.0.src.tar.xz.sig + source = http://llvm.org/releases/3.7.0/cfe-3.7.0.src.tar.xz + source = http://llvm.org/releases/3.7.0/cfe-3.7.0.src.tar.xz.sig + source = http://llvm.org/releases/3.7.0/clang-tools-extra-3.7.0.src.tar.xz + source = http://llvm.org/releases/3.7.0/clang-tools-extra-3.7.0.src.tar.xz.sig + source = http://llvm.org/releases/3.7.0/compiler-rt-3.7.0.src.tar.xz + source = http://llvm.org/releases/3.7.0/compiler-rt-3.7.0.src.tar.xz.sig + source = http://llvm.org/releases/3.7.0/lldb-3.7.0.src.tar.xz + source = http://llvm.org/releases/3.7.0/lldb-3.7.0.src.tar.xz.sig + source = llvm-3.7.0-link-tools-against-libLLVM.patch + source = llvm-3.7.0-export-more-symbols.patch + source = clang-tools-extra-3.7.0-install-clang-query.patch + source = lldb-3.7.0-avoid-linking-to-libLLVM.patch + source = llvm-Config-llvm-config.h + sha256sums = ab45895f9dcdad1e140a3a79fd709f64b05ad7364e308c0e582c5b02e9cc3153 + sha256sums = SKIP + sha256sums = 4ed740c5a91df1c90a4118c5154851d6a475f39a91346bdf268c1c29c13aa1cc + sha256sums = SKIP + sha256sums = 8ae8a0a3a96b7a700412d67df0af172cb2fc1326beec575fcc0f71d2e72709cd + sha256sums = SKIP + sha256sums = 227fa998520bc94974a428dc8e7654d9bdf277e5bc70d4064ebc05691bd62b0b + sha256sums = SKIP + sha256sums = f4d7505bc111044eaa4033af012221e492938405b62522b8e3e354c20c4b71e9 + sha256sums = SKIP + sha256sums = cf9c8b4d70b4547eda162644658c5c203c3139fcea6c75003b6cd7dc11a8cccc + sha256sums = a1c9f36b97c639666ab6a1bd647a08a027e93e3d3cfd6f5af9c36e757599ce81 + sha256sums = 3abf85430c275ecb8dbb526ecb82b1c9f4b4f782a8a43b5a06d040ec0baba7e7 + sha256sums = 2d53b6ed4c7620eeade87e7761b98093a0434801ddd599056daed7881141fb01 + sha256sums = 597dc5968c695bbdbb0eac9e8eb5117fcd2773bc91edf5ec103ecffffab8bc48 + makedepends_x86_64 = gcc-multilib + +pkgname = llvm + pkgdesc = Low Level Virtual Machine + depends = llvm-libs=3.7.0-4 + depends = perl + +pkgname = llvm-libs + pkgdesc = Low Level Virtual Machine (runtime libraries) + depends = gcc-libs + depends = zlib + depends = libffi + depends = libedit + depends = ncurses + +pkgname = llvm-ocaml + pkgdesc = OCaml bindings for LLVM + depends = llvm=3.7.0-4 + depends = ocaml=4.02.3 + depends = ocaml-ctypes + +pkgname = lldb + pkgdesc = Next generation, high-performance debugger + url = http://lldb.llvm.org/ + depends = libedit + depends = libxml2 + depends = python2 + +pkgname = clang + pkgdesc = C language family frontend for LLVM + url = http://clang.llvm.org/ + depends = llvm-libs=3.7.0-4 + depends = gcc + optdepends = python2: for git-clang-format + +pkgname = clang-analyzer + pkgdesc = A source code analysis framework + url = http://clang-analyzer.llvm.org/ + depends = clang=3.7.0-4 + depends = python2 + +pkgname = clang-tools-extra + pkgdesc = Extra tools built using Clang's tooling APIs + url = http://clang.llvm.org/ + depends = clang=3.7.0-4 + diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 000000000000..2783ffb3f4da --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,272 @@ +# $Id$ +# Maintainer: Evangelos Foutras <evangelos@foutrelis.com> +# Contributor: Jan "heftig" Steffens <jan.steffens@gmail.com> +# Contributor: Sebastian Nowicki <sebnow@gmail.com> +# Contributor: Devin Cofer <ranguvar{AT]archlinux[DOT}us> +# Contributor: Tobias Kieslich <tobias@justdreams.de> +# Contributor: Geoffroy Carrier <geoffroy.carrier@aur.archlinux.org> +# Contributor: Tomas Lindquist Olsen <tomas@famolsen.dk> +# Contributor: Roberto Alsina <ralsina@kde.org> +# Contributor: Gerardo Exequiel Pozzi <vmlinuz386@yahoo.com.ar> + +pkgname=('llvm' 'llvm-libs' 'llvm-ocaml' 'lldb' 'clang' 'clang-analyzer' + 'clang-tools-extra') +pkgver=3.7.0 +pkgrel=4 +_ocaml_ver=4.02.3 +arch=('i686' 'x86_64') +url="http://llvm.org/" +license=('custom:University of Illinois/NCSA Open Source License') +makedepends=('cmake' 'libffi' 'python2' "ocaml=$_ocaml_ver" 'python-sphinx' + 'ocaml-ctypes' 'ocaml-findlib' 'libedit' 'swig') +# Use gcc-multilib to build 32-bit compiler-rt libraries on x86_64 (FS#41911) +makedepends_x86_64=('gcc-multilib') +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/clang-tools-extra-$pkgver.src.tar.xz{,.sig} + http://llvm.org/releases/$pkgver/compiler-rt-$pkgver.src.tar.xz{,.sig} + http://llvm.org/releases/$pkgver/lldb-$pkgver.src.tar.xz{,.sig} + llvm-3.7.0-link-tools-against-libLLVM.patch + llvm-3.7.0-export-more-symbols.patch + clang-tools-extra-3.7.0-install-clang-query.patch + lldb-3.7.0-avoid-linking-to-libLLVM.patch + llvm-Config-llvm-config.h) +sha256sums=('ab45895f9dcdad1e140a3a79fd709f64b05ad7364e308c0e582c5b02e9cc3153' + 'SKIP' + '4ed740c5a91df1c90a4118c5154851d6a475f39a91346bdf268c1c29c13aa1cc' + 'SKIP' + '8ae8a0a3a96b7a700412d67df0af172cb2fc1326beec575fcc0f71d2e72709cd' + 'SKIP' + '227fa998520bc94974a428dc8e7654d9bdf277e5bc70d4064ebc05691bd62b0b' + 'SKIP' + 'f4d7505bc111044eaa4033af012221e492938405b62522b8e3e354c20c4b71e9' + 'SKIP' + 'cf9c8b4d70b4547eda162644658c5c203c3139fcea6c75003b6cd7dc11a8cccc' + 'a1c9f36b97c639666ab6a1bd647a08a027e93e3d3cfd6f5af9c36e757599ce81' + '3abf85430c275ecb8dbb526ecb82b1c9f4b4f782a8a43b5a06d040ec0baba7e7' + '2d53b6ed4c7620eeade87e7761b98093a0434801ddd599056daed7881141fb01' + '597dc5968c695bbdbb0eac9e8eb5117fcd2773bc91edf5ec103ecffffab8bc48') +validpgpkeys=('11E521D646982372EB577A1F8F0871F202119294' + 'B6C8F98282B944E3B0D5C2530FC3042E345AD05D') + +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/clang-tools-extra-$pkgver.src" tools/clang/tools/extra + + mv "$srcdir/compiler-rt-$pkgver.src" projects/compiler-rt + + mv "$srcdir/lldb-$pkgver.src" tools/lldb + + # Backport LLVM_LINK_LLVM_DYLIB option + # https://bugs.archlinux.org/task/46392 + patch -Np1 -i ../llvm-3.7.0-link-tools-against-libLLVM.patch + + # https://llvm.org/bugs/show_bug.cgi?id=24157 + patch -Np2 -i ../llvm-3.7.0-export-more-symbols.patch + + # https://llvm.org/bugs/show_bug.cgi?id=24046 + # Upstreamed - http://reviews.llvm.org/D13206 + patch -d tools/clang/tools/extra -Np1 <../clang-tools-extra-3.7.0-install-clang-query.patch + + # https://llvm.org/bugs/show_bug.cgi?id=24953 + patch -d tools/lldb -Np1 <../lldb-3.7.0-avoid-linking-to-libLLVM.patch + + # Use Python 2 + find tools/lldb -name Makefile -exec sed -i 's/python-config/python2-config/' {} + + sed -i 's|/usr/bin/env python|&2|' \ + tools/lldb/scripts/Python/{build-swig-Python,finish-swig-Python-LLDB}.sh + + mkdir build +} + +build() { + cd "$srcdir/llvm-$pkgver.src/build" + + cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -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=ON \ + -DLLVM_ENABLE_SPHINX=ON \ + -DLLVM_ENABLE_DOXYGEN=OFF \ + -DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi) \ + -DLLVM_BINUTILS_INCDIR=/usr/include \ + .. + + make + make ocaml_doc + + # 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_llvm() { + pkgdesc="Low Level Virtual Machine" + depends=("llvm-libs=$pkgver-$pkgrel" 'perl') + + cd "$srcdir/llvm-$pkgver.src" + + make -C build DESTDIR="$pkgdir" install + + # Remove documentation sources + rm -r "$pkgdir"/usr/share/doc/$pkgname/html/{_sources,.buildinfo} + + # The runtime libraries go into llvm-libs + mv -f "$pkgdir"/usr/lib/lib{LLVM,LTO}.so* "$srcdir" + mv -f "$pkgdir"/usr/lib/LLVMgold.so "$srcdir" + + # OCaml bindings go to a separate package + rm -rf "$srcdir"/ocaml.{lib,doc} + mv "$pkgdir/usr/lib/ocaml" "$srcdir/ocaml.lib" + mv "$pkgdir/usr/docs/ocaml/html" "$srcdir/ocaml.doc" + rm -r "$pkgdir/usr/docs" + + if [[ $CARCH == x86_64 ]]; then + # Needed for multilib (https://bugs.archlinux.org/task/29951) + # Header stub is taken from Fedora + mv "$pkgdir/usr/include/llvm/Config/llvm-config"{,-64}.h + cp "$srcdir/llvm-Config-llvm-config.h" \ + "$pkgdir/usr/include/llvm/Config/llvm-config.h" + fi + + install -Dm644 LICENSE.TXT "$pkgdir/usr/share/licenses/$pkgname/LICENSE" +} + +package_llvm-libs() { + pkgdesc="Low Level Virtual Machine (runtime libraries)" + depends=('gcc-libs' 'zlib' 'libffi' 'libedit' 'ncurses') + + install -d "$pkgdir/usr/lib" + cp -P \ + "$srcdir"/lib{LLVM,LTO}.so* \ + "$srcdir"/LLVMgold.so \ + "$pkgdir/usr/lib/" + + # Symlink LLVMgold.so from /usr/lib/bfd-plugins + # https://bugs.archlinux.org/task/28479 + install -d "$pkgdir/usr/lib/bfd-plugins" + ln -s ../LLVMgold.so "$pkgdir/usr/lib/bfd-plugins/LLVMgold.so" + + install -Dm644 "$srcdir/llvm-$pkgver.src/LICENSE.TXT" \ + "$pkgdir/usr/share/licenses/$pkgname/LICENSE" +} + +package_llvm-ocaml() { + pkgdesc="OCaml bindings for LLVM" + depends=("llvm=$pkgver-$pkgrel" "ocaml=$_ocaml_ver" 'ocaml-ctypes') + + cd "$srcdir/llvm-$pkgver.src" + + install -d "$pkgdir"/{usr/lib,usr/share/doc} + cp -a "$srcdir/ocaml.lib" "$pkgdir/usr/lib/ocaml" + cp -a "$srcdir/ocaml.doc" "$pkgdir/usr/share/doc/$pkgname" + + install -Dm644 LICENSE.TXT "$pkgdir/usr/share/licenses/$pkgname/LICENSE" +} + +package_lldb() { + pkgdesc="Next generation, high-performance debugger" + url="http://lldb.llvm.org/" + depends=('libedit' 'libxml2' 'python2') + + cd "$srcdir/llvm-$pkgver.src" + + make -C build/tools/lldb DESTDIR="$pkgdir" install + + # Compile Python scripts + python2 -m compileall "$pkgdir/usr/lib/python2.7/site-packages/lldb" + python2 -O -m compileall "$pkgdir/usr/lib/python2.7/site-packages/lldb" + + install -Dm644 tools/lldb/LICENSE.TXT "$pkgdir/usr/share/licenses/$pkgname/LICENSE" +} + +package_clang() { + pkgdesc="C language family frontend for LLVM" + url="http://clang.llvm.org/" + depends=("llvm-libs=$pkgver-$pkgrel" 'gcc') + optdepends=('python2: for git-clang-format') + + cd "$srcdir/llvm-$pkgver.src" + + make -C build/tools/clang DESTDIR="$pkgdir" install + make -C build/projects/compiler-rt DESTDIR="$pkgdir" install + + # Remove documentation sources + rm -r "$pkgdir"/usr/share/doc/$pkgname/html/{_sources,.buildinfo} + + # Install Python bindings + install -d "$pkgdir/usr/lib/python2.7/site-packages" + cp -a tools/clang/bindings/python/clang "$pkgdir/usr/lib/python2.7/site-packages/" + python2 -m compileall "$pkgdir/usr/lib/python2.7/site-packages/clang" + python2 -O -m compileall "$pkgdir/usr/lib/python2.7/site-packages/clang" + + # Use Python 2 + sed -i 's|/usr/bin/env python|&2|' \ + "$pkgdir/usr/bin/git-clang-format" \ + "$pkgdir/usr/share/$pkgname/clang-format-diff.py" + + install -Dm644 tools/clang/LICENSE.TXT \ + "$pkgdir/usr/share/licenses/$pkgname/LICENSE" +} + +package_clang-analyzer() { + pkgdesc="A source code analysis framework" + url="http://clang-analyzer.llvm.org/" + depends=("clang=$pkgver-$pkgrel" 'python2') + + cd "$srcdir/llvm-$pkgver.src/tools/clang" + + install -d "$pkgdir"/usr/{bin,lib/clang-analyzer} + for _tool in scan-{build,view}; do + cp -a tools/$_tool "$pkgdir/usr/lib/clang-analyzer/" + ln -s /usr/lib/clang-analyzer/$_tool/$_tool "$pkgdir/usr/bin/" + done + + # scan-build looks for clang within the same directory + ln -s /usr/bin/clang "$pkgdir/usr/lib/clang-analyzer/scan-build/" + + # Relocate man page + install -d "$pkgdir/usr/share/man/man1" + mv "$pkgdir/usr/lib/clang-analyzer/scan-build/scan-build.1" \ + "$pkgdir/usr/share/man/man1/" + + # Use Python 2 + sed -i \ + -e 's|env python$|&2|' \ + -e 's|/usr/bin/python$|&2|' \ + "$pkgdir/usr/lib/clang-analyzer/scan-view/scan-view" \ + "$pkgdir/usr/lib/clang-analyzer/scan-build/set-xcode-analyzer" + + # Compile Python scripts + python2 -m compileall "$pkgdir/usr/lib/clang-analyzer" + python2 -O -m compileall "$pkgdir/usr/lib/clang-analyzer" + + install -Dm644 LICENSE.TXT "$pkgdir/usr/share/licenses/$pkgname/LICENSE" +} + +package_clang-tools-extra() { + pkgdesc="Extra tools built using Clang's tooling APIs" + url="http://clang.llvm.org/" + depends=("clang=$pkgver-$pkgrel") + + cd "$srcdir/llvm-$pkgver.src" + + make -C build/tools/clang/tools/extra DESTDIR="$pkgdir" install + + install -Dm644 tools/clang/tools/extra/LICENSE.TXT \ + "$pkgdir/usr/share/licenses/$pkgname/LICENSE" +} + +# vim:set ts=2 sw=2 et: diff --git a/clang-tools-extra-3.7.0-install-clang-query.patch b/clang-tools-extra-3.7.0-install-clang-query.patch new file mode 100644 index 000000000000..a632baf125bd --- /dev/null +++ b/clang-tools-extra-3.7.0-install-clang-query.patch @@ -0,0 +1,9 @@ +diff -upr clang-tools-extra-3.7.0.src.orig/clang-query/tool/CMakeLists.txt clang-tools-extra-3.7.0.src/clang-query/tool/CMakeLists.txt +--- clang-tools-extra-3.7.0.src.orig/clang-query/tool/CMakeLists.txt 2015-06-20 22:28:07.000000000 +0300 ++++ clang-tools-extra-3.7.0.src/clang-query/tool/CMakeLists.txt 2015-09-28 11:51:14.724472237 +0300 +@@ -10,3 +10,5 @@ target_link_libraries(clang-query + clangQuery + clangTooling + ) ++ ++install(TARGETS clang-query RUNTIME DESTINATION bin) diff --git a/lldb-3.7.0-avoid-linking-to-libLLVM.patch b/lldb-3.7.0-avoid-linking-to-libLLVM.patch new file mode 100644 index 000000000000..f4859edad846 --- /dev/null +++ b/lldb-3.7.0-avoid-linking-to-libLLVM.patch @@ -0,0 +1,20 @@ +diff -upr lldb-3.7.0.src.orig/cmake/modules/AddLLDB.cmake lldb-3.7.0.src/cmake/modules/AddLLDB.cmake +--- lldb-3.7.0.src.orig/cmake/modules/AddLLDB.cmake 2015-09-28 11:42:23.439084000 +0300 ++++ lldb-3.7.0.src/cmake/modules/AddLLDB.cmake 2015-09-28 11:43:03.200237733 +0300 +@@ -56,7 +56,7 @@ macro(add_lldb_library name) + if (PARAM_OBJECT) + add_library(${name} ${libkind} ${srcs}) + else() +- llvm_add_library(${name} ${libkind} ${srcs}) ++ llvm_add_library(${name} ${libkind} DISABLE_LLVM_LINK_LLVM_DYLIB ${srcs}) + + lldb_link_common_libs(${name} "${libkind}") + +@@ -93,6 +93,6 @@ macro(add_lldb_library name) + endmacro(add_lldb_library) + + macro(add_lldb_executable name) +- add_llvm_executable(${name} ${ARGN}) ++ add_llvm_executable(${name} DISABLE_LLVM_LINK_LLVM_DYLIB ${ARGN}) + set_target_properties(${name} PROPERTIES FOLDER "lldb executables") + endmacro(add_lldb_executable) diff --git a/llvm-3.7.0-export-more-symbols.patch b/llvm-3.7.0-export-more-symbols.patch new file mode 100644 index 000000000000..bc3d141da62d --- /dev/null +++ b/llvm-3.7.0-export-more-symbols.patch @@ -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...") diff --git a/llvm-3.7.0-link-tools-against-libLLVM.patch b/llvm-3.7.0-link-tools-against-libLLVM.patch new file mode 100644 index 000000000000..e8c16ca29ab8 --- /dev/null +++ b/llvm-3.7.0-link-tools-against-libLLVM.patch @@ -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" diff --git a/llvm-Config-llvm-config.h b/llvm-Config-llvm-config.h new file mode 100644 index 000000000000..2fa08c9be696 --- /dev/null +++ b/llvm-Config-llvm-config.h @@ -0,0 +1,9 @@ +#include <bits/wordsize.h> + +#if __WORDSIZE == 32 +#include "llvm-config-32.h" +#elif __WORDSIZE == 64 +#include "llvm-config-64.h" +#else +#error "Unknown word size" +#endif |