meson's builtin LTO support allows meson to introspect whether LTO is
enabled and do some fancy things, such as forcing LTO off for a single
target that is known to be special(ly bad) and not support LTO.

Signed-off-by: Eli Schwartz <eschwart...@gmail.com>
---
 eclass/meson.eclass | 36 ++++++++++++++++++++++++++++++++----
 1 file changed, 32 insertions(+), 4 deletions(-)

diff --git a/eclass/meson.eclass b/eclass/meson.eclass
index d8bd93082ea5..c2ae289019e9 100644
--- a/eclass/meson.eclass
+++ b/eclass/meson.eclass
@@ -41,7 +41,7 @@ esac
 if [[ -z ${_MESON_ECLASS} ]]; then
 _MESON_ECLASS=1
 
-inherit multiprocessing ninja-utils python-utils-r1 toolchain-funcs
+inherit flag-o-matic multiprocessing ninja-utils python-utils-r1 
toolchain-funcs
 
 BDEPEND=">=dev-build/meson-1.2.1
        ${NINJA_DEPEND}
@@ -286,6 +286,36 @@ meson_src_configure() {
 
        [[ -n "${NINJA_DEPEND}" ]] || ewarn "Unknown value '${NINJA}' for 
\${NINJA}"
 
+       local ltoflags=()
+       if tc-is-lto; then
+               # We want to connect -flto in *FLAGS to the dedicated meson 
option,
+               # to ensure that meson has visibility into what the user set. 
Although
+               # it is unlikely projects will check `get_option('b_lto')` and 
change
+               # their behavior, individual targets which are broken with LTO 
can
+               # disable it per target. Injecting via *FLAGS means that meson 
cannot
+               # strip -flto from that target.
+               ltoflags+=( -Db_lto=true )
+
+               # respect -flto value, e.g. -flto=8, -flto=thin
+               local v=$(get-flag flto)
+               case ${v} in
+                       thin)
+                               ltoflags+=( -Db_lto_mode=thin )
+                               ;;
+                       ''|*[!0-9]*)
+                               ;;
+                       *) ltoflags+=( -Db_lto_threads=${v} )
+               esac
+               # finally, remove it from *FLAGS to avoid passing it:
+               # - twice, with potentially different values
+               # - on excluded targets
+               filter-lto
+       else
+               # Prevent projects from enabling LTO by default.  In Gentoo, 
LTO is
+               # enabled via setting *FLAGS appropriately.
+               ltoflags+=( -Db_lto=false )
+       fi
+
        local BUILD_CFLAGS=${BUILD_CFLAGS}
        local BUILD_CPPFLAGS=${BUILD_CPPFLAGS}
        local BUILD_CXXFLAGS=${BUILD_CXXFLAGS}
@@ -335,9 +365,7 @@ meson_src_configure() {
                # an upstream development matter. bug #754279.
                -Dwerror=false
 
-               # Prevent projects from enabling LTO by default.  In Gentoo, 
LTO is
-               # enabled via setting *FLAGS appropriately.
-               -Db_lto=false
+               "${ltoflags[@]}"
        )
 
        if [[ -n ${EMESON_BUILDTYPE} ]]; then
-- 
2.43.0


Reply via email to