From 26ee6ff6adbcd8560ec3a65cf219d2ab98edb804 Mon Sep 17 00:00:00 2001
From: Allan McRae <allan@archlinux.org>
Date: Fri, 24 Dec 2021 17:59:32 +1000
Subject: [PATCH] LTO: Add -flto to LDFLAGS for clang

GCC automatically detects when it is linking LTO objects, but clang does
not.  Add -flto to LDFLAGS to make this work for clang too.

Signed-off-by: Allan McRae <allan@archlinux.org>
---
 scripts/libmakepkg/buildenv/lto.sh.in | 1 +
 1 file changed, 1 insertion(+)

diff --git a/scripts/libmakepkg/buildenv/lto.sh.in b/scripts/libmakepkg/buildenv/lto.sh.in
index 1f1ca53f..c3bd0fa4 100644
--- a/scripts/libmakepkg/buildenv/lto.sh.in
+++ b/scripts/libmakepkg/buildenv/lto.sh.in
@@ -33,5 +33,6 @@ buildenv_lto() {
 	if check_option "lto" "y"; then
 		CFLAGS+=" -flto"
 		CXXFLAGS+=" -flto"
+		LDFLAGS+=" -flto"
 	fi
 }
From e37f7d8b6b4d2f9accf97eb96d0eacbddf2a1345 Mon Sep 17 00:00:00 2001
From: Xiretza <xiretza@xiretza.xyz>
Date: Sat, 1 Jan 2022 14:40:24 +0100
Subject: [PATCH] makepkg: use -ffile-prefix-map instead of -fdebug-prefix-map

>From gcc(1):

-ffile-prefix-map=old=new
	[...] Specifying this option is equivalent to specifying all the
	individual -f*-prefix-map options. This can be used to make reproducible
	builds that are location independent.

Specifically, this additionally enables -fmacro-prefix-map=, which causes
prefix mapping to be applied to expansions of __FILE__ and similar macros.

Without this option, if source files are compiled by passing the
absolute file path to the compiler (as done by e.g. cmake), any
expansions of __FILE__ (e.g. from uses of assert()) will contain
$srcdir.

Signed-off-by: Allan McRae <allan@archlinux.org>
---
 scripts/libmakepkg/buildenv/debugflags.sh.in | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/scripts/libmakepkg/buildenv/debugflags.sh.in b/scripts/libmakepkg/buildenv/debugflags.sh.in
