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  }