Bug 1490948: Add support for extra bindgen flags when compiling Cranelift; r=froydnj

Some build flags are being passed by the build system: they're passed in a text
file called extra-bindgen-flags.in that's filled at configure time.

Other flags have to be inferred from the current target/host combination, in
Cranelift's build script directly. This is mostly cargo-culted from the
ServoBindings.toml file, and should probably be merged in the build system at
some point.

Some Windows-specific adjustments were needed to provide access to libclang for
bindgen support, by adding clang-cl to the plain Spidermonkey Windows builds.

--HG--
extra : rebase_source : 0bda40b1d1eb38c2657593f094c951013711d00a
extra : histedit_source : aad930a5f9099e299d385ae4de2deb81aed9b6d5
This commit is contained in:
Benjamin Bouvier 2018-09-25 15:31:22 +02:00
Родитель be8a563409
Коммит 2ab4b1419f
8 изменённых файлов: 100 добавлений и 9 удалений

Просмотреть файл

@ -1116,10 +1116,10 @@ def check_have_64_bit(have_64_bit, compiler_have_64_bit):
'about the target bitness.')
option(env='BINDGEN_CFLAGS',
nargs=1,
default=bindgen_cflags_defaults,
help='Options bindgen should pass to the C/C++ parser')
js_option(env='BINDGEN_CFLAGS',
nargs=1,
default=bindgen_cflags_defaults,
help='Options bindgen should pass to the C/C++ parser')
@depends('BINDGEN_CFLAGS')

Просмотреть файл

@ -1820,6 +1820,9 @@ elif test "$EARLY_BETA_OR_EARLIER"; then
fi
AC_SUBST(EARLY_BETA_OR_EARLIER)
BINDGEN_SYSTEM_FLAGS="$_BINDGEN_CFLAGS $NSPR_CFLAGS"
AC_SUBST(BINDGEN_SYSTEM_FLAGS)
dnl ========================================================
dnl JavaScript shell
dnl ========================================================

Просмотреть файл

@ -0,0 +1 @@
@BINDGEN_SYSTEM_FLAGS@

Просмотреть файл

@ -6,6 +6,8 @@
RustLibrary('jsrust')
CONFIGURE_SUBST_FILES += ['extra-bindgen-flags']
if CONFIG['JS_SHARED_LIBRARY']:
FINAL_LIBRARY = 'js'

Просмотреть файл

