Skip to content

Commit c0fc2d0

Browse files
committed
implement sub command for gensym
1 parent 9a8e25e commit c0fc2d0

File tree

8 files changed

+111
-34
lines changed

8 files changed

+111
-34
lines changed

cmd/internal/gencfg/gencfg.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
"github.com/goplus/llcppg/cmd/internal/base"
88
"github.com/goplus/llcppg/cmd/llcppcfg/gen"
9+
"github.com/goplus/llcppg/config"
910
)
1011

1112
var Cmd = &base.Command{
@@ -47,7 +48,7 @@ func runCmd(cmd *base.Command, args []string) {
4748
if err != nil {
4849
panic(err)
4950
}
50-
outFile := "./llcppg.cfg"
51+
outFile := config.LLCPPG_CFG
5152
err = os.WriteFile(outFile, buf, 0600)
5253
if err != nil {
5354
panic(err)

cmd/internal/gensig/flags.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package gensig
2+
3+
import "flag"
4+
5+
var verbose bool
6+
7+
func addFlags(fs *flag.FlagSet) {
8+
fs.BoolVar(&verbose, "v", false, "enable verbose output")
9+
}

cmd/internal/gensym/flags.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
11
package gensym
22

3+
import "flag"
4+
35
var verbose bool
6+
7+
func addFlags(fs *flag.FlagSet) {
8+
fs.BoolVar(&verbose, "v", false, "enable verbose output")
9+
}

cmd/internal/gensym/gensym.go

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package gensym
22

33
import (
4-
"fmt"
4+
"bytes"
5+
"os"
6+
"os/exec"
57

68
"github.com/goplus/llcppg/cmd/internal/base"
9+
"github.com/goplus/llcppg/config"
710
)
811

912
var Cmd = &base.Command{
@@ -13,8 +16,30 @@ var Cmd = &base.Command{
1316

1417
func init() {
1518
Cmd.Run = runCmd
19+
addFlags(&Cmd.Flag)
1620
}
1721

1822
func runCmd(cmd *base.Command, args []string) {
19-
fmt.Println("todo gensym")
23+
err := cmd.Flag.Parse(args)
24+
check(err)
25+
26+
cfgFile := config.LLCPPG_CFG
27+
bytesOfConf, err := config.MarshalConfigFile(cfgFile)
28+
check(err)
29+
30+
if cmd.Flag.NArg() == 0 {
31+
args = append(args, "-")
32+
}
33+
34+
cmdForLlcppsymg := exec.Command("llcppsymg", args...)
35+
cmdForLlcppsymg.Stdin = bytes.NewReader(bytesOfConf)
36+
cmdForLlcppsymg.Stdout = os.Stdout
37+
cmdForLlcppsymg.Stderr = os.Stderr
38+
cmdForLlcppsymg.Run()
39+
}
40+
41+
func check(err error) {
42+
if err != nil {
43+
panic(err)
44+
}
2045
}

cmd/llcppg/gensym_cmd.gox

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ use "gensym"
66

77
short "generate symbol table for a C/C++ library"
88

9+
flagOff
10+
911
run args => {
1012
self.Cmd.Run self.Cmd, args
1113
}

cmd/llcppg/main_app.gox

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
short `llcppg aims to be a tool for automatically generating LLGo bindings for C/C++ libraries, enhancing the experience of integrating LLGo with C!`
1+
short `
2+
llcppg aims to be a tool for automatically generating LLGo bindings for C/C++ libraries,
3+
enhancing the experience of integrating LLGo with C!`

config/config.go

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,11 @@
11
package config
22

33
import (
4-
"encoding/json"
54
"fmt"
65

76
"github.com/goplus/llcppg/ast"
87
)
98

10-
const LLCPPG_CFG = "llcppg.cfg"
11-
const LLCPPG_SYMB = "llcppg.symb.json"
12-
const LLCPPG_SIGFETCH = "llcppg.sigfetch.json"
13-
const LLCPPG_PUB = "llcppg.pub"
14-
159
type Condition struct {
1610
OS []string `json:"os"`
1711
Arch []string `json:"arch"`
@@ -41,30 +35,6 @@ type Config struct {
4135
HeaderOnly bool `json:"headerOnly,omitempty"`
4236
}
4337

44-
// json middleware for validating
45-
func (c *Config) UnmarshalJSON(data []byte) error {
46-
// create a new type here to avoid unmarshalling infinite loop.
47-
type newConfig Config
48-
49-
var config newConfig
50-
err := json.Unmarshal(data, &config)
51-
52-
if err != nil {
53-
return err
54-
}
55-
56-
*c = Config(config)
57-
58-
// do some check
59-
60-
// when headeronly mode is disabled, libs must not be empty.
61-
if c.Libs == "" && !c.HeaderOnly {
62-
return fmt.Errorf("%w: libs must not be empty", ErrConfig)
63-
}
64-
65-
return nil
66-
}
67-
6838
func NewDefault() *Config {
6939
return &Config{}
7040
}

config/parse.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package config
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"os"
7+
8+
"github.com/goplus/llgo/xtool/env"
9+
)
10+
11+
const LLCPPG_CFG = "llcppg.cfg"
12+
const LLCPPG_SYMB = "llcppg.symb.json"
13+
const LLCPPG_SIGFETCH = "llcppg.sigfetch.json"
14+
const LLCPPG_PUB = "llcppg.pub"
15+
16+
// json middleware for validating
17+
func (c *Config) UnmarshalJSON(data []byte) error {
18+
// create a new type here to avoid unmarshalling infinite loop.
19+
type newConfig Config
20+
21+
var config newConfig
22+
err := json.Unmarshal(data, &config)
23+
24+
if err != nil {
25+
return err
26+
}
27+
28+
*c = Config(config)
29+
30+
// do some check
31+
32+
// when headeronly mode is disabled, libs must not be empty.
33+
if c.Libs == "" && !c.HeaderOnly {
34+
return fmt.Errorf("%w: libs must not be empty", ErrConfig)
35+
}
36+
37+
return nil
38+
}
39+
40+
func ParseConfigFile(cfgFile string) (*Config, error) {
41+
openCfgFile, err := os.Open(cfgFile)
42+
if err != nil {
43+
return nil, err
44+
}
45+
defer openCfgFile.Close()
46+
var conf Config
47+
err = json.NewDecoder(openCfgFile).Decode(&conf)
48+
if err != nil {
49+
return nil, err
50+
}
51+
conf.CFlags = env.ExpandEnv(conf.CFlags)
52+
conf.Libs = env.ExpandEnv(conf.Libs)
53+
return &conf, nil
54+
}
55+
56+
func MarshalConfigFile(cfgFile string) ([]byte, error) {
57+
conf, err := ParseConfigFile(cfgFile)
58+
if err != nil {
59+
return nil, err
60+
}
61+
return json.MarshalIndent(&conf, "", " ")
62+
}

0 commit comments

Comments
 (0)