github.com/metux/go-metabuild@v0.0.0-20240118143255-d9ed5ab697f9/engine/builder/c/base.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 BaseCBuilder struct {
    13  	base.BaseBuilder
    14  }
    15  
    16  func (b BaseCBuilder) JobDepends() []jobs.JobId {
    17  	return append(
    18  		append(
    19  			append(b.BaseBuilder.JobDepends(),
    20  				b.EntryStrList(target.KeyLinkStatic)...),
    21  			b.EntryStrList(target.KeyLinkShared)...),
    22  		b.EntryStrList(target.KeyLinkBoth)...)
    23  }
    24  
    25  func (b BaseCBuilder) ImportInternalLib(id string, wantShared bool, wantStatic bool) compiler.PkgConfigInfo {
    26  	pi := b.BuildConf.PkgConfig(b.ForBuild(), id)
    27  	pi.WantShared = wantShared
    28  	pi.WantStatic = wantStatic
    29  	return pi
    30  }
    31  
    32  func (b BaseCBuilder) ImportSrcdir() compiler.PkgConfigInfo {
    33  	cflags := append(b.FeaturedStrList(target.KeyCCflags), util.StrPrefix("-I", b.EntryStrList(target.KeyIncludeDir))...)
    34  	ldflags := append(b.FeaturedStrList(target.KeyCLdflags), util.StrPrefix("-L", b.EntryStrList(target.KeyLibDirs))...)
    35  
    36  	return compiler.PkgConfigInfo{
    37  		Private:       true,
    38  		SharedCflags:  cflags,
    39  		SharedLdflags: ldflags,
    40  		StaticCflags:  cflags,
    41  		StaticLdflags: ldflags,
    42  	}
    43  }
    44  
    45  func (b BaseCBuilder) AllImports() []compiler.PkgConfigInfo {
    46  	imports := []compiler.PkgConfigInfo{}
    47  
    48  	for _, x := range b.EntryStrList(target.KeyLinkStatic) {
    49  		imports = append(imports, b.ImportInternalLib(x, false, true))
    50  	}
    51  	for _, x := range b.EntryStrList(target.KeyLinkShared) {
    52  		imports = append(imports, b.ImportInternalLib(x, true, false))
    53  	}
    54  	for _, x := range b.EntryStrList(target.KeyLinkBoth) {
    55  		imports = append(imports, b.ImportInternalLib(x, false, false))
    56  	}
    57  
    58  	imports = append(imports, b.ImportSrcdir())
    59  
    60  	pkgs := b.PkgImports()
    61  	// sanity check for pkg-config imports
    62  	for _, p := range pkgs {
    63  		if !p.Valid() {
    64  			util.Panicf("config error: missing pkg-config check for: %s", p.Id)
    65  		}
    66  	}
    67  
    68  	imports = append(imports, pkgs...)
    69  	return imports
    70  }
    71  
    72  func MakeBaseCBuilder(o spec.TargetObject, id string) BaseCBuilder {
    73  	return BaseCBuilder{base.MakeBaseBuilder(o, id)}
    74  }