%define pkg_name    julia
%define pkg_version 1.1.0
%define pkg_release 3%{?_dist_release}

%global unwindversion 1.1-julia2
%global uvcommit 2348256acf5759a544e5ca7935f638d2bc091d60
%global patchelfversion 0.9
%global utf8proccommit 97ef668b312b96382714dbb8eaac4affce0816e6
%global llvmversion 6.0.1
%global libwhichcommit 81e9723c0273d78493dc8c8ed570f68d9ce7e89e
%global mpfrversion 4.0.1
%global cacertversion 2018-10-17

%global pkgcommit 853b3f1fd9895db32b402d89e9dee153b66b2316


Summary: High-level, high-performance dynamic programming language for numerical computing
Name:    %{pkg_name}
Version: %{pkg_version}
Release: %{pkg_release}

License: MIT, BSD and GPLv3
# julia, utf8proc, libwhich: MIT
# libunwind, libuv, llvm: BSD
# patchelf, mpfr: GPLv3
Group:   Applications/Edutainment
URL:     https://julialang.org/

Source0: https://github.com/JuliaLang/julia/releases/download/v%{version}/%{name}-%{version}.tar.gz

Source11: libunwind-%{unwindversion}.tar.gz
Source12: libuv-%{uvcommit}.tar.gz
Source13: patchelf-%{patchelfversion}.tar.gz
Source14: utf8proc-%{utf8proccommit}.tar.gz
Source15: llvm-%{llvmversion}.src.tar.xz
Source16: libwhich-%{libwhichcommit}.tar.gz
Source17: mpfr-%{mpfrversion}.tar.bz2
Source18: cacert-%{cacertversion}.pem

Source31: https://api.github.com/repos/JuliaLang/Pkg.jl/tarball/%{pkgcommit}#/Pkg-%{pkgcommit}.tar.gz

# not make debug
Patch11: julia-Makefile_release.patch

# ## Patches for make test
# # Avoid test error
# Patch21: julia-skip-LibGit2-libgit2.patch

# Patch from Fedora
Patch31: llvm-julia-installdirs-64.patch

# march=pentium4 in i686
Patch32: julia-i686-march.patch


BuildRoot: %{_tmppath}/%{name}-%{version}-root

BuildRequires: cmake
BuildRequires: gcc-gfortran
BuildRequires: gmp-devel
BuildRequires: openblas-devel
%ifarch x86_64
BuildRequires: openblas64-devel
%endif
BuildRequires: openspecfun-devel
BuildRequires: openlibm-devel
BuildRequires: suitesparse-devel
BuildRequires: dSFMT-devel
BuildRequires: pcre2-devel
BuildRequires: libssh2-devel
BuildRequires: curl-devel
BuildRequires: libgit2-devel
BuildRequires: mbedtls-devel
BuildRequires: libatomic
BuildRequires: desktop-file-utils

Requires: openblas-threads
%ifarch x86_64
Requires: openblas-threads64_
%endif
Requires: openlibm
Requires: suitesparse
Requires: dSFMT
Requires: pcre2
Requires: libssh2
Requires: libgit2
Requires: mbedtls
Requires: libatomic


Vendor: Project Vine
Distribution: Vine Linux
Packager: ara_t


%description
Julia is a high-level, high-performance dynamic programming language
for numerical computing. It provides a sophisticated compiler,
distributed parallel execution, numerical accuracy, and an extensive
mathematical function library. Julia’s Base library, largely written
in Julia itself, also integrates mature, best-of-breed open source C
and Fortran libraries for linear algebra, random number generation,
signal processing, and string processing. In addition, the Julia developer
community is contributing a number of external packages through Julia's
built-in package manager at a rapid pace.
IJulia, a collaboration between the Jupyter and Julia communities,
provides a powerful browser-based graphical notebook interface to Julia.

Julia programs are organized around multiple dispatch; by defining functions
and overloading them for different combinations of argument types,
which can also be user-defined. For a more in-depth discussion of the
rationale and advantages of Julia over other systems, see the following
highlights or read the introduction in the online manual.
#'


%prep
%{__rm} -rf ${RPM_BUILD_ROOT}
%setup -q

%patch11 -b .release
# %patch21 -b .skip_test

%ifarch x86_64
%patch31 -p1 -b .installdir64
%endif

%ifarch %{ix86}
%patch32 -b .march
%endif


cat > Make.user <<EOF
USE_SYSTEM_LLVM=0
USE_SYSTEM_LIBUNWIND=0
USE_SYSTEM_LIBUV=0
USE_SYSTEM_LIBM=0
USE_SYSTEM_OPENLIBM=1
UNTRUSTED_SYSTEM_LIBM=0
USE_SYSTEM_OPENSPECFUN=1

USE_SYSTEM_PCRE=1
USE_SYSTEM_DSFMT=1
USE_SYSTEM_GMP=1
USE_SYSTEM_MPFR=0
USE_SYSTEM_BLAS=1
USE_SYSTEM_LAPACK=1
USE_SYSTEM_SUITESPARSE=1

USE_SYSTEM_LIBSSH2=1
USE_SYSTEM_CURL=1
USE_SYSTEM_LIBGIT2=1
USE_SYSTEM_MBEDTLS=1
EOF

%{__mkdir_p} deps/srccache stdlib/srccache
%{__cp} \
 %{SOURCE11} %{SOURCE12} %{SOURCE13} %{SOURCE14} %{SOURCE15} \
 %{SOURCE16} %{SOURCE17} %{SOURCE18} \
 deps/srccache

