Clang

这个包提供了一个用于 libclang 的 Julia 语言封装器:一个稳定的,C 导出的 LLVM Clang 编译器的接口。 libclang API 文档 提供了有关通过 libclang 可用功能的背景信息,因而也可以通过 Julia 封装器使用。

安装

现在,该软件包在 Linux、macOS 和 Windows 上提供开箱即用的安装体验。你可以简单地运行下边代码来安装它:

pkg> add Clang

C 绑定生成器

该软件包包括一个生成器,用于从一组头文件的 C 库创建 Julia 包装器。目前支持以下声明:

  • function:翻译成 Julia 的 ccall(关于可变参数函数的一些注意事项,参见 可变函数

  • struct:翻译成 Julia 的 struct

  • eznum:翻译为 EnumCEnum

  • union:翻译成 Julia 的 struct

  • typedef:转换为 Julia typealias 以表示底层内置类型

  • macro:有限的支持

  • bitfield:实验性支持

以下示例封装了 Clang_jll 中的 include/clang-c/*.h 并将封装器的代码输出到 LibClang.jl

首先写一个配置脚本 generator.toml

[general]
library_name = "libclang"
output_file_path = "./LibClang.jl"
module_name = "LibClang"
jll_pkg_name = "Clang_jll"
export_symbol_prefixes = ["CX", "clang_"]

然后加载配置并生成封装器。

using Clang.Generators
using Clang.LibClang.Clang_jll

cd(@__DIR__)

include_dir = normpath(Clang_jll.artifact_dir, "include")
clang_dir = joinpath(include_dir, "clang-c")

# wrapper generator options
options = load_options(joinpath(@__DIR__, "generator.toml"))

# add compiler flags, e.g. "-DXXXXXXXXX"
args = get_default_args()
push!(args, "-I$include_dir")

headers = [joinpath(clang_dir, header) for header in readdir(clang_dir) if endswith(header, ".h")]
# there is also an experimental `detect_headers` function for auto-detecting top-level headers in the directory
# headers = detect_headers(clang_dir, args)

# create context
ctx = create_context(headers, args, options)

# run generator
build!(ctx)
兼容性

上述的生成器在 Clang.jl 0.14 中引入的。如果您使用的是旧版本的 Clang.jl,请查看 旧版本文档

LibClang

LibClang 是 libclang 的精简封装器。它一对一映射到 libclang API。 通过执行 using Clang.LibClang,所有以 CX/clang_ 为前缀的 libclang API 都会被导入到当前命名空间,您可以使用它从头开始构建自己的工具。如果你不熟悉 Clang AST,一个很好的初学教程是 Introduction to the Clang AST