%global security_hardening nofortify

# It needs linux sources only to generate linux-api-headers for
# local glibc build. glibc bits get dropped and will not be packaged
%define linux_kernel_version 4.19.52
%define glibc_version 2.28

Name:    gcc-aarch64-linux-gnu
Summary: Cross GCC for Aarch64
Version: 7.3.0
Release: 1%{?dist}
Group:   Development/Tools
Vendor:  VMware, Inc.
Distribution: Photon
License: GPLv2+
URL:     http://gcc.gnu.org
Source0: https://ftp.gnu.org/gnu/gcc/gcc-%{version}/gcc-%{version}.tar.xz
%define sha1 gcc=9689b9cae7b2886fdaa08449a26701f095c04e48
Source1: https://www.kernel.org/pub/linux/kernel/v4.x/linux-%{linux_kernel_version}.tar.xz
%define sha1 linux=0fc8eeba8a8a710c95d71f140dfdc4bdff735248
Source2: https://ftp.gnu.org/gnu/glibc/glibc-%{glibc_version}.tar.xz
%define sha1 glibc=ccb5dc9e51a9884df8488f86982439d47b283b2a
Source3: https://ftp.gnu.org/gnu/mpfr/mpfr-4.0.1.tar.gz
%define sha1 mpfr=655e3cf416a0cc9530d9cb3c38dc8839504f0e98
Source4: https://ftp.gnu.org/gnu/gmp/gmp-6.1.2.tar.xz
%define sha1 gmp=9dc6981197a7d92f339192eea974f5eca48fcffe
Source5: https://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gz
%define sha1 mpc=b019d9e1d27ec5fb99497159d43a3164995de2d0
Patch0:   libsanitizer-avoidustat.h-glibc-2.28.patch
Patch1:   PLUGIN_TYPE_CAST.patch
BuildArch: x86_64
Provides: libgcc_s.so.1
Provides: libgcc_s.so.1(GCC_3.0)
Provides: libgcc_s.so.1(GCC_3.3)
Provides: libgcc_s.so.1(GCC_4.2.0)
Provides: libgcc_s.so.1(GLIBC_2.0)
BuildRequires: binutils-aarch64-linux-gnu
Requires: binutils-aarch64-linux-gnu

%global target_arch aarch64-unknown-linux-gnu
%global target_linux_arch arm64
%global sysroot /target-aarch64

%description
The GCC package contains the GNU compiler collection,
which includes the C and C++ compilers.

%prep
%setup -c -q
%setup -T -D -q -a 1
%setup -T -D -q -a 2
%setup -T -D -q -a 3
%setup -T -D -q -a 4
%setup -T -D -q -a 5

cd gcc-%{version}
%patch0 -p1
%patch1 -p1
ln -sf `ls -1d ../mpfr-*/` mpfr
ln -sf `ls -1d ../gmp-*/` gmp
ln -sf `ls -1d ../mpc-*/` mpc

# disable no-pie for gcc binaries
sed -i '/^NO_PIE_CFLAGS = /s/@NO_PIE_CFLAGS@//' gcc/Makefile.in

%build

# Create usrmove symlinks
mkdir -p %{sysroot}/usr/lib && ln -s usr/lib %{sysroot}/lib
mkdir -p %{sysroot}/usr/bin && ln -s usr/bin %{sysroot}/bin
mkdir -p %{sysroot}/usr/sbin && ln -s usr/sbin %{sysroot}/sbin

builddir=$RPM_BUILD_DIR/%{name}-%{version}

###
### Step 1
###

echo "Step 1. Building Linux headers"

cd $builddir/linux-%{linux_kernel_version} && \
make mrproper && \
make ARCH=%{target_linux_arch} headers_check && \
make ARCH=%{target_linux_arch} \
     INSTALL_HDR_PATH=%{sysroot}%{_prefix} \
     headers_install

###
### Step 2
###

echo "Step 2. Building GCC C compiler"

mkdir -p $builddir/build-gcc-%{target_arch} && \
cd $builddir/build-gcc-%{target_arch} && \
$builddir/gcc-%{version}/configure \
    --prefix=%{_prefix} \
    --target=%{target_arch} \
    --with-sysroot=%{sysroot} \
    --enable-plugins \
    --enable-languages=c \
    --enable-threads=posix \
    --enable-linker-build-id \
    --disable-multilib && \
