github.com/metux/go-metabuild@v0.0.0-20240118143255-d9ed5ab697f9/engine/builder/c/library_pkgconfig.go (about)

     1  package c
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/metux/go-metabuild/spec/target"
     7  	"github.com/metux/go-metabuild/util/compiler"
     8  )
     9  
    10  type BuilderCLibraryPkgConfig struct {
    11  	BaseCBuilder
    12  }
    13  
    14  func (b BuilderCLibraryPkgConfig) JobRun() error {
    15  	libname := b.RequiredEntryStr(target.KeyPkgLibname)
    16  
    17  	requires := []string{}
    18  	for _, pi := range b.AllImports() {
    19  		if !pi.Private {
    20  			requires = append(requires, pi.PkgSpec)
    21  		}
    22  	}
    23  
    24  	pkginfo := compiler.PkgConfigInfo{
    25  		Name:          b.RequiredEntryStr(target.KeyPkgName),
    26  		Version:       b.RequiredEntryStr(target.KeyPkgVersion),
    27  		Description:   b.RequiredEntryStr(target.KeyPkgDescription),
    28  		SharedLdflags: []string{"-L${sharedlibdir}", "-l" + libname},
    29  		SharedCflags:  []string{"-I${includedir}"}, /* add cflags ? */
    30  		StaticLdflags: []string{"-L${libdir}", "-l" + libname},
    31  		StaticCflags:  []string{"-I${includedir}"}, /* add cflags ? */
    32  		Requires:      requires,
    33  		Variables: map[string]string{
    34  			"prefix":       b.RequiredEntryStr(target.KeyPkgPrefix),
    35  			"exec_prefix":  b.RequiredEntryStr(target.KeyPkgExecPrefix),
    36  			"libdir":       b.RequiredEntryStr(target.KeyPkgLibdir),
    37  			"includedir":   b.RequiredEntryStr(target.KeyPkgIncludedir),
    38  			"sharedlibdir": b.RequiredEntryStr(target.KeyPkgSharedLibdir),
    39  			"archive":      b.RequiredEntryStr(target.KeyPkgArchive),
    40  		},
    41  	}
    42  
    43  	pcfile := b.RequiredEntryStr(target.KeyFile)
    44  
    45  	if err := pkginfo.Write(pcfile); err != nil {
    46  		return err
    47  	}
    48  
    49  	if b.InstallPkgFileAuto() {
    50  		// write pkgconf dependencies
    51  		pkgdeps := []string{}
    52  		for _, x := range requires {
    53  			// we may have either "<name>" or "<name> >= <ver>"
    54  			f := strings.Fields(x)
    55  			if len(f) < 1 {
    56  				b.Logf("WARN: empty pkgconfig req line\n")
    57  			} else if len(f) < 3 {
    58  				pkgdeps = append(pkgdeps, f[0])
    59  			} else {
    60  				pkgdeps = append(pkgdeps, f[0]+" "+f[2])
    61  			}
    62  		}
    63  		b.WritePkgMeta(pcfile+".pcdep", strings.Join(pkgdeps, "\n"))
    64  	}
    65  
    66  	return nil
    67  }