From b06c39d7b51c5fbc8cac690318d27e241694a015 Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Sun, 10 Dec 2023 19:35:50 +0100 Subject: [PATCH] builder: c/library: support passing --whole-archive on linking When linking internal libs set have the "library/link-whole" attribute set to true, linking them will cause "-Wl,--whole-archive" to be passed. That's only desired in a few cases, eg. if the objects contain some sections that aren't referred at link time, but loaded at runtime, (eg. linked-in glib resource) Signed-off-by: Enrico Weigelt, metux IT consult --- engine/builder/c/library.go | 8 ++++++-- spec/target/keys.go | 3 +++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/engine/builder/c/library.go b/engine/builder/c/library.go index bc1e9d56..66dc0b91 100644 --- a/engine/builder/c/library.go +++ b/engine/builder/c/library.go @@ -4,6 +4,7 @@ import ( "github.com/metux/go-metabuild/engine/builder/base" "github.com/metux/go-metabuild/spec" "github.com/metux/go-metabuild/spec/target" + "github.com/metux/go-metabuild/util" "github.com/metux/go-metabuild/util/compiler" "github.com/metux/go-metabuild/util/jobs" ) @@ -18,6 +19,7 @@ func (b *BuilderCLibrary) JobPrepare(id jobs.JobId) error { libname := b.RequiredEntryStr(target.KeyLibraryName) pkgname := b.RequiredEntryStr(target.KeyPkgName) pkgid := b.RequiredEntryStr(target.KeyLibraryPkgId) + archive := "-l:" + b.RequiredEntryStr(target.KeyStaticLib) cflags = []string{"-I."} @@ -26,8 +28,10 @@ func (b *BuilderCLibrary) JobPrepare(id jobs.JobId) error { PkgSpec: pkgname, SharedLdflags: []string{"-L.", "-l" + libname}, SharedCflags: cflags, - StaticLdflags: []string{"-L.", "-l:" + b.RequiredEntryStr(target.KeyStaticLib)}, - StaticCflags: cflags, + StaticLdflags: util.ValIf(b.EntryBoolDef(target.KeyLibraryLinkWhole, false), + []string{"-L.", "-Wl,--whole-archive", archive, "-Wl,--no-whole-archive"}, + []string{"-L.", archive}), + StaticCflags: cflags, } return b.BuildConf.SetPkgConfig(b.ForBuild(), pkgid, pi) diff --git a/spec/target/keys.go b/spec/target/keys.go index 328bdfc9..8e3db688 100644 --- a/spec/target/keys.go +++ b/spec/target/keys.go @@ -53,6 +53,9 @@ const ( KeyLibraryName = Key("library/name") KeyStaticLib = Key("static::file") + // static / archives + KeyLibraryLinkWhole = Key("library/link-whole") + // library devlink KeyLinkTarget = Key("target") )