File ghc.spec of Package ghc

#
# spec file for package ghc
#
# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
#
# 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 http://bugs.opensuse.org/
#


%if 0%{?suse_version} == 1315 && !0%{?is_opensuse}
%define without_manual 1
%endif

%global unregisterised_archs aarch64 s390 s390x

Name:           ghc
Version:        8.0.2
Release:        0
Url:            http://haskell.org/ghc/dist/%{version}/%{name}-%{version}-src.tar.xz
Summary:        The Glorious Glasgow Haskell Compiler
License:        BSD-3-Clause
Group:          Development/Languages/Other
ExclusiveArch:  aarch64 %{ix86} x86_64 ppc ppc64 ppc64le s390 s390x
BuildRequires:  binutils-devel
BuildRequires:  gcc
BuildRequires:  ghc-bootstrap >= 7.8
BuildRequires:  ghc-rpm-macros-extra
BuildRequires:  glibc-devel
BuildRequires:  gmp-devel
BuildRequires:  libdw-devel
BuildRequires:  libelf-devel
#Fix for openSUSE:Leap:42.1
%if 0%{?suse_version} == 1315
BuildRequires:  libffi48-devel
%else
BuildRequires:  libffi-devel
%endif
%ifarch aarch64
BuildRequires:  binutils-gold
%endif
#TODO ghc-8.0.1 supports only llvm-3.7, need talk with llvm packagers about
# versioned build of llvm
# Currently, there is no llvm support for powerpc* in GHC.
# Aarch64 has unregisterised LLVM backend, we need llvm 3.7.x
#%%ifarch aarch64 %{ix86} x86_64
#BuildRequires:  llvm
#%%endif
BuildRequires:  ncurses-devel
BuildRequires:  pkg-config
BuildRequires:  xz
%if %{undefined without_manual}
BuildRequires:  python-sphinx
%endif

PreReq:         update-alternatives
Requires:       ghc-compiler = %{version}-%{release}
Requires:       ghc-ghc-devel = %{version}-%{release}
Requires:       ghc-libraries = %{version}-%{release}
Source:         http://haskell.org/ghc/dist/%{version}/%{name}-%{version}-src.tar.xz
Source1:        ghc-rpmlintrc
# PATCH-FIX_UPSTREAM 0001-StgCmmPrim-Add-missing-write-barrier.patch peter.trommler@ohm-hochschule.de -- Add missing write barrier on mutable arrays.
Patch28:        0001-StgCmmPrim-Add-missing-write-barrier.patch
# PATCH-FIX_UPSTREAM ghc-no-madv-free.patch peter.trommler@ohn-hochschule.de -- Fix "unable to decommit memory: Invalid argument" errors. See Haskell Trac #12865 for details.
Patch29:        ghc-no-madv-free.patch
# PATCH-FIX-UPSTREAM 0001-PPC-CodeGen-fix-lwa-instruction-generation.patch peter.trommler@ohm-hochschule.de -- Fix PPC codegen: Fixes ghc-zeromq4-haskell build on 64-bit PowerPCs
Patch30:        0001-PPC-CodeGen-fix-lwa-instruction-generation.patch
# PATCH-FIX-OPENSUSE ghc-8.0.2-Cabal-dynlibdir.patch -- Fix shared library directory location.
Patch100:       ghc-8.0.2-Cabal-dynlibdir.patch
BuildRoot:      %{_tmppath}/%{name}-%{version}-build

%description
Haskell is the standard purely functional programming language; the
current language version is Haskell 98, agreed in December 1998.

GHC is a state-of-the-art programming suite for Haskell.  Included is
an optimising compiler generating good code for a variety of
platforms, together with an interactive system for convenient, quick
development.  The distribution includes space and time profiling
facilities, a large collection of libraries, and support for various
language extensions, including concurrency, exceptions, and foreign
language interfaces (C, C++, etc).

A wide variety of Haskell related resources (tutorials, libraries,
specifications, documentation, compilers, interprbeters, references,
contact information, links to research groups) are available from the
Haskell home page at <http://www.haskell.org/>.

%package compiler
Summary:        GHC compiler and utilities
Group:          Development/Languages/Other
Requires:       gcc
Requires:       ghc-base-devel
Requires(post): update-alternatives
Requires(postun): update-alternatives
%ifarch aarch64
Requires:       binutils-gold
%endif

%description compiler
This package contains the GHC compiler, tools and utilities.

The GHC libraries are provided by ghc-devel.
To install all of GHC install package ghc.

%global ghc_version_override %{version}

%global ghc_pkg_c_deps ghc-compiler = %{ghc_version_override}-%{release}

