-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathenvs.go
72 lines (66 loc) · 2.42 KB
/
envs.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package pkg
import (
"bytes"
"os"
"reflect"
"runtime"
"strconv"
"text/template"
)
const pkgTagName = "pkg"
// paths env variable used in instruction
type PackageEnvs struct {
PkgRoot string `pkg:"PKG_ROOT"` // the path running pkg
VendorPath string `pkg:"VENDOR_PATH"` // vendor
PkgInCPath string `pkg:"INCLUDE"` // vendor/include
PackageCacheDir string `pkg:"CACHE"` // vendor/cache/@pkg
PackagePkgDir string `pkg:"PKG_DIR"` // vendor/pkg/@pkg
PackagePkgIncDir string `pkg:"PKG_INC"` // vendor/pkg/@pkg/include
PackageSrcDir string `pkg:"SRC_DIR"` // vendor/src/@pkg
PackageFindPath string `pkg:"PKG_FIND_PATH"` // vendor/deps/@pkg or vendor/pkg/@pkg (decided by env)
CMakePackageFindDir string `pkg:"CMAKE_VENDOR_PATH_PKG"` // vendor/pkg/@pkg
}
// pkgRoot: the root directory of project
// packageName: package name/path
// packageSrcPath: path of package source
func NewPackageEnvs(pkgRoot, packageName, packageSrc string) *PackageEnvs {
pkgFindPath := GetPackagePkgPath(pkgRoot, packageName)
if pkgEnvInc := os.Getenv("PKG_INNER_BUILD"); pkgEnvInc != "" {
pkgFindPath = GetPackageDepsPath(pkgRoot, packageName)
}
return &PackageEnvs{
PkgRoot: pkgRoot,
VendorPath: GetVendorPath(pkgRoot),
PkgInCPath: GetIncludePath(pkgRoot),
PackageCacheDir: GetCachePath(pkgRoot, packageName),
PackagePkgDir: GetPackagePkgPath(pkgRoot, packageName),
PackagePkgIncDir: GetPkgIncludePath(pkgRoot, packageName),
PackageSrcDir: packageSrc,
PackageFindPath: pkgFindPath,
CMakePackageFindDir: GetCMakeVendorPkgPath(packageName),
}
}
// replace origin string with args values.
func ExpandEnv(origin string, envs *PackageEnvs) (string, error) {
var vars = make(map[string]string)
// add global envs
vars["CORES"] = strconv.Itoa(runtime.NumCPU())
// convert struct to map (key is the tag).
t := reflect.TypeOf(*envs)
v := reflect.ValueOf(*envs)
for i := 0; i < t.NumField(); i++ {
// Get the field tag value
tag := t.Field(i).Tag.Get(pkgTagName)
vars[tag] = v.Field(i).Interface().(string)
}
// template rendering
if t, err := template.New("o").Parse(origin); err != nil {
return "", err
} else {
sb := bytes.NewBufferString("")
if err := t.Execute(sb, vars); err != nil {
return "", err
}
return sb.String(), nil
}
}