diff --git a/build_install_run.go b/build_install_run.go new file mode 100644 index 00000000..383ab785 --- /dev/null +++ b/build_install_run.go @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2023 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package llgo + +import ( + "github.com/goplus/llgo/x/gocmd" +) + +// ----------------------------------------------------------------------------- + +func BuildDir(dir string, conf *Config, build *gocmd.BuildConfig) (err error) { + panic("todo") +} + +func BuildPkgPath(workDir, pkgPath string, conf *Config, build *gocmd.BuildConfig) (err error) { + panic("todo") +} + +func BuildFiles(files []string, conf *Config, build *gocmd.BuildConfig) (err error) { + panic("todo") +} + +// ----------------------------------------------------------------------------- diff --git a/cmd/internal/base/base.go b/cmd/internal/base/base.go new file mode 100644 index 00000000..440cdf4a --- /dev/null +++ b/cmd/internal/base/base.go @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2023 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Package base defines shared basic pieces of the llgo command, +// in particular logging and the Command structure. +package base + +import ( + "flag" + "fmt" + "io" + "os" + "strings" +) + +// A Command is an implementation of a gop command +// like gop export or gop install. +type Command struct { + // Run runs the command. + // The args are the arguments after the command name. + Run func(cmd *Command, args []string) + + // UsageLine is the one-line usage message. + // The words between "gop" and the first flag or argument in the line are taken to be the command name. + UsageLine string + + // Short is the short description shown in the 'gop help' output. + Short string + + // Flag is a set of flags specific to this command. + Flag flag.FlagSet + + // Commands lists the available commands and help topics. + // The order here is the order in which they are printed by 'gop help'. + // Note that subcommands are in general best avoided. + Commands []*Command +} + +// Llgo command +var Llgo = &Command{ + UsageLine: "llgo", + Short: `llgo is a Go compiler based on LLVM in order to better integrate Go with the C ecosystem.`, + // Commands initialized in package main +} + +// LongName returns the command's long name: all the words in the usage line between "gop" and a flag or argument, +func (c *Command) LongName() string { + name := c.UsageLine + if i := strings.Index(name, " ["); i >= 0 { + name = name[:i] + } + if name == "llgo" { + return "" + } + return strings.TrimPrefix(name, "llgo ") +} + +// Name returns the command's short name: the last word in the usage line before a flag or argument. +func (c *Command) Name() string { + name := c.LongName() + if i := strings.LastIndex(name, " "); i >= 0 { + name = name[i+1:] + } + return name +} + +// Usage show the command usage. +func (c *Command) Usage(w io.Writer) { + fmt.Fprintf(w, "%s\n\nUsage: %s\n", c.Short, c.UsageLine) + + // restore output of flag + defer c.Flag.SetOutput(c.Flag.Output()) + + c.Flag.SetOutput(w) + c.Flag.PrintDefaults() + fmt.Fprintln(w) + os.Exit(2) +} + +// Runnable reports whether the command can be run; otherwise +// it is a documentation pseudo-command. +func (c *Command) Runnable() bool { + return c.Run != nil +} + +// Usage is the usage-reporting function, filled in by package main +// but here for reference by other packages. +// +// flag.Usage func() + +// CmdName - "build", "install", "list", "mod tidy", etc. +var CmdName string + +// Main runs a command. +func Main(c *Command, app string, args []string) { + name := c.UsageLine + if i := strings.Index(name, " ["); i >= 0 { + c.UsageLine = app + name[i:] + } + c.Run(c, args) +} diff --git a/cmd/internal/build/build.go b/cmd/internal/build/build.go new file mode 100644 index 00000000..e22d9f2a --- /dev/null +++ b/cmd/internal/build/build.go @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2023 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Package build implements the “llgo build” command. +package build + +import ( + "fmt" + "log" + "os" + "path/filepath" + "reflect" + + "github.com/goplus/gop" + "github.com/goplus/gop/x/gopprojs" + "github.com/goplus/llgo" + "github.com/goplus/llgo/cmd/internal/base" + "github.com/goplus/llgo/x/gocmd" +) + +// llgo build +var Cmd = &base.Command{ + UsageLine: "llog build [flags] [packages]", + Short: "Build Go files", +} + +var ( + flagOutput = flag.String("o", "", "build output file") + _ = flag.Bool("v", false, "print verbose information") + flag = &Cmd.Flag +) + +func init() { + Cmd.Run = runCmd +} + +func runCmd(cmd *base.Command, args []string) { + err := flag.Parse(args) + if err != nil { + log.Panicln("parse input arguments failed:", err) + } + + args = flag.Args() + if len(args) == 0 { + args = []string{"."} + } + + proj, args, err := gopprojs.ParseOne(args...) + if err != nil { + log.Panicln(err) + } + if len(args) != 0 { + log.Panicln("too many arguments:", args) + } + + conf := &llgo.Config{} + confCmd := &gocmd.BuildConfig{} + if *flagOutput != "" { + output, err := filepath.Abs(*flagOutput) + if err != nil { + log.Panicln(err) + } + confCmd.Output = output + } + build(proj, conf, confCmd) +} + +func build(proj gopprojs.Proj, conf *llgo.Config, build *gocmd.BuildConfig) { + var obj string + var err error + switch v := proj.(type) { + case *gopprojs.DirProj: + obj = v.Dir + err = llgo.BuildDir(obj, conf, build) + case *gopprojs.PkgPathProj: + obj = v.Path + err = llgo.BuildPkgPath("", v.Path, conf, build) + case *gopprojs.FilesProj: + err = llgo.BuildFiles(v.Files, conf, build) + default: + log.Panicln("`llgo build` doesn't support", reflect.TypeOf(v)) + } + if gop.NotFound(err) { + fmt.Fprintf(os.Stderr, "llgo build %v: not found\n", obj) + } else if err != nil { + fmt.Fprintln(os.Stderr, err) + } else { + return + } + os.Exit(1) +} + +// ----------------------------------------------------------------------------- diff --git a/cmd/internal/help/help.go b/cmd/internal/help/help.go new file mode 100644 index 00000000..a1d07005 --- /dev/null +++ b/cmd/internal/help/help.go @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2023 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Package help implements the “llgo help” command. +package help + +import ( + "bufio" + "fmt" + "io" + "log" + "os" + "strings" + "text/template" + "unicode" + "unicode/utf8" + + "github.com/goplus/llgo/cmd/internal/base" +) + +// Help implements the 'help' command. +func Help(w io.Writer, args []string) { + cmd := base.Llgo +Args: + for i, arg := range args { + for _, sub := range cmd.Commands { + if sub.Name() == arg { + cmd = sub + continue Args + } + } + + // helpSuccess is the help command using as many args as possible that would succeed. + helpSuccess := "llgo help" + if i > 0 { + helpSuccess += " " + strings.Join(args[:i], " ") + } + fmt.Fprintf(os.Stderr, "llgo help %s: unknown help topic. Run '%s'.\n", strings.Join(args, " "), helpSuccess) + os.Exit(2) + } + + if len(cmd.Commands) > 0 { + PrintUsage(w, cmd) + } else { + cmd.Usage(w) + } + // not exit 2: succeeded at 'llgo help cmd'. +} + +var usageTemplate = `{{.Short | trim}} + +Usage: + + {{.UsageLine}} [arguments] + +The commands are: +{{range .Commands}}{{if or (.Runnable) .Commands}} + {{.Name | printf "%-11s"}} {{.Short}}{{end}}{{end}} + +Use "llgo help{{with .LongName}} {{.}}{{end}} " for more information about a command. + +` + +// An errWriter wraps a writer, recording whether a write error occurred. +type errWriter struct { + w io.Writer + err error +} + +func (w *errWriter) Write(b []byte) (int, error) { + n, err := w.w.Write(b) + if err != nil { + w.err = err + } + return n, err +} + +// tmpl executes the given template text on data, writing the result to w. +func tmpl(w io.Writer, text string, data interface{}) { + t := template.New("top") + t.Funcs(template.FuncMap{"trim": strings.TrimSpace, "capitalize": capitalize}) + template.Must(t.Parse(text)) + ew := &errWriter{w: w} + err := t.Execute(ew, data) + if ew.err != nil { + // I/O error writing. Ignore write on closed pipe. + if strings.Contains(ew.err.Error(), "pipe") { + os.Exit(1) + } + log.Fatalf("writing output: %v", ew.err) + } + if err != nil { + panic(err) + } +} + +func capitalize(s string) string { + if s == "" { + return s + } + r, n := utf8.DecodeRuneInString(s) + return string(unicode.ToTitle(r)) + s[n:] +} + +// PrintUsage prints usage information. +func PrintUsage(w io.Writer, cmd *base.Command) { + bw := bufio.NewWriter(w) + tmpl(bw, usageTemplate, cmd) + bw.Flush() +} diff --git a/cmd/llgo/llgo.go b/cmd/llgo/llgo.go new file mode 100644 index 00000000..7e22a168 --- /dev/null +++ b/cmd/llgo/llgo.go @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2023 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package main + +import ( + "flag" + "fmt" + "os" + "strings" + + "github.com/qiniu/x/log" + + "github.com/goplus/llgo/cmd/internal/base" + "github.com/goplus/llgo/cmd/internal/build" + "github.com/goplus/llgo/cmd/internal/help" +) + +func mainUsage() { + help.PrintUsage(os.Stderr, base.Llgo) + os.Exit(2) +} + +func init() { + flag.Usage = mainUsage + base.Llgo.Commands = []*base.Command{ + build.Cmd, + } +} + +func main() { + flag.Parse() + args := flag.Args() + if len(args) < 1 { + flag.Usage() + } + log.SetFlags(log.Ldefault &^ log.LstdFlags) + + base.CmdName = args[0] // for error messages + if args[0] == "help" { + help.Help(os.Stderr, args[1:]) + return + } + +BigCmdLoop: + for bigCmd := base.Llgo; ; { + for _, cmd := range bigCmd.Commands { + if cmd.Name() != args[0] { + continue + } + args = args[1:] + if len(cmd.Commands) > 0 { + bigCmd = cmd + if len(args) == 0 { + help.PrintUsage(os.Stderr, bigCmd) + os.Exit(2) + } + if args[0] == "help" { + help.Help(os.Stderr, append(strings.Split(base.CmdName, " "), args[1:]...)) + return + } + base.CmdName += " " + args[0] + continue BigCmdLoop + } + if !cmd.Runnable() { + continue + } + cmd.Run(cmd, args) + return + } + helpArg := "" + if i := strings.LastIndex(base.CmdName, " "); i >= 0 { + helpArg = " " + base.CmdName[:i] + } + fmt.Fprintf(os.Stderr, "llgo %s: unknown command\nRun 'llgo help%s' for usage.\n", base.CmdName, helpArg) + os.Exit(2) + } +} diff --git a/go.mod b/go.mod index ba17e23a..0695abfa 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,14 @@ go 1.18 require ( github.com/aykevl/go-wasm v0.0.1 github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb + github.com/goplus/gop v1.1.13 github.com/qiniu/x v1.13.1 golang.org/x/tools v0.16.0 tinygo.org/x/go-llvm v0.0.0-20231014233752-75a8a9fe6f74 ) + +require ( + github.com/goplus/gox v1.13.1 // indirect + github.com/goplus/mod v0.11.9 // indirect + golang.org/x/mod v0.14.0 // indirect +) diff --git a/go.sum b/go.sum index d7843037..0fc7f0bc 100644 --- a/go.sum +++ b/go.sum @@ -2,9 +2,60 @@ github.com/aykevl/go-wasm v0.0.1 h1:lPxy8l48P39W7I0tLrtCrLfZBOUq9IWZ7odGdyJP2AM= github.com/aykevl/go-wasm v0.0.1/go.mod h1:b4nggwg3lEkNKOU4wzhtLKz2q2sLxSHFnc98aGt6z/Y= github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb h1:m935MPodAbYS46DG4pJSv7WO+VECIWUQ7OJYSoTrMh4= github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= +github.com/goplus/gop v1.1.13 h1:Nnyzy7BeE25SbpGfOX/mHGBCpvVsmkr/9hW0FtUXZwY= +github.com/goplus/gop v1.1.13/go.mod h1:iRl6Rxc4bazQaDr4yUlxSpa9Wxs8J2nXG0ON8vcfh4g= +github.com/goplus/gox v1.13.1 h1:/X6Ja9R2hQuLVbN+PzLHRtaBcan+YmhASvGO3nMJsZw= +github.com/goplus/gox v1.13.1/go.mod h1:UNzOPlRyO/uQn+9iHelk6KelAFaaC7OBn5AxtSSsC9c= +github.com/goplus/mod v0.11.9 h1:XdWvSNi55fQ3KHnk0PVVHsXynG58lTbfXps/C9HjTVQ= +github.com/goplus/mod v0.11.9/go.mod h1:YxrBMhvWGcvLU14j8e7qyKSVnj5Loba7GgH1rNXJtDg= github.com/qiniu/x v1.13.1 h1:hi7tkXFq6BWGbBpMoLV7kvA2elop69j6Kl7TlxnFAiU= github.com/qiniu/x v1.13.1/go.mod h1:INZ2TSWSJVWO/RuELQROERcslBwVgFG7MkTfEdaQz9E= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM= golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= tinygo.org/x/go-llvm v0.0.0-20231014233752-75a8a9fe6f74 h1:tW8XhLI9gUZLL+2pG0HYb5dc6bpMj1aqtESpizXPnMY= tinygo.org/x/go-llvm v0.0.0-20231014233752-75a8a9fe6f74/go.mod h1:GFbusT2VTA4I+l4j80b17KFK+6whv69Wtny5U+T8RR0= diff --git a/load.go b/load.go new file mode 100644 index 00000000..06d4851a --- /dev/null +++ b/load.go @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2023 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package llgo + +// ----------------------------------------------------------------------------- + +type Config struct { +} + +// ----------------------------------------------------------------------------- diff --git a/x/gocmd/build_install_run.go b/x/gocmd/build_install_run.go new file mode 100644 index 00000000..fb046d75 --- /dev/null +++ b/x/gocmd/build_install_run.go @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2023 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package gocmd + +// ----------------------------------------------------------------------------- + +type BuildConfig struct { + Output string +} + +// -----------------------------------------------------------------------------