mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
script: Move code generation and webidl files to new script_bindings crate. (#35157)
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
This commit is contained in:
parent
a88b59534f
commit
af8d7c2de7
469 changed files with 187 additions and 137 deletions
13
Cargo.lock
generated
13
Cargo.lock
generated
|
@ -6176,14 +6176,13 @@ dependencies = [
|
||||||
"parking_lot",
|
"parking_lot",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"phf",
|
"phf",
|
||||||
"phf_codegen",
|
|
||||||
"phf_shared 0.11.2",
|
|
||||||
"pixels",
|
"pixels",
|
||||||
"profile_traits",
|
"profile_traits",
|
||||||
"range",
|
"range",
|
||||||
"ref_filter_map",
|
"ref_filter_map",
|
||||||
"regex",
|
"regex",
|
||||||
"ring",
|
"ring",
|
||||||
|
"script_bindings",
|
||||||
"script_layout_interface",
|
"script_layout_interface",
|
||||||
"script_traits",
|
"script_traits",
|
||||||
"selectors",
|
"selectors",
|
||||||
|
@ -6220,6 +6219,16 @@ dependencies = [
|
||||||
"xml5ever",
|
"xml5ever",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "script_bindings"
|
||||||
|
version = "0.0.1"
|
||||||
|
dependencies = [
|
||||||
|
"phf_codegen",
|
||||||
|
"phf_shared 0.11.2",
|
||||||
|
"serde_json",
|
||||||
|
"style",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "script_layout_interface"
|
name = "script_layout_interface"
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
|
|
|
@ -21,17 +21,12 @@ tracing = ["dep:tracing"]
|
||||||
webgl_backtrace = ["canvas_traits/webgl_backtrace"]
|
webgl_backtrace = ["canvas_traits/webgl_backtrace"]
|
||||||
js_backtrace = []
|
js_backtrace = []
|
||||||
refcell_backtrace = ["accountable-refcell"]
|
refcell_backtrace = ["accountable-refcell"]
|
||||||
webxr = ["webxr-api"]
|
webxr = ["webxr-api", "script_bindings/webxr"]
|
||||||
webgpu = []
|
webgpu = ["script_bindings/webgpu"]
|
||||||
|
|
||||||
[lints.rust]
|
[lints.rust]
|
||||||
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(crown)'] }
|
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(crown)'] }
|
||||||
|
|
||||||
[build-dependencies]
|
|
||||||
phf_codegen = "0.11"
|
|
||||||
phf_shared = "0.11"
|
|
||||||
serde_json = { workspace = true }
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
aes = { workspace = true }
|
aes = { workspace = true }
|
||||||
aes-kw = { workspace = true }
|
aes-kw = { workspace = true }
|
||||||
|
@ -99,6 +94,7 @@ range = { path = "../range" }
|
||||||
ref_filter_map = "1.0.1"
|
ref_filter_map = "1.0.1"
|
||||||
regex = { workspace = true }
|
regex = { workspace = true }
|
||||||
ring = { workspace = true }
|
ring = { workspace = true }
|
||||||
|
script_bindings = { path = "../script_bindings" }
|
||||||
script_layout_interface = { workspace = true }
|
script_layout_interface = { workspace = true }
|
||||||
script_traits = { workspace = true }
|
script_traits = { workspace = true }
|
||||||
selectors = { workspace = true }
|
selectors = { workspace = true }
|
||||||
|
|
|
@ -2,121 +2,11 @@
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
use std::fs::File;
|
use std::env;
|
||||||
use std::io::Write;
|
|
||||||
use std::path::PathBuf;
|
|
||||||
use std::process::Command;
|
|
||||||
use std::time::Instant;
|
|
||||||
use std::{env, fmt};
|
|
||||||
|
|
||||||
use phf_shared::{self, FmtConst};
|
|
||||||
use serde_json::{self, Value};
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let start = Instant::now();
|
println!(
|
||||||
|
"cargo:rustc-env=BINDINGS_OUT_DIR={}",
|
||||||
let style_out_dir = PathBuf::from(env::var_os("DEP_SERVO_STYLE_CRATE_OUT_DIR").unwrap());
|
env::var("DEP_SCRIPT_BINDINGS_CRATE_OUT_DIR").unwrap(),
|
||||||
let css_properties_json = style_out_dir.join("css-properties.json");
|
);
|
||||||
let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap());
|
|
||||||
|
|
||||||
println!("cargo::rerun-if-changed=dom/webidls");
|
|
||||||
println!("cargo::rerun-if-changed=dom/bindings/codegen");
|
|
||||||
println!("cargo::rerun-if-changed={}", css_properties_json.display());
|
|
||||||
println!("cargo::rerun-if-changed=../../third_party/WebIDL/WebIDL.py");
|
|
||||||
// NB: We aren't handling changes in `third_party/ply` here.
|
|
||||||
|
|
||||||
let status = Command::new(find_python())
|
|
||||||
.arg("dom/bindings/codegen/run.py")
|
|
||||||
.arg(&css_properties_json)
|
|
||||||
.arg(&out_dir)
|
|
||||||
.status()
|
|
||||||
.unwrap();
|
|
||||||
if !status.success() {
|
|
||||||
std::process::exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
println!("Binding generation completed in {:?}", start.elapsed());
|
|
||||||
|
|
||||||
let json = out_dir.join("InterfaceObjectMapData.json");
|
|
||||||
let json: Value = serde_json::from_reader(File::open(json).unwrap()).unwrap();
|
|
||||||
let mut map = phf_codegen::Map::new();
|
|
||||||
for (key, value) in json.as_object().unwrap() {
|
|
||||||
map.entry(Bytes(key), value.as_str().unwrap());
|
|
||||||
}
|
|
||||||
let phf = PathBuf::from(env::var_os("OUT_DIR").unwrap()).join("InterfaceObjectMapPhf.rs");
|
|
||||||
let mut phf = File::create(phf).unwrap();
|
|
||||||
writeln!(
|
|
||||||
&mut phf,
|
|
||||||
"pub(crate) static MAP: phf::Map<&'static [u8], fn(JSContext, HandleObject)> = {};",
|
|
||||||
map.build(),
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Eq, Hash, PartialEq)]
|
|
||||||
struct Bytes<'a>(&'a str);
|
|
||||||
|
|
||||||
impl FmtConst for Bytes<'_> {
|
|
||||||
fn fmt_const(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
write!(formatter, "b\"{}\"", self.0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl phf_shared::PhfHash for Bytes<'_> {
|
|
||||||
fn phf_hash<H: std::hash::Hasher>(&self, hasher: &mut H) {
|
|
||||||
self.0.as_bytes().phf_hash(hasher)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Tries to find a suitable python
|
|
||||||
///
|
|
||||||
/// Algorithm
|
|
||||||
/// 1. Trying to find python3/python in $VIRTUAL_ENV (this should be from Servo's venv)
|
|
||||||
/// 2. Checking PYTHON3 (set by mach)
|
|
||||||
/// 3. Falling back to the system installation.
|
|
||||||
///
|
|
||||||
/// Note: This function should be kept in sync with the version in `components/servo/build.rs`
|
|
||||||
fn find_python() -> PathBuf {
|
|
||||||
let mut candidates = vec![];
|
|
||||||
if let Some(venv) = env::var_os("VIRTUAL_ENV") {
|
|
||||||
let bin_directory = PathBuf::from(venv).join("bin");
|
|
||||||
|
|
||||||
let python3 = bin_directory.join("python3");
|
|
||||||
if python3.exists() {
|
|
||||||
candidates.push(python3);
|
|
||||||
}
|
|
||||||
let python = bin_directory.join("python");
|
|
||||||
if python.exists() {
|
|
||||||
candidates.push(python);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
if let Some(python3) = env::var_os("PYTHON3") {
|
|
||||||
let python3 = PathBuf::from(python3);
|
|
||||||
if python3.exists() {
|
|
||||||
candidates.push(python3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let system_python = ["python3", "python"].map(PathBuf::from);
|
|
||||||
candidates.extend_from_slice(&system_python);
|
|
||||||
|
|
||||||
for name in &candidates {
|
|
||||||
// Command::new() allows us to omit the `.exe` suffix on windows
|
|
||||||
if Command::new(name)
|
|
||||||
.arg("--version")
|
|
||||||
.output()
|
|
||||||
.is_ok_and(|out| out.status.success())
|
|
||||||
{
|
|
||||||
return name.to_owned();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let candidates = candidates
|
|
||||||
.into_iter()
|
|
||||||
.map(|c| c.into_os_string())
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
panic!(
|
|
||||||
"Can't find python (tried {:?})! Try enabling Servo's Python venv, \
|
|
||||||
setting the PYTHON3 env var or adding python3 to PATH.",
|
|
||||||
candidates.join(", ".as_ref())
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -174,28 +174,28 @@ pub(crate) mod xmlname;
|
||||||
#[allow(missing_docs, non_snake_case)]
|
#[allow(missing_docs, non_snake_case)]
|
||||||
pub(crate) mod codegen {
|
pub(crate) mod codegen {
|
||||||
pub(crate) mod DomTypeHolder {
|
pub(crate) mod DomTypeHolder {
|
||||||
include!(concat!(env!("OUT_DIR"), "/DomTypeHolder.rs"));
|
include!(concat!(env!("BINDINGS_OUT_DIR"), "/DomTypeHolder.rs"));
|
||||||
}
|
}
|
||||||
pub(crate) mod DomTypes {
|
pub(crate) mod DomTypes {
|
||||||
include!(concat!(env!("OUT_DIR"), "/DomTypes.rs"));
|
include!(concat!(env!("BINDINGS_OUT_DIR"), "/DomTypes.rs"));
|
||||||
}
|
}
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pub(crate) mod Bindings {
|
pub(crate) mod Bindings {
|
||||||
include!(concat!(env!("OUT_DIR"), "/Bindings/mod.rs"));
|
include!(concat!(env!("BINDINGS_OUT_DIR"), "/Bindings/mod.rs"));
|
||||||
}
|
}
|
||||||
pub(crate) mod InterfaceObjectMap {
|
pub(crate) mod InterfaceObjectMap {
|
||||||
include!(concat!(env!("OUT_DIR"), "/InterfaceObjectMap.rs"));
|
include!(concat!(env!("BINDINGS_OUT_DIR"), "/InterfaceObjectMap.rs"));
|
||||||
}
|
}
|
||||||
#[allow(dead_code, unused_imports, clippy::enum_variant_names)]
|
#[allow(dead_code, unused_imports, clippy::enum_variant_names)]
|
||||||
pub(crate) mod InheritTypes {
|
pub(crate) mod InheritTypes {
|
||||||
include!(concat!(env!("OUT_DIR"), "/InheritTypes.rs"));
|
include!(concat!(env!("BINDINGS_OUT_DIR"), "/InheritTypes.rs"));
|
||||||
}
|
}
|
||||||
#[allow(clippy::upper_case_acronyms)]
|
#[allow(clippy::upper_case_acronyms)]
|
||||||
pub(crate) mod PrototypeList {
|
pub(crate) mod PrototypeList {
|
||||||
include!(concat!(env!("OUT_DIR"), "/PrototypeList.rs"));
|
include!(concat!(env!("BINDINGS_OUT_DIR"), "/PrototypeList.rs"));
|
||||||
}
|
}
|
||||||
pub(crate) mod RegisterBindings {
|
pub(crate) mod RegisterBindings {
|
||||||
include!(concat!(env!("OUT_DIR"), "/RegisterBindings.rs"));
|
include!(concat!(env!("BINDINGS_OUT_DIR"), "/RegisterBindings.rs"));
|
||||||
}
|
}
|
||||||
#[allow(
|
#[allow(
|
||||||
non_camel_case_types,
|
non_camel_case_types,
|
||||||
|
@ -206,6 +206,6 @@ pub(crate) mod codegen {
|
||||||
clippy::enum_variant_names
|
clippy::enum_variant_names
|
||||||
)]
|
)]
|
||||||
pub(crate) mod UnionTypes {
|
pub(crate) mod UnionTypes {
|
||||||
include!(concat!(env!("OUT_DIR"), "/UnionTypes.rs"));
|
include!(concat!(env!("BINDINGS_OUT_DIR"), "/UnionTypes.rs"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -206,7 +206,7 @@
|
||||||
pub(crate) mod macros;
|
pub(crate) mod macros;
|
||||||
|
|
||||||
pub(crate) mod types {
|
pub(crate) mod types {
|
||||||
include!(concat!(env!("OUT_DIR"), "/InterfaceTypes.rs"));
|
include!(concat!(env!("BINDINGS_OUT_DIR"), "/InterfaceTypes.rs"));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) mod abortcontroller;
|
pub(crate) mod abortcontroller;
|
||||||
|
|
28
components/script_bindings/Cargo.toml
Normal file
28
components/script_bindings/Cargo.toml
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
[package]
|
||||||
|
name = "script_bindings"
|
||||||
|
build = "build.rs"
|
||||||
|
version.workspace = true
|
||||||
|
authors.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
publish.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
|
||||||
|
# https://github.com/rust-lang/cargo/issues/3544
|
||||||
|
links = "script_bindings_crate"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "script_bindings"
|
||||||
|
path = "lib.rs"
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
phf_codegen = "0.11"
|
||||||
|
phf_shared = "0.11"
|
||||||
|
serde_json = { workspace = true }
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
style = { workspace = true }
|
||||||
|
|
||||||
|
[features]
|
||||||
|
webgpu = []
|
||||||
|
webxr = []
|
124
components/script_bindings/build.rs
Normal file
124
components/script_bindings/build.rs
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::Write;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use std::process::Command;
|
||||||
|
use std::time::Instant;
|
||||||
|
use std::{env, fmt};
|
||||||
|
|
||||||
|
use phf_shared::{self, FmtConst};
|
||||||
|
use serde_json::{self, Value};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let start = Instant::now();
|
||||||
|
|
||||||
|
let style_out_dir = PathBuf::from(env::var_os("DEP_SERVO_STYLE_CRATE_OUT_DIR").unwrap());
|
||||||
|
let css_properties_json = style_out_dir.join("css-properties.json");
|
||||||
|
let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap());
|
||||||
|
|
||||||
|
println!("cargo:out_dir={}", out_dir.display());
|
||||||
|
|
||||||
|
println!("cargo::rerun-if-changed=webidls");
|
||||||
|
println!("cargo::rerun-if-changed=codegen");
|
||||||
|
println!("cargo::rerun-if-changed={}", css_properties_json.display());
|
||||||
|
println!("cargo::rerun-if-changed=../../third_party/WebIDL/WebIDL.py");
|
||||||
|
// NB: We aren't handling changes in `third_party/ply` here.
|
||||||
|
|
||||||
|
let status = Command::new(find_python())
|
||||||
|
.arg("codegen/run.py")
|
||||||
|
.arg(&css_properties_json)
|
||||||
|
.arg(&out_dir)
|
||||||
|
.status()
|
||||||
|
.unwrap();
|
||||||
|
if !status.success() {
|
||||||
|
std::process::exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("Binding generation completed in {:?}", start.elapsed());
|
||||||
|
|
||||||
|
let json = out_dir.join("InterfaceObjectMapData.json");
|
||||||
|
let json: Value = serde_json::from_reader(File::open(json).unwrap()).unwrap();
|
||||||
|
let mut map = phf_codegen::Map::new();
|
||||||
|
for (key, value) in json.as_object().unwrap() {
|
||||||
|
map.entry(Bytes(key), value.as_str().unwrap());
|
||||||
|
}
|
||||||
|
let phf = PathBuf::from(env::var_os("OUT_DIR").unwrap()).join("InterfaceObjectMapPhf.rs");
|
||||||
|
let mut phf = File::create(phf).unwrap();
|
||||||
|
writeln!(
|
||||||
|
&mut phf,
|
||||||
|
"pub(crate) static MAP: phf::Map<&'static [u8], fn(JSContext, HandleObject)> = {};",
|
||||||
|
map.build(),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Eq, Hash, PartialEq)]
|
||||||
|
struct Bytes<'a>(&'a str);
|
||||||
|
|
||||||
|
impl FmtConst for Bytes<'_> {
|
||||||
|
fn fmt_const(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
write!(formatter, "b\"{}\"", self.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl phf_shared::PhfHash for Bytes<'_> {
|
||||||
|
fn phf_hash<H: std::hash::Hasher>(&self, hasher: &mut H) {
|
||||||
|
self.0.as_bytes().phf_hash(hasher)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Tries to find a suitable python
|
||||||
|
///
|
||||||
|
/// Algorithm
|
||||||
|
/// 1. Trying to find python3/python in $VIRTUAL_ENV (this should be from Servo's venv)
|
||||||
|
/// 2. Checking PYTHON3 (set by mach)
|
||||||
|
/// 3. Falling back to the system installation.
|
||||||
|
///
|
||||||
|
/// Note: This function should be kept in sync with the version in `components/servo/build.rs`
|
||||||
|
fn find_python() -> PathBuf {
|
||||||
|
let mut candidates = vec![];
|
||||||
|
if let Some(venv) = env::var_os("VIRTUAL_ENV") {
|
||||||
|
let bin_directory = PathBuf::from(venv).join("bin");
|
||||||
|
|
||||||
|
let python3 = bin_directory.join("python3");
|
||||||
|
if python3.exists() {
|
||||||
|
candidates.push(python3);
|
||||||
|
}
|
||||||
|
let python = bin_directory.join("python");
|
||||||
|
if python.exists() {
|
||||||
|
candidates.push(python);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if let Some(python3) = env::var_os("PYTHON3") {
|
||||||
|
let python3 = PathBuf::from(python3);
|
||||||
|
if python3.exists() {
|
||||||
|
candidates.push(python3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let system_python = ["python3", "python"].map(PathBuf::from);
|
||||||
|
candidates.extend_from_slice(&system_python);
|
||||||
|
|
||||||
|
for name in &candidates {
|
||||||
|
// Command::new() allows us to omit the `.exe` suffix on windows
|
||||||
|
if Command::new(name)
|
||||||
|
.arg("--version")
|
||||||
|
.output()
|
||||||
|
.is_ok_and(|out| out.status.success())
|
||||||
|
{
|
||||||
|
return name.to_owned();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let candidates = candidates
|
||||||
|
.into_iter()
|
||||||
|
.map(|c| c.into_os_string())
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
panic!(
|
||||||
|
"Can't find python (tried {:?})! Try enabling Servo's Python venv, \
|
||||||
|
setting the PYTHON3 env var or adding python3 to PATH.",
|
||||||
|
candidates.join(", ".as_ref())
|
||||||
|
)
|
||||||
|
}
|
|
@ -8229,7 +8229,7 @@ class GlobalGenRoots():
|
||||||
], "\n")), pre="#[derive(Clone, Copy)]\npub(crate) struct Globals: u8 {\n", post="\n}")
|
], "\n")), pre="#[derive(Clone, Copy)]\npub(crate) struct Globals: u8 {\n", post="\n}")
|
||||||
globals_ = CGWrapper(CGIndenter(global_flags), pre="bitflags::bitflags! {\n", post="\n}")
|
globals_ = CGWrapper(CGIndenter(global_flags), pre="bitflags::bitflags! {\n", post="\n}")
|
||||||
|
|
||||||
phf = CGGeneric("include!(concat!(env!(\"OUT_DIR\"), \"/InterfaceObjectMapPhf.rs\"));")
|
phf = CGGeneric("include!(concat!(env!(\"BINDINGS_OUT_DIR\"), \"/InterfaceObjectMapPhf.rs\"));")
|
||||||
|
|
||||||
return CGList([
|
return CGList([
|
||||||
CGGeneric(AUTOGENERATED_WARNING_COMMENT),
|
CGGeneric(AUTOGENERATED_WARNING_COMMENT),
|
|
@ -8,7 +8,7 @@ import json
|
||||||
import re
|
import re
|
||||||
|
|
||||||
SCRIPT_PATH = os.path.abspath(os.path.dirname(__file__))
|
SCRIPT_PATH = os.path.abspath(os.path.dirname(__file__))
|
||||||
SERVO_ROOT = os.path.abspath(os.path.join(SCRIPT_PATH, "..", "..", "..", "..", ".."))
|
SERVO_ROOT = os.path.abspath(os.path.join(SCRIPT_PATH, "..", "..", ".."))
|
||||||
|
|
||||||
FILTER_PATTERN = re.compile("// skip-unless ([A-Z_]+)\n")
|
FILTER_PATTERN = re.compile("// skip-unless ([A-Z_]+)\n")
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ def main():
|
||||||
# Do not ascend above the target dir, because it may not be called target
|
# Do not ascend above the target dir, because it may not be called target
|
||||||
# or even have a parent (see CARGO_TARGET_DIR).
|
# or even have a parent (see CARGO_TARGET_DIR).
|
||||||
doc_servo = os.path.join(out_dir, "..", "..", "..", "..", "doc")
|
doc_servo = os.path.join(out_dir, "..", "..", "..", "..", "doc")
|
||||||
webidls_dir = os.path.join(SCRIPT_PATH, "..", "..", "webidls")
|
webidls_dir = os.path.join(SCRIPT_PATH, "..", "webidls")
|
||||||
config_file = "Bindings.conf"
|
config_file = "Bindings.conf"
|
||||||
|
|
||||||
import WebIDL
|
import WebIDL
|
3
components/script_bindings/lib.rs
Normal file
3
components/script_bindings/lib.rs
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue