summaryrefslogtreecommitdiffstats
path: root/toolkit/crashreporter/client/app/build.rs
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/crashreporter/client/app/build.rs')
-rw-r--r--toolkit/crashreporter/client/app/build.rs89
1 files changed, 89 insertions, 0 deletions
diff --git a/toolkit/crashreporter/client/app/build.rs b/toolkit/crashreporter/client/app/build.rs
new file mode 100644
index 0000000000..98f20dc375
--- /dev/null
+++ b/toolkit/crashreporter/client/app/build.rs
@@ -0,0 +1,89 @@
+/* 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::{env, path::Path};
+
+fn main() {
+ windows_manifest();
+ crash_ping_annotations();
+ set_mock_cfg();
+}
+
+fn windows_manifest() {
+ use embed_manifest::{embed_manifest, manifest, new_manifest};
+
+ if std::env::var_os("CARGO_CFG_WINDOWS").is_none() {
+ return;
+ }
+
+ // See https://docs.rs/embed-manifest/1.4.0/embed_manifest/fn.new_manifest.html for what the
+ // default manifest includes. The defaults include almost all of the settings used in the old
+ // crash reporter.
+ let manifest = new_manifest("CrashReporter")
+ // Use legacy active code page because GDI doesn't support per-process UTF8 (and older
+ // win10 may not support this setting anyway).
+ .active_code_page(manifest::ActiveCodePage::Legacy)
+ // GDI scaling is not enabled by default but we need it to make the GDI-drawn text look
+ // nice on high-DPI displays.
+ .gdi_scaling(manifest::Setting::Enabled);
+
+ embed_manifest(manifest).expect("unable to embed windows manifest file");
+
+ println!("cargo:rerun-if-changed=build.rs");
+}
+
+/// Generate crash ping annotation information from the yaml definition file.
+fn crash_ping_annotations() {
+ use std::fs::File;
+ use std::io::{BufWriter, Write};
+ use yaml_rust::{Yaml, YamlLoader};
+
+ let crash_annotations = Path::new("../../CrashAnnotations.yaml")
+ .canonicalize()
+ .unwrap();
+ println!("cargo:rerun-if-changed={}", crash_annotations.display());
+
+ let crash_ping_file = Path::new(&env::var("OUT_DIR").unwrap()).join("ping_annotations.rs");
+
+ let yaml = std::fs::read_to_string(crash_annotations).unwrap();
+ let Yaml::Hash(entries) = YamlLoader::load_from_str(&yaml)
+ .unwrap()
+ .into_iter()
+ .next()
+ .unwrap()
+ else {
+ panic!("unexpected crash annotations root type");
+ };
+
+ let ping_annotations = entries.into_iter().filter_map(|(k, v)| {
+ v["ping"]
+ .as_bool()
+ .unwrap_or(false)
+ .then(|| k.into_string().unwrap())
+ });
+
+ let mut phf_set = phf_codegen::Set::new();
+ for annotation in ping_annotations {
+ phf_set.entry(annotation);
+ }
+
+ let mut file = BufWriter::new(File::create(&crash_ping_file).unwrap());
+ writeln!(
+ &mut file,
+ "static PING_ANNOTATIONS: phf::Set<&'static str> = {};",
+ phf_set.build()
+ )
+ .unwrap();
+}
+
+/// Set the mock configuration option when tests are enabled or when the mock feature is enabled.
+fn set_mock_cfg() {
+ // Very inconveniently, there's no way to detect `cfg(test)` from build scripts. See
+ // https://github.com/rust-lang/cargo/issues/4789. This seems like an arbitrary and pointless
+ // limitation, and only complicates the evaluation of mock behavior. Because of this, we have a
+ // `mock` feature which is activated by `toolkit/library/rust/moz.build`.
+ if env::var_os("CARGO_FEATURE_MOCK").is_some() || mozbuild::config::MOZ_CRASHREPORTER_MOCK {
+ println!("cargo:rustc-cfg=mock");
+ }
+}