%if %{defined ghclibdir}
%ghc_lib_subpackage Cabal-1.24.2.0
%ghc_lib_subpackage array-0.5.1.1
%ghc_lib_subpackage -c gmp-devel,libffi-devel,libdw-devel,libelf-devel base-4.9.1.0
%ghc_lib_subpackage binary-0.8.3.0
%ghc_lib_subpackage bytestring-0.10.8.1
%ghc_lib_subpackage containers-0.5.7.1
%ghc_lib_subpackage deepseq-1.4.2.0
%ghc_lib_subpackage directory-1.3.0.0
%ghc_lib_subpackage filepath-1.4.1.1
%ghc_lib_subpackage -x ghc-%{ghc_version_override}
%ghc_lib_subpackage ghc-boot-%{ghc_version_override}
%ghc_lib_subpackage ghc-boot-th-%{ghc_version_override}
%ghc_lib_subpackage -x ghci-%{ghc_version_override}
%ghc_lib_subpackage haskeline-0.7.3.0
%ghc_lib_subpackage hoopl-3.10.2.1
%ghc_lib_subpackage hpc-0.6.0.3
%ghc_lib_subpackage pretty-1.1.3.3
%ghc_lib_subpackage process-1.4.3.0
%ghc_lib_subpackage template-haskell-2.11.1.0
%ghc_lib_subpackage -c ncurses-devel terminfo-0.4.0.2
%ghc_lib_subpackage time-1.6.0.1
%ghc_lib_subpackage transformers-0.5.2.0
%ghc_lib_subpackage unix-2.7.2.1
%ghc_lib_subpackage xhtml-3000.2.1
%endif

%global version %{ghc_version_override}

%package libraries
Summary:        GHC development libraries meta package
Group:          Development/Libraries/Other
Requires:       ghc-compiler = %{version}-%{release}
Obsoletes:      ghc-devel < %{version}-%{release}
Provides:       ghc-devel = %{version}-%{release}
Obsoletes:      ghc-prof < %{version}-%{release}
Provides:       ghc-prof = %{version}-%{release}
%{?ghc_packages_list:Requires: %(echo %{ghc_packages_list} | sed -e "s/\([^ ]*\)-\([^ ]*\)/ghc-\1-devel = \2-%{release},/g")}

%description libraries
This is a meta-package for all the development library packages in GHC
except the ghc library, which is installed by the toplevel ghc metapackage.

%prep
%setup -q
%patch28 -p1
%patch29 -p1
%patch30 -p1
%patch100 -p1

%build
# Check if bootstrap is required, i.e. version is different from ghc's version
# Note: Cannot use ghc_version macro here as we defined version override earlier
%if "%version" != "%(ghc --numeric-version)"
%define ghc_boot 1
cat > mk/build.mk <<EOF
GhcLibWays = v %{!?ghc_without_shared:dyn}
%if %{defined ghc_without_shared}
DYNAMIC_BY_DEFAULT   = NO
DYNAMIC_GHC_PROGRAMS = NO
%endif
%ifarch %{unregisterised_archs}
GhcUnregisterised    = YES
GhcWithNativeCodeGen = NO
GhcWithInterpreter   = YES
SRC_HC_OPTS          = -O -H64m
GhcStage1HcOpts      = -O
GhcStage2HcOpts      = -O
GhcHcOpts            = -Rghc-timing
GhcLibHcOpts         = -O
SRC_HC_OPTS         += -optc-fno-builtin
SRC_CC_OPTS         += -fno-builtin
%endif
HADDOCK_DOCS         = NO
BUILD_SPHINX_HTML    = NO
BUILD_SPHINX_PS      = NO
BUILD_SPHINX_PDF     = NO
HSCOLOUR_SRCS        = NO
EOF
./configure --prefix=%{_builddir}/ghc-boot --with-system-libffi
%ifnarch aarch64 s390 s390x
make %{?_smp_mflags}
%else
make -j 2
%endif
make install
make clean
%endif

cat > mk/build.mk <<EOF
%ifnarch %{unregisterised_archs}
BuildFlavour = perf
%endif
EOF

