c/clang/symg:use cjson get conf

This commit is contained in:
luoliwoshang
2024-07-29 15:09:54 +08:00
parent c8532a548c
commit f427c0532d
2 changed files with 42 additions and 47 deletions

View File

@@ -134,6 +134,20 @@ func (o *JSON) PrintUnformatted() *c.Char { return nil }
// llgo:link (*JSON).PrintBuffered C.cJSON_PrintBuffered // llgo:link (*JSON).PrintBuffered C.cJSON_PrintBuffered
func (o *JSON) PrintBuffered(prebuffer c.Int, fmt c.Int) *c.Char { return nil } func (o *JSON) PrintBuffered(prebuffer c.Int, fmt c.Int) *c.Char { return nil }
// llgo:link (*JSON).GetObjectItemCaseSensitive C.cJSON_GetObjectItemCaseSensitive
func (o *JSON) GetObjectItemCaseSensitive(key *c.Char) *JSON { return nil }
func (o *JSON) GetItem(key string) *JSON { return o.GetObjectItemCaseSensitive(c.AllocaCStr(key)) }
// llgo:link (*JSON).GetArraySize C.cJSON_GetArraySize
func (o *JSON) GetArraySize() c.Int { return 0 }
// llgo:link (*JSON).GetArrayItem C.cJSON_GetArrayItem
func (o *JSON) GetArrayItem(index c.Int) *JSON { return nil }
// llgo:link (*JSON).GetStringValue C.cJSON_GetStringValue
func (o *JSON) GetStringValue() *c.Char { return nil }
//go:linkname Free C.cJSON_free //go:linkname Free C.cJSON_free
func Free(ptr unsafe.Pointer) func Free(ptr unsafe.Pointer)

View File

@@ -26,10 +26,11 @@ import (
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
"regexp"
"strconv" "strconv"
"strings" "strings"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/cjson"
"github.com/goplus/llgo/chore/llcppg/types" "github.com/goplus/llgo/chore/llcppg/types"
) )
@@ -48,9 +49,10 @@ func main() {
} }
check(err) check(err)
var config types.Config config, err := getConf(data)
err = json.Unmarshal(data, &config) if err != nil {
check(err) fmt.Fprintln(os.Stderr, "Failed to parse config file:", cfgFile)
}
symbols, err := parseDylibSymbols(config.Libs) symbols, err := parseDylibSymbols(config.Libs)
check(err) check(err)
@@ -84,6 +86,26 @@ func check(err error) {
} }
} }
func getConf(data []byte) (config types.Config, err error) {
conf := cjson.ParseBytes(data)
defer conf.Delete()
if conf == nil {
return config, errors.New("failed to execute nm command")
}
config.Name = c.GoString(conf.GetItem("name").GetStringValue())
config.CFlags = c.GoString(conf.GetItem("cflags").GetStringValue())
config.Libs = c.GoString(conf.GetItem("libs").GetStringValue())
config.Include = make([]string, conf.GetItem("include").GetArraySize())
for i := range config.Include {
config.Include[i] = c.GoString(conf.GetItem("include").GetArrayItem(c.Int(i)).GetStringValue())
}
config.TrimPrefixes = make([]string, conf.GetItem("trimPrefixes").GetArraySize())
for i := range config.TrimPrefixes {
config.TrimPrefixes[i] = c.GoString(conf.GetItem("trimPrefixes").GetArrayItem(c.Int(i)).GetStringValue())
}
return
}
func parseDylibSymbols(lib string) ([]types.CPPSymbol, error) { func parseDylibSymbols(lib string) ([]types.CPPSymbol, error) {
dylibPath, _ := generateDylibPath(lib) dylibPath, _ := generateDylibPath(lib)
nmCmd := exec.Command("nm", "-gU", dylibPath) nmCmd := exec.Command("nm", "-gU", dylibPath)
@@ -106,7 +128,7 @@ func parseDylibSymbols(lib string) ([]types.CPPSymbol, error) {
} }
func generateDylibPath(lib string) (string, error) { func generateDylibPath(lib string) (string, error) {
output := expandEnv(lib) output := lib
libPath := "" libPath := ""
libName := "" libName := ""
for _, part := range strings.Fields(string(output)) { for _, part := range strings.Fields(string(output)) {
@@ -160,7 +182,6 @@ func decodeSymbolName(symbolName string) (string, error) {
return decodedName, nil return decodedName, nil
} }
// parseHeaderFile
func parseHeaderFile(config types.Config) ([]types.ASTInformation, error) { func parseHeaderFile(config types.Config) ([]types.ASTInformation, error) {
files := generateHeaderFilePath(config.CFlags, config.Include) files := generateHeaderFilePath(config.CFlags, config.Include)
fmt.Println(files) fmt.Println(files)
@@ -182,7 +203,7 @@ func parseHeaderFile(config types.Config) ([]types.ASTInformation, error) {
} }
func generateHeaderFilePath(cflags string, files []string) []string { func generateHeaderFilePath(cflags string, files []string) []string {
prefixPath := expandEnv(cflags) prefixPath := cflags
prefixPath = strings.TrimPrefix(prefixPath, "-I") prefixPath = strings.TrimPrefix(prefixPath, "-I")
var includePaths []string var includePaths []string
for _, file := range files { for _, file := range files {
@@ -260,43 +281,3 @@ func removePrefix(str string, prefixes []string) string {
} }
return str return str
} }
var (
reSubcmd = regexp.MustCompile(`\$\([^)]+\)`)
reFlag = regexp.MustCompile(`[^ \t\n]+`)
)
func expandEnv(s string) string {
return expandEnvWithCmd(s)
}
func expandEnvWithCmd(s string) string {
expanded := reSubcmd.ReplaceAllStringFunc(s, func(m string) string {
subcmd := strings.TrimSpace(s[2 : len(s)-1])
args := parseSubcmd(subcmd)
cmd := args[0]
if cmd != "pkg-config" && cmd != "llvm-config" {
fmt.Fprintf(os.Stderr, "expand cmd only support pkg-config and llvm-config: '%s'\n", subcmd)
return ""
}
var out []byte
var err error
out, err = exec.Command(cmd, args[1:]...).Output()
if err != nil {
// TODO(kindy): log in verbose mode
return ""
}
return string(out)
})
return os.Expand(expanded, os.Getenv)
}
func parseSubcmd(s string) []string {
return reFlag.FindAllString(s, -1)
}