mirror of
https://github.com/slint-ui/slint.git
synced 2025-08-29 06:44:08 +00:00

For Ninja builds we instruct the compiler to generate a dependency file. This would include paths like builtin:/native/../common/slint-logo-light.svg, which my version of Ninja on Windows doesn't like at all and just flat out aborts on. It doesn't make sense for us to emit those as dependencies, so this patch excludes builtin paths.
83 lines
2.8 KiB
Rust
83 lines
2.8 KiB
Rust
// Copyright © SixtyFPS GmbH <info@slint-ui.com>
|
|
// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-commercial
|
|
|
|
use clap::Parser;
|
|
use i_slint_compiler::diagnostics::BuildDiagnostics;
|
|
use i_slint_compiler::*;
|
|
use std::io::Write;
|
|
|
|
#[derive(Parser)]
|
|
#[command(author, version, about, long_about = None)]
|
|
struct Cli {
|
|
/// Set output format
|
|
#[arg(short = 'f', long = "format", default_value = "cpp", action)]
|
|
format: generator::OutputFormat,
|
|
|
|
/// Include path for other .slint files
|
|
#[arg(short = 'I', name = "include path", number_of_values = 1, action)]
|
|
include_paths: Vec<std::path::PathBuf>,
|
|
|
|
/// Path to .slint file ('-' for stdin)
|
|
#[arg(name = "file", action)]
|
|
path: std::path::PathBuf,
|
|
|
|
/// The style name ('native' or 'fluent')
|
|
#[arg(long, name = "style name", action)]
|
|
style: Option<String>,
|
|
|
|
/// Generate a dependency file
|
|
#[arg(name = "dependency file", long = "depfile", number_of_values = 1, action)]
|
|
depfile: Option<std::path::PathBuf>,
|
|
|
|
/// Sets the output file ('-' for stdout)
|
|
#[arg(name = "file to generate", short = 'o', default_value = "-", action)]
|
|
output: std::path::PathBuf,
|
|
}
|
|
|
|
fn main() -> std::io::Result<()> {
|
|
proc_macro2::fallback::force(); // avoid a abort if panic=abort is set
|
|
let args = Cli::parse();
|
|
let mut diag = BuildDiagnostics::default();
|
|
let syntax_node = parser::parse_file(&args.path, &mut diag);
|
|
//println!("{:#?}", syntax_node);
|
|
if diag.has_error() {
|
|
diag.print();
|
|
std::process::exit(-1);
|
|
}
|
|
let mut compiler_config = CompilerConfiguration::new(args.format);
|
|
compiler_config.include_paths = args.include_paths;
|
|
if let Some(style) = args.style {
|
|
compiler_config.style = Some(style);
|
|
}
|
|
let syntax_node = syntax_node.expect("diags contained no compilation errors");
|
|
let (doc, diag) = spin_on::spin_on(compile_syntax_node(syntax_node, diag, compiler_config));
|
|
|
|
let diag = diag.check_and_exit_on_error();
|
|
|
|
if args.output == std::path::Path::new("-") {
|
|
generator::generate(args.format, &mut std::io::stdout(), &doc)?;
|
|
} else {
|
|
generator::generate(args.format, &mut std::fs::File::create(&args.output)?, &doc)?;
|
|
}
|
|
|
|
if let Some(depfile) = args.depfile {
|
|
let mut f = std::fs::File::create(depfile)?;
|
|
write!(f, "{}:", args.output.display())?;
|
|
for x in &diag.all_loaded_files {
|
|
if x.is_absolute() {
|
|
write!(f, " {}", x.display())?;
|
|
}
|
|
}
|
|
for resource in doc.root_component.embedded_file_resources.borrow().keys() {
|
|
if !fileaccess::load_file(&std::path::Path::new(resource))
|
|
.map_or(false, |f| f.is_builtin())
|
|
{
|
|
write!(f, " {}", resource)?;
|
|
}
|
|
}
|
|
|
|
writeln!(f)?;
|
|
}
|
|
diag.print_warnings_and_exit_on_error();
|
|
Ok(())
|
|
}
|