make %{?_smp_mflags} all-gcc && \
make install-gcc

###
### Step 3
###

echo "Step 3. Building GLIBC headers and C runtime"

mkdir -p $builddir/build-glibc-%{target_arch} && \
cd $builddir/build-glibc-%{target_arch} && \
$builddir/glibc-%{glibc_version}/configure \
    --prefix=%{_prefix} \
    --libexecdir=/usr/lib/glibc \
    --build=$MACHTYPE \
    --host=%{target_arch} \
    --target=%{target_arch} \
    --with-headers=%{sysroot}/usr/include \
    --disable-multilib \
    libc_cv_forced_unwind=yes && \
make install-bootstrap-headers=yes install-headers install_root=%{sysroot} && \
make %{?_smp_mflags} csu/subdir_lib && \
mkdir -p %{sysroot}/usr/lib && \
install csu/crt1.o csu/crti.o csu/crtn.o \
            %{sysroot}/usr/lib && \
%{target_arch}-gcc \
    -nostdlib \
    -nostartfiles \
    -shared \
    -x c /dev/null \
    -o %{sysroot}/usr/lib/libc.so && \
mkdir -p %{sysroot}/usr/include/gnu && \
touch %{sysroot}/usr/include/gnu/stubs.h

###
### Step 4
###

echo "Stage 4. Building GCC compiler support library"

cd $builddir/build-gcc-%{target_arch} && \
$builddir/gcc-%{version}/configure \
    --prefix=%{_prefix} \
    --target=%{target_arch} \
    --with-sysroot=%{sysroot} \
    --enable-shared \
    --enable-threads=posix \
    --enable-__cxa_atexit \
    --enable-clocale=gnu \
    --enable-languages=c,c++,fortran \
    --disable-multilib \
    --enable-linker-build-id \
    --enable-plugin \
    --with-system-zlib && \
make %{?_smp_mflags} all-target-libgcc && \
make install-target-libgcc
make %{?_smp_mflags} DESTDIR=%{buildroot} install-target-libgcc

###
### Step 5
###

echo "Step 5. Building full GLIBC"

cd $builddir/build-glibc-%{target_arch} && \
make %{?_smp_mflags} && \
make install install_root=%{sysroot}

###
### Step 6
###

echo "Step 6. Building full GCC"

cd $builddir/build-gcc-%{target_arch} && \
make %{?_smp_mflags} all && \
make %{?_smp_mflags} DESTDIR=%{buildroot} install


%install

CROSS_TOOLCHAIN_PKG_CONFIG=%{buildroot}%{_bindir}/%{target_arch}-pkg-config

cat > $CROSS_TOOLCHAIN_PKG_CONFIG << EOF
#! /bin/sh

SYSROOT=%{sysroot}

export PKG_CONFIG_DIR=
export PKG_CONFIG_LIBDIR=\${SYSROOT}/usr/lib/pkgconfig:\${SYSROOT}/usr/share/pkgconfig
export PKG_CONFIG_SYSROOT_DIR=\${SYSROOT}

exec pkg-config "\$@"
EOF
chmod +x $CROSS_TOOLCHAIN_PKG_CONFIG

%post   -p /sbin/ldconfig
%postun -p /sbin/ldconfig

%files
%defattr(-,root,root)
%{_bindir}/*
%{_libdir}/*
%exclude %{_libdir}/debug
%{_lib64dir}/*
%{_libexecdir}/*
%{_datadir}/*
%exclude %{_datadir}/info/dir
%{_prefix}/%{target_arch}/*

%changelog
* Fri Nov 02 2018 Alexey Makhalov <amakhalov@vmware.com> 7.3.0-1
- Cloned from cross-aarch64-tools.spec
* Thu Nov 1 2018 Sriram Nambakam <snambakam@vmware.com> 1.0.0-3
- Updated versions of cross toolchain components
* Mon Oct 22 2018 Sriram Nambakam <snambakam@vmware.com> 1.0.0-2
- Replace _sysroot definition with sysroot
* Fri Oct 19 2018 Sriram Nambakam <snambakam@vmware.com> 1.0.0
- Initial build. First version