extract common cmd flags
This commit is contained in:
@@ -75,6 +75,8 @@ type Config struct {
|
||||
RunArgs []string // only valid for ModeRun
|
||||
Mode Mode
|
||||
GenExpect bool // only valid for ModeCmpTest
|
||||
Verbose bool
|
||||
Tags string
|
||||
}
|
||||
|
||||
func NewDefaultConf(mode Mode) *Config {
|
||||
@@ -136,56 +138,6 @@ const (
|
||||
loadSyntax = loadTypes | packages.NeedSyntax | packages.NeedTypesInfo
|
||||
)
|
||||
|
||||
func mergeFlags(flags, extraFlags []string) (newFlags []string, tags []string) {
|
||||
// Combine all flags
|
||||
allFlags := append([]string{}, flags...)
|
||||
allFlags = append(allFlags, extraFlags...)
|
||||
|
||||
// Find all -tags flags and extract their values
|
||||
tagValues := []string{}
|
||||
|
||||
for i := 0; i < len(allFlags); i++ {
|
||||
flag := allFlags[i]
|
||||
// Handle -tags=value format
|
||||
if strings.HasPrefix(flag, "-tags=") {
|
||||
value := strings.TrimPrefix(flag, "-tags=")
|
||||
if value != "" {
|
||||
tagValues = append(tagValues, strings.Split(value, ",")...)
|
||||
}
|
||||
continue
|
||||
}
|
||||
// Handle -tags value format
|
||||
if flag == "-tags" && i+1 < len(allFlags) {
|
||||
i++
|
||||
value := allFlags[i]
|
||||
if value != "" {
|
||||
tagValues = append(tagValues, strings.Split(value, ",")...)
|
||||
}
|
||||
continue
|
||||
}
|
||||
// Keep other flags
|
||||
newFlags = append(newFlags, flag)
|
||||
}
|
||||
// Add combined -tags flag if we found any tag values
|
||||
if len(tagValues) > 0 {
|
||||
// Remove duplicates
|
||||
uniqueTags := make([]string, 0, len(tagValues))
|
||||
seen := make(map[string]bool)
|
||||
for _, tag := range tagValues {
|
||||
tag = strings.TrimSpace(tag)
|
||||
if tag != "" && !seen[tag] {
|
||||
seen[tag] = true
|
||||
uniqueTags = append(uniqueTags, tag)
|
||||
}
|
||||
}
|
||||
if len(uniqueTags) > 0 {
|
||||
newFlags = append(newFlags, "-tags", strings.Join(uniqueTags, ","))
|
||||
tags = []string{"-tags", strings.Join(uniqueTags, ",")}
|
||||
}
|
||||
}
|
||||
return newFlags, tags
|
||||
}
|
||||
|
||||
func Do(args []string, conf *Config) ([]Package, error) {
|
||||
if conf.Goos == "" {
|
||||
conf.Goos = runtime.GOOS
|
||||
@@ -193,11 +145,15 @@ func Do(args []string, conf *Config) ([]Package, error) {
|
||||
if conf.Goarch == "" {
|
||||
conf.Goarch = runtime.GOARCH
|
||||
}
|
||||
flags, patterns, verbose := ParseArgs(args, buildFlags)
|
||||
flags, _ = mergeFlags(flags, []string{"-tags", "llgo"})
|
||||
verbose := conf.Verbose
|
||||
patterns := args
|
||||
tags := "llgo"
|
||||
if conf.Tags != "" {
|
||||
tags += "," + conf.Tags
|
||||
}
|
||||
cfg := &packages.Config{
|
||||
Mode: loadSyntax | packages.NeedDeps | packages.NeedModule | packages.NeedExportFile,
|
||||
BuildFlags: flags,
|
||||
BuildFlags: []string{"-tags=" + tags},
|
||||
Fset: token.NewFileSet(),
|
||||
Tests: conf.Mode == ModeTest,
|
||||
}
|
||||
@@ -1048,50 +1004,6 @@ func WasmRuntime() string {
|
||||
return defaultEnv(llgoWasmRuntime, defaultWasmRuntime)
|
||||
}
|
||||
|
||||
func ParseArgs(args []string, swflags map[string]bool) (flags, patterns []string, verbose bool) {
|
||||
n := len(args)
|
||||
for i := 0; i < n; i++ {
|
||||
arg := args[i]
|
||||
if strings.HasPrefix(arg, "-") {
|
||||
checkFlag(arg, &i, &verbose, swflags)
|
||||
} else {
|
||||
patterns = append([]string{}, args[i:]...)
|
||||
flags = append([]string{}, args[:i]...)
|
||||
return
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func SkipFlagArgs(args []string) int {
|
||||
n := len(args)
|
||||
for i := 0; i < n; i++ {
|
||||
arg := args[i]
|
||||
if strings.HasPrefix(arg, "-") {
|
||||
checkFlag(arg, &i, nil, buildFlags)
|
||||
} else {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
func checkFlag(arg string, i *int, verbose *bool, swflags map[string]bool) {
|
||||
if pos := strings.IndexByte(arg, '='); pos > 0 {
|
||||
if verbose != nil && arg == "-v=true" {
|
||||
*verbose = true
|
||||
}
|
||||
} else if hasarg, ok := swflags[arg]; ok {
|
||||
if hasarg {
|
||||
*i++
|
||||
} else if verbose != nil && arg == "-v" {
|
||||
*verbose = true
|
||||
}
|
||||
} else {
|
||||
panic("unknown flag: " + arg)
|
||||
}
|
||||
}
|
||||
|
||||
func concatPkgLinkFiles(ctx *context, pkg *packages.Package, verbose bool) (parts []string) {
|
||||
llgoPkgLinkFiles(ctx, pkg, func(linkFile string) {
|
||||
parts = append(parts, linkFile)
|
||||
|
||||
@@ -54,13 +54,13 @@ func mockRun(args []string, cfg *Config) {
|
||||
}
|
||||
|
||||
func TestRun(t *testing.T) {
|
||||
mockRun([]string{"-v", "../../cl/_testgo/print"}, &Config{Mode: ModeRun})
|
||||
mockRun([]string{"../../cl/_testgo/print"}, &Config{Mode: ModeRun})
|
||||
}
|
||||
|
||||
func TestTest(t *testing.T) {
|
||||
mockRun([]string{"-v", "../../cl/_testgo/runtest"}, &Config{Mode: ModeTest})
|
||||
mockRun([]string{"../../cl/_testgo/runtest"}, &Config{Mode: ModeTest})
|
||||
}
|
||||
|
||||
func TestCmpTest(t *testing.T) {
|
||||
mockRun([]string{"-v", "../../cl/_testgo/runtest"}, &Config{Mode: ModeCmpTest})
|
||||
mockRun([]string{"../../cl/_testgo/runtest"}, &Config{Mode: ModeCmpTest})
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import (
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
|
||||
"github.com/goplus/llgo/internal/packages"
|
||||
)
|
||||
@@ -32,11 +33,20 @@ var (
|
||||
}
|
||||
)
|
||||
|
||||
func Clean(args []string, conf *Config) {
|
||||
flags, patterns, verbose := ParseArgs(args, cleanFlags)
|
||||
func Clean(patterns []string, conf *Config) {
|
||||
if conf.Goos == "" {
|
||||
conf.Goos = runtime.GOOS
|
||||
}
|
||||
if conf.Goarch == "" {
|
||||
conf.Goarch = runtime.GOARCH
|
||||
}
|
||||
tags := "llgo"
|
||||
if conf.Tags != "" {
|
||||
tags += "," + conf.Tags
|
||||
}
|
||||
cfg := &packages.Config{
|
||||
Mode: loadSyntax | packages.NeedExportFile,
|
||||
BuildFlags: flags,
|
||||
BuildFlags: []string{"-tags=" + tags},
|
||||
}
|
||||
|
||||
if patterns == nil {
|
||||
@@ -45,11 +55,11 @@ func Clean(args []string, conf *Config) {
|
||||
initial, err := packages.LoadEx(nil, nil, cfg, patterns...)
|
||||
check(err)
|
||||
|
||||
cleanPkgs(initial, verbose)
|
||||
cleanPkgs(initial, conf.Verbose)
|
||||
|
||||
for _, pkg := range initial {
|
||||
if pkg.Name == "main" {
|
||||
cleanMainPkg(pkg, conf, verbose)
|
||||
cleanMainPkg(pkg, conf, conf.Verbose)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user