expand template vars in targets config

This commit is contained in:
Li Jie
2025-08-21 18:51:54 +08:00
parent 5cfd996659
commit 06568da140
2 changed files with 209 additions and 3 deletions

View File

@@ -44,6 +44,83 @@ func cacheDir() string {
return filepath.Join(env.LLGoCacheDir(), "crosscompile")
}
// expandEnv expands template variables in a string
// Supports variables like {port}, {hex}, {bin}, {root}, {tmpDir}, etc.
// Special case: {} expands to the first available file variable (hex, bin, img, zip)
func expandEnv(template string, envs map[string]string) string {
return expandEnvWithDefault(template, envs)
}
// expandEnvWithDefault expands template variables with optional default for {}
func expandEnvWithDefault(template string, envs map[string]string, defaultValue ...string) string {
if template == "" {
return ""
}
result := template
// Handle special case of {} - use provided default or first available file variable
if strings.Contains(result, "{}") {
defaultVal := ""
if len(defaultValue) > 0 && defaultValue[0] != "" {
defaultVal = defaultValue[0]
} else {
// Priority order: hex, bin, img, zip
for _, key := range []string{"hex", "bin", "img", "zip"} {
if value, exists := envs[key]; exists && value != "" {
defaultVal = value
break
}
}
}
result = strings.ReplaceAll(result, "{}", defaultVal)
}
// Replace named variables
for key, value := range envs {
if key != "" { // Skip empty key used for {} default
result = strings.ReplaceAll(result, "{"+key+"}", value)
}
}
return result
}
// expandEnvSlice expands template variables in a slice of strings
func expandEnvSlice(templates []string, envs map[string]string) []string {
return expandEnvSliceWithDefault(templates, envs)
}
// expandEnvSliceWithDefault expands template variables in a slice with optional default for {}
func expandEnvSliceWithDefault(templates []string, envs map[string]string, defaultValue ...string) []string {
if len(templates) == 0 {
return templates
}
result := make([]string, len(templates))
for i, template := range templates {
result[i] = expandEnvWithDefault(template, envs, defaultValue...)
}
return result
}
// buildEnvMap creates a map of template variables for the current context
func buildEnvMap(llgoRoot string) map[string]string {
envs := make(map[string]string)
// Basic paths
envs["root"] = llgoRoot
envs["tmpDir"] = os.TempDir()
// These will typically be set by calling code when actual values are known
// envs["port"] = "" // Serial port (e.g., "/dev/ttyUSB0", "COM3")
// envs["hex"] = "" // Path to hex file
// envs["bin"] = "" // Path to binary file
// envs["img"] = "" // Path to image file
// envs["zip"] = "" // Path to zip file
return envs
}
// getMacOSSysroot returns the macOS SDK path using xcrun
func getMacOSSysroot() (string, error) {
cmd := exec.Command("xcrun", "--sdk", "macosx", "--show-sdk-path")
@@ -347,6 +424,9 @@ func useTarget(targetName string) (export Export, err error) {
export.GOOS = config.GOOS
export.GOARCH = config.GOARCH
// Build environment map for template variable expansion
envs := buildEnvMap(env.LLGoROOT())
// Convert LLVMTarget, CPU, Features to CCFLAGS/LDFLAGS
var ccflags []string
var ldflags []string
@@ -361,7 +441,9 @@ func useTarget(targetName string) (export Export, err error) {
cflags = append(cflags, "--target="+config.LLVMTarget)
ccflags = append(ccflags, "--target="+config.LLVMTarget)
}
cflags = append(cflags, config.CFlags...)
// Expand template variables in cflags
expandedCFlags := expandEnvSlice(config.CFlags, envs)
cflags = append(cflags, expandedCFlags...)
// Inspired by tinygo
cpu := config.CPU
@@ -394,10 +476,11 @@ func useTarget(targetName string) (export Export, err error) {
}
ldflags = append(ldflags, "-L", env.LLGoROOT()) // search targets/*.ld
// Combine with config flags
// Combine with config flags and expand template variables
export.CFLAGS = cflags
export.CCFLAGS = ccflags
export.LDFLAGS = append(ldflags, config.LDFlags...)
expandedLDFlags := expandEnvSlice(config.LDFlags, envs)
export.LDFLAGS = append(ldflags, expandedLDFlags...)
return export, nil
}