# # spec file for package julia # # Copyright (c) 2023 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed # upon. The license for this file, and modifications and additions to the # file, is the same license as for the pristine package itself (unless the # license for the pristine package is not an Open Source License, in which # case the license is the MIT License). An "Open Source License" is a # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. # Please submit bugfixes or comments via https://bugs.opensuse.org/ # # We must not strip binaries in julia, since it can lead to many problems. # For example, see: # # https://github.com/JuliaLang/julia/issues/17941 %undefine _build_create_debug %define __arch_install_post export NO_BRP_STRIP_DEBUG=true %global __provides_exclude_from ^%{_libdir}/%{name}/.*\\.so$ # List all bundled libraries. %global _privatelibs lib(LLVM-.*|ccalltest|llvmcalltest|uv|openblas.*|sys|julia.*)\\.so.* %global __provides_exclude ^(%{_privatelibs})$ %global __requires_exclude ^(%{_privatelibs})$ %define libjulia_sover_major 1 %define libjulia_sover_minor 10 %if "@BUILD_FLAVOR@%{nil}" == "compat" %define compat_mode 1 %else %define compat_mode 0 %endif %if 0%{?compat_mode} %define libname libjulia-compat%{libjulia_sover_major} %else %define libname libjulia%{libjulia_sover_major} %endif # LTO currently makes building blastrampoline and Julia itself fail # It is not enabled upstream anyway %global _lto_cflags %nil Version: 1.10.0 Release: 0 URL: http://julialang.org/ Source0: https://github.com/JuliaLang/julia/releases/download/v%{version}/julia-%{version}-full.tar.gz Source1: https://github.com/JuliaLang/julia/releases/download/v%{version}/julia-%{version}-full.tar.gz.asc Source2: https://gitlab.archlinux.org/archlinux/packaging/packages/julia/-/raw/main/keys/pgp/3673DF529D9049477F76B37566E3C7DC03D6E495.asc?ref_type=heads#/julia.keyring Source3: https://www.unicode.org/Public/13.0.0/ucd/UnicodeData.txt Source4: julia-rpmlintrc # PATCH-FIX-OPENSUSE julia-env-script-interpreter.patch ronisbr@gmail.com -- Change script interpreted to avoid errors in rpmlint. Patch1: julia-env-script-interpreter.patch # Patch2: https://gitlab.archlinux.org/archlinux/packaging/packages/julia/-/raw/main/e08e1444.patch?ref_type=heads#/new-pass-manager.patch # Patch3: https://gitlab.archlinux.org/archlinux/packaging/packages/julia/-/raw/main/959902f1.patch?ref_type=heads#/support-float16-depending-on-llvm-and-platform.patch # Patch4: https://gitlab.archlinux.org/archlinux/packaging/packages/julia/-/raw/main/f11bfc6c.patch?ref_type=heads#/use-newpm-asan.patch # Patch5: https://gitlab.archlinux.org/archlinux/packaging/packages/julia/-/raw/main/21d4c2f1.patch?ref_type=heads#/llvm-set-of-custom-patches.patch Patch6: https://gitlab.archlinux.org/archlinux/packaging/packages/julia/-/raw/main/julia-libunwind-1.6.patch?ref_type=heads#/julia-libunwind-1.9.patch # Patch8: https://gitlab.archlinux.org/archlinux/packaging/packages/julia/-/raw/main/julia-libgit2-1.7.patch?ref_type=heads#/julia-libgit2-1.7.patch # Patch9: https://gitlab.archlinux.org/archlinux/packaging/packages/julia/-/raw/main/julia-suitesparse-7.patch?ref_type=heads#/julia-suitesparse-7.patch Patch9: https://gitlab.archlinux.org/archlinux/packaging/packages/julia/-/raw/main/julia-libcholmod-cuda.patch?ref_type=heads#/julia-remove-libcholmod_cuda.patch Patch10: use-system-libuv-correctly.patch Patch11: openlibm.patch Patch12: llvm-link-shared.patch # Adapted from https://gitlab.archlinux.org/archlinux/packaging/packages/julia/-/raw/main/julia-hardcoded-libs.patch?ref_type=heads # We just remove the julia specific llvm sofile change Patch13: julia-hardcoded-libs.patch Patch14: disable-download-of-unicode-for-doc-gen.patch Patch15: disable-doc-gen-in-makefile.patch BuildRequires: ImageMagick BuildRequires: blas-devel BuildRequires: ca-certificates BuildRequires: cmake BuildRequires: curl BuildRequires: dSFMT-devel BuildRequires: dos2unix BuildRequires: double-conversion-devel BuildRequires: fdupes BuildRequires: fftw3-threads-devel >= 3.3.4 BuildRequires: gcc BuildRequires: gcc-c++ BuildRequires: gcc-fortran BuildRequires: git BuildRequires: gmp-devel >= 6.1.2 BuildRequires: hicolor-icon-theme BuildRequires: lapack-devel >= 3.5.0 BuildRequires: libblastrampoline-devel BuildRequires: libcholmod3 BuildRequires: libcurl-devel BuildRequires: libgit2-devel BuildRequires: libnghttp2-devel BuildRequires: libopenblas_openmp-devel >= 0.3.5 BuildRequires: libssh2-devel >= 1.9.0 BuildRequires: libunwind-devel >= 1.3.1 BuildRequires: libuv-devel BuildRequires: libwhich BuildRequires: lld15 BuildRequires: llvm15-devel BuildRequires: m4 BuildRequires: mbedtls-devel BuildRequires: mpfr-devel >= 4.0.2 BuildRequires: ncurses-devel BuildRequires: openblas-common-devel BuildRequires: openlibm-devel BuildRequires: openspecfun-devel BuildRequires: openssl BuildRequires: p7zip >= 16 BuildRequires: patchelf >= 0.9 BuildRequires: pcre2-devel >= 10.31 BuildRequires: perl BuildRequires: python >= 2.5 BuildRequires: readline-devel BuildRequires: suitesparse-devel >= 5.4.0 BuildRequires: update-desktop-files BuildRequires: utf8proc-devel BuildRequires: zlib-devel Requires: ca-certificates Requires: p7zip >= 16 Requires: readline # Libraries used by CompilerSupportLibraries_jll, blastrampoline, # nghttp2_jll but not detected as they are dlopen()ed but not linked to %if 0%{?__isa_bits} == 64 Requires: libgfortran.so.5()(64bit) Requires: libgomp.so.1()(64bit) Requires: libmbedcrypto.so.15()(64bit) %else Requires: libgfortran.so.5 Requires: libgomp.so.1 Requires: libmbedcrypto.so.15 %endif # Same as the previous comment. But the difference # is that we applied julia-hardcoded-libs.patch Requires: libgit2-devel Requires: libnghttp2-devel Requires: libssh2-devel Requires: mbedtls-devel Requires: openlibm-devel Requires: suitesparse-devel # Julia requires the devel package as well # specifically libjulia.so %if 0%{?compat_mode} Requires: julia-compat-devel %else Requires: julia-devel %endif Requires(post): %{_sbindir}/update-alternatives Requires(post): %{_sbindir}/ldconfig Requires(postun):%{_sbindir}/update-alternatives Requires(postun):%{_sbindir}/ldconfig Recommends: curl Recommends: git Recommends: gmp-devel Recommends: libcurl-devel Recommends: mpfr-devel Recommends: openspecfun-devel Recommends: openssh-clients Recommends: pcre2-devel Recommends: suitesparse-devel %if 0%{?compat_mode} == 0 Name: julia %else Name: julia-compat %endif %if 0%{?compat_mode} == 0 Summary: High-level, high-performance dynamic programming language License: BSD-3-Clause AND GPL-2.0-or-later AND MIT AND Zlib Group: Development/Languages/Other %else Summary: High-level, high-performance dynamic programming language (without CPU optim.) License: BSD-3-Clause AND GPL-2.0-or-later AND MIT AND Zlib Group: Development/Languages/Other %endif %if 0%{?compat_mode} Conflicts: julia Provides: julia = %{version} %endif # Let's not be optimistic towards 32 bit support and other architectures # openSUSE or Julia cannot guarantee to support, shall we? Only choose # Tier1 architectures %if 0%{?compat_mode} ExclusiveArch: x86_64 x86_64_v3 %else ExclusiveArch: x86_64 x86_64_v3 aarch64 %endif %{?suse_build_hwcaps_libs} %description Julia is a high-level, high-performance dynamic programming language for technical computing, with syntax that is familiar to users of other technical computing environments. It provides a sophisticated compiler, distributed parallel execution, numerical accuracy, and an extensive mathematical function library. The library, largely written in Julia itself, also integrates mature, best-of-breed C and Fortran libraries for linear algebra, random number generation, signal processing, and string processing. This package is experimental and by no means supported by upstream. If you want to use julia, please install juliaup instead. %package devel Summary: Julia development, debugging and testing files Group: Development/Languages/Other Requires: %{libname} = %{version} %if 0%{?compat_mode} Conflicts: julia-devel Provides: julia-devel %endif %description devel Contains library symbolic links and header files for developing applications linking to the Julia library, in particular embedding it, as well as tests and a debugging version of Julia. This package is normally not needed when programming in the Julia language, but rather for embedding Julia into external programs or debugging Julia itself. %package -n %{libname} Summary: Julia shared object libraries Group: System/Libraries %if 0%{?compat_mode} Conflicts: libjulia%{libjulia_sover_major} Provides: libjulia%{libjulia_sover_major} %endif %description -n %{libname} Contains library files for interacting with Julia through C interfaces. %prep %setup -q -n julia-%{version} patch -p1 -i %{PATCH1} patch -p1 -i %{PATCH14} patch -p1 -i %{PATCH15} # patch -p1 -i %%{PATCH2} # patch -p1 -i %%{PATCH3} # patch -p1 -i %%{PATCH4} # patch -p1 -i %%{PATCH5} # libunwind 1.6 compatibility patch -p1 -i %{PATCH6} # Fix tests with libgit2 1.7 # patch -p1 -i %%{PATCH8} # Make.inc puts it in the wrong libpath # patch -p1 -i %%{PATCH10} patch -p1 -i %{PATCH9} # Other hardcoded libs patch # patch -p1 -i %{PATCH11} patch -p1 -i %{PATCH12} patch -p1 -i %{PATCH13} # Copy https://www.unicode.org/Public/13.0.0/ucd/UnicodeData.txt to deps/srccache cp %{SOURCE3} deps/srccache/UnicodeData-13.0.0.txt %build %if 0%{?compat_mode} == 0 %ifarch x86_64 || x86_64_v3 %define julia_march core2 %endif %ifarch %{ix86} %define julia_march pentium4 %endif %ifarch aarch64 %define julia_march armv8-a %endif %ifarch armv7l armv7hl %define julia_march armv7-a %endif %ifarch armv6l armv6hl %define julia_march armv6 %endif %ifarch ppc64le %define julia_march ppc64le %endif %else # compat_mode is only defined for 64-bit architecture. %define julia_march x86-64 %endif export CFLAGS="%{optflags}" export CXXFLAGS="%{optflags}" export NO_GIT=1 export LD_LIBRARY_PATH="%{_builddir}/%{buildsubdir}/build/usr/lib:%{_builddir}/%{buildsubdir}/build%{_libdir}:%{_builddir}/%{buildsubdir}/usr/lib:%{_libdir}:%{_prefix}/lib" make %{?_smp_mflags} \ MARCH=%{julia_march} \ %ifarch aarch64 JULIA_CPU_TARGET="generic;cortex-a57;thunderx2t99;armv8.2-a,crypto,fullfp16,lse,rdm" \ %endif %ifarch x86_64 || x86_64_v3 JULIA_CPU_TARGET="generic;sandybridge,-xsaveopt,clone_all;haswell,-rdrnd,base(1)" \ %endif build_prefix=%{_builddir}/%{buildsubdir}/build%{_prefix} \ build_libdir=%{_builddir}/%{buildsubdir}/build%{_libdir} \ prefix=%{_prefix} \ bindir=%{_bindir} \ libdir=%{_libdir} \ libexecdir=%{_libexecdir} \ datarootdir=%{_datarootdir} \ includedir=%{_includedir} \ sysconfdir=%{_sysconfdir} \ USE_BINARYBUILDER=0 \ USE_SYSTEM_CSL=1 \ USE_SYSTEM_LLVM=0 \ USE_SYSTEM_LLD=1 \ USE_BINARYBUILDER_OPENBLAS=0 \ USE_BINARYBUILDER_LIBSUITESPARSE=0 \ OPENBLAS_CFLAGS="%{optflags}" \ USE_SYSTEM_LIBUNWIND=1 \ USE_SYSTEM_PCRE=1 \ USE_SYSTEM_BLAS=0 \ USE_SYSTEM_LAPACK=0 \ USE_SYSTEM_LIBBLASTRAMPOLINE=1 \ USE_SYSTEM_GMP=1 \ USE_SYSTEM_MPFR=1 \ USE_SYSTEM_LIBSUITESPARSE=1 \ USE_SYSTEM_SUITESPARSE=1 \ USE_INTEL_JITEVENTS=0 \ USE_SYSTEM_LIBWHICH=1 \ USE_SYSTEM_DSFMT=1 \ USE_SYSTEM_LIBUV=0 \ USE_SYSTEM_UTF8PROC=1 \ USE_SYSTEM_LIBGIT2=1 \ USE_SYSTEM_LIBSSH2=1 \ USE_SYSTEM_MBEDTLS=1 \ USE_SYSTEM_CURL=1 \ USE_SYSTEM_PATCHELF=1 \ USE_SYSTEM_ZLIB=1 \ USE_SYSTEM_P7ZIP=1 \ USE_SYSTEM_OPENLIBM=1 \ USE_BLAS64=1 \ JLDFLAGS="$LDFLAGS" \ VERBOSE=1 \ %if 0%{?suse_version} > 1600 TAGGED_RELEASE_BANNER="openSUSE Tumbleweed Build" \ %else TAGGED_RELEASE_BANNER="openSUSE Leap $(echo \"%{?sle_version}\" | tr '0' '.' | sed 's/..$//') Build" \ %endif release # This may fix other issues where libLLVM-15jl.so is not properly copied? if [ "x%{_lib}" != xlib ] ; then cp -a %{_builddir}/%{buildsubdir}/build/usr/lib/* %{_builddir}/%{buildsubdir}/build/%{_libdir} rm -rf %{_builddir}/%{buildsubdir}/build/usr/lib/ fi %check # The tests will only pass if openblas is being used. # make %{?_smp_mflags} test %install export NO_GIT=1 export CFLAGS="%{optflags}" export CXXFLAGS="%{optflags}" export LD_LIBRARY_PATH="%{_builddir}/%{buildsubdir}/build/usr/lib:%{_builddir}/%{buildsubdir}/build%{_libdir}:%{_builddir}/%{buildsubdir}/usr/lib:%{_libdir}:%{_prefix}/lib" make install DESTDIR=%{buildroot} \ MARCH=%{julia_march} \ %ifarch aarch64 JULIA_CPU_TARGET="generic;cortex-a57;thunderx2t99;armv8.2-a,crypto,fullfp16,lse,rdm" \ %endif %ifarch x86_64 || x86_64_v3 JULIA_CPU_TARGET="generic;sandybridge,-xsaveopt,clone_all;haswell,-rdrnd,base(1)" \ %endif build_prefix=%{_builddir}/%{buildsubdir}/build%{_prefix} \ build_libdir=%{_builddir}/%{buildsubdir}/build%{_libdir} \ prefix=%{_prefix} \ bindir=%{_bindir} \ libdir=%{_libdir} \ libexecdir=%{_libexecdir} \ datarootdir=%{_datarootdir} \ includedir=%{_includedir} \ sysconfdir=%{_sysconfdir} \ USE_BINARYBUILDER=0 \ USE_SYSTEM_CSL=1 \ USE_SYSTEM_LLVM=0 \ USE_SYSTEM_LLD=1 \ USE_BINARYBUILDER_OPENBLAS=0 \ USE_BINARYBUILDER_LIBSUITESPARSE=0 \ OPENBLAS_CFLAGS="%{optflags}" \ USE_SYSTEM_LIBUNWIND=1 \ USE_SYSTEM_PCRE=1 \ USE_SYSTEM_BLAS=0 \ USE_SYSTEM_LAPACK=0 \ USE_SYSTEM_LIBBLASTRAMPOLINE=1 \ USE_SYSTEM_GMP=1 \ USE_SYSTEM_MPFR=1 \ USE_SYSTEM_LIBSUITESPARSE=1 \ USE_SYSTEM_SUITESPARSE=1 \ USE_INTEL_JITEVENTS=0 \ USE_SYSTEM_LIBWHICH=1 \ USE_SYSTEM_DSFMT=1 \ USE_SYSTEM_LIBUV=0 \ USE_SYSTEM_UTF8PROC=1 \ USE_SYSTEM_LIBGIT2=1 \ USE_SYSTEM_LIBSSH2=1 \ USE_SYSTEM_MBEDTLS=1 \ USE_SYSTEM_CURL=1 \ USE_SYSTEM_PATCHELF=1 \ USE_SYSTEM_ZLIB=1 \ USE_SYSTEM_P7ZIP=1 \ USE_SYSTEM_OPENLIBM=1 \ USE_BLAS64=1 \ JLDFLAGS="$LDFLAGS" \ VERBOSE=1 \ %if 0%{?suse_version} > 1600 TAGGED_RELEASE_BANNER="openSUSE Tumbleweed Build" %else TAGGED_RELEASE_BANNER="openSUSE Leap $(echo \"%{?sle_version}\" | tr '0' '.' | sed 's/..$//') Build" %endif # GZip man page. gzip %{buildroot}/%{_mandir}/man1/julia.1 rm -f %{buildroot}%{_libdir}/julia/libuv.a rm -f %{buildroot}%{_datadir}/julia/base/build.h rm -f %{buildroot}%{_datadir}/julia/base/Makefile # Fix documentation directories. mkdir -p %{buildroot}%{_docdir}/julia mv -f %{buildroot}%{_datadir}/doc/julia/* %{buildroot}%{_docdir}/julia/ rm -r %{buildroot}%{_datadir}/doc/julia ln -sfv /var/lib/ca-certificates/ca-bundle.pem %{buildroot}%{_datadir}/julia/cert.pem # Needed by some julia packages # Remove execution permission on documentation files. chmod -x+X -R %{buildroot}%{_docdir}/julia/* # Install .desktop file and icons mkdir -p %{buildroot}%{_datadir}/icons/hicolor/scalable/apps/ mkdir -p %{buildroot}%{_datadir}/icons/hicolor/16x16/apps/ mkdir -p %{buildroot}%{_datadir}/icons/hicolor/24x24/apps/ mkdir -p %{buildroot}%{_datadir}/icons/hicolor/32x32/apps/ mkdir -p %{buildroot}%{_datadir}/icons/hicolor/48x48/apps/ mkdir -p %{buildroot}%{_datadir}/icons/hicolor/256x256/apps/ cp -p contrib/julia.svg %{buildroot}%{_datadir}/icons/hicolor/scalable/apps/%{name}.svg convert -scale 16x16 -extent 16x16 -gravity center -background transparent \ contrib/julia.svg %{buildroot}%{_datadir}/icons/hicolor/16x16/apps/%{name}.png convert -scale 24x24 -extent 24x24 -gravity center -background transparent \ contrib/julia.svg %{buildroot}%{_datadir}/icons/hicolor/24x24/apps/%{name}.png convert -scale 32x32 -extent 32x32 -gravity center -background transparent \ contrib/julia.svg %{buildroot}%{_datadir}/icons/hicolor/32x32/apps/%{name}.png convert -scale 48x48 -extent 48x48 -gravity center -background transparent \ contrib/julia.svg %{buildroot}%{_datadir}/icons/hicolor/48x48/apps/%{name}.png convert -scale 256x256 -extent 256x256 -gravity center -background transparent \ contrib/julia.svg %{buildroot}%{_datadir}/icons/hicolor/256x256/apps/%{name}.png # Remove hidden files and zero-length files and directories from stdlib. pushd %{buildroot} find . -name ".codecov.yml" -prune -execdir rm -rf {} \; find . -name ".git*" -prune -execdir rm -rf {} \; find . -name ".ci" -prune -execdir rm -rf {} \; find . -name ".devcontainer" -prune -execdir rm -rf {} \; find . -name ".travis.yml" -prune -execdir rm -rf {} \; find . -empty -type d -prune -execdir rm -rf {} \; find . -empty -type f -prune -execdir rm -rf {} \; find . -name "*.orig" -prune -execdir rm -rf {} \; popd %if 0%{?compat_mode} rm -rf %{buildroot}%{_docdir}/julia/ # The 'application' object must be only provided by one package # Alternatively, we could rename the .appdata and .desktop file to have # both applications show up in a valid way, but that would require the # -compat appdata to be modified to make the difference clear rm %{buildroot}%{_datadir}/appdata/julia.appdata.xml %endif %suse_update_desktop_file -r julia Science Math mv %{buildroot}%{_bindir}/julia %{buildroot}%{_bindir}/julia-base mkdir -p %{buildroot}%{_sysconfdir}/alternatives if [ "x%{_lib}" != xlib ] ; then mkdir -p %{buildroot}%{_prefix}/lib ln -sf %{_libdir}/julia %{buildroot}%{_prefix}/lib/julia fi ln -sf %{_sysconfdir}/alternatives/julia %{buildroot}%{_bindir}/julia # Julia has a custom compiled LLVM sofile with a good name. We need # it to be discoverable in LD_LIBRARY_PATHs # so it can be dlopened for libLLVM_jll ln -sf %{_libdir}/julia/libLLVM-15jl.so %{buildroot}%{_libdir}/libLLVM-15jl.so # Convert all eol encodings to Unix find %{buildroot} -type f -execdir dos2unix -k {} \; # make it executable chmod +x %{buildroot}%{_datadir}/julia/stdlib/v1.10/SparseArrays/gen/generator.jl # Remove duplicated files. %fdupes %{buildroot}%{_datadir}/julia %post %{_sbindir}/update-alternatives --install %{_bindir}/julia \ julia %{_bindir}/julia-base 5 %{_sbindir}/ldconfig %postun if [ ! -f %{_bindir}/julia-base ] ; then %{_sbindir}/update-alternatives --remove julia %{_bindir}/julia-base fi %{_sbindir}/ldconfig %post devel -p %{_sbindir}/ldconfig %postun devel -p %{_sbindir}/ldconfig %post -n %{libname} -p %{_sbindir}/ldconfig %postun -n %{libname} -p %{_sbindir}/ldconfig %files %doc CONTRIBUTING.md NEWS.md README.md %license LICENSE.md %ghost %{_bindir}/julia %ghost %{_sysconfdir}/alternatives/julia %{_bindir}/julia-base %dir %{_datadir}/julia %{_datadir}/julia/base %{_datadir}/julia/base.cache %{_datadir}/julia/stdlib %{_datadir}/julia/compiled* %{_datadir}/julia/cert.pem %dir %{_libexecdir}/julia %{_libexecdir}/julia/* %{_datadir}/icons/hicolor/scalable/apps/%{name}.svg %{_datadir}/icons/hicolor/16x16/apps/%{name}.png %{_datadir}/icons/hicolor/24x24/apps/%{name}.png %{_datadir}/icons/hicolor/32x32/apps/%{name}.png %{_datadir}/icons/hicolor/48x48/apps/%{name}.png %{_datadir}/icons/hicolor/256x256/apps/%{name}.png %if !%{?compat_mode} %dir %{_datadir}/appdata/ %{_datadir}/appdata/julia.appdata.xml %dir %{_docdir}/julia %{_docdir}/julia/* %endif %{_datadir}/applications/julia.desktop %{_prefix}/lib/julia %{_libdir}/julia/ %{_mandir}/man1/julia.1%{?ext_man} %{_libdir}/libLLVM-15jl.so %dir %{_sysconfdir}/julia/ %config(noreplace) %{_sysconfdir}/julia/startup.jl %files devel %{_datadir}/julia/test/ %{_datadir}/julia/julia-config.jl %{_includedir}/julia/ %{_libdir}/libjulia.so %files -n %{libname} %{_libdir}/libjulia.so.* %changelog