From 9a23fbbcf01b2b3d742d1d89898da22dcda5f920 Mon Sep 17 00:00:00 2001 From: Harmen Stoppels Date: Thu, 20 Jan 2022 17:07:04 +0100 Subject: Julia: build without vendored dependencies (#27280) * Julia unvendored * restrict LBT --- var/spack/repos/builtin/packages/julia/gc.patch | 11 - ...lia-1.6-system-libwhich-and-p7zip-symlink.patch | 74 ++++ .../packages/julia/llvm7-symver-jlprefix.patch | 18 + .../repos/builtin/packages/julia/openblas.patch | 68 ---- var/spack/repos/builtin/packages/julia/package.py | 383 ++++++++++----------- .../builtin/packages/julia/use-add-rpath.patch | 34 ++ 6 files changed, 317 insertions(+), 271 deletions(-) delete mode 100644 var/spack/repos/builtin/packages/julia/gc.patch create mode 100644 var/spack/repos/builtin/packages/julia/julia-1.6-system-libwhich-and-p7zip-symlink.patch create mode 100644 var/spack/repos/builtin/packages/julia/llvm7-symver-jlprefix.patch delete mode 100644 var/spack/repos/builtin/packages/julia/openblas.patch create mode 100644 var/spack/repos/builtin/packages/julia/use-add-rpath.patch diff --git a/var/spack/repos/builtin/packages/julia/gc.patch b/var/spack/repos/builtin/packages/julia/gc.patch deleted file mode 100644 index 6db69c6c1b..0000000000 --- a/var/spack/repos/builtin/packages/julia/gc.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- julia/src/gc.c -+++ julia/src/gc.c -@@ -162,7 +162,7 @@ - // A region is contiguous storage for up to REGION_PG_COUNT naturally aligned GC_PAGE_SZ pages - // It uses a very naive allocator (see malloc_page & free_page) - #if defined(_P64) && !defined(_COMPILER_MICROSOFT_) --#define REGION_PG_COUNT 16*8*4096 // 8G because virtual memory is cheap -+#define REGION_PG_COUNT 8*4096 // 512M - #else - #define REGION_PG_COUNT 8*4096 // 512M - #endif diff --git a/var/spack/repos/builtin/packages/julia/julia-1.6-system-libwhich-and-p7zip-symlink.patch b/var/spack/repos/builtin/packages/julia/julia-1.6-system-libwhich-and-p7zip-symlink.patch new file mode 100644 index 0000000000..fa36cc4847 --- /dev/null +++ b/var/spack/repos/builtin/packages/julia/julia-1.6-system-libwhich-and-p7zip-symlink.patch @@ -0,0 +1,74 @@ +diff --git a/Make.inc b/Make.inc +index 4719a3d49b..b056dc6c73 100644 +--- a/Make.inc ++++ b/Make.inc +@@ -54,6 +54,7 @@ USE_SYSTEM_NGHTTP2:=0 + USE_SYSTEM_CURL:=0 + USE_SYSTEM_LIBGIT2:=0 + USE_SYSTEM_PATCHELF:=0 ++USE_SYSTEM_LIBWHICH:=0 + USE_SYSTEM_ZLIB:=0 + USE_SYSTEM_P7ZIP:=0 + +@@ -1085,6 +1086,12 @@ else + PATCHELF := $(build_depsbindir)/patchelf + endif + ++ifeq ($(USE_SYSTEM_LIBWHICH), 1) ++LIBWHICH := libwhich ++else ++LIBWHICH := $(build_depsbindir)/libwhich ++endif ++ + # On aarch64 and powerpc64le, we assume the page size is 64K. Our binutils linkers + # and such already assume this, but `patchelf` seems to be behind the times. We + # explicitly tell it to use this large page size so that when we rewrite rpaths and +diff --git a/base/Makefile b/base/Makefile +index 2bef6aab7f..9e8c1abac7 100644 +--- a/base/Makefile ++++ b/base/Makefile +@@ -170,7 +170,7 @@ endif + + define symlink_system_library + libname_$2 := $$(notdir $(call versioned_libname,$2,$3)) +-libpath_$2 := $$(shell $$(call spawn,$$(build_depsbindir)/libwhich) -p $$(libname_$2) 2>/dev/null) ++libpath_$2 := $$(shell $$(call spawn,$$(LIBWHICH)) -p $$(libname_$2) 2>/dev/null) + symlink_$2: $$(build_private_libdir)/$$(libname_$2) + $$(build_private_libdir)/$$(libname_$2): + @if [ -e "$$(libpath_$2)" ]; then \ +@@ -191,6 +191,19 @@ SYMLINK_SYSTEM_LIBRARIES += symlink_$2 + endif + endef + ++# libexec executables ++symlink_p7zip: $(build_bindir)/7z$(EXE) ++ ++ifneq ($(USE_SYSTEM_P7ZIP),0) ++SYMLINK_SYSTEM_LIBRARIES += symlink_p7zip ++7Z_PATH := $(shell which 7z$(EXE)) ++endif ++ ++$(build_bindir)/7z$(EXE): ++ [ -e "$(7Z_PATH)" ] && \ ++ ([ ! -e "$@" ] || rm "$@") && \ ++ ln -svf "$(7Z_PATH)" "$@" ++ + # the following excludes: libuv.a, libutf8proc.a + + ifneq ($(USE_SYSTEM_LIBM),0) +diff --git a/deps/Makefile b/deps/Makefile +index 3d3f795131..50ca806307 100644 +--- a/deps/Makefile ++++ b/deps/Makefile +@@ -159,9 +159,11 @@ DEP_LIBS += lapack + endif + endif + ++ifeq ($(USE_SYSTEM_LIBWHICH), 0) + ifneq ($(OS), WINNT) + DEP_LIBS += libwhich + endif ++endif + + # unlist targets that have not been converted to use the staged-install + DEP_LIBS_STAGED := $(filter-out suitesparse-wrapper,$(DEP_LIBS)) diff --git a/var/spack/repos/builtin/packages/julia/llvm7-symver-jlprefix.patch b/var/spack/repos/builtin/packages/julia/llvm7-symver-jlprefix.patch new file mode 100644 index 0000000000..5c3449a45b --- /dev/null +++ b/var/spack/repos/builtin/packages/julia/llvm7-symver-jlprefix.patch @@ -0,0 +1,18 @@ +From f23277bb91a4925ba8763337137a3123a7600557 Mon Sep 17 00:00:00 2001 +From: Valentin Churavy +Date: Tue, 16 Jan 2018 17:29:05 -0500 +Subject: [PATCH] add JL prefix to all LLVM version suffixes + +--- + tools/llvm-shlib/simple_version_script.map.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/llvm/tools/llvm-shlib/simple_version_script.map.in b/llvm/tools/llvm-shlib/simple_version_script.map.in +index e9515fe7862..af082581627 100644 +--- a/llvm/tools/llvm-shlib/simple_version_script.map.in ++++ b/llvm/tools/llvm-shlib/simple_version_script.map.in +@@ -1 +1 @@ +-LLVM_@LLVM_VERSION_MAJOR@ { global: *; }; ++JL_LLVM_@LLVM_VERSION_MAJOR@.@LLVM_VERSION_MINOR@ { global: *; }; +-- +2.15.1 diff --git a/var/spack/repos/builtin/packages/julia/openblas.patch b/var/spack/repos/builtin/packages/julia/openblas.patch deleted file mode 100644 index f75d7dd04f..0000000000 --- a/var/spack/repos/builtin/packages/julia/openblas.patch +++ /dev/null @@ -1,68 +0,0 @@ -diff --git a/deps/Makefile b/deps/Makefile -index 6cb73be..bcd8520 100644 ---- a/deps/Makefile -+++ b/deps/Makefile -@@ -1049,7 +1049,7 @@ OPENBLAS_BUILD_OPTS += NO_AFFINITY=1 - - # Build for all architectures - required for distribution - ifeq ($(OPENBLAS_DYNAMIC_ARCH), 1) --OPENBLAS_BUILD_OPTS += DYNAMIC_ARCH=1 -+OPENBLAS_BUILD_OPTS += DYNAMIC_ARCH=1 MAKE_NO_J=1 - endif - - # 64-bit BLAS interface -@@ -1085,6 +1085,7 @@ OPENBLAS_BUILD_OPTS += NO_AVX2=1 - endif - - $(OPENBLAS_SRC_DIR)/config.status: $(OPENBLAS_SRC_DIR)/Makefile -+ cd $(dir $@) && patch -p1 < ../openblas-make.patch - ifeq ($(OS),WINNT) - cd $(dir $@) && patch -p1 < ../openblas-win64.patch - endif -diff --git a/deps/openblas.version b/deps/openblas.version -index 7c97e1b..58b9467 100644 ---- a/deps/openblas.version -+++ b/deps/openblas.version -@@ -1,2 +1,2 @@ --OPENBLAS_BRANCH=v0.2.15 --OPENBLAS_SHA1=53e849f4fcae4363a64576de00e982722c7304f9 -+OPENBLAS_BRANCH=v0.2.17 -+OPENBLAS_SHA1=a71e8c82f6a9f73093b631e5deab1e8da716b61f ---- a/deps/openblas-make.patch -+++ b/deps/openblas-make.patch -@@ -0,0 +1,35 @@ -+diff --git a/Makefile.system b/Makefile.system -+index b89f60e..2dbdad0 100644 -+--- a/Makefile.system -++++ b/Makefile.system -+@@ -139,6 +139,10 @@ NO_PARALLEL_MAKE=0 -+ endif -+ GETARCH_FLAGS += -DNO_PARALLEL_MAKE=$(NO_PARALLEL_MAKE) -+ -++ifdef MAKE_NO_J -++GETARCH_FLAGS += -DMAKE_NO_J=$(MAKE_NO_J) -++endif -++ -+ ifdef MAKE_NB_JOBS -+ GETARCH_FLAGS += -DMAKE_NB_JOBS=$(MAKE_NB_JOBS) -+ endif -+diff --git a/getarch.c b/getarch.c -+index f9c49e6..dffad70 100644 -+--- a/getarch.c -++++ b/getarch.c -+@@ -1012,6 +1012,7 @@ int main(int argc, char *argv[]){ -+ #endif -+ #endif -+ -++#ifndef MAKE_NO_J -+ #ifdef MAKE_NB_JOBS -+ printf("MAKE += -j %d\n", MAKE_NB_JOBS); -+ #elif NO_PARALLEL_MAKE==1 -+@@ -1021,6 +1022,7 @@ int main(int argc, char *argv[]){ -+ printf("MAKE += -j %d\n", get_num_cores()); -+ #endif -+ #endif -++#endif -+ -+ break; -+ diff --git a/var/spack/repos/builtin/packages/julia/package.py b/var/spack/repos/builtin/packages/julia/package.py index 83b0a4eb1d..2f10694e32 100644 --- a/var/spack/repos/builtin/packages/julia/package.py +++ b/var/spack/repos/builtin/packages/julia/package.py @@ -3,213 +3,212 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) - import os from spack import * +from spack.version import ver + + +def get_best_target(microarch, compiler_name, compiler_version): + for compiler_entry in microarch.compilers[compiler_name]: + if compiler_version.satisfies(ver(compiler_entry["versions"])): + return compiler_entry.get("name", microarch.name) + raise InstallError("Could not find a target architecture") -class Julia(Package): +class Julia(MakefilePackage): """The Julia Language: A fresh approach to technical computing""" homepage = "https://julialang.org" - url = "https://github.com/JuliaLang/julia/releases/download/v0.4.3/julia-0.4.3-full.tar.gz" + url = "https://github.com/JuliaLang/julia/releases/download/v1.7.0/julia-1.7.0.tar.gz" git = "https://github.com/JuliaLang/julia.git" - maintainers = ['glennpj', 'vchuravy'] + maintainers = ['glennpj', 'vchuravy', 'haampie'] version('master', branch='master') - version('1.7.0', sha256='d40d83944f8e1709de1d6f7544e1a6721e091f70ba06b44c25b89bdba754dfa6', preferred=True) - version('1.6.4', sha256='954578b973fdb891c88fa1eedd931129e215ab928ecc416dd0bdf6c70549d2fc') - version('1.6.3', sha256='29aad934582fb4c6dd9f9dd558ad649921f43bc7320eab54407fdf6dd3270a33') - version('1.6.2', sha256='01241120515cb9435b96179cf301fbd2c24d4405f252588108d13ceac0f41c0a') - version('1.6.1', sha256='71d8e40611361370654e8934c407b2dec04944cf3917c5ecb6482d6b85ed767f') - version('1.6.0', sha256='1b05f42c9368bc2349c47363b7ddc175a2da3cd162d52b6e24c4f5d4d6e1232c') - version('1.5.4', sha256='dbfb8cd544b223eff70f538da7bb9d5b6f76fd0b00dd2385e6254e74ad4e892f') - version('1.5.3', sha256='fb69337ca037576758547c7eed9ae8f153a9c052318327b6b7f1917408c14d91') - version('1.5.2', sha256='850aed3fe39057488ec633f29af705f5ada87e3058fd65e48ad26f91b713a19a') - version('1.5.1', sha256='1d0debfccfc7cd07047aa862dd2b1a96f7438932da1f5feff6c1033a63f9b1d4') - version('1.5.0', sha256='4a6ffadc8dd04ca0b7fdef6ae203d0af38185e57b78f7c0b972c4707354a6d1b') - version('1.4.2', sha256='948c70801d5cce81eeb7f764b51b4bfbb2dc0b1b9effc2cb9fc8f8cf6c90a334') - version('1.4.1', sha256='b21585db55673ac0668c163678fcf2aad11eb7c64bb2aa03a43046115fab1553') - version('1.4.0', sha256='880c73a08296ce8d94ad9605149f2a2b2b028e7202a700ef725da899300b8be9') - version('1.3.1', sha256='053908ec2706eb76cfdc998c077de123ecb1c60c945b4b5057aa3be19147b723') - version('1.2.0', sha256='2419b268fc5c3666dd9aeb554815fe7cf9e0e7265bc9b94a43957c31a68d9184') - version('1.1.1', sha256='3c5395dd3419ebb82d57bcc49dc729df3b225b9094e74376f8c649ee35ed79c2', deprecated=True) - version('1.0.0', sha256='1a2497977b1d43bb821a5b7475b4054b29938baae8170881c6b8dd4099d133f1', deprecated=True) - version('0.6.2', sha256='1e34c13091c9ddb47cf87a51566d94a06613f3db3c483b8f63b276e416dd621b', deprecated=True) - version('0.5.2', sha256='f5ef56d79ed55eacba9fe968bb175317be3f61668ef93e747d76607678cc01dd', deprecated=True) - version('0.5.1', sha256='533b6427a1b01bd38ea0601f58a32d15bf403f491b8415e9ce4305b8bc83bb21', deprecated=True) - version('0.5.0', sha256='732478536b6dccecbf56e541eef0aed04de0e6d63ae631b136e033dda2e418a9', deprecated=True) - version('0.4.7', sha256='d658d5bd5fb79b19f3c01cadb9aba8622ca8a12a4b687acc7d99c21413623570', deprecated=True) - version('0.4.6', sha256='4c23c9fc72398014bd39327c2f7efd3a301884567d4cb2a89105c984d4d633ba', deprecated=True) - version('0.4.5', sha256='cbf361c23a77e7647040e8070371691083e92aa93c8a318afcc495ad1c3a71d9', deprecated=True) - version('0.4.3', sha256='2b9df25a8f58df8e43038ec30bae195dfb160abdf925f3fa193b59d40e4113c5', deprecated=True) - - variant('cxx', default=False, description='Prepare for Julia Cxx package') - variant('mkl', default=False, description='Use Intel MKL') - - patch('gc.patch', when='@0.4:0.4.5') - patch('openblas.patch', when='@0.4:0.4.5') - patch('armgcc.patch', when='@1.0.0:1.1.1 %gcc@:5.9 target=aarch64:') - - # Build-time dependencies: - # depends_on('awk') - depends_on('m4', type='build') - # depends_on('pkgconfig') - # Python only needed to build LLVM? - depends_on('python@2.7:2.8', type='build', when='@:1.1') - depends_on('python@2.7:', type='build', when='@1.2:') - depends_on('cmake@2.8:', type='build', when='@1.0:') - depends_on('cmake@:3.11', type='build', when='@:1.4') - depends_on('git', type='build', when='@master') - - # Combined build-time and run-time dependencies: - # (Yes, these are run-time dependencies used by Julia's package manager.) - depends_on('cmake @2.8:', type=('build', 'run'), when='@:0.6') - depends_on('curl', when='@:0.5.0') - depends_on('git', type=('build', 'run'), when='@:0.4') - depends_on('openssl@:1.0', when='@:0.5.0') - depends_on('mkl', when='+mkl') - - # Run-time dependencies: - # depends_on('arpack') - # depends_on('fftw +float') - # depends_on('gmp') - # depends_on('libgit') - # depends_on('mpfr') - # depends_on('openblas') - # depends_on('pcre2') - - # ARPACK: Requires BLAS and LAPACK; needs to use the same version - # as Julia. - - # BLAS and LAPACK: Julia prefers 64-bit versions on 64-bit - # systems. OpenBLAS has an option for this; make it available as - # variant. - - # FFTW: Something doesn't work when using a pre-installed FFTW - # library; need to investigate. - - # GMP, MPFR: Something doesn't work when using a pre-installed - # FFTW library; need to investigate. - - # LLVM: Julia works only with specific versions, and might require - # patches. Thus we let Julia install its own LLVM. - - # Other possible dependencies: - # USE_SYSTEM_OPENLIBM=0 - # USE_SYSTEM_OPENSPECFUN=0 - # USE_SYSTEM_DSFMT=0 - # USE_SYSTEM_SUITESPARSE=0 - # USE_SYSTEM_UTF8PROC=0 - # USE_SYSTEM_LIBGIT2=0 - - conflicts('+cxx', when='@:0.6', msg='Variant cxx requires Julia >= 1.0.0') - - conflicts('@:0.7.0', when='target=aarch64:') - - # GCC conflicts - conflicts('@:0.5.1', when='%gcc@8:', msg='Julia <= 0.5.1 needs GCC <= 7') - - # Building recent versions of Julia with Intel is untested and unsupported - # by the Julia project, https://github.com/JuliaLang/julia/issues/23407. - conflicts('@0.6:', when='%intel', - msg='Only Julia <= 0.5.x can be built with the Intel compiler.') - conflicts('%intel', when='~mkl', - msg='Building with the Intel compiler requires the mkl variant ' - '(+mkl)') + version('1.7.1', sha256='17d298e50e4e3dd897246ccebd9f40ce5b89077fa36217860efaec4576aa718e') + version('1.7.0', sha256='8e870dbef71bc72469933317a1a18214fd1b4b12f1080784af7b2c56177efcb4') + version('1.6.5', sha256='b70ae299ff6b63a9e9cbf697147a48a31b4639476d1947cb52e4201e444f23cb') + version('1.6.4', sha256='a4aa921030250f58015201e28204bff604a007defc5a379a608723e6bb1808d4') + + # We've deprecated these versions, so that we can remove them in Spack 0.18 + # They are still available in Spack 0.17. Julia 0.17.0 is the first version that + # can be built enitrely from Spack packages, without a network connection during + # the build. + for v in [ + '1.6.3', '1.6.2', '1.6.1', '1.6.0', '1.5.4', '1.5.3', '1.5.2', '1.5.1', '1.5.0', + '1.4.2', '1.4.1', '1.4.0', '1.3.1', '1.2.0', '1.1.1', '1.0.0', '0.6.2', '0.5.2', + '0.5.1', '0.5.0', '0.4.7', '0.4.6', '0.4.5', '0.4.3' + ]: + version(v, deprecated=True) + + variant('precompile', default=True, description='Improve julia startup time') + variant('openlibm', default=True, description='Use openlibm instead of libm') + + # Note, we just use link_llvm_dylib so that we not only get a libLLVM, + # but also so that llvm-config --libfiles gives only the dylib. Without + # it it also gives static libraries, and breaks Julia's build. + depends_on('llvm version_suffix=jl +link_llvm_dylib ~internal_unwind') + depends_on('libuv') + + with when('@1.7.0:1.7'): + # libssh2.so.1, libpcre2-8.so.0, mbedtls.so.13, mbedcrypto.so.5, mbedx509.so.1 + # openlibm.so.3, (todo: complete this list for upperbounds...) + depends_on('llvm@12.0.1') + depends_on('libuv@1.42.0') + depends_on('mbedtls@2.24.0:2.24') + depends_on('openlibm@0.7.0:0.7', when='+openlibm') + depends_on('libblastrampoline@3.0.0:3') + + with when('@1.6.0:1.6'): + # libssh2.so.1, libpcre2-8.so.0, mbedtls.so.13, mbedcrypto.so.5, mbedx509.so.1 + # openlibm.so.3, (todo: complete this list for upperbounds...) + depends_on('llvm@11.0.1') + depends_on('libuv@1.39.0') + depends_on('mbedtls@2.24.0:2.24') + depends_on('openlibm@0.7.0:0.7', when='+openlibm') + + # Patches for llvm + depends_on('llvm', patches='llvm7-symver-jlprefix.patch') + depends_on('llvm', when='^llvm@11.0.1', patches=patch( + 'https://raw.githubusercontent.com/spack/patches/0b543955683a903d711a3e95ff29a4ce3951ca13/julia/llvm-11.0.1-julia-1.6.patch', + sha256='8866ee0595272b826b72d173301a2e625855e80680a84af837f1ed6db4657f42')) + depends_on('llvm', when='^llvm@12.0.1', patches=patch( + 'https://github.com/JuliaLang/llvm-project/compare/fed41342a82f5a3a9201819a82bf7a48313e296b...980d2f60a8524c5546397db9e8bbb7d6ea56c1b7.patch', + sha256='10cb42f80c2eaad3e9c87cb818b6676f1be26737bdf972c77392d71707386aa4')) + depends_on('llvm', when='^llvm@13.0.0', patches=patch( + 'https://github.com/JuliaLang/llvm-project/compare/d7b669b3a30345cfcdb2fde2af6f48aa4b94845d...6ced34d2b63487a88184c3c468ceda166d10abba.patch', + sha256='92f022176ab85ded517a9b7aa04df47e19a5def88f291e0c31100128823166c1')) + + # Patches for libuv + depends_on('libuv', when='^libuv@1.39.0', patches=patch( + 'https://raw.githubusercontent.com/spack/patches/b59ca193423c4c388254f528afabb906b5373162/julia/libuv-1.39.0.patch', + sha256='f7c1e7341e89dc35dfd85435ba35833beaef575b997c3f978c27d0dbf805149b')) + depends_on('libuv', when='^libuv@1.42.0', patches=patch( + 'https://raw.githubusercontent.com/spack/patches/89b6d14eb1f3c3d458a06f1e06f7dda3ab67bd38/julia/libuv-1.42.0.patch', + sha256='d9252fbe67ac8f15e15653f0f6b00dffa07ae1a42f013d4329d17d8b492b7cdb')) + + # patchelf 0.13 is required because the rpath patch uses --add-rpath + depends_on('patchelf@0.13:', type='build') + depends_on('perl', type='build') + depends_on('libwhich', type='build') + + depends_on('blas') # note: for now openblas is fixed... + depends_on('curl tls=mbedtls +nghttp2 +libssh2') + depends_on('dsfmt@2.2.4:') # apparently 2.2.3->2.2.4 breaks API + depends_on('gmp') + depends_on('lapack') # note: for now openblas is fixed... + depends_on('libblastrampoline', when='@1.7.0:') + depends_on('libgit2') + depends_on('libssh2 crypto=mbedtls') + depends_on('mbedtls libs=shared') + depends_on('mpfr') + depends_on('nghttp2') + depends_on('openblas +ilp64 symbol_suffix=64_') + depends_on('openlibm', when='+openlibm') + depends_on('p7zip') + depends_on('pcre2') + depends_on('suite-sparse +pic') + depends_on('unwind') + depends_on('utf8proc') + depends_on('zlib +shared +pic +optimize') + + # Patches for julia + patch('julia-1.6-system-libwhich-and-p7zip-symlink.patch', when='@1.6.0:1.6') + patch('use-add-rpath.patch') + + def patch(self): + # The system-libwhich-libblastrampoline.patch causes a rebuild of docs as it + # touches the main Makefile, so we reset the a/m-time to doc/_build's. + f = os.path.join("doc", "_build", "html", "en", "index.html") + if os.path.exists(f): + time = (os.path.getatime(f), os.path.getmtime(f)) + os.utime(os.path.join("base", "Makefile"), time) def setup_build_environment(self, env): - # The julia build can have trouble with finding GCC libraries with the - # spack compiler. - if self.compiler.name == 'gcc': - gcc_base = os.path.split(os.path.split(self.compiler.cc)[0])[0] - env.prepend_path('LD_LIBRARY_PATH', join_path(gcc_base, 'lib64')) - - def install(self, spec, prefix): - # Julia needs git tags - if os.path.isfile('.git/shallow'): - git = which('git') - git('fetch', '--unshallow') - # Explicitly setting CC, CXX, or FC breaks building libuv, one - # of Julia's dependencies. This might be a Darwin-specific - # problem. Given how Spack sets up compilers, Julia should - # still use Spack's compilers, even if we don't specify them - # explicitly. Potential options are - # 'CC=cc', - # 'CXX=c++', - # 'FC=fc', - # 'USE_SYSTEM_ARPACK=1', - # 'override USE_SYSTEM_CURL=1', - # 'USE_SYSTEM_FFTW=1', - # 'USE_SYSTEM_GMP=1', - # 'USE_SYSTEM_MPFR=1', - # 'USE_SYSTEM_PCRE=1', + # this is a bit ridiculous, but we are setting runtime linker paths to + # dependencies so that libwhich can locate them. + if ( + self.spec.satisfies('platform=linux') or + self.spec.satisfies('platform=cray') + ): + linker_var = 'LD_LIBRARY_PATH' + elif self.spec.satisfies('platform=darwin'): + linker_var = 'DYLD_FALLBACK_LIBRARY_PATH' + else: + return + pkgs = [ + 'curl', 'dsfmt', 'gmp', 'libgit2', 'libssh2', 'libunwind', 'mbedtls', + 'mpfr', 'nghttp2', 'openblas', 'openlibm', 'pcre2', 'suite-sparse', + 'utf8proc', 'zlib' + ] + if self.spec.satisfies('@1.7.0:'): + pkgs.append('libblastrampoline') + for pkg in pkgs: + for dir in self.spec[pkg].libs.directories: + env.prepend_path(linker_var, dir) + + def edit(self, spec, prefix): + # TODO: use a search query for blas / lapack? + libblas = os.path.splitext(spec['blas'].libs.basenames[0])[0] + liblapack = os.path.splitext(spec['lapack'].libs.basenames[0])[0] + + # Host compiler target name + march = get_best_target(spec.target, spec.compiler.name, spec.compiler.version) + + # LLVM compatible name for the JIT + julia_cpu_target = get_best_target(spec.target, 'clang', spec['llvm'].version) + options = [ - 'prefix={0}'.format(prefix) + 'prefix:={0}'.format(prefix), + 'MARCH:={0}'.format(march), + 'JULIA_CPU_TARGET:={0}'.format(julia_cpu_target), + 'USE_BINARYBUILDER:=0', + 'VERBOSE:=1', + + # Spack managed dependencies + 'USE_SYSTEM_BLAS:=1', + 'USE_SYSTEM_CSL:=1', + 'USE_SYSTEM_CURL:=1', + 'USE_SYSTEM_DSFMT:=1', + 'USE_SYSTEM_GMP:=1', + 'USE_SYSTEM_LAPACK:=1', + 'USE_SYSTEM_LIBBLASTRAMPOLINE:=1', + 'USE_SYSTEM_LIBGIT2:=1', + 'USE_SYSTEM_LIBSSH2:=1', + 'USE_SYSTEM_LIBSUITESPARSE:=1', # @1.7: + 'USE_SYSTEM_SUITESPARSE:=1', # @:1.6 + 'USE_SYSTEM_LIBUNWIND:=1', + 'USE_SYSTEM_LIBUV:=1', + 'USE_SYSTEM_LIBWHICH:=1', + 'USE_SYSTEM_LLVM:=1', + 'USE_SYSTEM_MBEDTLS:=1', + 'USE_SYSTEM_MPFR:=1', + 'USE_SYSTEM_P7ZIP:=1', + 'USE_SYSTEM_PATCHELF:=1', + 'USE_SYSTEM_PCRE:=1', + 'USE_SYSTEM_UTF8PROC:=1', + 'USE_SYSTEM_ZLIB:=1', + + # todo: ilp depends on arch + 'USE_BLAS64:=1', + 'LIBBLASNAME:={0}'.format(libblas), + 'LIBLAPACKNAME:={0}'.format(liblapack), + 'override LIBUV:={0}'.format(spec['libuv'].libs.libraries[0]), + 'override LIBUV_INC:={0}'.format(spec['libuv'].headers.directories[0]), + 'override USE_LLVM_SHLIB:=1', + # make rebuilds a bit faster for now, not sure if this should be kept + 'JULIA_PRECOMPILE:={0}'.format( + '1' if spec.variants['precompile'].value else '0'), ] - if '@:0.5.0' in spec: - options += [ - 'override USE_SYSTEM_CURL=1' - ] - - if '+cxx' in spec: - options += [ - 'BUILD_LLVM_CLANG=1', - 'LLVM_ASSERTIONS=1', - 'USE_LLVM_SHLIB=1' - ] - if spec.target.family == 'aarch64': - options += [ - 'JULIA_CPU_TARGET=generic', - 'MARCH=armv8-a+crc' - ] - - if spec.target.family == 'x86_64' or spec.target.family == 'x86': - if spec.target == 'x86_64': - options += [ - 'JULIA_CPU_TARGET=generic' - ] - else: - target_str = str(spec.target).replace('_', '-') - if target_str == "zen": - target_str = "znver1" - if target_str == "zen2": - target_str = "znver2" - if target_str == "zen3": - if spec.satisfies('@1.7.0:'): - target_str = "znver3" - else: - # The LLVM in @1.6.4 doesn't support znver3. - target_str = "znver2" - options += [ - 'JULIA_CPU_TARGET={0}'.format(target_str) - ] - - if '%intel' in spec: - options += [ - 'USEICC=1', - 'USEIFC=1', - 'USE_INTEL_LIBM=1' - ] - - if '+mkl' in spec: - options += [ - 'USE_INTEL_MKL=1', - ] + + # libm or openlibm? + if spec.variants['openlibm'].value: + options.append('USE_SYSTEM_LIBM=0') + options.append('USE_SYSTEM_OPENLIBM=1') + else: + options.append('USE_SYSTEM_LIBM=1') + options.append('USE_SYSTEM_OPENLIBM=0') + with open('Make.user', 'w') as f: f.write('\n'.join(options) + '\n') - - make() - make('install') - - # Julia's package manager needs a certificate - if '@:0.5.0' in spec: - cacert_dir = join_path(prefix, 'etc', 'curl') - mkdirp(cacert_dir) - cacert_file = join_path(cacert_dir, 'cacert.pem') - curl = which('curl') - curl('--create-dirs', - '--output', cacert_file, - 'https://curl.haxx.se/ca/cacert.pem') diff --git a/var/spack/repos/builtin/packages/julia/use-add-rpath.patch b/var/spack/repos/builtin/packages/julia/use-add-rpath.patch new file mode 100644 index 0000000000..b1aa91f170 --- /dev/null +++ b/var/spack/repos/builtin/packages/julia/use-add-rpath.patch @@ -0,0 +1,34 @@ +diff --git a/Makefile b/Makefile +index 2fb9be55f9..76ffc5b738 100644 +--- a/Makefile ++++ b/Makefile +@@ -343,7 +343,7 @@ ifneq ($(DARWIN_FRAMEWORK),1) + endif + else ifneq (,$(findstring $(OS),Linux FreeBSD)) + for j in $(JL_TARGETS) ; do \ +- $(PATCHELF) --set-rpath '$$ORIGIN/$(private_libdir_rel):$$ORIGIN/$(libdir_rel)' $(DESTDIR)$(bindir)/$$j; \ ++ $(PATCHELF) --add-rpath '$$ORIGIN/$(private_libdir_rel):$$ORIGIN/$(libdir_rel)' $(DESTDIR)$(bindir)/$$j; \ + done + endif + +@@ -363,9 +363,9 @@ endif + + # Set rpath for libjulia-internal, which is moving from `../lib` to `../lib/julia`. We only need to do this for Linux/FreeBSD + ifneq (,$(findstring $(OS),Linux FreeBSD)) +- $(PATCHELF) --set-rpath '$$ORIGIN:$$ORIGIN/$(reverse_private_libdir_rel)' $(DESTDIR)$(private_libdir)/libjulia-internal.$(SHLIB_EXT) ++ $(PATCHELF) --add-rpath '$$ORIGIN:$$ORIGIN/$(reverse_private_libdir_rel)' $(DESTDIR)$(private_libdir)/libjulia-internal.$(SHLIB_EXT) + ifeq ($(BUNDLE_DEBUG_LIBS),1) +- $(PATCHELF) --set-rpath '$$ORIGIN:$$ORIGIN/$(reverse_private_libdir_rel)' $(DESTDIR)$(private_libdir)/libjulia-internal-debug.$(SHLIB_EXT) ++ $(PATCHELF) --add-rpath '$$ORIGIN:$$ORIGIN/$(reverse_private_libdir_rel)' $(DESTDIR)$(private_libdir)/libjulia-internal-debug.$(SHLIB_EXT) + endif + endif + +@@ -389,7 +389,7 @@ ifeq ($(OS),FreeBSD) + # don't set libgfortran's RPATH, it won't be able to find its friends on systems + # that don't have the exact GCC port installed used for the build. + for lib in $(DESTDIR)$(private_libdir)/libgfortran*$(SHLIB_EXT)*; do \ +- $(PATCHELF) --set-rpath '$$ORIGIN' $$lib; \ ++ $(PATCHELF) --add-rpath '$$ORIGIN' $$lib; \ + done + endif + -- cgit v1.2.3-70-g09d2