git » gcc.git » main » tree

[main] / PKGBUILD

# Based on the Arch-ARM GCC package

pkgname=(gcc gcc-libs lto-dump gcc-fortran gcc-go)
pkgver=12.3.0
_majorver=${pkgver%%.*}
pkgrel=4
pkgdesc='The GNU Compiler Collection'
arch=(armv7h 'aarch64')
license=(GPL-3.0-with-GCC-exception GFDL-1.3-or-later)
url='https://gcc.gnu.org'
options=(!emptydirs !lto !distcc)
_libdir=usr/lib/gcc/$CHOST/${pkgver%%+*}
source=("$pkgname-$pkgver.tar.gz"
        c89 c99
)

prepare() {
  [[ ! -d gcc ]] && ln -s gcc-${pkgver/+/-} gcc
  cd gcc

  # Do not run fixincludes
  sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in


  # Arch Linux installs x86_64 libraries /lib
  [[ $CARCH == "x86_64" ]] && sed -i '/m64=/s/lib64/lib/' gcc/config/i386/t-linux64

  # ARMLFS installs aarch64 libraries /lib
  [[ $CARCH == "aarch64" ]] && sed -i '/lp64=/s/lib64/lib/' gcc/config/aarch64/t-aarch64-linux

  mkdir -p "$srcdir/gcc-build"
#  mkdir -p "$srcdir/libgccjit-build"
}

build() {
  local _confflags=(
	LD=ld
      --prefix=/usr
      --with-bugurl=https://armlfs.urja.dev/
      --with-linker-hash-style=gnu
      --with-system-zlib
      --enable-__cxa_atexit
      --enable-checking=release
      --enable-clocale=gnu
      --enable-default-pie
      --enable-default-ssp
      --enable-gnu-indirect-function
      --enable-gnu-unique-object
      --enable-libstdcxx-backtrace
      --enable-linker-build-id
      --enable-lto
      --enable-plugin
      --enable-shared
      --enable-threads=posix
      --enable-default-pie
      --enable-default-ssp
      --disable-libssp
      --disable-libstdcxx-pch
      --disable-multilib
      --disable-werror
  )

  # Specify build host types, triplet patch
  [[ $CARCH == "armv7h" ]] && _confflags+=(--host=armv7l-unknown-linux-gnueabihf --build=armv7l-unknown-linux-gnueabihf --with-arch=armv7ve --with-float=hard --with-fpu=neon-vfpv4)
  [[ $CARCH == "aarch64" ]] && _confflags+=(--host=aarch64-unknown-linux-gnu --build=aarch64-unknown-linux-gnu --with-arch=armv8-a --enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419)


  cd gcc-build

  # Credits @allanmcrae
  # https://github.com/allanmcrae/toolchain/blob/f18604d70c5933c31b51a320978711e4e6791cf1/gcc/PKGBUILD
  # TODO: properly deal with the build issues resulting from this
  CFLAGS=${CFLAGS/-Werror=format-security/}
  CXXFLAGS=${CXXFLAGS/-Werror=format-security/}

  #Enable more languages later, if needed.

  "$srcdir/gcc/configure" \
    --enable-languages=c,c++,fortran,go \
    --enable-bootstrap \
    "${_confflags[@]:?_confflags unset}"

  # see https://bugs.archlinux.org/task/71777 for rationale re *FLAGS handling
  make -O STAGE1_CFLAGS="-O2" \
          BOOT_CFLAGS="$CFLAGS" \
          BOOT_LDFLAGS="$LDFLAGS" \
          LDFLAGS_FOR_TARGET="$LDFLAGS" \
          bootstrap

}

check() {
  # Disable for now - please do run if you suspect the setup.
  # But since "some" cases always fail (like 200 out of 100000),
  # the gcc testsuite has a pretty bad signal/noise for the time it takes to run.
  # (Like, you'd need to be a gcc expert to know if your gcc is more
  #  subtly broken than usual... which i'm not yet, quite. And since
  #  we have no programmatic fail criterion, I might not even look 
  #  at the results of any specific run.)
  return 0

  cd gcc-build

  # disable libphobos test to avoid segfaults
  sed -i '/maybe-check-target-libphobos \\/d' Makefile

  # do not abort on error as some are "expected"
  ulimit -s 32768
  echo "==== GCC TESTSUITE ===="
  make -O -k check || true
  "$srcdir/gcc/contrib/test_summary"
  echo "==== GCC TESTSUITE ===="
}

