# Maintainer: Giancarlo Razzolini <grazzolini@archlinux.org>
# Maintainer: Frederik Schwan <freswa at archlinux dot org>
# Contributor:  Bartłomiej Piotrowski <bpiotrowski@archlinux.org>
# Contributor: Allan McRae <allan@archlinux.org>

# toolchain build order: linux-api-headers->glibc->binutils->gcc->glibc->binutils->gcc

pkgname=binutils
pkgver=2.47
_commit=6ce87bbc521cf46eaee9a1f7ef61cee2cdfb3e32
pkgrel=2
pkgdesc='A set of programs to assemble and manipulate binary and object files'
arch=(x86_64)
url='https://www.gnu.org/software/binutils/'
license=(GPL-2.0-or-later GPL-3.0-or-later LGPL-2.0-or-later LGPL-3.0-or-later GFDL-1.3 FSFAP)
depends=(
  glibc
  jansson
  libelf
  libgcc
  libstdc++
  zlib
  zstd
)
makedepends=(
  git
)
checkdepends=(
  bc
  dejagnu
  debuginfod
)
optdepends=(
  'debuginfod: for debuginfod server/client functionality'
  'perl: for gprofng-display-html'
)
conflicts=(
  binutils-multilib
)
replaces=(
  binutils-multilib
)
provides=(
  libctf.so
  libgprofng.so
  libsframe.so
)
backup=(
  'etc/gprofng.rc'
)
options=(
  staticlibs
  !distcc
  !ccache
)
source=(
  git+https://sourceware.org/git/binutils-gdb.git#commit=${_commit}
  gold-warn-unsupported.patch
  revert-strip.patch
  revert-strip-2.patch
  0001-strip-Don-t-treat-fat-IR-objects-as-plugin-object.patch
)
sha256sums=('79e580da50b1914cf02f0dd1f293ffdb3d4ee81311d6146ddb17092764b1a3c6'
            '2d430b66f84a19c154725ec535280c493be1d34f1a90f95208dce02fecd0e4e4'
            'c783401be72ebfc954efe5c3e5f151ec2c6083757562cd43b3af10638008defa'
            'b91a57731c699b415f477a3a4f0ec0fdab68e6caee6f8e57e8b4d0877dc1580d'
            'cd1816becb0e992ebc09f2ff66050e4b92fad33f0b7acc833cf513f4e4791d1a')
validpgpkeys=(3A24BC1E8FB409FA9F14371813FCEF89DD9E3C4F)

pkgver() {
  cd binutils-gdb
  git describe --abbrev=12 --tags | sed 's/[^-]*-//;s/[^-]*-/&r/;s/-/+/g;s/_/./g'
}

prepare() {
  [[ ! -d binutils-gdb ]] && ln -s binutils-${pkgver} binutils-gdb
  mkdir -p binutils-build

  cd binutils-gdb

  # Turn off development mode (-Werror, gas run-time checks, date in sonames)
  sed -i '/^development=/s/true/false/' bfd/development.sh

  # Creds @Fedora
  # Change the gold configuration script to only warn about
  # unsupported targets.  This allows the binutils to be built with
  # BPF support enabled.
  patch -Np1 < ../gold-warn-unsupported.patch

  # AutoFDO packaging is currently broken, since strip is failing
  # Rever the commit and wait till upstream fixes this
  # We are not running in the mentioned objtool amdgpu issue, therefore it should be pretty safe to revert it
  patch -Rp1 -i "${srcdir}"/revert-strip-2.patch
  patch -Rp1 -i "${srcdir}"/revert-strip.patch
}

build() {
  cd binutils-build

  "${srcdir}"/binutils-gdb/configure \
    --prefix=/usr \
    --sysconfdir=/etc \
    --with-lib-path=/usr/lib:/usr/local/lib \
    --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/binutils/-/issues \
    --enable-cet \
    --enable-colored-disassembly \
    --enable-default-execstack=no \
    --enable-deterministic-archives \
    --enable-gold \
    --enable-install-libiberty \
    --enable-jansson \
    --enable-ld=default \
    --enable-new-dtags \
    --enable-pgo-build=lto \
    --enable-plugins \
    --enable-relro \
    --enable-shared \
    --enable-targets=x86_64-pep,bpf-unknown-none \
    --enable-threads \
    --disable-gdb \
    --disable-gdbserver \
    --disable-libdecnumber \
    --disable-readline \
    --disable-sim \
    --disable-werror \
    --with-debuginfod \
    --with-pic \
    --with-system-zlib

  make -O tooldir=/usr

  # Extract the FSF All Permissive License
  # <https://www.gnu.org/prep/maintain/html_node/License-Notices-for-Other-Files.html>
  # used for some linker scripts.
  tail -n 5 "${srcdir}"/binutils-gdb/ld/scripttempl/README > FSFAP
}

check() {
  cd binutils-build

  # Use minimal flags for testsuite
  # ld testsuite uses CFLAGS_FOR_TARGET and requires -g
  # gold testsuite requires CXXFLAGS/CFLAGS with default PIE/PIC disabled
  make -O CFLAGS_FOR_TARGET="-O2 -g" \
          CXXFLAGS="-O2 -no-pie -fno-PIC" \
          CFLAGS="-O2 -no-pie" \
          LDFLAGS="" \
          check || true
}

package() {
  cd binutils-build
  make DESTDIR="${pkgdir}" tooldir=/usr install

  # install PIC version of libiberty
  install -m644 libiberty/pic/libiberty.a "${pkgdir}"/usr/lib

  # Remove unwanted files
  rm -f "${pkgdir}"/usr/share/man/man1/{dlltool,windres,windmc}*

  # No shared linking to these files outside binutils
  rm -f "${pkgdir}"/usr/lib/lib{bfd,opcodes}.so
  tee "${pkgdir}"/usr/lib/libbfd.so << EOS
/* GNU ld script */

INPUT( /usr/lib/libbfd.a -lsframe -liberty -lz -lzstd -ldl )
EOS

  tee "${pkgdir}"/usr/lib/libopcodes.so << EOS
/* GNU ld script */

INPUT( /usr/lib/libopcodes.a -lbfd )
EOS

  # install FSF All Permissive License
  install -Dm644 -t "${pkgdir}"/usr/share/licenses/${pkgname}/ FSFAP
}
