Implement llgo build mode support (#1197)
- Add BuildMode type with three build modes: exe, c-archive, c-shared - Restrict buildmode flag to llgo build command only (not run/install/test) - Implement build mode specific linker arguments: - c-shared: use -shared -fPIC flags - c-archive: use ar tool to create static archive - exe: default executable mode - Add normalizeOutputPath function for platform-specific file naming conventions - Generate C header files for library modes - Fix buildmode flag conflict by removing from PassArgs - Add comprehensive test coverage for all build modes - Resolve duplicate logic between defaultAppExt and normalizeOutputPath 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -75,7 +75,7 @@ func PassBuildFlags(cmd *Command) *PassArgs {
|
||||
p.Bool("a")
|
||||
p.Bool("linkshared", "race", "msan", "asan",
|
||||
"trimpath", "work")
|
||||
p.Var("p", "asmflags", "compiler", "buildmode",
|
||||
p.Var("p", "asmflags", "compiler",
|
||||
"gcflags", "gccgoflags", "installsuffix",
|
||||
"ldflags", "pkgdir", "toolexec", "buildvcs")
|
||||
return p
|
||||
|
||||
@@ -39,6 +39,7 @@ func init() {
|
||||
|
||||
flags.AddCommonFlags(&Cmd.Flag)
|
||||
flags.AddBuildFlags(&Cmd.Flag)
|
||||
flags.AddBuildModeFlags(&Cmd.Flag)
|
||||
flags.AddEmulatorFlags(&Cmd.Flag)
|
||||
flags.AddEmbeddedFlags(&Cmd.Flag)
|
||||
flags.AddOutputFlags(&Cmd.Flag)
|
||||
@@ -51,7 +52,10 @@ func runCmd(cmd *base.Command, args []string) {
|
||||
}
|
||||
|
||||
conf := build.NewDefaultConf(build.ModeBuild)
|
||||
flags.UpdateConfig(conf)
|
||||
if err := flags.UpdateBuildConfig(conf); err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
mockable.Exit(1)
|
||||
}
|
||||
|
||||
args = cmd.Flag.Args()
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ func AddOutputFlags(fs *flag.FlagSet) {
|
||||
|
||||
var Verbose bool
|
||||
var BuildEnv string
|
||||
var BuildMode string
|
||||
var Tags string
|
||||
var Target string
|
||||
var Emulator bool
|
||||
@@ -52,6 +53,10 @@ func AddBuildFlags(fs *flag.FlagSet) {
|
||||
}
|
||||
}
|
||||
|
||||
func AddBuildModeFlags(fs *flag.FlagSet) {
|
||||
fs.StringVar(&BuildMode, "buildmode", "exe", "Build mode (exe, c-archive, c-shared)")
|
||||
}
|
||||
|
||||
var Gen bool
|
||||
|
||||
func AddEmulatorFlags(fs *flag.FlagSet) {
|
||||
@@ -68,12 +73,13 @@ func AddCmpTestFlags(fs *flag.FlagSet) {
|
||||
fs.BoolVar(&Gen, "gen", false, "Generate llgo.expect file")
|
||||
}
|
||||
|
||||
func UpdateConfig(conf *build.Config) {
|
||||
func UpdateConfig(conf *build.Config) error {
|
||||
conf.Tags = Tags
|
||||
conf.Verbose = Verbose
|
||||
conf.Target = Target
|
||||
conf.Port = Port
|
||||
conf.BaudRate = BaudRate
|
||||
|
||||
switch conf.Mode {
|
||||
case build.ModeBuild:
|
||||
conf.OutFile = OutputFile
|
||||
@@ -99,4 +105,20 @@ func UpdateConfig(conf *build.Config) {
|
||||
conf.GenLL = GenLLFiles
|
||||
conf.ForceEspClang = ForceEspClang
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func UpdateBuildConfig(conf *build.Config) error {
|
||||
// First apply common config
|
||||
if err := UpdateConfig(conf); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Validate and set build mode
|
||||
if err := build.ValidateBuildMode(BuildMode); err != nil {
|
||||
return err
|
||||
}
|
||||
conf.BuildMode = build.BuildMode(BuildMode)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -47,7 +47,10 @@ func runCmd(cmd *base.Command, args []string) {
|
||||
}
|
||||
|
||||
conf := build.NewDefaultConf(build.ModeInstall)
|
||||
flags.UpdateConfig(conf)
|
||||
if err := flags.UpdateConfig(conf); err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
mockable.Exit(1)
|
||||
}
|
||||
|
||||
args = cmd.Flag.Args()
|
||||
_, err := build.Do(args, conf)
|
||||
|
||||
@@ -76,7 +76,10 @@ func runCmdEx(cmd *base.Command, args []string, mode build.Mode) {
|
||||
}
|
||||
|
||||
conf := build.NewDefaultConf(mode)
|
||||
flags.UpdateConfig(conf)
|
||||
if err := flags.UpdateConfig(conf); err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
mockable.Exit(1)
|
||||
}
|
||||
|
||||
args = cmd.Flag.Args()
|
||||
args, runArgs, err := parseRunArgs(args)
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"github.com/goplus/llgo/cmd/internal/base"
|
||||
"github.com/goplus/llgo/cmd/internal/flags"
|
||||
"github.com/goplus/llgo/internal/build"
|
||||
"github.com/goplus/llgo/internal/mockable"
|
||||
)
|
||||
|
||||
// llgo test
|
||||
@@ -30,12 +31,15 @@ func runCmd(cmd *base.Command, args []string) {
|
||||
}
|
||||
|
||||
conf := build.NewDefaultConf(build.ModeTest)
|
||||
flags.UpdateConfig(conf)
|
||||
if err := flags.UpdateConfig(conf); err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
mockable.Exit(1)
|
||||
}
|
||||
|
||||
args = cmd.Flag.Args()
|
||||
_, err := build.Do(args, conf)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(1)
|
||||
mockable.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user