index e0a1ed00..84ca7b71 100644
--- a/scripts/libmakepkg/buildenv/debugflags.sh.in
+++ b/scripts/libmakepkg/buildenv/debugflags.sh.in
@@ -30,8 +30,8 @@ buildenv_functions+=('buildenv_debugflags')
 
 buildenv_debugflags() {
 	if check_option "debug" "y"; then
-		DEBUG_CFLAGS+=" -fdebug-prefix-map=$srcdir=${DBGSRCDIR:-/usr/src/debug}"
-		DEBUG_CXXFLAGS+=" -fdebug-prefix-map=$srcdir=${DBGSRCDIR:-/usr/src/debug}"
+		DEBUG_CFLAGS+=" -ffile-prefix-map=$srcdir=${DBGSRCDIR:-/usr/src/debug}"
+		DEBUG_CXXFLAGS+=" -ffile-prefix-map=$srcdir=${DBGSRCDIR:-/usr/src/debug}"
 		DEBUG_RUSTFLAGS+=" --remap-path-prefix=$srcdir=${DBGSRCDIR:-/usr/src/debug}"
 		CFLAGS+=" $DEBUG_CFLAGS"
 		CXXFLAGS+=" $DEBUG_CXXFLAGS"
From 42fe4864a0c8e2846007ffee532fe0cf4b321cdd Mon Sep 17 00:00:00 2001
From: Allan McRae <allan@archlinux.org>
Date: Sun, 9 Jan 2022 12:45:58 +1000
Subject: [PATCH] libmakepkg: add extra buildflags only when buildflags is not
 disabled

This means options=('!buildflags') will disable the addition of CFLAG
etc for LTO and debug building.

Signed-off-by: Allan McRae <allan@archlinux.org>
---
 scripts/libmakepkg/buildenv/debugflags.sh.in | 2 +-
 scripts/libmakepkg/buildenv/lto.sh.in        | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/scripts/libmakepkg/buildenv/debugflags.sh.in b/scripts/libmakepkg/buildenv/debugflags.sh.in
index 84ca7b71..1cb58613 100644
--- a/scripts/libmakepkg/buildenv/debugflags.sh.in
+++ b/scripts/libmakepkg/buildenv/debugflags.sh.in
@@ -29,7 +29,7 @@ source "$LIBRARY/util/option.sh"
 buildenv_functions+=('buildenv_debugflags')
 
 buildenv_debugflags() {
-	if check_option "debug" "y"; then
+	if check_option "debug" "y" && ! check_option "buildflags" "n"; then
 		DEBUG_CFLAGS+=" -ffile-prefix-map=$srcdir=${DBGSRCDIR:-/usr/src/debug}"
 		DEBUG_CXXFLAGS+=" -ffile-prefix-map=$srcdir=${DBGSRCDIR:-/usr/src/debug}"
 		DEBUG_RUSTFLAGS+=" --remap-path-prefix=$srcdir=${DBGSRCDIR:-/usr/src/debug}"
diff --git a/scripts/libmakepkg/buildenv/lto.sh.in b/scripts/libmakepkg/buildenv/lto.sh.in
index 081d5648..6e500eab 100644
--- a/scripts/libmakepkg/buildenv/lto.sh.in
+++ b/scripts/libmakepkg/buildenv/lto.sh.in
@@ -30,7 +30,7 @@ build_options+=('lto')
 buildenv_functions+=('buildenv_lto')
 
 buildenv_lto() {
-	if check_option "lto" "y"; then
+	if check_option "lto" "y" && ! check_option "buildflags" "n"; then
 		CFLAGS+=" -flto"
 		CXXFLAGS+=" -flto"
 		LDFLAGS+=" -flto"
From e1ce2351f5c00dd90104e0f4ce3bf176da28af08 Mon Sep 17 00:00:00 2001
From: Evangelos Foutras <evangelos@foutrelis.com>
Date: Thu, 10 Feb 2022 05:15:01 +0200
Subject: [PATCH] Make link time optimization flags configurable

We want to use -flto=auto in Arch Linux to speed up building, but we
can't hardcode it in buildenv/lto.sh because other downstreams might
have clang < 13.0.0 which did not recognize -flto=auto as equivalent
to -flto=full.

Introducing an LTOFLAGS variable to makepkg.conf seems the way to go.

Signed-off-by: Allan McRae <allan@archlinux.org>
---
 doc/makepkg.conf.5.asciidoc                   | 10 ++++++++--
 etc/makepkg.conf.in                           |  1 +
 scripts/libmakepkg/buildenv/buildflags.sh.in  |  2 +-
 scripts/libmakepkg/buildenv/lto.sh.in         |  6 +++---
 scripts/libmakepkg/lint_config/variable.sh.in |  8 ++++----
 5 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/doc/makepkg.conf.5.asciidoc b/doc/makepkg.conf.5.asciidoc
index 39c5c808..a0d9a6d4 100644
--- a/doc/makepkg.conf.5.asciidoc
+++ b/doc/makepkg.conf.5.asciidoc
@@ -81,6 +81,11 @@ Options
 	usage resembling ``-Wl,--hash-style=gnu''. Read ld(1) for more details on
 	available linker flags.
 
+**LTOFLAGS=**"ltoflags"::
+	Additional compiler and linker flags appended to `CFLAGS`, `CXXFLAGS`
+	and `LDFLAGS` when building with link time optimization. If empty,
+	``-flto'' is used.
+
 **MAKEFLAGS=**"makeflags"::
 	This is often used to set the number of jobs used; for example, `-j2`.
 	Other flags that make accepts can also be passed.
@@ -190,8 +195,9 @@ Options
 		package containing the debug symbols when used with `strip'.
 
 	*lto*;;
-		Enable building packages using link time optimization. Adds '-flto'
-		to both CFLAGS and CXXFLAGS.
+		Enable building packages using link time optimization. Adds the
+		flags specified in LTOFLAGS to CFLAGS, CXXFLAGS and LDFLAGS (or
+		``-flto'' if LTOFLAGS is empty).
 
 	*autodep*;;
 		Enable the automatic addition of libraries to the depends and
diff --git a/etc/makepkg.conf.in b/etc/makepkg.conf.in
index 0c911cce..edc5f442 100644
--- a/etc/makepkg.conf.in
+++ b/etc/makepkg.conf.in
@@ -41,6 +41,7 @@ CHOST="@CHOST@"
 #CFLAGS="-O2 -pipe"
 #CXXFLAGS="-O2 -pipe"
 #LDFLAGS=""
+#LTOFLAGS="-flto"
 #RUSTFLAGS="-C opt-level=2"
 #-- Make Flags: change this for DistCC/SMP systems
 #MAKEFLAGS="-j2"
diff --git a/scripts/libmakepkg/buildenv/buildflags.sh.in b/scripts/libmakepkg/buildenv/buildflags.sh.in
index 74f91988..07b4a730 100644
--- a/scripts/libmakepkg/buildenv/buildflags.sh.in
+++ b/scripts/libmakepkg/buildenv/buildflags.sh.in
@@ -30,6 +30,6 @@ buildenv_functions+=('buildenv_buildflags')
 
 buildenv_buildflags() {
 	if check_option "buildflags" "n"; then
-		unset CPPFLAGS CFLAGS DEBUG_CFLAGS CXXFLAGS DEBUG_CXXFLAGS LDFLAGS RUSTFLAGS DEBUG_RUSTFLAGS
+		unset CPPFLAGS CFLAGS DEBUG_CFLAGS CXXFLAGS DEBUG_CXXFLAGS LDFLAGS LTOFLAGS RUSTFLAGS DEBUG_RUSTFLAGS
 	fi
 }
diff --git a/scripts/libmakepkg/buildenv/lto.sh.in b/scripts/libmakepkg/buildenv/lto.sh.in
index 6e500eab..6492def7 100644
--- a/scripts/libmakepkg/buildenv/lto.sh.in
+++ b/scripts/libmakepkg/buildenv/lto.sh.in
@@ -31,8 +31,8 @@ buildenv_functions+=('buildenv_lto')
 
 buildenv_lto() {
 	if check_option "lto" "y" && ! check_option "buildflags" "n"; then
-		CFLAGS+=" -flto"
-		CXXFLAGS+=" -flto"
-		LDFLAGS+=" -flto"
+		CFLAGS+=" ${LTOFLAGS:--flto}"
+		CXXFLAGS+=" ${LTOFLAGS:--flto}"
+		LDFLAGS+=" ${LTOFLAGS:--flto}"
 	fi
 }
diff --git a/scripts/libmakepkg/lint_config/variable.sh.in b/scripts/libmakepkg/lint_config/variable.sh.in
index 8327b0a5..03a67ee2 100644
--- a/scripts/libmakepkg/lint_config/variable.sh.in
+++ b/scripts/libmakepkg/lint_config/variable.sh.in
@@ -32,10 +32,10 @@ lint_config_variables() {
 	local array=(DLAGENTS VCSCLIENTS BUILDENV OPTIONS INTEGRITY_CHECK MAN_DIRS
 	             DOC_DIRS PURGE_TARGETS COMPRESSGZ COMPRESSBZ2 COMPRESSXZ
 	             COMPRESSLRZ COMPRESSLZO COMPRESSZ)
-	local string=(CARCH CHOST CPPFLAGS CFLAGS CXXFLAGS RUSTFLAGS LDFLAGS DEBUG_CFLAGS
-	              DEBUG_CXXFLAGS DEBUG_RUSTFLAGS DISTCC_HOSTS BUILDDIR STRIP_BINARIES
-	              STRIP_SHARED STRIP_STATIC PKGDEST SRCDEST SRCPKGDEST LOGDEST PACKAGER
-	              GPGKEY PKGEXT SRCEXT)
+	local string=(CARCH CHOST CPPFLAGS CFLAGS CXXFLAGS RUSTFLAGS LDFLAGS LTOFLAGS
+	              DEBUG_CFLAGS DEBUG_CXXFLAGS DEBUG_RUSTFLAGS DISTCC_HOSTS BUILDDIR
+	              STRIP_BINARIES STRIP_SHARED STRIP_STATIC PKGDEST SRCDEST SRCPKGDEST
+	              LOGDEST PACKAGER GPGKEY PKGEXT SRCEXT)
 
 	local i keys ret=0
 
