Patch rdmd to auto-detect available *dmd binary

This commit is contained in:
Михаил Страшун 2015-03-28 20:09:39 +00:00
parent dcac85cdb6
commit 20eb98f837
2 changed files with 51 additions and 1 deletions

View File

@ -2,7 +2,7 @@
pkgname=('dtools')
pkgver=2.067.0
pkgrel=1
pkgrel=2
pkgdesc="Ancilliary tools for the D programming language"
license=("custom")
groups=('dlang')
@ -17,11 +17,13 @@ source=(
"git+http://github.com/D-Programming-Language/tools#tag=v$pkgver"
"git+https://github.com/Dicebot/Arch-PKGBUILDs.git"
"http://www.boost.org/LICENSE_1_0.txt"
"autodetect.diff"
)
sha1sums=(
'SKIP'
'SKIP'
'3cba29011be2b9d59f6204d6fa0a386b1b2dbd90'
'7fb5bd71d6c4e90c0ca49b292454e11169afdee8'
)
build()
@ -30,6 +32,7 @@ build()
DMD=ldmd
cd $srcdir/tools
git apply $srcdir/autodetect.diff
# rdmd is used to build others
$DMD -od. -ofdtools-rdmd rdmd.d

47
autodetect.diff Normal file
View File

@ -0,0 +1,47 @@
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