Skip to content

Commit

Permalink
llcppsigfetch:use clang's searchpath to keep libclang consist
Browse files Browse the repository at this point in the history
  • Loading branch information
luoliwoshang committed Feb 13, 2025
1 parent 41ee7bb commit 8f1c8cd
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 15 deletions.
9 changes: 6 additions & 3 deletions _xtool/llcppsigfetch/llcppsigfetch.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,12 @@ func main() {
isTemp = args.BoolArg(arg, false)
case strings.HasPrefix(arg, "-cpp="):
isCpp = args.BoolArg(arg, true)
case strings.HasPrefix(arg, "-resourceIncDir="):
// temp to avoid call clang -print-resource-dir in llcppsigfetch,will cause hang
parse.ResourceIncDir = args.StringArg(arg, "")
case strings.HasPrefix(arg, "-ClangResourceInclude="):
// temp to avoid call clang in llcppsigfetch,will cause hang
parse.ClangResourceInclude = args.StringArg(arg, "")
case strings.HasPrefix(arg, "-ClangSearchPath="):
// temp to avoid call clang in llcppsigfetch,will cause hang
parse.ClangSearchPath = strings.Split(args.StringArg(arg, ""), ",")
default:
otherArgs = append(otherArgs, arg)
}
Expand Down
3 changes: 1 addition & 2 deletions _xtool/llcppsigfetch/parse/cvt.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,8 @@ func initFileMap(cfg *Config) (map[string]*types.FileInfo, error) {
if len(incins) > 0 {
cur := unit.GetCursor(&incins[0])
incPath = toStr(cur.String())

fileMap[incedFile] = &types.FileInfo{
IsSys: loc.IsInSystemHeader() != 0 || (ResourceIncDir != "" && strings.HasPrefix(incedFile, ResourceIncDir)),
IsSys: loc.IsInSystemHeader() != 0 || (ClangResourceInclude != "" && strings.HasPrefix(incedFile, ClangResourceInclude)),
IncPath: incPath,
}
}
Expand Down
14 changes: 9 additions & 5 deletions _xtool/llcppsigfetch/parse/parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@ import (
"github.com/goplus/llgo/c/cjson"
)

// temp to avoid call clang -print-resource-dir in llcppsigfetch,will cause hang
var ResourceIncDir string
// temp to avoid call clang in llcppsigfetch,will cause hang
var ClangSearchPath []string
var ClangResourceInclude string

type Context struct {
FileSet []*ast.FileEntry
Expand Down Expand Up @@ -170,10 +171,13 @@ func Do(cfg *ParseConfig) (*types.Pkg, error) {
if err != nil {
return nil, err
}
libclangFlags := strings.Fields(cfg.Conf.CFlags)
if ResourceIncDir != "" {
libclangFlags = append(libclangFlags, "-I"+ResourceIncDir)
libclangFlags := []string{}
if len(ClangSearchPath) != 0 {
for _, path := range ClangSearchPath {
libclangFlags = append(libclangFlags, "-I"+path)
}
}
libclangFlags = append(libclangFlags, strings.Fields(cfg.Conf.CFlags)...)
// llvm cflags is not clang's include search path
converter, err := NewConverterX(
&Config{
Expand Down
33 changes: 33 additions & 0 deletions _xtool/llcppsymg/clangutils/clangutils.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"errors"
"os"
"os/exec"
"path/filepath"
"strings"
"unsafe"

"github.com/goplus/llgo/c"
Expand Down Expand Up @@ -145,3 +147,34 @@ func Preprocess(cfg *PreprocessConfig) error {
cmd.Stderr = os.Stderr
return cmd.Run()
}

func GetIncludePaths(isCpp bool) []string {
args := []string{"-E", "-v"}
args = append(args, defaultArgs(isCpp)...)
args = append(args, "/dev/null")
cmd := exec.Command("clang", args...)
output, err := cmd.CombinedOutput()
if err != nil {
panic(err)
}
return ParseClangIncOutput(string(output))
}

func ParseClangIncOutput(output string) []string {
var paths []string
start := strings.Index(output, "#include <...> search starts here:")
end := strings.Index(output, "End of search list.")
if start == -1 || end == -1 {
return paths
}
content := output[start:end]
lines := strings.Split(content, "\n")
for _, line := range lines[1:] {
for _, item := range strings.Fields(line) {
if path := strings.TrimSpace(item); filepath.IsAbs(path) {
paths = append(paths, path)
}
}
}
return paths
}
11 changes: 6 additions & 5 deletions cmd/gogensig/config/conf.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"sort"
"strings"

"github.com/goplus/llcppg/_xtool/llcppsymg/clangutils"
"github.com/goplus/llcppg/ast"
"github.com/goplus/llcppg/cmd/gogensig/unmarshal"
cppgtypes "github.com/goplus/llcppg/types"
Expand Down Expand Up @@ -60,16 +61,16 @@ func SigfetchExtract(cfg *SigfetchExtractConfig) ([]byte, error) {
args = append(args, "-cpp=false")
}

return executeSigfetch(args, cfg.Dir)
return executeSigfetch(args, cfg.Dir, cfg.IsCpp)
}

func SigfetchConfig(configFile string, dir string) ([]byte, error) {
func SigfetchConfig(configFile string, dir string, isCpp bool) ([]byte, error) {
args := []string{configFile}
return executeSigfetch(args, dir)
return executeSigfetch(args, dir, isCpp)
}

func executeSigfetch(args []string, dir string) ([]byte, error) {
cmd := exec.Command("llcppsigfetch", append(args, "-resourceIncDir="+ClangResourceDir())...)
func executeSigfetch(args []string, dir string, isCpp bool) ([]byte, error) {
cmd := exec.Command("llcppsigfetch", append(args, "-ClangResourceInclude="+ClangResourceDir(), "-ClangSearchPath="+strings.Join(clangutils.GetIncludePaths(isCpp), ","))...)
if dir != "" {
cmd.Dir = dir
}
Expand Down

0 comments on commit 8f1c8cd

Please sign in to comment.