go-clang / gen

Generate Go bindings for Clang's C API
https://pkg.go.dev/github.com/go-clang/gen
BSD 3-Clause "New" or "Revised" License
44 stars 5 forks source link

new binding for libclang-v17 #183

Open Newbluecake opened 9 months ago

Newbluecake commented 9 months ago

Hi, I'm using this library to parse c/c++ code. Everying is good until I need a new api in v17. I try to gen binding for this version, but there seems to be some error. Could you support this version?

anatol commented 6 months ago

The same request. Is this library planned to be ported to the latest LLVM release?

Newbluecake commented 6 months ago

I have ported one https://github.com/Newbluecake/bootstrap/tree/clang-v17, but not latest version

anatol commented 6 months ago

Thank you @Newbluecake for your work.

I am trying to compile this code with your library https://gist.githubusercontent.com/josharian/54b2268af5792ff0e62f06437f28a8c9/raw/f4d07e7340ae0bf84991deaa9d2cb478b7909d4a/gen_git2go_enum.go

and I have a warning:

# github.com/Newbluecake/bootstrap/clang
cgo-gcc-prolog: In function ‘_cgo_19b11e5eef9a_Cfunc_clang_getDiagnosticCategoryName’:
cgo-gcc-prolog:269:2: warning: ‘clang_getDiagnosticCategoryName’ is deprecated [-Wdeprecated-declarations]
In file included from ../../../go/pkg/mod/github.com/!newbluecake/bootstrap@v0.17.1/clang/clang_gen.go:4:
../../../go/pkg/mod/github.com/!newbluecake/bootstrap@v0.17.1/clang/./clang-c/CXDiagnostic.h:314:1: note: declared here
  314 | clang_getDiagnosticCategoryName(unsigned Category);
      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

it seems harmless. But then I run the tool with ./tool -fname ~/sources/libgit2/include/git2/oid.h but it fails:

/usr/include/time.h:29:10: fatal error: 'stddef.h' file not found
PROBLEM: 'stddef.h' file not found

which seems comes from

tu := idx.ParseTranslationUnit(*fname, []string{"-DDOCURIUM=1"}, nil, 0)

line. Do you have any idea why does it fail to find clang's stddef.h file?

My system is Arch Linux up-to-date with clang v17:

$ clang --version
clang version 17.0.6
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Newbluecake commented 6 months ago

Yeah, it seems that libclang did't automatically add system dir for header search. I add following code in my project to fix this problem:

    cmd := exec.Command("bash", "-c", "echo | clang -E -v -")
    output, err := cmd.CombinedOutput()
    if err != nil {
        return utils.LogError("exec clang err: %v", err)
    }

    outputStr := string(output)
    lines := strings.Split(outputStr, "\n")
    var start, end int
    for i, line := range lines {
        if line == "#include <...> search starts here:" {
            start = i + 1
        } else if line == "End of search list." {
            end = i - 1
            break
        }
    }

    for i := start; i <= end; i++ {
        dir := strings.TrimSpace(lines[i])
        if dir == "" {
            continue
        }

        psr.SysInclude = append(psr.SysInclude, dir)
    }
anatol commented 6 months ago

It is a bit strange that libclang is unable to detect the clang's sysinclude dir automatically.

BTW @Newbluecake is there any chance you can update the bindings to clang-v18?

Newbluecake commented 5 months ago

@anatol Sorry about that, you may checkout https://github.com/Newbluecake/gen and try it. If you have any question, I can help you.

lilili87222 commented 1 week ago

Can this generate libtooling binding of clang?