git: 37b66193453c - main - Uses/cabal.mk: Add support for LTO feature.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 27 Feb 2023 18:18:42 UTC
The branch main has been updated by arrowd:
URL: https://cgit.FreeBSD.org/ports/commit/?id=37b66193453c2ed2c103385aebf7e9f034a58ac1
commit 37b66193453c2ed2c103385aebf7e9f034a58ac1
Author: Gleb Popov <arrowd@FreeBSD.org>
AuthorDate: 2023-02-27 10:54:00 +0000
Commit: Gleb Popov <arrowd@FreeBSD.org>
CommitDate: 2023-02-27 18:11:10 +0000
Uses/cabal.mk: Add support for LTO feature.
Haskell code benefits greatly from splitting functions into distinct ELF
sections and then letting the linker to garbage-collect them.
devel/hs-haskell-language-server port goes from 277MiB to 176MiB in size.
net-p2p/cardano-node ports goes 302MiB -> 76.2MiB
Relevant blog post: http://brandon.si/code/linking-smaller-haskell-binaries/
Reported by: Greg Steuck <greg@nest.cx>
---
Mk/Features/lto.mk | 4 ++++
Mk/Uses/cabal.mk | 6 +++---
2 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/Mk/Features/lto.mk b/Mk/Features/lto.mk
index d17484e05f53..aadd27b5d61f 100644
--- a/Mk/Features/lto.mk
+++ b/Mk/Features/lto.mk
@@ -16,6 +16,10 @@ LTO_Include_MAINTAINER= pkubaj@FreeBSD.org
CARGO_PROFILE_RELEASE_CODEGEN_UNITS=1
. elif defined(_INCLUDE_USES_MESON_MK)
MESON_ARGS+= -Db_lto=true
+. elif defined(_INCLUDE_USES_CABAL_MK)
+ CABAL_LTO_ARGS= --ghc-options=-split-sections \
+ --gcc-options="-fdata-sections -ffunction-sections" \
+ --ld-options=-Wl,--gc-sections,--build-id,--icf=all
. else
# Overridable as a user may want to use -flto
LTO_FLAGS?= -flto=thin
diff --git a/Mk/Uses/cabal.mk b/Mk/Uses/cabal.mk
index 27237bde3974..23d0b0fa6ebb 100644
--- a/Mk/Uses/cabal.mk
+++ b/Mk/Uses/cabal.mk
@@ -215,12 +215,12 @@ cabal-extract: check-cabal
# This pulls in all source dependencies, resolves them and generates build plan
cabal-configure: check-cabal
cd ${WRKSRC} && \
- ${SETENV} ${MAKE_ENV} HOME=${CABAL_HOME} ${CABAL_CMD} build --dry-run --disable-benchmarks --disable-tests --flags="${CABAL_FLAGS}" ${CABAL_WITH_ARGS} ${BUILD_ARGS} ${BUILD_TARGET}
+ ${SETENV} ${MAKE_ENV} HOME=${CABAL_HOME} ${CABAL_CMD} build --dry-run --disable-benchmarks --disable-tests --flags="${CABAL_FLAGS}" ${CABAL_WITH_ARGS} ${CABAL_LTO_ARGS} ${BUILD_ARGS} ${BUILD_TARGET}
# Calls cabal build on the Haskell package located in ${WRKSRC}
cabal-build: check-cabal
cd ${WRKSRC} && \
- ${SETENV} ${MAKE_ENV} HOME=${CABAL_HOME} ${CABAL_CMD} build --disable-benchmarks --disable-tests ${CABAL_WITH_ARGS} ${BUILD_ARGS} ${BUILD_TARGET}
+ ${SETENV} ${MAKE_ENV} HOME=${CABAL_HOME} ${CABAL_CMD} build --disable-benchmarks --disable-tests ${CABAL_WITH_ARGS} ${CABAL_LTO_ARGS} ${BUILD_ARGS} ${BUILD_TARGET}
# Generates USE_CABAL= ... line ready to be pasted into the port based on the plan.json file generated by cabal configure.
make-use-cabal: check-cabal2tuple
@@ -306,7 +306,7 @@ cabal-pre-configure:
. if !target(do-build)
do-build:
cd ${WRKSRC} && \
- ${SETENV} ${MAKE_ENV} HOME=${CABAL_HOME} ${CABAL_CMD} build --offline --disable-benchmarks --disable-tests ${CABAL_WITH_ARGS} --flags "${CABAL_FLAGS}" ${BUILD_ARGS} ${BUILD_TARGET}
+ ${SETENV} ${MAKE_ENV} HOME=${CABAL_HOME} ${CABAL_CMD} build --offline --disable-benchmarks --disable-tests ${CABAL_WITH_ARGS} ${CABAL_LTO_ARGS} --flags "${CABAL_FLAGS}" ${BUILD_ARGS} ${BUILD_TARGET}
. endif
. if !target(do-install)