# BuildFlavours are defined in mk/build.mk.sample
cat mk/build.mk.sample >> mk/build.mk
# override some settings
cat >> mk/build.mk << EOF
GhcLibWays = v %{!?ghc_without_shared:dyn} %{!?without_prof:p}
%if %{defined ghc_without_shared}
DYNAMIC_BY_DEFAULT   = NO
DYNAMIC_GHC_PROGRAMS = NO
%endif
%ifarch  %{unregisterised_archs}
GhcUnregisterised    = YES
GhcWithNativeCodeGen = NO
SRC_HC_OPTS          = -O -H64m
GhcStage1HcOpts      = -O
GhcStage2HcOpts      = -O
GhcHcOpts            = -Rghc-timing
GhcLibHcOpts         = -O
SRC_HC_OPTS         += -optc-fno-builtin -optc-Wno-return-type
SRC_CC_OPTS         += -fno-builtin -Wno-return-type
%endif
%if %{defined without_haddock}
HADDOCK_DOCS = NO
%endif
BUILD_SPHINX_PS   = NO
%if %{defined without_manual}
BUILD_SPHINX_HTML = NO
BUILD_SPHINX_PDF  = NO
%endif
%if %{defined without_hscolour}
HSCOLOUR_SRCS = NO
%endif
EOF

export CFLAGS="${CFLAGS:-%optflags}"
./configure --prefix=%{_prefix} --exec-prefix=%{_exec_prefix} \
  --bindir=%{_bindir} --sbindir=%{_sbindir} --sysconfdir=%{_sysconfdir} \
  --datadir=%{_datadir} --includedir=%{_includedir} --libdir=%{_libdir} \
  --libexecdir=%{_libexecdir} --localstatedir=%{_localstatedir} \
  --sharedstatedir=%{_sharedstatedir} --mandir=%{_mandir} \
  %{?ghc_boot:--with-ghc=%{_builddir}/ghc-boot/bin/ghc} \
  --with-system-libffi 

%ifnarch aarch64 s390 s390x
make %{?_smp_mflags}
%else
make -j 2
%endif

%install
#%%ghc_suse_disable_debug_packages
%makeinstall

for i in %{ghc_packages_list}; do
name=$(echo $i | sed -e "s/\(.*\)-.*/\1/")
ver=$(echo $i | sed -e "s/.*-\(.*\)/\1/")
%ghc_gen_filelists $name $ver
echo "%doc libraries/$name/LICENSE" >> ghc-$name.files
done

# ghc-base should own ghclibdir
echo "%dir %{ghclibdir}" >> ghc-base.files

%ghc_gen_filelists ghc %{ghc_version_override}
%ghc_gen_filelists ghci %{ghc_version_override}
%ghc_gen_filelists ghc-prim 0.5.0.0
%ghc_gen_filelists integer-gmp 1.0.0.1

%define merge_filelist()\
cat ghc-%1.files >> ghc-%2.files\
cat ghc-%1-devel.files >> ghc-%2-devel.files\
cp -p libraries/%1/LICENSE libraries/LICENSE.%1\
echo "%doc libraries/LICENSE.%1" >> ghc-%2.files

%merge_filelist integer-gmp base
%merge_filelist ghc-prim base

%if %{undefined ghc_without_shared}
echo %%dir %{ghclibdir}/rts >> ghc-base.files
ls %{buildroot}%{ghclibdir}/rts/libHS*.so >> ghc-base.files
sed -i -e "s|^%{buildroot}||g" ghc-base.files
%endif
echo %%dir %{ghclibdir}/rts >> ghc-base-devel.files
ls -d %{buildroot}%{ghclibdir}/rts/libHS*.a  %{buildroot}%{ghclibdir}/package.conf.d/rts.conf %{buildroot}%{ghclibdir}/include >> ghc-base-devel.files
sed -i -e "s|^%{buildroot}||g" ghc-base-devel.files

# these are handled as alternatives
mkdir -p %{buildroot}%{_sysconfdir}/alternatives
for i in hsc2hs runhaskell; do
  if [ -x %{buildroot}%{_bindir}/$i-ghc ]; then
    rm %{buildroot}%{_bindir}/$i
  else
    mv %{buildroot}%{_bindir}/$i{,-ghc}
  fi
  ln -s -f %{_sysconfdir}/alternatives/$i %{buildroot}%{_bindir}/$i
  touch %{buildroot}%{_sysconfdir}/alternatives/$i
done

%ghc_strip_dynlinked

find %{buildroot}%{ghclibdocdir} -name LICENSE -exec rm '{}' ';'

