github.com/metux/go-metabuild@v0.0.0-20240118143255-d9ed5ab697f9/engine/builder/c/library.go (about) 1 package c 2 3 import ( 4 "github.com/metux/go-metabuild/engine/builder/base" 5 "github.com/metux/go-metabuild/spec" 6 "github.com/metux/go-metabuild/spec/target" 7 "github.com/metux/go-metabuild/util" 8 "github.com/metux/go-metabuild/util/compiler" 9 "github.com/metux/go-metabuild/util/jobs" 10 ) 11 12 type BuilderCLibrary struct { 13 BaseCBuilder 14 } 15 16 func (b *BuilderCLibrary) JobPrepare(id jobs.JobId) error { 17 cflags := b.CFlags() 18 19 libname := b.RequiredEntryStr(target.KeyLibraryName) 20 pkgname := b.RequiredEntryStr(target.KeyPkgName) 21 pkgid := b.RequiredEntryStr(target.KeyLibraryPkgId) 22 archive := "-l:" + b.RequiredEntryStr(target.KeyStaticLib) 23 24 cflags = []string{"-I."} 25 26 pi := compiler.PkgConfigInfo{ 27 Name: pkgname, 28 PkgSpec: pkgname, 29 SharedLdflags: []string{"-L.", "-l" + libname}, 30 SharedCflags: cflags, 31 StaticLdflags: util.ValIf(b.EntryBoolDef(target.KeyLibraryLinkWhole, false), 32 []string{"-L.", "-Wl,--whole-archive", archive, "-Wl,--no-whole-archive"}, 33 []string{"-L.", archive}), 34 StaticCflags: cflags, 35 } 36 37 return b.BuildConf.SetPkgConfig(b.ForBuild(), pkgid, pi) 38 } 39 40 func (b BuilderCLibrary) copySub(sub base.BaseBuilder) { 41 sub.DefaultPutStrList(target.KeySource, b.FeaturedStrList(target.KeySource)) 42 sub.DefaultPutStrList(target.KeyCDefines, b.FeaturedStrList(target.KeyCDefines)) 43 sub.DefaultPutStrList(target.KeyCCflags, b.FeaturedStrList(target.KeyCCflags)) 44 sub.DefaultPutStrList(target.KeyLinkStatic, b.FeaturedStrList(target.KeyLinkStatic)) 45 sub.DefaultPutStrList(target.KeyLinkShared, b.FeaturedStrList(target.KeyLinkShared)) 46 sub.DefaultPutStrList(target.KeyLinkBoth, b.FeaturedStrList(target.KeyLinkBoth)) 47 sub.DefaultPutStrList(target.KeyPkgconfImport, b.FeaturedStrList(target.KeyPkgconfImport)) 48 sub.DefaultPutStrList(target.KeyIncludeDir, b.FeaturedStrList(target.KeyIncludeDir)) 49 sub.DefaultPutStrList(target.KeyLibDirs, b.FeaturedStrList(target.KeyLibDirs)) 50 sub.DefaultPutStrList(target.KeyJobDepends, b.JobDepends()) 51 } 52 53 func (b *BuilderCLibrary) mksub1(subkey spec.Key) BaseCBuilder { 54 subtarget := b.SubTarget(subkey) 55 newbuilder := MakeBaseCBuilder(subtarget, b.JobId()+"/"+string(subkey)) 56 b.copySub(newbuilder.BaseBuilder) 57 return newbuilder 58 } 59 60 func (b *BuilderCLibrary) mkHdrSub(subkey spec.Key) BuilderCLibraryHeaders { 61 newbuilder := MakeBaseCBuilder(b.SubTarget(subkey), b.JobId()+"/"+string(subkey)) 62 newbuilder.SetType(target.TypeCHeader) 63 // needs to be explicitly initialized, since not yet known in post-configure phase 64 newbuilder.LoadTargetDefaults() 65 b.copySub(newbuilder.BaseBuilder) 66 return BuilderCLibraryHeaders{newbuilder} 67 } 68 69 // FIXME: support skipping some of them 70 func (b BuilderCLibrary) JobSub() ([]jobs.Job, error) { 71 72 jobs := []jobs.Job{} 73 74 if !b.EntryBoolDef("skip/shared", false) { 75 jobs = append(jobs, 76 &BuilderCLibraryShared{b.mksub1("shared")}, 77 &BuilderCLibraryDevlink{b.mksub1("devlink")}) 78 } 79 if !b.EntryBoolDef("skip/static", false) { 80 jobs = append(jobs, &BuilderCLibraryStatic{b.mksub1("static")}) 81 } 82 if !b.EntryBoolDef("skip/pkgconf", false) { 83 jobs = append(jobs, &BuilderCLibraryPkgConfig{b.mksub1("pkgconf")}) 84 } 85 86 for _, h := range b.EntryKeys(target.KeyHeaders) { 87 jobs = append(jobs, b.mkHdrSub(target.KeyHeaders.Append(h))) 88 } 89 return jobs, nil 90 } 91 92 func MakeCLibrary(o spec.TargetObject, id string) *BuilderCLibrary { 93 b := BuilderCLibrary{BaseCBuilder: MakeBaseCBuilder(o, id)} 94 return &b 95 }