# Contributor: Travis Tilley # Maintainer: Travis Tilley pkgname=llvm pkgver=3.6.1 pkgrel=2 use_svn="false" pkgdesc="low level virtual machine compiler system" arch="all" url="http://llvm.org/" license="UOI-NCSA" depends="" depends_dev="perl" makedepends="$depends_dev cmake make flex bison groff musl-dev binutils-dev libffi-dev libxml2-dev libxml2-utils zlib-dev ncurses-dev python python-dev py-sphinx chrpath" [ "${use_svn}" = "true" ] && makedepends="$makedepends subversion" install= subpackages="clang clang-doc:clang_doc $pkgname-dev $pkgname-doc $pkgname-libs" source=" llvm-0001-fix-shared-build.patch llvm-0002-musl-triple.patch llvm-0003-musl-hacks.patch compiler-rt-0001-musl-no-dlvsym.patch compiler-rt-0002-musl-no-sanitizers.patch compiler-rt-0003-off_t.patch clang-0001-fix-stdint.h.patch clang-0002-fix-unwind-header.patch clang-0003-add-alpine-linux-distro.patch clang-0004-alpine-use-z-relro.patch clang-0005-alpine-hash-style-gnu.patch clang-0006-musl-alpine-triple.patch clang-0007-musl-dynamic-linker-paths.patch clang-0008-alpine-PIE-by-default.patch clang-0009-pass-host-triple-to-compiler-rt.patch " if [ "${use_svn}" != "true" ]; then source="$source http://llvm.org/releases/$pkgver/llvm-$pkgver.src.tar.xz http://llvm.org/releases/$pkgver/cfe-$pkgver.src.tar.xz http://llvm.org/releases/$pkgver/clang-tools-extra-$pkgver.src.tar.xz http://llvm.org/releases/$pkgver/compiler-rt-$pkgver.src.tar.xz" fi _builddir="$srcdir"/build _bootstrap_prefix="$srcdir"/bootstrap _cmake_flags="\ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_VERBOSE_MAKEFILE=NO \ " # the binutils include directory setting appears to be necessary in order to # build the LLVMGold plugin, even if the headers are in /usr/include and easily # detected. # auto-detection of both go and ocaml are explicitly disabled here, as they # currently do not compile. _cmake_common_flags="\ ${_cmake_flags} \ -DLLVM_DEFAULT_TARGET_TRIPLE=$CBUILD \ -DLLVM_HOST_TRIPLE=$CHOST \ -DLLVM_BINUTILS_INCDIR=/usr/include \ -DLLVM_ENABLE_ASSERTIONS=NO \ -DLLVM_ENABLE_FFI=YES \ -DLLVM_ENABLE_LIBCXX=NO \ -DLLVM_ENABLE_PIC=YES \ -DLLVM_ENABLE_ZLIB=YES \ -DLLVM_ENABLE_RTTI=YES \ -DGO_EXECUTABLE=GO_EXECUTABLE-NOTFOUND \ -DOCAMLFIND=OCAMLFIND-NOTFOUND \ -DCLANG_BUILD_EXAMPLES=NO \ -DLLVM_BUILD_EXAMPLES=NO \ -DLLVM_INCLUDE_EXAMPLES=NO \ -DLIBXML2_INCLUDE_DIR=/usr/include/libxml2 \ " # attempt to build the bootstrap compiler as quickly as is sane. unfortunately, # there is no way to turn off ObjC support. we can, however, disable building # ARCMT (automatic reference counting migration tool), the static analyzer, and # documentation. also, since we're using the cmake build and not autotools, the # tests aren't automatically built (targets for testing are emitted, just not # built as part of the default target). _cmake_bootstrap_flags="\ ${_cmake_common_flags} \ -DCMAKE_INSTALL_PREFIX=${_bootstrap_prefix} \ -DLLVM_TARGETS_TO_BUILD=host \ -DBUILD_SHARED_LIBS=NO \ -DCLANG_ENABLE_ARCMT=NO \ -DCLANG_ENABLE_STATIC_ANALYZER=NO \ -DCLANG_INCLUDE_DOCS=NO \ -DLLVM_ENABLE_CXX1Y=NO \ -DLLVM_ENABLE_SPHINX=NO \ -DLLVM_ENABLE_TERMINFO=NO \ -DLLVM_INCLUDE_DOCS=NO \ -DLLVM_EXTERNAL_CLANG_TOOLS_EXTRA_BUILD=NO \ " # setting compiler-rt to compile as if it were an external build allows it to # use the freshly built clang to compile, rather than the bootstrap compiler. # NOTE: there appears to be an issue building compiler-rt as an external project # and using ninja as the build tool, so stick to good old fashioned makefiles. _cmake_final_flags="\ ${_cmake_common_flags} \ -DCMAKE_INSTALL_PREFIX=/usr \ -DLLVM_TARGETS_TO_BUILD=all \ -DLLVM_BUILD_EXTERNAL_COMPILER_RT=YES \ -DBUILD_SHARED_LIBS=YES \ -DLLVM_BUILD_DOCS=YES \ -DLLVM_ENABLE_CXX1Y=YES \ -DLLVM_ENABLE_SPHINX=YES \ -DLLVM_ENABLE_TERMINFO=YES \ -DLIBCLANG_BUILD_STATIC=YES \ " _srcdir="$srcdir"/"$pkgname-$pkgver.src" _srcdir_clang="$_srcdir"/tools/clang _srcdir_clang_extra="$_srcdir_clang"/tools/extra _srcdir_compiler_rt="$_srcdir"/projects/compiler-rt prepare() { if [[ "${use_svn}" = "true" ]]; then pkgsvnver="tags/RELEASE_${pkgver//./}/final/" svn_source="http://llvm.org/svn/llvm-project" cd "$srcdir" svn co "$svn_source/llvm/$pkgsvnver" llvm-$pkgver.src svn co "$svn_source/cfe/$pkgsvnver" cfe-$pkgver.src svn co "$svn_source/clang-tools-extra/$pkgsvnver" clang-tools-extra-$pkgver.src svn co "$svn_source/compiler-rt/$pkgsvnver" compiler-rt-$pkgver.src fi msg "Preparing LLVM project sources..." mv "$srcdir"/cfe-$pkgver.src \ "$_srcdir_clang" || return 1 mv "$srcdir"/clang-tools-extra-$pkgver.src \ "$_srcdir_clang_extra" || return 1 mv "$srcdir"/compiler-rt-$pkgver.src \ "$_srcdir_compiler_rt" || return 1 msg "Patching LLVM core..." cd "$_srcdir" || return 1 update_config_sub || return 1 sed -i -e '/case "\${UNAME_MACHINE}:\${UNAME_SYSTEM}:\${UNAME_RELEASE}:\${UNAME_VERSION}" in/i \' \ -e 'if [ x != "x$CBUILD" ]; then echo "$CBUILD"; exit; fi' \ ./autoconf/config.guess || return 1 for i in $source; do case $i in llvm-*.patch) msg "Applying $i..." patch -s -p1 -N -i "$srcdir"/$i || return 1 ;; esac done msg "Patching clang..." cd "$_srcdir_clang" || return 1 # FIXME: I have never seen these tests pass on any system, be it vanilla clang # or patched, musl or glibc, autoconf or cmake. It fails on alpine, gentoo, # and ubuntu. rm ./test/Driver/lto.c for i in $source; do case $i in clang-*.patch) msg "Applying $i..." patch -s -p1 -N -i "$srcdir"/$i || return 1 ;; esac done msg "Patching compiler-rt..." cd "$_srcdir_compiler_rt" || return 1 for i in $source; do case $i in compiler-rt-*.patch) msg "Applying $i..." patch -s -p1 -N -i "$srcdir"/$i || return 1 ;; esac done } build() { # cmake is funky. it uses several flag related settings in addition to picking # up what's in the CFLAGS/CXXFLAGS env variables. to make using any abuild-set # flags sane, we pass them in as options to cmake and unset the environment # variables. we also back up the original flags so that we can tweak them # without losing the original setting (see below re: -fno-devirtualize). orig_cflags="${CFLAGS}" orig_cxxflags="${CXXFLAGS}" unset CFLAGS unset CXXFLAGS # just in case those were set to blank strings, we _really_ want to make sure # we're not building what will effectively be a -O0 build here... test -z "${orig_cflags}" && orig_cflags="-O3" test -z "${orig_cxxflags}" && orig_cxxflags="-O3" # -fno-devirtualize is added here because, to quote the fedora spec file, # "gcc has scary template-related bugs". the flag is removed post-bootstrap. # -DNDEBUG is required to disable assertions cflags="${orig_cflags} -DNDEBUG" cxxflags="${orig_cxxflags} -DNDEBUG -fno-devirtualize" # The cmake logic appears to use the result of config.guess in a few places # even though we override the various triple settings manually. export CBUILD # to the tweaked config.guess just to be safe. export CBUILD # cmake doesn't call out to pkg-config to determine the include path for FFI, # and since alpine installs the headers to a versioned directory cmake can't # auto-detect it by guessing either. ffi_include_dir="$(pkg-config --cflags-only-I libffi | sed 's|^-I||g')" mkdir -p "$_builddir" cd "$_builddir" msg "Compiling bootstrap compiler" cmake -G "Unix Makefiles" -Wno-dev ${_cmake_bootstrap_flags} \ -DCMAKE_C_FLAGS_RELEASE="${cflags}" \ -DCMAKE_CXX_FLAGS_RELEASE="${cxxflags}" \ -DCMAKE_EXE_LINKER_FLAGS="${LDFLAGS}" \ -DCMAKE_SHARED_LINKER_FLAGS="${LDFLAGS}" \ -DFFI_INCLUDE_DIR="$ffi_include_dir" \ "${_srcdir}" || return 1 make || return 1 make install || return 1 cflags="${orig_cflags} -DNDEBUG" cxxflags="${orig_cxxflags} -DNDEBUG" CC="${_bootstrap_prefix}/bin/clang" CXX="${_bootstrap_prefix}/bin/clang++" cd .. rm -rf "$_builddir" mkdir -p "$_builddir" cd "$_builddir" msg "Compiling final compiler" cmake -G "Unix Makefiles" -Wno-dev ${_cmake_final_flags} \ -DCMAKE_C_COMPILER="${CC}" \ -DCMAKE_CXX_COMPILER="${CXX}" \ -DCMAKE_C_FLAGS_RELEASE="${cflags}" \ -DCMAKE_CXX_FLAGS_RELEASE="${cxxflags}" \ -DCMAKE_EXE_LINKER_FLAGS="${LDFLAGS}" \ -DCMAKE_SHARED_LINKER_FLAGS="${LDFLAGS}" \ -DFFI_INCLUDE_DIR="$ffi_include_dir" \ "${_srcdir}" || return 1 make || return 1 # llvm tests don't run under PaX, almost certainly due to MCJIT # TODO: detect when running a vanilla kernel and run all tests # make check-llvm || return 1 make check-clang || return 1 # 27 failures, all related to clang-tidy. # clang-format/clang-modernize and friends pass their test suites # make check-clang-tools || return 1 make check-compiler-rt || return 1 } package() { cd "$_builddir" make DESTDIR="$pkgdir" install rm "$pkgdir"/usr/lib/LLVMHello.so file "$pkgdir"/usr/lib/*.so | awk -F: '$2~/ELF/{print $1}' | xargs -r chrpath -d file "$pkgdir"/usr/bin/* | awk -F: '$2~/ELF/{print $1}' | xargs -r chrpath -d } clang() { pkgdesc="A C language family front-end for LLVM" mkdir -p "$subpkgdir"/usr/bin \ "$subpkgdir"/usr/lib "$subpkgdir"/usr/share/clang "$subpkgdir"/usr/include mv "$pkgdir"/usr/bin/*clang* \ "$subpkgdir"/usr/bin/ || return 1 mv "$pkgdir"/usr/lib/clang \ "$pkgdir"/usr/lib/libclang* \ "$pkgdir"/usr/lib/libmodernize* \ "$subpkgdir"/usr/lib/ || return 1 mv "$pkgdir"/usr/include/clang "$pkgdir"/usr/include/clang-c \ "$subpkgdir"/usr/include/ || return 1 cp -r "$_srcdir"/tools/clang/tools/scan-build "$subpkgdir"/usr/share/clang/scan-build cp -r "$_srcdir"/tools/clang/tools/scan-view "$subpkgdir"/usr/share/clang/scan-view ln -s /usr/share/clang/scan-build/scan-build "$subpkgdir"/usr/bin/scan-build ln -s /usr/share/clang/scan-view/scan-view "$subpkgdir"/usr/bin/scan-view } clang_doc() { pkgdesc="clang documentation" mkdir -p "$subpkgdir"/usr/share/doc/ || return 1 mv "$pkgdir"/usr/share/doc/clang "$subpkgdir"/usr/share/doc/ || return 1 } libs() { pkgdesc="LLVM shared libraries" mkdir -p "$subpkgdir"/usr/lib/ mv "$pkgdir"/usr/lib/*.so "$subpkgdir"/usr/lib/ } md5sums="0947294a8c83c8d7f857dfc16204c4eb llvm-0001-fix-shared-build.patch d10fc3574c560ccfae3eeacdc4a988f2 llvm-0002-musl-triple.patch 056178d87918d531f531b1b765a59e7c llvm-0003-musl-hacks.patch 346081b2f0825ca7f491155c4b3ca0ea compiler-rt-0001-musl-no-dlvsym.patch eb3797555357896a92f74bf1bacfbdc2 compiler-rt-0002-musl-no-sanitizers.patch 8bc11d4a60af51a7fc10643bd0970d3a compiler-rt-0003-off_t.patch eab0123372fa909817ed21cfcffdbe16 clang-0001-fix-stdint.h.patch 069f5cd7a6d0b01eade62bb72aac9e8b clang-0002-fix-unwind-header.patch 93ffbede80bc857c8ae6bed5ff016a52 clang-0003-add-alpine-linux-distro.patch 231fad6dc619ef6a54567c14082bf7af clang-0004-alpine-use-z-relro.patch 2967fea7ed0624d99808bc091be1bab4 clang-0005-alpine-hash-style-gnu.patch 2848c592e5388069b7f4785085193078 clang-0006-musl-alpine-triple.patch e24a82edcd6caa5e405ff67a45d6befc clang-0007-musl-dynamic-linker-paths.patch 6bc4b7047042f9afec452a97c35c2cd5 clang-0008-alpine-PIE-by-default.patch 0ae0c5939c27750c52b39158fbc7a7a9 clang-0009-pass-host-triple-to-compiler-rt.patch ebf9e97be405ae126e134d3a357cd58a llvm-3.6.1.src.tar.xz 9ff6811757735051f8651833b22ae014 cfe-3.6.1.src.tar.xz 1ad810536f0f7fefd4541a907aff83b3 clang-tools-extra-3.6.1.src.tar.xz 6f204b1feb324b1672ac907b32d927c0 compiler-rt-3.6.1.src.tar.xz" sha256sums="4f75c2a76cf4c439d65c8e67511cd91c895edf8ccf003a5f94ffa07c29456296 llvm-0001-fix-shared-build.patch 3062c6135b12eab1ff365d1d609193723bb4c6ff3dfa9fcf76fe2b75948668c9 llvm-0002-musl-triple.patch c6892c843b38c9a852367e5d76ffc29c21bdfd522adbc4c4e3e3c890a513c0db llvm-0003-musl-hacks.patch 94f5626b4729afb39ad00a6cac4f8d44e3ee6f3d87362268bcd2c0ec637edc22 compiler-rt-0001-musl-no-dlvsym.patch 7dd2d22c61892eb651809649606fb3722520a5d12f8d88c2e96be977d0f8b71a compiler-rt-0002-musl-no-sanitizers.patch 45bcfa7d1c757e32183c5cd95703f150ec3d1ed966a9cfa68b13b648e5310e78 compiler-rt-0003-off_t.patch 516a1dbba85731a557840ee3ebc9cc82a2e5ce625cf5b37f5392bd089ef40bdc clang-0001-fix-stdint.h.patch 3be240b78d2371728280ffb15191573c969b304ed784883b79c662ff73c2bc43 clang-0002-fix-unwind-header.patch 78449c4f7c9fdfaccef3b68039c69e7e041fb34862d39c803d7e6fac17f659aa clang-0003-add-alpine-linux-distro.patch 501ab6e3fb99c9ffb82329475051a633797bf824c0dea437843266f190c062a0 clang-0004-alpine-use-z-relro.patch 1c4dbd1d474bf08de5979d6f4399aeba29de9ba8950aa0688d081d82e552d7d3 clang-0005-alpine-hash-style-gnu.patch a7c3ab756cae110887dad315b8458212830949442a491618253c79eba754b546 clang-0006-musl-alpine-triple.patch c7612168defefcb35cc8c988ff8b519aa983f07a62fd3b2c67f7d468459ca48a clang-0007-musl-dynamic-linker-paths.patch 39c275490e3360d50fe339406992616fad0fa9127204c9b93578ee2403ae850c clang-0008-alpine-PIE-by-default.patch ec0c2014d455040499f599dc3d690fb92e54baf6058605be5f25c2c845629cfe clang-0009-pass-host-triple-to-compiler-rt.patch 2f00c615913aa0b56607ee1548936e60ad2aa89e6d56f23fb032a4463366fc7a llvm-3.6.1.src.tar.xz 74f92d0c93b86678b015e87655f59474b2f657769680efdeb3c0524ffbd2dad7 cfe-3.6.1.src.tar.xz f4ee70d870d550a9147ac6a548ce7daf7d9e6897348bf411f43c572966fb92b6 clang-tools-extra-3.6.1.src.tar.xz fcbf610c77be6047f11ca10c4725610417beba832565115a9e2fcfe2897b649f compiler-rt-3.6.1.src.tar.xz" sha512sums="b3c0e0f74680e9b2d02f1c923a191ef5eb913be84105e4d63aae6a88b1dac758467cecad3430496a7945cebdc73ec5ee1f643dc5dc7b336fee920e3c8b6d54d2 llvm-0001-fix-shared-build.patch 8088e79c51694d237f0e29a1c9032776f943561aff389f8706f1c10b3b0405d4fa72643fb83c973be55370e89d893f7b7592bb8c64dcf2310369c0d1b7ba5db2 llvm-0002-musl-triple.patch df8959d43af48054bc35e4125f98e5dab1e1b5beaf7b67e95791caf144efec06764bd31a9eb5efc2179932591de8b862ebf89592d131e47070c89f19412979b7 llvm-0003-musl-hacks.patch f1e6d17f4cc618b6a1edba64bda652f210d3c839bd8d2d4eff81af0895176062dab1e8fa963d0fe2403311863aee083d257bdb57ad9b44e23a958286a0d2e12b compiler-rt-0001-musl-no-dlvsym.patch 45f64cd5863238b7f7ad2f4a3733455e17eb3ab3121ba3404404f312beb91bb4d109c7c3278f77fc78730086e70cfe6532e159efef30e34af0132ca44a965220 compiler-rt-0002-musl-no-sanitizers.patch effed16bed6160c1629c72960424afed87f8c1c1290bf4eccd43da5a1fcb5b350242c01fcc1cc7355b420f5ac80231ea7a33ca71cafad884ea4c756cbdfbdd59 compiler-rt-0003-off_t.patch 6ad0a3409eb9c9bd43115c696f2894b683e4659b16b7ce29c7d88c35b3f585c10870c9df224a63fa14ff78810ee829b88a60dbf426f5b36084dfce7541a0cc00 clang-0001-fix-stdint.h.patch 0e3c9fbc70a12986e0531c9c642f9fff97d9d7617fd33ee69ac81d283ee14e86b6de435f1b51478a9c304f787c1b21ebc804d39a57a1ebeedce7308362d93614 clang-0002-fix-unwind-header.patch 0b8108c96948a1704275a93f3b872572fe2c61a0cd3e7f4caf63c0ca262cc079e2424b70f41d20f4a9aebe30333e39e3c594b4240fd41f7bd9a6682e751a23d9 clang-0003-add-alpine-linux-distro.patch ac72ea29d6f889f2b54915b97d56bc388e849da2f524b872241053fa6bb9dde4eb6b1333813070e3671115121da34c22ff1e87aa19ce82a393166143b30c7de4 clang-0004-alpine-use-z-relro.patch 0594cc85b6cf0be66e747eb7ba6af5aff401d65b4072f3da4a3e531795965f72df5a3850c7abbbe4e1fde3dc6ad583ecfc4a77429531bae02143b5ca36bed37e clang-0005-alpine-hash-style-gnu.patch e00a05f6a599b4686d6759c844f8283360a95bc6d1f171d4ab56ba7e17e017bc244f302ba2a4191a3e006bb8bc3b8d235de3624d423357fe30a3595d20bb9371 clang-0006-musl-alpine-triple.patch c4365cbf9645e7aacbef2392cd7418c055a45e178e4ad956dfe45eafc90ab1db70ff620dfeeec11a4fab550ec557385f2d75f68adc0830ce74b5ece7077a3baf clang-0007-musl-dynamic-linker-paths.patch 2a217800aefbce07017b793a8c91e174dac20546343de47749b4b07b4905db9a55411ef45e482b8df93cb4dbbdf25415202c3257be36ae095a6f2de11935f80b clang-0008-alpine-PIE-by-default.patch 7628c1b12febb27d0a9ecb846205edec61044fbb963ba5e588863652bccbb05d1436febf8840ff4b47dfb326689bb142464be59a18b17bd5d30aa03bb7e76a9f clang-0009-pass-host-triple-to-compiler-rt.patch fa07d0fe6c527d86c0b91b1b62597f949d777e3609e4e8ca2ea5e07931e1ebc7a363273cc705cf4a13b45e7ab00716b76de26688d077c1b51341d9dd2972de3f llvm-3.6.1.src.tar.xz a96944bccfd9341be7adafdcc40367d458e85e7e74b0d2f3a7ea18edf1454d04a232c2d0003d6449c52f81d1e235b434acc1bb63eb5f7d16f8f4a43b70826743 cfe-3.6.1.src.tar.xz 3273f8c1fa1683de231d0c0b9371d4b7537381e939fe38996e70a8005a1e6185da459ace2f260fad41df4840b459448ed1498c2fd576dd560005117a54e2ccb9 clang-tools-extra-3.6.1.src.tar.xz 121c048fe60bccccd4a188a18613c94e1e1d9abd8fbae6405d23418f0c9b3562fff72fe77aea9bc0f8632ec9ad89503b9c67fcab5bf378001f90ad7492a1845a compiler-rt-3.6.1.src.tar.xz"