@ -22,13 +22,22 @@
extern crate bindgen;
use std::env;
use std::fs::File;
use std::io::prelude::*;
use std::path::PathBuf;
enum Arch {
X86,
X64,
Arm,
Aarch64
}
fn main() {
// Tell Cargo to regenerate the bindings if the header file changes.
println!("cargo:rerun-if-changed=baldrapi.h");
let bindings = bindgen::builder()
let mut bindings = bindgen::builder()
.disable_name_namespacing()
// We whitelist the Baldr C functions and get the associated types for free.
.whitelist_function("env_.*")
@ -40,8 +49,79 @@ fn main() {
.rustified_enum("BD_.*|Trap|TypeCode|FuncTypeIdDescKind")
.whitelist_type("BD_.*|Trap|TypeCode|FuncTypeIdDescKind")
.header("baldrapi.h")
.clang_args(&["-x", "c++", "-std=c++14"])
.clang_arg("-I../..")
.clang_args(&["-x", "c++", "-std=gnu++14", "-fno-sized-deallocation", "-DRUST_BINDGEN"])
.clang_arg("-I../..");
let arch = {
let target_arch = env::var("CARGO_CFG_TARGET_ARCH");
match target_arch.as_ref().map(|x| x.as_str()) {
Ok("aarch64") => Arch::Aarch64,
Ok("arm") => Arch::Arm,
Ok("x86") => Arch::X86,
Ok("x86_64") => Arch::X64,
_ => panic!("unknown arch")
}
};
match env::var("CARGO_CFG_TARGET_OS").as_ref().map(|x| x.as_str()) {
Ok("android") => {
bindings = bindings.clang_arg("-DOS_ANDROID=1");
bindings = match arch {
Arch::Aarch64 => { bindings.clang_arg("--target=aarch64-linux-android") }
Arch::Arm => { bindings.clang_arg("--target=armv7-linux-androideabi") }
Arch::X86 => { bindings.clang_arg("--target=i686-linux-android") }
Arch::X64 => { bindings.clang_arg("--target=x86_64-linux-android") }
};
}
Ok("linux") | Ok("freebsd") | Ok("dragonfly") | Ok("openbsd") | Ok("bitrig") | Ok("netbsd")
| Ok("macos") | Ok("ios") => {
// Nothing to do in particular for these OSes, until proven the contrary.
}
Ok("windows") => {
bindings = bindings.clang_arg("-DOS_WIN=1")
.clang_arg("-DWIN32=1");
bindings = match env::var("CARGO_CFG_TARGET_ENV").as_ref().map(|x| x.as_str()) {
Ok("msvc") => {
bindings = bindings.clang_arg("-fms-compatibility-version=19");
bindings = bindings.clang_arg("-D_CRT_USE_BUILTIN_OFFSETOF");
bindings = bindings.clang_arg("-DHAVE_VISIBILITY_HIDDEN_ATTRIBUTE=1");
match arch {
Arch::X86 => { bindings.clang_arg("--target=i686-pc-win32") },
Arch::X64 => { bindings.clang_arg("--target=x86_64-pc-win32") },
Arch::Aarch64 => { bindings.clang_arg("--target=aarch64-pc-windows-msvc") }
_ => panic!("unknown Windows architecture for msvc build")
}
}
Ok("gnu") => {
match arch {
Arch::X86 => { bindings.clang_arg("--target=i686-pc-mingw32") },
Arch::X64 => { bindings.clang_arg("--target=x86_64-w64-mingw32") },
_ => panic!("unknown Windows architecture for gnu build")
}
}
_ => panic!("unknown Windows build environment")
};
}
os => panic!("unknown target os {:?}!", os)
}
let path = PathBuf::from(env::var_os("MOZ_TOPOBJDIR").unwrap()).join("js/src/rust/extra-bindgen-flags");
let mut extra_flags = String::new();
File::open(&path)
.expect("Failed to open extra-bindgen-flags file")
.read_to_string(&mut extra_flags)
.expect("Failed to read extra-bindgen-flags file");
let display_path = path.to_str().expect("path is utf8 encoded");
println!("cargo:rerun-if-changed={}", display_path);
let extra_flags: Vec<String> = extra_flags.split_whitespace().map(|s| s.to_owned()).collect();
for flag in extra_flags {
bindings = bindings.clang_arg(flag);
}
let bindings = bindings
.generate()
.expect("Unable to generate baldrapi.h bindings");

Просмотреть файл

@ -1,4 +1,4 @@
[build]
args = [
@BINDGEN_SYSTEM_FLAGS@
@BINDGEN_SYSTEM_TOML_FLAGS@
]

Просмотреть файл

@ -3946,7 +3946,9 @@ AC_SUBST_LIST(MOZ_CAIRO_OSLIBS)
AC_SUBST(MOZ_TREE_PIXMAN)
BINDGEN_SYSTEM_FLAGS="$_BINDGEN_CFLAGS $NSPR_CFLAGS $NSS_CFLAGS $MOZ_PIXMAN_CFLAGS $MOZ_CAIRO_CFLAGS"
AC_SUBST_TOML_LIST(BINDGEN_SYSTEM_FLAGS)
AC_SUBST(BINDGEN_SYSTEM_FLAGS)
BINDGEN_SYSTEM_TOML_FLAGS="$BINDGEN_SYSTEM_FLAGS"
AC_SUBST_TOML_LIST(BINDGEN_SYSTEM_TOML_FLAGS)
dnl ========================================================
dnl disable xul

Просмотреть файл

@ -19,6 +19,7 @@ sm-plain-win32/debug:
run:
spidermonkey-variant: plaindebug
toolchains:
- win64-clang-cl
- win64-rust
sm-plain-win32/opt:
@ -31,6 +32,7 @@ sm-plain-win32/opt:
run:
spidermonkey-variant: plain
toolchains:
- win64-clang-cl
- win64-rust
sm-compacting-win32/debug:
@ -43,4 +45,5 @@ sm-compacting-win32/debug:
run:
spidermonkey-variant: compacting
toolchains:
- win64-clang-cl
- win64-rust