%{__cp} %{SOURCE31} stdlib/srccache

# Required so that the image is not optimized for the build CPU
# (i386 does not work yet: https://github.com/JuliaLang/julia/issues/7185)
# Without specifying MARCH, the Julia system image would only work on native CPU
%ifarch %{ix86}
%global march pentium4
%endif
%ifarch x86_64
%global march x86-64
%endif

# setting for using system openblas
%ifarch %{ix86}
%global blas USE_BLAS64=0 LIBBLAS=-lopenblasp LIBBLASNAME=libopenblasp LIBLAPACK=-lopenblasp LIBLAPACKNAME=libopenblasp
%endif
%ifarch x86_64
%global blas USE_BLAS64=1 LIBBLAS=-lopenblasp64_ LIBBLASNAME=libopenblasp64_ LIBLAPACK=-lopenblasp64_ LIBLAPACKNAME=libopenblasp64_ OPENBLAS_SYMBOLSUFFIX=64_
%endif

# About build, build_libdir and build_bindir
# see https://github.com/JuliaLang/julia/issues/5063#issuecomment-32628111
%global julia_builddir %{_builddir}/%{name}-%{version}/build
%global installopts prefix=%{_prefix} bindir=%{_bindir} libdir=%{_libdir} libexecdir=%{_libexecdir} datarootdir=%{_datarootdir} includedir=%{_includedir} sysconfdir=%{_sysconfdir} build_prefix=%{julia_builddir}%{_prefix} build_bindir=%{julia_builddir}%{_bindir} build_libdir=%{julia_builddir}%{_libdir} build_private_libdir=%{julia_builddir}%{_libdir}/julia build_libexecdir=%{julia_builddir}%{_libexecdir} build_datarootdir=%{julia_builddir}%{_datarootdir} build_includedir=%{julia_builddir}%{_includedir} build_sysconfdir=%{julia_builddir}%{_sysconfdir}

%global commonopts MARCH=%{march} %{blas} %{installopts}

%build
%{__make} %{?_smp_mflags} %{commonopts}

# to avoid making documents
%{__mkdir_p} doc/_build/html/en
touch doc/_build/html/en/index.html

%install
%{__make} %{commonopts} install DESTDIR=${RPM_BUILD_ROOT}

# remove html files
pushd ${RPM_BUILD_ROOT}%{_docdir}
%{__mv} julia %{name}-%{version}
%{__rm} -rf %{name}-%{version}/html
popd


%{__cp} \
 CONTRIBUTING.md DISTRIBUTING.md HISTORY.md \
 LICENSE.md NEWS.md README.md \
 ${RPM_BUILD_ROOT}%{_docdir}/%{name}-%{version}

%check
%{__make} %{?_smp_mflags} %{commonopts} test

%clean
%{__rm} -rf ${RPM_BUILD_ROOT}

%post
%{_syssbindir}/ldconfig
if [ -x %{_bindir}/update-desktop-database ] ; then
    %{_bindir}/update-desktop-database %{_datadir}/applications
fi

%postun
%{_syssbindir}/ldconfig
if [ $1 -eq 0 ] ; then
    if [ -x %{_bindir}/update-desktop-database ] ; then
        %{_bindir}/update-desktop-database %{_datadir}/applications
    fi
fi


%files
%defattr(-, root, root)
%{_bindir}/julia
%{_sysconfdir}/%{name}
%{_includedir}/%{name}
%{_libdir}/%{name}/
%{_libdir}/libjulia.so*
%{_datadir}/appdata/
%{_datadir}/applications/
%{_datadir}/icons/
%{_datadir}/julia/
%{_docdir}/%{name}-%{version}
%{_mandir}/man1/


%changelog
* Sun Nov 03 2019 Toshiaki Ara <ara_t@384.jp> 1.1.0-3
- Rebuild for suitesparse 5.4.0

* Wed Mar 27 2019 Toshiaki Ara <ara_t@384.jp> 1.1.0-2
- build llvm shared library
- add Patch31 for x86_64
- add Patch32 for i686
- add SOURCE18 (cacert-*.pem)
- add SOURCE31 (Pkg library)
- drop Patch21

* Mon Jan 28 2019 Toshiaki Ara <ara_t@384.jp> 1.1.0-1
- update to 1.1.0
- change using system openblas

* Sat Jan 26 2019 Toshiaki Ara <ara_t@384.jp> 1.0.3-2
- remove unnecessary sofiles
- rebuild with gfortran-8.2.0

* Sat Jan 05 2019 Toshiaki Ara <ara_t@384.jp> 1.0.3-1
- update to 1.0.3

* Fri Nov 16 2018 Toshiaki Ara <ara_t@384.jp> 1.0.2-1
- update to 1.0.2

* Thu Oct 04 2018 Toshiaki Ara <ara_t@384.jp> 1.0.1-1
- update to 1.0.1

* Wed Aug 22 2018 Toshiaki Ara <ara_t@384.jp> 1.0.0-2
- rebuild with suitesparse-4.4.6

* Fri Aug 17 2018 Toshiaki Ara <ara_t@384.jp> 1.0.0-1
- update to 1.0.0
- add/update sources
- drop some Patches
- add BuildRequires: and Requires: libatomic

* Sat Jul 14 2018 Toshiaki Ara <ara_t@384.jp> 0.6.4-1
- new upstream release
- update SOURCE17 (openblas)

* Sun Jun 17 2018 Toshiaki Ara <ara_t@384.jp> 0.6.3-1
- new package