diff --git a/README.md b/README.md index a1212a8..76e6b68 100644 --- a/README.md +++ b/README.md @@ -370,7 +370,7 @@ sources = [ ] ``` -An option `opts.comple_cmd_fmt` also exists. Its default is `{compiler} +An option `opts.compile_cmd_fmt` also exists. Its default is `{compiler} {compiler_flags} -MD -MF {depfile} -o {object} -c {source}`. Note that if you remove the `-MD -MF {depfile}` component, ninja will have no way to discover what header files your source file depends on. diff --git a/src/content_generation/ninja_file.rs b/src/content_generation/ninja_file.rs index edd622e..0bc1be5 100644 --- a/src/content_generation/ninja_file.rs +++ b/src/content_generation/ninja_file.rs @@ -125,8 +125,14 @@ build $builddir/{name}/dep: mkdir for source in &target.sources { let new_file = source.replace('/', "-"); - let obj_name = format!("$builddir/{}/obj/{}.o", name, new_file); - let dep_name = format!("$builddir/{}/dep/{}.o.d", name, new_file); + let obj_name = format!( + "$builddir/{}/obj/{}{}", + name, new_file, target.opts.object_suffix + ); + let dep_name = format!( + "$builddir/{}/dep/{}{}.d", + name, new_file, target.opts.object_suffix + ); ret.push_str(&format!( "build {}: cc_{} {}\n dep = {}\n", obj_name, name, source, dep_name diff --git a/src/deser.rs b/src/deser.rs index 9726a2b..4a76684 100644 --- a/src/deser.rs +++ b/src/deser.rs @@ -23,6 +23,7 @@ pub struct DeserTargetOptions { pub default: Option, pub compile_cmd_fmt: Option, pub link_cmd_fmt: Option, + pub object_suffix: Option, } #[derive(Debug, Clone, Deserialize)] diff --git a/src/parse_deser/target.rs b/src/parse_deser/target.rs index 63a5c52..626a319 100644 --- a/src/parse_deser/target.rs +++ b/src/parse_deser/target.rs @@ -24,13 +24,13 @@ impl<'a> Target<'a> { ret.opts = opts.clone(); if let Some(parent) = parent { - if let None = deser.outfile { + if deser.outfile.is_none() { ret.outfile = parent.outfile; } - if let None = deser.compiler { + if deser.compiler.is_none() { ret.compiler = parent.compiler; } - if let None = deser.linker { + if deser.linker.is_none() { ret.linker = parent.linker; } for string in parent.compiler_flags.clone() { @@ -60,10 +60,8 @@ impl<'a> Target<'a> { } if let Some(v) = &deser.linker { ret.linker = v; - } else { - if let Some(v) = &deser.compiler { - ret.linker = v; - } + } else if let Some(v) = &deser.compiler { + ret.linker = v; } if let Some(v) = &deser.linker_flags { for string in v { diff --git a/src/parse_deser/target_options.rs b/src/parse_deser/target_options.rs index a209e7e..5049a2b 100644 --- a/src/parse_deser/target_options.rs +++ b/src/parse_deser/target_options.rs @@ -8,6 +8,7 @@ pub struct TargetOptions<'a> { pub depend_on: Vec<&'a str>, pub compile_cmd_fmt: &'a str, pub link_cmd_fmt: &'a str, + pub object_suffix: &'a str, } impl<'a> From<&'a DeserTargetOptions> for TargetOptions<'a> { @@ -40,6 +41,10 @@ impl<'a> From<&'a DeserTargetOptions> for TargetOptions<'a> { ret.link_cmd_fmt = v; } + if let Some(v) = &value.object_suffix { + ret.object_suffix = v; + } + ret } } @@ -54,6 +59,7 @@ impl<'a> TargetOptions<'a> { compile_cmd_fmt: "{compiler} {compiler_flags} -MD -MF {depfile} -o {object} -c {source}", link_cmd_fmt: "{linker} {linker_flags} -o {outfile} {objects} {linker_libs}", + object_suffix: ".o", } } }