summaryrefslogtreecommitdiffstats
path: root/build/rust/mozbuild
diff options
context:
space:
mode:
Diffstat (limited to 'build/rust/mozbuild')
-rw-r--r--build/rust/mozbuild/Cargo.toml8
-rw-r--r--build/rust/mozbuild/build.rs20
-rw-r--r--build/rust/mozbuild/generate_buildconfig.py95
-rw-r--r--build/rust/mozbuild/lib.rs20
-rw-r--r--build/rust/mozbuild/moz.build9
5 files changed, 152 insertions, 0 deletions
diff --git a/build/rust/mozbuild/Cargo.toml b/build/rust/mozbuild/Cargo.toml
new file mode 100644
index 0000000000..ef9b4c6ccf
--- /dev/null
+++ b/build/rust/mozbuild/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "mozbuild"
+version = "0.1.0"
+edition = "2018"
+license = "MPL-2.0"
+
+[lib]
+path = "lib.rs"
diff --git a/build/rust/mozbuild/build.rs b/build/rust/mozbuild/build.rs
new file mode 100644
index 0000000000..e9fb6b91b0
--- /dev/null
+++ b/build/rust/mozbuild/build.rs
@@ -0,0 +1,20 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+use std::path::PathBuf;
+
+fn main() {
+ let out_dir = PathBuf::from(std::env::var_os("OUT_DIR").unwrap());
+ if let Some(topobjdir) = out_dir
+ .ancestors()
+ .find(|dir| dir.join("config.status").exists())
+ {
+ println!(
+ "cargo:rustc-env=BUILDCONFIG_RS={}",
+ topobjdir
+ .join("build/rust/mozbuild/buildconfig.rs")
+ .display()
+ );
+ }
+}
diff --git a/build/rust/mozbuild/generate_buildconfig.py b/build/rust/mozbuild/generate_buildconfig.py
new file mode 100644
index 0000000000..2252276319
--- /dev/null
+++ b/build/rust/mozbuild/generate_buildconfig.py
@@ -0,0 +1,95 @@
+# 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 http://mozilla.org/MPL/2.0/.
+
+import string
+import textwrap
+
+import buildconfig
+
+
+def generate_bool(name):
+ value = buildconfig.substs.get(name)
+ return f"pub const {name}: bool = {'true' if value else 'false'};\n"
+
+
+def escape_rust_string(value):
+ """escape the string into a Rust literal"""
+ # This could be more generous, but we're only escaping paths with it.
+ unescaped = string.ascii_letters + string.digits + "/$+-_~ "
+ result = ""
+ for ch in str(value):
+ if ch in unescaped:
+ result += ch
+ elif ch == "\r":
+ result += "\\r"
+ elif ch == "\n":
+ result += "\\n"
+ elif ch == "\\":
+ result += "\\\\"
+ elif ch == '"':
+ result += '\\"'
+ else:
+ result += "\\u{%x}" % ord(ch)
+ return '"%s"' % result
+
+
+def generate(output):
+ # Write out a macro which can be used within `include!`-like methods to
+ # reference the topobjdir.
+ output.write(
+ textwrap.dedent(
+ f"""
+ /// Macro used to name a path in the objdir for use with macros like `include!`
+ #[macro_export]
+ macro_rules! objdir_path {{
+ ($path:literal) => {{
+ concat!({escape_rust_string(buildconfig.topobjdir + "/")}, $path)
+ }}
+ }}
+
+ /// Macro used to name a path in the srcdir for use with macros like `include!`
+ #[macro_export]
+ macro_rules! srcdir_path {{
+ ($path:literal) => {{
+ concat!({escape_rust_string(buildconfig.topsrcdir + "/")}, $path)
+ }}
+ }}
+
+ /// The objdir path for use in build scripts
+ pub const TOPOBJDIR: &str = {escape_rust_string(buildconfig.topobjdir)};
+ /// The srcdir path for use in build scripts
+ pub const TOPSRCDIR: &str = {escape_rust_string(buildconfig.topsrcdir)};
+
+ """
+ )
+ )
+
+ windows_rs_dir = buildconfig.substs.get("MOZ_WINDOWS_RS_DIR")
+ if windows_rs_dir:
+ output.write(
+ textwrap.dedent(
+ f"""
+ /// Macro used to name a path in the srcdir for use with macros like `include!`
+ #[macro_export]
+ macro_rules! windows_rs_path {{
+ ($path:literal) => {{
+ concat!({escape_rust_string(windows_rs_dir + "/")}, $path)
+ }}
+ }}
+
+ /// The path to the windows-rs crate, for use in build scripts
+ pub const WINDOWS_RS_DIR: &str = {escape_rust_string(windows_rs_dir)};
+
+ """
+ )
+ )
+
+ # Finally, write out some useful booleans from the buildconfig.
+ output.write(generate_bool("MOZ_FOLD_LIBS"))
+ output.write(generate_bool("NIGHTLY_BUILD"))
+ output.write(generate_bool("RELEASE_OR_BETA"))
+ output.write(generate_bool("EARLY_BETA_OR_EARLIER"))
+ output.write(generate_bool("MOZ_DEV_EDITION"))
+ output.write(generate_bool("MOZ_ESR"))
+ output.write(generate_bool("MOZ_DIAGNOSTIC_ASSERT_ENABLED"))
diff --git a/build/rust/mozbuild/lib.rs b/build/rust/mozbuild/lib.rs
new file mode 100644
index 0000000000..a22b1d9176
--- /dev/null
+++ b/build/rust/mozbuild/lib.rs
@@ -0,0 +1,20 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+use std::path::Path;
+
+// Path::new is not const at the moment. This is a non-generic version
+// of Path::new, similar to libstd's implementation of Path::new.
+#[inline(always)]
+const fn const_path(s: &'static str) -> &'static std::path::Path {
+ unsafe { &*(s as *const str as *const std::path::Path) }
+}
+
+pub const TOPOBJDIR: &Path = const_path(config::TOPOBJDIR);
+
+pub const TOPSRCDIR: &Path = const_path(config::TOPSRCDIR);
+
+pub mod config {
+ include!(env!("BUILDCONFIG_RS"));
+}
diff --git a/build/rust/mozbuild/moz.build b/build/rust/mozbuild/moz.build
new file mode 100644
index 0000000000..3cc09a7c5a
--- /dev/null
+++ b/build/rust/mozbuild/moz.build
@@ -0,0 +1,9 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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 http://mozilla.org/MPL/2.0/.
+
+GeneratedFile(
+ "buildconfig.rs", script="generate_buildconfig.py", entry_point="generate"
+)