From 9ad968374e8cced1b032d13bd1e0e20906b0fb7d Mon Sep 17 00:00:00 2001 From: Dexoron Date: Thu, 21 May 2026 00:02:24 +0800 Subject: [PATCH] fix: target system add: new field in dcr.toml - filename, extension --- src/cli/build.rs | 43 ++++++++++++++++++++++++++++++++----- src/cli/gen.rs | 2 ++ src/core/builder/gas.rs | 8 +++++-- src/core/builder/mod.rs | 2 ++ src/core/builder/nasm.rs | 8 +++++-- src/core/builder/unix_cc.rs | 8 +++++-- 6 files changed, 60 insertions(+), 11 deletions(-) diff --git a/src/cli/build.rs b/src/cli/build.rs index 4b47552..6039c99 100644 --- a/src/cli/build.rs +++ b/src/cli/build.rs @@ -50,7 +50,15 @@ pub fn build(args: &[String]) -> i32 { Err(code) => return code, }; - // If no target specified, use default host target for target-specific config + if flags.target.is_none() { + let config_path = root.join("dcr.toml"); + if let Ok(config) = Config::open(config_path.to_str().unwrap()) { + let bt = get_build_string_with_profile(&config, "target", "debug"); + if !bt.is_empty() { + flags.target = Some(bt); + } + } + } if flags.target.is_none() { let default_target = if cfg!(target_os = "linux") { "x86_64-unknown-linux-gnu" @@ -490,10 +498,23 @@ fn build_project_at( .or_else(|| get_config_opt(&config, "toolchain.moc")); let tc_rcc = get_config_value(&config, "toolchain", "rcc", profile, build_target) .or_else(|| get_config_opt(&config, "toolchain.rcc")); - let build_cflags = + let mut build_cflags = get_list_with_profile_and_target(&config, "cflags", profile, build_target)?; + // Автоматически добавляем --target=..., если задан build.target и флаг ещё не указан + if let Some(t) = build_target { + if !t.trim().is_empty() { + let target_flag = format!("--target={}", t.trim()); + if !build_cflags.iter().any(|f| f == &target_flag || f.starts_with("--target=")) { + build_cflags.insert(0, target_flag); + } + } + } let build_ldflags = get_list_with_profile_and_target(&config, "ldflags", profile, build_target)?; + + // Новые поля: filename и extension + let output_filename = get_string_with_profile_and_target(&config, "filename", profile, build_target); + let output_extension = get_string_with_profile_and_target(&config, "extension", profile, build_target); let build_excludes = get_list_with_profile_and_target(&config, "exclude", profile, build_target)?; let build_includes = @@ -672,6 +693,8 @@ fn build_project_at( libs: &resolved.libs, cflags: &resolved_cflags, ldflags: &resolved_ldflags, + output_filename: if output_filename.is_empty() { None } else { Some(output_filename.as_str()) }, + output_extension: if output_extension.is_empty() { None } else { Some(output_extension.as_str()) }, }; if std::env::var("DCR_DEBUG").is_ok() { eprintln!("[dcr] debug: compiler={}", ctx.compiler); @@ -1265,13 +1288,23 @@ fn build_cache_path(profile: &str, target_dir: Option<&str>) -> std::path::PathB } fn build_output_path(ctx: &BuildContext) -> String { + let name = ctx.output_filename.unwrap_or(ctx.project_name); + let ext = ctx.output_extension.unwrap_or(""); + + let final_name = if ext.is_empty() { + name.to_string() + } else { + format!("{}.{}", name, ext) + }; + if ctx.kind == "staticlib" { - return crate::platform::lib_path(ctx.profile, ctx.project_name, ctx.target_dir); + // Для библиотек добавляем lib префикс если нужно, но упростим + return crate::platform::lib_path(ctx.profile, &final_name, ctx.target_dir); } if ctx.kind == "sharedlib" { - return crate::platform::shared_lib_path(ctx.profile, ctx.project_name, ctx.target_dir); + return crate::platform::shared_lib_path(ctx.profile, &final_name, ctx.target_dir); } - crate::platform::bin_path(ctx.profile, ctx.project_name, ctx.target_dir) + crate::platform::bin_path(ctx.profile, &final_name, ctx.target_dir) } fn collect_header_files( diff --git a/src/cli/gen.rs b/src/cli/gen.rs index 2f6bc77..e1c70b7 100644 --- a/src/cli/gen.rs +++ b/src/cli/gen.rs @@ -337,6 +337,8 @@ fn collect_project_info_inner(root: &Path, profile: &str) -> Result Result { for flag in ctx.ldflags { cmd.arg(flag); } + let name = ctx.output_filename.unwrap_or(ctx.project_name); + let ext = ctx.output_extension.unwrap_or(""); + let final_name = if ext.is_empty() { name.to_string() } else { format!("{}.{}", name, ext) }; + let out_path = if ctx.kind == "sharedlib" { - platform::shared_lib_path(ctx.profile, ctx.project_name, ctx.target_dir) + platform::shared_lib_path(ctx.profile, &final_name, ctx.target_dir) } else { - platform::bin_path(ctx.profile, ctx.project_name, ctx.target_dir) + platform::bin_path(ctx.profile, &final_name, ctx.target_dir) }; cmd.arg("-o").arg(out_path); diff --git a/src/core/builder/mod.rs b/src/core/builder/mod.rs index d4c9f2e..26d015b 100644 --- a/src/core/builder/mod.rs +++ b/src/core/builder/mod.rs @@ -26,6 +26,8 @@ pub struct BuildContext<'a> { pub libs: &'a [String], pub cflags: &'a [String], pub ldflags: &'a [String], + pub output_filename: Option<&'a str>, + pub output_extension: Option<&'a str>, } pub fn build(ctx: &BuildContext) -> Result { diff --git a/src/core/builder/nasm.rs b/src/core/builder/nasm.rs index 96460de..0a4a43c 100644 --- a/src/core/builder/nasm.rs +++ b/src/core/builder/nasm.rs @@ -70,10 +70,14 @@ pub fn build(ctx: &BuildContext) -> Result { for flag in ctx.ldflags { cmd.arg(flag); } + let name = ctx.output_filename.unwrap_or(ctx.project_name); + let ext = ctx.output_extension.unwrap_or(""); + let final_name = if ext.is_empty() { name.to_string() } else { format!("{}.{}", name, ext) }; + let out_path = if ctx.kind == "sharedlib" { - platform::shared_lib_path(ctx.profile, ctx.project_name, ctx.target_dir) + platform::shared_lib_path(ctx.profile, &final_name, ctx.target_dir) } else { - platform::bin_path(ctx.profile, ctx.project_name, ctx.target_dir) + platform::bin_path(ctx.profile, &final_name, ctx.target_dir) }; cmd.arg("-o").arg(out_path); diff --git a/src/core/builder/unix_cc.rs b/src/core/builder/unix_cc.rs index e7f48fa..a3cdb6f 100644 --- a/src/core/builder/unix_cc.rs +++ b/src/core/builder/unix_cc.rs @@ -63,10 +63,14 @@ pub fn build(ctx: &BuildContext) -> Result { for flag in ctx.ldflags { cmd.arg(flag); } + let name = ctx.output_filename.unwrap_or(ctx.project_name); + let ext = ctx.output_extension.unwrap_or(""); + let final_name = if ext.is_empty() { name.to_string() } else { format!("{}.{}", name, ext) }; + let out_path = if ctx.kind == "sharedlib" { - platform::shared_lib_path(ctx.profile, ctx.project_name, ctx.target_dir) + platform::shared_lib_path(ctx.profile, &final_name, ctx.target_dir) } else { - platform::bin_path(ctx.profile, ctx.project_name, ctx.target_dir) + platform::bin_path(ctx.profile, &final_name, ctx.target_dir) }; cmd.arg("-o").arg(out_path);