_pick() {
  local p="$1" f d; shift
  for f; do
    d="$srcdir/$p/${f#$pkgdir/}"
    mkdir -p "$(dirname "$d")"
    mv "$f" "$d"
    rmdir -p --ignore-fail-on-non-empty "$(dirname "$f")"
  done
}

package_gcc() {
	pkgdesc="The GNU Compiler Collection - C and C++ frontends"
	depends=("gcc-libs=$pkgver-$pkgrel" 'binutils>=2.28' mpc zstd libisl.so)
	options=(!emptydirs staticlibs)

	cd gcc-build
	make DESTDIR="$pkgdir/" install

	# many packages expect this symlink
	ln -s gcc "$pkgdir"/usr/bin/cc
	ln -sv gcc.1 "$pkgdir"/usr/share/man/man1/cc.1

	# Historical FHS symlink
	ln -svr "$pkgdir"/usr/bin/cpp "$pkgdir"/usr/lib

	mkdir -p "$pkgdir"/usr/lib/bfd-plugins/
	ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/$pkgver/liblto_plugin.so \
        "$pkgdir"/usr/lib/bfd-plugins/

	# POSIX conformance launcher scripts for c89 and c99
	install -Dm755 "$srcdir/c89" "$pkgdir/usr/bin/c89"
	install -Dm755 "$srcdir/c99" "$pkgdir/usr/bin/c99"

	mkdir -pv "$pkgdir"/usr/share/gdb/auto-load/usr/lib
	mv -v "$pkgdir"/usr/lib/*gdb.py "$pkgdir"/usr/share/gdb/auto-load/usr/lib

	(
		cd "$pkgdir"
		_pick gcc-libs usr/lib/lib{asan,atomic,gcc_s,gomp,itm,stdc++,ubsan,gfortran,go}.so*
		_pick lto-dump usr/bin/lto-dump

		_pick gcc-go usr/bin/{*go,gofmt}
		_pick gcc-go usr/lib/go/*
		_pick gcc-go usr/libexec/gcc/$CHOST/$pkgver/{buildid,cgo,go1,test2json,vet}
		_pick gcc-go usr/lib/libgo{,begin,libbegin}.a
		_pick gcc-go usr/share/info/gccgo.info
		_pick gcc-go usr/share/man/man1/{gccgo,go,gofmt}.1

		_pick gcc-fortran usr/bin/*gfortran
		_pick gcc-fortran usr/libexec/gcc/$CHOST/$pkgver/f951
		_pick gcc-fortran usr/lib/gcc/$CHOST/$pkgver/finclude
		_pick gcc-fortran usr/lib/gcc/$CHOST/$pkgver/include/ISO_Fortran_binding.h
		_pick gcc-fortran usr/lib/gcc/$CHOST/$pkgver/libcaf_single.a
		_pick gcc-fortran usr/lib/libgfortran.{a,spec}
		_pick gcc-fortran usr/share/info/gfortran.info
		_pick gcc-fortran usr/share/man/man1/gfortran.1
	)
}

package_gcc-libs() {
	depends=('glibc>=2.27')
	options=(!emptydirs !strip)
	provides=(libubsan.so libasan.so)
	pkgdesc+=" (libraries)"
	mv -v gcc-libs/* "$pkgdir"
}

package_lto-dump() {
	depends=("gcc=$pkgver-$pkgrel")
	pkgdesc="Dump link time optimization object files"
	mv -v lto-dump/* "$pkgdir"
}

package_gcc-fortran() {
	pkgdesc='Fortran front-end for GCC'
	depends=("gcc=$pkgver-$pkgrel" libisl.so)

	mv -v gcc-fortran/* "$pkgdir"
	ln -s gfortran "$pkgdir/usr/bin/f95"
}

package_gcc-go() {
	pkgdesc='Go front-end for GCC'
	depends=("gcc=$pkgver-$pkgrel" libisl.so)
	provides=("go=1.17")
	conflicts=(go)

	mv -v gcc-go/* "$pkgdir"
}

sha256sums=('11275aa7bb34cd8ab101d01b341015499f8d9466342a2574ece93f954d92273b'
            'de48736f6e4153f03d0a5d38ceb6c6fdb7f054e8f47ddd6af0a3dbf14f27b931'
            '2513c6d9984dd0a2058557bf00f06d8d5181734e41dcfe07be7ed86f2959622a')