[pacman-dev] LTO and PGO build options
Allan McRae
allan at archlinux.org
Fri Mar 18 23:49:46 UTC 2016
On 19/03/16 04:35, Que Quotion wrote:
> This orignates from a utility I put together:
> https://bbs.archlinux.org/viewtopic.php?pid=1451263#p1451263
>
> The script streamlines enabling some build options that makepkg does not
> yet offer, such as link-time optimization and profile-guided optimization.
>
> The above script works, but has limitations in that it is a wrapper script.
> I propose adding these as build options in makepkg itself. Most packages
> compile safely with both or either option and the benefits are enormous
> (especially with PGO).
>
> Here are the changes I propose to makepkg, for which I am open to
> suggestions and hope someone other than myself will test:
>
> --- /usr/bin/makepkg 2016-02-26 14:07:15.000000000 +0900
> +++ ./makepkg.qq 2016-03-19 03:13:09.535977092 +0900
> @@ -48,7 +48,7 @@
>
> LIBRARY=${LIBRARY:-'/usr/share/makepkg'}
>
> -build_options=('ccache' 'distcc' 'buildflags' 'makeflags')
> +build_options=('ccache' 'distcc' 'buildflags' 'makeflags' 'pgo' 'lto')
> splitpkg_overrides=('pkgdesc' 'arch' 'url' 'license' 'groups' 'depends'
> 'optdepends' 'provides' 'conflicts' 'replaces' 'backup'
> 'options' 'install' 'changelog')
> @@ -866,6 +866,32 @@
> export DISTCC_HOSTS
> fi
>
> +
> + # Use lto if it is requested (check buildenv and PKGBUILD opts)
> + if check_buildoption "lto" "y" && [[ -f "$(gcc -print-search-dirs | grep
> install | awk '{print $2 "liblto_plugin.so"}')" ]]; then
> + CFLAGS+=" -flto=$(getconf _NPROCESSORS_ONLN)"
> + CXXFLAGS+=" -flto=$(getconf _NPROCESSORS_ONLN)"
> + LDFLAGS+=" $CFLAGS -fuse-linker-plugin"
> + LTOPLUGIN="$(gcc -print-search-dirs | grep install | awk '{print $2
> "liblto_plugin.so"}')"
> + ARFLAGS+=" --plugin $LTOPLUGIN"
> + RANLIBFLAGS+=" --plugin $LTOPLUGIN"
> + NMFLAGS+=" --plugin $LTOPLUGIN"
> + fi
> +
What is the advantage to all this beyond people adding "-flto" to their
CFLAGS if they want LTO? All modern builds should handle the rest by
themselves.
> + # Generate or utilize pgo if it is requested (check buildenv and PKGBUILD
> opts)
> + if check_buildoption "pgo" "y"; then
> + if [ ! -d "$PROFDEST/$pkgbase.gen" ]; then
> + mkdir "$PROFDEST/$pkgbase.gen"
> + CFLAGS+="-fprofile-generate -fprofile-dir=$PROFDEST/$pkgbase.gen"
> + CXXFLAGS+="-fprofile-generate -fprofile-dir=$PROFDEST/$pkgbase.gen"
> + LDFLAGS+="-lgcov"
> + elif [ ! -d "$PROFDEST/$pkgbase.used" ]; then
> + mv "$PROFDEST/$pkgbase.gen" "$PROFDEST/$pkgbase.used"
> + CFLAGS+="-fprofile-correction -fprofile-use
> -fprofile-dir=$PROFDEST/$pkgbase.used"
> + CXXFLAGS+="-fprofile-correction -fprofile-use
> -fprofile-dir=$PROFDEST/$pkgbase.used"
> + fi
> + fi
> +
I'm guessing this is untested... Anyway, I don't think PGO has a place
in makepkg itself and should stay in a wrapper script.
A
More information about the pacman-dev
mailing list