Julia package: add ARM support and versions 1.1.1, 1.0.0 (#12300)

* Add patch when building with GCC on ARM
* Update syntax for adding Julia packages based on version (newer
  versions use a different syntax)
This commit is contained in:
Toyohisa Kameyama 2019-08-24 08:29:14 +09:00 committed by Peter Scheibel
parent c7c8f60617
commit 6a730d7059
2 changed files with 88 additions and 19 deletions

View file

@ -0,0 +1,42 @@
diff -ru spack-src/src/ccalltest.c spack-src.new/src/ccalltest.c
--- spack-src/src/ccalltest.c 2019-08-01 14:58:12.092094781 +0900
+++ spack-src.new/src/ccalltest.c 2019-08-01 14:57:53.242092475 +0900
@@ -817,6 +817,7 @@
return x;
}
+#if defined(__GNUC__) && (__GNUC__ >= 6)
typedef struct {
__fp16 v1;
double v2;
@@ -833,6 +834,7 @@
struct_aa64_2 x = {v4 / 2 + 1, v1 * 2 + v2 * 4 - v3};
return x;
}
+#endif
#include <arm_neon.h>
diff -ru spack-src/src/test/ccall.jl spack-src.new/src/test/ccall.jl
--- spack-src/test/ccall.jl 2019-05-16 13:13:14.000000000 +0900
+++ spack-src.new/test/ccall.jl 2019-08-02 15:24:47.632241893 +0900
@@ -1130,19 +1130,6 @@
expected = Struct_AA64_1(v1 ÷ 2 + 1 - v3_1, v2 * 2 - 1 - v3_2)
@test res === expected
end
- for v1 in 1:4, v2 in -4:-1, v3 in 3:5, v4 in -(1:3)
- res = ccall((:test_aa64_fp16_1, libccalltest), Float16,
- (Cint, Float32, Float64, Float16),
- v1, v2, v3, v4)
- expected = Float16(v1 + v2 * 2 + v3 * 3 + v4 * 4)
- @test res === expected
-
- res = ccall((:test_aa64_fp16_2, libccalltest), Struct_AA64_2,
- (Cint, Float32, Float64, Float16),
- v1, v2, v3, v4)
- expected = Struct_AA64_2(v4 / 2 + 1, v1 * 2 + v2 * 4 - v3)
- @test res === expected
- end
for v1_1 in 1:4, v1_2 in -2:2, v2 in -4:-1, v3_1 in 3:5, v3_2 in 6:8
res = ccall((:test_aa64_vec_1, libccalltest),
VecReg{2,Int64},

View file

@ -17,6 +17,8 @@ class Julia(Package):
git = "https://github.com/JuliaLang/julia.git" git = "https://github.com/JuliaLang/julia.git"
version('master', branch='master') version('master', branch='master')
version('1.1.1', sha256='3c5395dd3419ebb82d57bcc49dc729df3b225b9094e74376f8c649ee35ed79c2')
version('1.0.0', sha256='1a2497977b1d43bb821a5b7475b4054b29938baae8170881c6b8dd4099d133f1')
version('0.6.2', '255d80bc8d56d5f059fe18f0798e32f6') version('0.6.2', '255d80bc8d56d5f059fe18f0798e32f6')
version('release-0.5', branch='release-0.5') version('release-0.5', branch='release-0.5')
version('0.5.2', '8c3fff150a6f96cf0536fb3b4eaa5cbb') version('0.5.2', '8c3fff150a6f96cf0536fb3b4eaa5cbb')
@ -40,6 +42,7 @@ class Julia(Package):
patch('gc.patch', when='@0.4:0.4.5') patch('gc.patch', when='@0.4:0.4.5')
patch('openblas.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')
variant('binutils', default=sys.platform != 'darwin', variant('binutils', default=sys.platform != 'darwin',
description="Build via binutils") description="Build via binutils")
@ -97,6 +100,8 @@ class Julia(Package):
depends_on("mpi", when="+mpi", type="run") depends_on("mpi", when="+mpi", type="run")
depends_on("py-matplotlib", when="+plot", type="run") depends_on("py-matplotlib", when="+plot", type="run")
conflicts("@:0.7.0", when="target=aarch64")
def install(self, spec, prefix): def install(self, spec, prefix):
# Julia needs git tags # Julia needs git tags
if os.path.isfile(".git/shallow"): if os.path.isfile(".git/shallow"):
@ -126,6 +131,10 @@ def install(self, spec, prefix):
"BUILD_LLVM_CLANG=1", "BUILD_LLVM_CLANG=1",
"LLVM_ASSERTIONS=1", "LLVM_ASSERTIONS=1",
"USE_LLVM_SHLIB=1"] "USE_LLVM_SHLIB=1"]
if spec.satisfies('target=aarch64'):
options += [
'JULIA_CPU_TARGET=generic',
'MARCH=armv8-a+crc']
with open('Make.user', 'w') as f: with open('Make.user', 'w') as f:
f.write('\n'.join(options) + '\n') f.write('\n'.join(options) + '\n')
make() make()
@ -149,18 +158,29 @@ def install(self, spec, prefix):
mkdirp(pkgdir) mkdirp(pkgdir)
# Configure Julia # Configure Julia
with open(join_path(prefix, "etc", "julia", "juliarc.jl"), if spec.satisfies('@master') or spec.satisfies("@0.7:"):
julia_config = 'startup.jl'
cache_path = 'DEPOT_PATH'
unshift = 'pushfirst!'
else:
julia_config = 'juliarc.jl'
cache_path = 'LOAD_CACHE_PATH'
unshift = 'unshift!'
with open(join_path(prefix, "etc", "julia", julia_config),
"a") as juliarc: "a") as juliarc:
if "@master" in spec or "@release-0.5" in spec or "@0.5:" in spec: if "@master" in spec or "@release-0.5" in spec or "@0.5" in spec:
# This is required for versions @0.5: # This is required for versions @0.5:
juliarc.write( juliarc.write(
'# Point package manager to working certificates\n') '# Point package manager to working certificates\n')
if spec.satisfies('@master') or spec.satisfies('@0,7'):
juliarc.write('import LibGit2;')
juliarc.write('LibGit2.set_ssl_cert_locations("%s")\n' % juliarc.write('LibGit2.set_ssl_cert_locations("%s")\n' %
cacert_file) cacert_file)
juliarc.write('\n') juliarc.write('\n')
juliarc.write('# Put compiler cache into a private directory\n') juliarc.write('# Put compiler cache into a private directory\n')
juliarc.write('empty!(Base.LOAD_CACHE_PATH)\n') juliarc.write('empty!(Base.%s)\n' % cache_path)
juliarc.write('unshift!(Base.LOAD_CACHE_PATH, "%s")\n' % cachedir) juliarc.write('%s(Base.%s, "%s")\n' %
(unshift, cache_path, cachedir))
juliarc.write('\n') juliarc.write('\n')
juliarc.write('# Put Julia packages into a private directory\n') juliarc.write('# Put Julia packages into a private directory\n')
juliarc.write('ENV["JULIA_PKGDIR"] = "%s"\n' % pkgdir) juliarc.write('ENV["JULIA_PKGDIR"] = "%s"\n' % pkgdir)
@ -168,22 +188,26 @@ def install(self, spec, prefix):
# Install some commonly used packages # Install some commonly used packages
julia = spec['julia'].command julia = spec['julia'].command
if spec.satisfies("@:0.7"):
julia("-e", 'Pkg.init(); Pkg.update()') julia("-e", 'Pkg.init(); Pkg.update()')
pkgstart = ''
else:
pkgstart = 'import Pkg;'
# Install HDF5 # Install HDF5
if "+hdf5" in spec: if "+hdf5" in spec:
with open(join_path(prefix, "etc", "julia", "juliarc.jl"), with open(join_path(prefix, "etc", "julia", julia_config),
"a") as juliarc: "a") as juliarc:
juliarc.write('# HDF5\n') juliarc.write('# HDF5\n')
juliarc.write('push!(Libdl.DL_LOAD_PATH, "%s")\n' % juliarc.write('push!(Libdl.DL_LOAD_PATH, "%s")\n' %
spec["hdf5"].prefix.lib) spec["hdf5"].prefix.lib)
juliarc.write('\n') juliarc.write('\n')
julia("-e", 'Pkg.add("HDF5"); using HDF5') julia("-e", pkgstart + 'Pkg.add("HDF5"); using HDF5')
julia("-e", 'Pkg.add("JLD"); using JLD') julia("-e", pkgstart + 'Pkg.add("JLD"); using JLD')
# Install MPI # Install MPI
if "+mpi" in spec: if "+mpi" in spec:
with open(join_path(prefix, "etc", "julia", "juliarc.jl"), with open(join_path(prefix, "etc", "julia", julia_config),
"a") as juliarc: "a") as juliarc:
juliarc.write('# MPI\n') juliarc.write('# MPI\n')
juliarc.write('ENV["JULIA_MPI_C_COMPILER"] = "%s"\n' % juliarc.write('ENV["JULIA_MPI_C_COMPILER"] = "%s"\n' %
@ -191,11 +215,11 @@ def install(self, spec, prefix):
juliarc.write('ENV["JULIA_MPI_Fortran_COMPILER"] = "%s"\n' % juliarc.write('ENV["JULIA_MPI_Fortran_COMPILER"] = "%s"\n' %
join_path(spec["mpi"].prefix.bin, "mpifort")) join_path(spec["mpi"].prefix.bin, "mpifort"))
juliarc.write('\n') juliarc.write('\n')
julia("-e", 'Pkg.add("MPI"); using MPI') julia("-e", pkgstart + 'Pkg.add("MPI"); using MPI')
# Install Python # Install Python
if "+python" in spec or "+plot" in spec: if "+python" in spec or "+plot" in spec:
with open(join_path(prefix, "etc", "julia", "juliarc.jl"), with open(join_path(prefix, "etc", "julia", julia_config),
"a") as juliarc: "a") as juliarc:
juliarc.write('# Python\n') juliarc.write('# Python\n')
juliarc.write('ENV["PYTHON"] = "%s"\n' % spec["python"].home) juliarc.write('ENV["PYTHON"] = "%s"\n' % spec["python"].home)
@ -203,15 +227,18 @@ def install(self, spec, prefix):
# Python's OpenSSL package installer complains: # Python's OpenSSL package installer complains:
# Error: PREFIX too long: 166 characters, but only 128 allowed # Error: PREFIX too long: 166 characters, but only 128 allowed
# Error: post-link failed for: openssl-1.0.2g-0 # Error: post-link failed for: openssl-1.0.2g-0
julia("-e", 'Pkg.add("PyCall"); using PyCall') julia("-e", pkgstart + 'Pkg.add("PyCall"); using PyCall')
if "+plot" in spec: if "+plot" in spec:
julia("-e", 'Pkg.add("PyPlot"); using PyPlot') julia("-e", pkgstart + 'Pkg.add("PyPlot"); using PyPlot')
julia("-e", 'Pkg.add("Colors"); using Colors') julia("-e", pkgstart + 'Pkg.add("Colors"); using Colors')
# These require maybe gtk and image-magick # These require maybe gtk and image-magick
julia("-e", 'Pkg.add("Plots"); using Plots') julia("-e", pkgstart + 'Pkg.add("Plots"); using Plots')
julia("-e", 'Pkg.add("PlotRecipes"); using PlotRecipes') julia("-e", pkgstart + 'Pkg.add("PlotRecipes"); using PlotRecipes')
julia("-e", 'Pkg.add("UnicodePlots"); using UnicodePlots') julia(
"-e",
pkgstart + 'Pkg.add("UnicodePlots"); using UnicodePlots'
)
julia("-e", """\ julia("-e", """\
using Plots using Plots
using UnicodePlots using UnicodePlots
@ -221,6 +248,6 @@ def install(self, spec, prefix):
# Install SIMD # Install SIMD
if "+simd" in spec: if "+simd" in spec:
julia("-e", 'Pkg.add("SIMD"); using SIMD') julia("-e", pkgstart + 'Pkg.add("SIMD"); using SIMD')
julia("-e", 'Pkg.status()') julia("-e", pkgstart + 'Pkg.status()')