%check
# Actually, I took this from Jens Petersen's Fedora package
# stolen from ghc6/debian/rules:
# Do some very simple tests that the compiler actually works
rm -rf testghc
mkdir testghc
echo 'main = putStrLn "Foo"' > testghc/foo.hs
inplace/bin/ghc-stage2 testghc/foo.hs -o testghc/foo
[ "$(testghc/foo)" = "Foo" ]
# doesn't seem to work inplace:
#[ "$(inplace/bin/runghc testghc/foo.hs)" = "Foo" ]
rm testghc/*
echo 'main = putStrLn "Foo"' > testghc/foo.hs
inplace/bin/ghc-stage2 testghc/foo.hs -o testghc/foo -O2
[ "$(testghc/foo)" = "Foo" ]
rm testghc/*
%if %{undefined ghc_without_shared}
echo 'main = putStrLn "Foo"' > testghc/foo.hs
#inplace/bin/ghc-stage2 testghc/foo.hs -o testghc/foo -dynamic
#[ "$(testghc/foo)" = "Foo" ]
rm testghc/*
%endif

%post compiler
# Alas, GHC, Hugs and nhc all come with different set of tools in addition to
# a runFOO:
#
#   * GHC:  hsc2hs
#   * Hugs: hsc2hs, cpphs
#   * nhc:  cpphs
#
# Therefore it is currently not possible to use --slave below to form link
# groups under a single name 'runhaskell'. Either these tools should be
# disentangled from the Haskell implementations or all implementations should
# have the same set of tools. *sigh*
%{_sbindir}/update-alternatives --install %{_bindir}/runhaskell runhaskell %{_bindir}/runghc     500
%{_sbindir}/update-alternatives --install %{_bindir}/hsc2hs     hsc2hs     %{_bindir}/hsc2hs-ghc 500

%preun compiler
if test "$1" = 0; then
  %{_sbindir}/update-alternatives --remove runhaskell %{_bindir}/runghc
  %{_sbindir}/update-alternatives --remove hsc2hs     %{_bindir}/hsc2hs-ghc
fi

%files
%defattr(-,root,root,-)
%doc LICENSE

%files compiler
%defattr(-,root,root,-)
%doc ANNOUNCE LICENSE
%{_bindir}/ghc
%{_bindir}/ghc-%{version}
%{_bindir}/ghc-pkg
%{_bindir}/ghc-pkg-%{version}
%{_bindir}/ghci
%{_bindir}/ghci-%{version}
%{_bindir}/hp2ps
%{_bindir}/hpc
%{_bindir}/hsc2hs
%ghost %{_sysconfdir}/alternatives/hsc2hs
%{_bindir}/hsc2hs-ghc
%{_bindir}/runghc
%{_bindir}/runghc-%{version}
%{_bindir}/runhaskell
%ghost %{_sysconfdir}/alternatives/runhaskell
%{_bindir}/runhaskell-ghc
%dir %{ghclibdir}
%{ghclibdir}/settings
%dir %{ghclibdir}/bin
%{ghclibdir}/bin/ghc
%{ghclibdir}/bin/ghc-pkg
%{ghclibdir}/bin/ghc-iserv
%{ghclibdir}/bin/ghc-iserv-dyn
%{ghclibdir}/bin/ghc-iserv-prof
%{ghclibdir}/bin/hpc
%{ghclibdir}/bin/hsc2hs
%ifnarch %{unregisterised_archs}
%{ghclibdir}/bin/ghc-split
%endif
%{ghclibdir}/ghc-usage.txt
%{ghclibdir}/ghci-usage.txt
%dir %{ghclibdir}/package.conf.d
%ghost %{ghclibdir}/package.conf.d/package.cache
%{ghclibdir}/platformConstants
%{ghclibdir}/bin/runghc
%{ghclibdir}/template-hsc.h
%{ghclibdir}/bin/unlit
%dir %{_datadir}/doc/ghc-%{version}
%dir %{ghcdocbasedir}
%dir %{ghcdocbasedir}/libraries
%if %{undefined without_manual}
%{_mandir}/man1/ghc.*
%endif
%if %{undefined without_haddock}
%{_bindir}/haddock
%{_bindir}/haddock-ghc-%{version}
%{ghclibdir}/html
%{ghclibdir}/latex
%{ghclibdir}/bin/haddock
%if %{undefined without_manual}
%{ghcdocbasedir}/haddock
%{ghcdocbasedir}/users_guide
%endif
%{ghcdocbasedir}/libraries/gen_contents_index
%{ghcdocbasedir}/libraries/hslogo-16.png
%{ghcdocbasedir}/libraries/ocean.css
%{ghcdocbasedir}/libraries/prologue.txt
%{ghcdocbasedir}/libraries/synopsis.png
%{ghcdocbasedir}/index.html
%ghost %{ghcdocbasedir}/libraries/doc-index*.html
%ghost %{ghcdocbasedir}/libraries/haddock-util.js
%ghost %{ghcdocbasedir}/libraries/index*.html
%ghost %{ghcdocbasedir}/libraries/minus.gif
%ghost %{ghcdocbasedir}/libraries/plus.gif
%endif

%files libraries
%defattr(-,root,root,-)
%doc LICENSE

%changelog