c/clang/symg:use cjson get conf
This commit is contained in:
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user