diff --git a/rdmd.d b/rdmd.d index 5d66c9f..61fb86a 100644 --- a/rdmd.d +++ b/rdmd.d @@ -51,7 +51,32 @@ else version (LDC) else static assert(false, "Unknown compiler"); -private string compiler = defaultCompiler; +private string compiler; + +void chooseCompiler(ref string compiler) +{ + import std.stdio; + + // if compiler is set explicitly, don't interefer + // otherwise find one that exists in PATH + if (!compiler.length) + { + import std.process : executeShell; + auto compilers = [ defaultCompiler, "dmd", "ldmd2", "gdmd2", "ldmd", "gdmd" ]; + + foreach (candidate; compilers) + { + // dirty hack, no-arg dmd invocation will return 1 + if (executeShell(candidate ~ "| grep Usage").status == 0) + { + compiler = candidate; + return; + } + } + + throw new Exception("Couldn't find any D compiler"); + } +} int main(string[] args) { @@ -141,6 +166,8 @@ int main(string[] args) if (bailout) return 0; if (dryRun) chatty = true; // dry-run implies chatty + chooseCompiler(compiler); + /* Only -of is supported because Make is very susceptible to file names, and * it doesn't do a good job resolving them. One option would be to use * std.path.buildNormalizedPath(), but some corner cases will break, so it