Merge pull request #166 from vibe-d/update_compiler_support
Update to DMD 2.087.0 and LDC 1.6.0. merged-on-behalf-of: Leonid Kramer <l-kramer@users.noreply.github.com>
This commit is contained in:
commit
beac700a5b
14
.travis.yml
14
.travis.yml
|
@ -5,20 +5,16 @@ d:
|
||||||
# this way the overall test time gets cut down (GDC/LDC are a lot
|
# this way the overall test time gets cut down (GDC/LDC are a lot
|
||||||
# slower tham DMD, so they should be started early), while still
|
# slower tham DMD, so they should be started early), while still
|
||||||
# catching most DMD version related build failures early
|
# catching most DMD version related build failures early
|
||||||
- dmd-2.086.0
|
- dmd-2.087.1
|
||||||
- dmd-2.078.3
|
- dmd-2.078.3
|
||||||
|
- ldc-1.16.0
|
||||||
|
- ldc-1.15.0
|
||||||
|
- ldc-1.14.0
|
||||||
- ldc-1.13.0
|
- ldc-1.13.0
|
||||||
- ldc-1.12.0
|
|
||||||
- ldc-1.11.0
|
|
||||||
- ldc-1.10.0
|
|
||||||
- ldc-1.9.0
|
- ldc-1.9.0
|
||||||
- ldc-1.8.0
|
- dmd-2.086.1
|
||||||
- dmd-2.085.1
|
- dmd-2.085.1
|
||||||
- dmd-2.084.1
|
- dmd-2.084.1
|
||||||
- dmd-2.083.1
|
|
||||||
- dmd-2.082.1
|
|
||||||
- dmd-2.081.2
|
|
||||||
- dmd-2.080.1
|
|
||||||
- dmd-2.079.0
|
- dmd-2.079.0
|
||||||
- dmd-beta
|
- dmd-beta
|
||||||
|
|
||||||
|
|
15
README.md
15
README.md
|
@ -26,22 +26,19 @@ Supported compilers
|
||||||
|
|
||||||
The following compilers are tested and supported:
|
The following compilers are tested and supported:
|
||||||
|
|
||||||
- DMD 2.086.0
|
- DMD 2.087.1
|
||||||
|
- DMD 2.086.1
|
||||||
- DMD 2.085.1
|
- DMD 2.085.1
|
||||||
- DMD 2.084.1
|
- DMD 2.084.1
|
||||||
- DMD 2.083.1
|
|
||||||
- DMD 2.082.1
|
|
||||||
- DMD 2.081.2
|
|
||||||
- DMD 2.080.1
|
|
||||||
- DMD 2.079.0
|
- DMD 2.079.0
|
||||||
- DMD 2.078.3
|
- LDC 1.16.0
|
||||||
- LDC 1.15.0
|
- LDC 1.15.0
|
||||||
- LDC 1.14.0
|
- LDC 1.14.0
|
||||||
- LDC 1.13.0
|
- LDC 1.13.0
|
||||||
- LDC 1.12.0
|
|
||||||
- LDC 1.11.0
|
|
||||||
- LDC 1.10.0
|
|
||||||
- LDC 1.9.0
|
- LDC 1.9.0
|
||||||
|
|
||||||
|
Supported up to 1.6.2:
|
||||||
|
- DMD 2.078.3
|
||||||
- LDC 1.8.0
|
- LDC 1.8.0
|
||||||
|
|
||||||
Supported up to 1.4.7:
|
Supported up to 1.4.7:
|
||||||
|
|
37
appveyor.yml
37
appveyor.yml
|
@ -2,37 +2,28 @@ platform: x64
|
||||||
environment:
|
environment:
|
||||||
matrix:
|
matrix:
|
||||||
- DC: dmd
|
- DC: dmd
|
||||||
DVersion: 2.086.0
|
DVersion: 2.087.1
|
||||||
arch: x64
|
arch: x64
|
||||||
- DC: dmd
|
- DC: dmd
|
||||||
DVersion: 2.086.0
|
DVersion: 2.087.1
|
||||||
arch: x86
|
arch: x86
|
||||||
- DC: dmd
|
- DC: dmd
|
||||||
DVersion: 2.086.0
|
DVersion: 2.087.1
|
||||||
arch: x86_mscoff
|
arch: x86_mscoff
|
||||||
|
- DC: dmd
|
||||||
|
DVersion: 2.086.1
|
||||||
|
arch: x64
|
||||||
- DC: dmd
|
- DC: dmd
|
||||||
DVersion: 2.085.1
|
DVersion: 2.085.1
|
||||||
arch: x64
|
arch: x64
|
||||||
- DC: dmd
|
- DC: dmd
|
||||||
DVersion: 2.084.1
|
DVersion: 2.084.1
|
||||||
arch: x86
|
arch: x86
|
||||||
- DC: dmd
|
|
||||||
DVersion: 2.083.1
|
|
||||||
arch: x86_mscoff
|
|
||||||
- DC: dmd
|
|
||||||
DVersion: 2.082.1
|
|
||||||
arch: x86_mscoff
|
|
||||||
- DC: dmd
|
|
||||||
DVersion: 2.081.2
|
|
||||||
arch: x86_mscoff
|
|
||||||
- DC: dmd
|
|
||||||
DVersion: 2.080.1
|
|
||||||
arch: x86_mscoff
|
|
||||||
- DC: dmd
|
- DC: dmd
|
||||||
DVersion: 2.079.0
|
DVersion: 2.079.0
|
||||||
arch: x86_mscoff
|
arch: x86_mscoff
|
||||||
- DC: dmd
|
- DC: ldc
|
||||||
DVersion: 2.078.3
|
DVersion: 1.16.0
|
||||||
arch: x64
|
arch: x64
|
||||||
- DC: ldc
|
- DC: ldc
|
||||||
DVersion: 1.15.0
|
DVersion: 1.15.0
|
||||||
|
@ -43,21 +34,9 @@ environment:
|
||||||
- DC: ldc
|
- DC: ldc
|
||||||
DVersion: 1.13.0
|
DVersion: 1.13.0
|
||||||
arch: x64
|
arch: x64
|
||||||
- DC: ldc
|
|
||||||
DVersion: 1.12.0
|
|
||||||
arch: x64
|
|
||||||
- DC: ldc
|
|
||||||
DVersion: 1.11.0
|
|
||||||
arch: x64
|
|
||||||
- DC: ldc
|
|
||||||
DVersion: 1.10.0
|
|
||||||
arch: x64
|
|
||||||
- DC: ldc
|
- DC: ldc
|
||||||
DVersion: 1.9.0
|
DVersion: 1.9.0
|
||||||
arch: x64
|
arch: x64
|
||||||
- DC: ldc
|
|
||||||
DVersion: 1.8.0
|
|
||||||
arch: x64
|
|
||||||
|
|
||||||
skip_tags: false
|
skip_tags: false
|
||||||
|
|
||||||
|
|
|
@ -9,201 +9,211 @@ import core.thread;
|
||||||
import vibe.core.log;
|
import vibe.core.log;
|
||||||
import vibe.core.core;
|
import vibe.core.core;
|
||||||
import vibe.core.process;
|
import vibe.core.process;
|
||||||
|
import std.algorithm;
|
||||||
import std.array;
|
import std.array;
|
||||||
import std.range;
|
import std.range;
|
||||||
import std.algorithm;
|
|
||||||
|
|
||||||
void testEcho()
|
void testEcho()
|
||||||
{
|
{
|
||||||
foreach (i; 0..100) {
|
foreach (i; 0..100) {
|
||||||
auto procPipes = pipeProcess(["echo", "foo bar"], Redirect.stdout);
|
auto procPipes = pipeProcess(["echo", "foo bar"], Redirect.stdout);
|
||||||
|
|
||||||
assert(!procPipes.process.exited);
|
auto output = procPipes.stdout.collectOutput();
|
||||||
|
|
||||||
auto output = procPipes.stdout.collectOutput();
|
assert(procPipes.process.wait() == 0);
|
||||||
|
assert(procPipes.process.exited);
|
||||||
|
|
||||||
assert(procPipes.process.wait() == 0);
|
assert(output == "foo bar\n");
|
||||||
assert(procPipes.process.exited);
|
}
|
||||||
|
|
||||||
assert(output == "foo bar\n");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void testCat()
|
void testCat()
|
||||||
{
|
{
|
||||||
auto procPipes = pipeProcess(["cat"]);
|
auto procPipes = pipeProcess(["cat"]);
|
||||||
|
|
||||||
string output;
|
string output;
|
||||||
auto outputTask = runTask({
|
auto outputTask = runTask({
|
||||||
output = procPipes.stdout.collectOutput();
|
output = procPipes.stdout.collectOutput();
|
||||||
});
|
});
|
||||||
|
|
||||||
auto inputs = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
|
auto inputs = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
|
||||||
.map!(s => s ~ "\n")
|
.map!(s => s ~ "\n")
|
||||||
.repeat(4000).join.array;
|
.repeat(4000).join.array;
|
||||||
foreach (input; inputs) {
|
foreach (input; inputs) {
|
||||||
procPipes.stdin.write(input);
|
procPipes.stdin.write(input);
|
||||||
}
|
}
|
||||||
|
|
||||||
procPipes.stdin.close();
|
procPipes.stdin.close();
|
||||||
assert(procPipes.process.wait() == 0);
|
assert(procPipes.process.wait() == 0);
|
||||||
|
|
||||||
outputTask.join();
|
outputTask.join();
|
||||||
|
|
||||||
assert(output == inputs.join());
|
assert(output == inputs.join());
|
||||||
}
|
}
|
||||||
|
|
||||||
void testStderr()
|
void testStderr()
|
||||||
{
|
{
|
||||||
auto program = q{
|
auto program = q{
|
||||||
foreach (line; stdin.byLine())
|
foreach (line; stdin.byLine())
|
||||||
stderr.writeln(line);
|
stderr.writeln(line);
|
||||||
};
|
};
|
||||||
auto procPipes = pipeProcess(["rdmd", "--eval", program], Redirect.stdin | Redirect.stderr);
|
auto procPipes = pipeProcess(["rdmd", "--eval", program], Redirect.stdin | Redirect.stderr);
|
||||||
|
|
||||||
// Wait for rdmd to compile
|
// Wait for rdmd to compile
|
||||||
sleep(3.seconds);
|
sleep(3.seconds);
|
||||||
|
|
||||||
string output;
|
string output;
|
||||||
auto outputTask = runTask({
|
auto outputTask = runTask({
|
||||||
output = procPipes.stderr.collectOutput();
|
output = procPipes.stderr.collectOutput();
|
||||||
});
|
});
|
||||||
|
|
||||||
auto inputs = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
|
auto inputs = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
|
||||||
.map!(s => s ~ "\n")
|
.map!(s => s ~ "\n")
|
||||||
.repeat(4000).join.array;
|
.repeat(4000).join.array;
|
||||||
foreach (input; inputs) {
|
foreach (input; inputs) {
|
||||||
procPipes.stdin.write(input);
|
procPipes.stdin.write(input);
|
||||||
}
|
}
|
||||||
|
|
||||||
procPipes.stdin.close();
|
procPipes.stdin.close();
|
||||||
assert(procPipes.process.wait() == 0);
|
assert(procPipes.process.wait() == 0);
|
||||||
|
|
||||||
outputTask.join();
|
outputTask.join();
|
||||||
|
|
||||||
assert(output == inputs.join);
|
assert(output == inputs.join);
|
||||||
}
|
}
|
||||||
|
|
||||||
void testRandomDeath()
|
void testRandomDeath()
|
||||||
{
|
{
|
||||||
auto program = q{
|
auto program = q{
|
||||||
import core.thread;
|
import core.thread;
|
||||||
import std.random;
|
import std.random;
|
||||||
Thread.sleep(dur!"msecs"(uniform(0, 1000)));
|
Thread.sleep(dur!"msecs"(uniform(0, 1000)));
|
||||||
};
|
};
|
||||||
// Prime rdmd
|
// Prime rdmd
|
||||||
execute(["rdmd", "--eval", program]);
|
execute(["rdmd", "--eval", program]);
|
||||||
|
|
||||||
foreach (i; 0..20) {
|
foreach (i; 0..20) {
|
||||||
auto process = spawnProcess(["rdmd", "--eval", program]);
|
auto process = spawnProcess(["rdmd", "--eval", program]);
|
||||||
|
|
||||||
assert(!process.exited);
|
assert(!process.exited);
|
||||||
|
|
||||||
sleep(800.msecs);
|
sleep(800.msecs);
|
||||||
try {
|
try {
|
||||||
process.kill();
|
process.kill();
|
||||||
} catch (Exception e) {}
|
} catch (Exception e) {
|
||||||
process.wait();
|
}
|
||||||
|
process.wait();
|
||||||
|
|
||||||
assert(process.exited);
|
assert(process.exited);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testIgnoreSigterm()
|
void testIgnoreSigterm()
|
||||||
{
|
{
|
||||||
auto program = q{
|
auto program = q{
|
||||||
import core.thread;
|
import core.thread;
|
||||||
import core.sys.posix.signal;
|
import core.sys.posix.signal;
|
||||||
|
|
||||||
signal(SIGINT, SIG_IGN);
|
signal(SIGINT, SIG_IGN);
|
||||||
signal(SIGTERM, SIG_IGN);
|
signal(SIGTERM, SIG_IGN);
|
||||||
|
|
||||||
foreach (line; stdin.byLine()) {
|
foreach (line; stdin.byLine()) {
|
||||||
writeln(line);
|
writeln(line);
|
||||||
stdout.flush();
|
stdout.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Zombie
|
// Zombie
|
||||||
while (true) Thread.sleep(100.dur!"msecs");
|
while (true) Thread.sleep(100.dur!"msecs");
|
||||||
};
|
};
|
||||||
auto procPipes = pipeProcess(
|
auto procPipes = pipeProcess(
|
||||||
["rdmd", "--eval", program],
|
["rdmd", "--eval", program],
|
||||||
Redirect.stdin | Redirect.stdout | Redirect.stderrToStdout);
|
Redirect.stdin | Redirect.stdout | Redirect.stderrToStdout);
|
||||||
|
|
||||||
string output;
|
string output;
|
||||||
auto outputTask = runTask({
|
auto outputTask = runTask({
|
||||||
output = procPipes.stdout.collectOutput();
|
output = procPipes.stdout.collectOutput();
|
||||||
});
|
});
|
||||||
|
|
||||||
assert(!procPipes.process.exited);
|
assert(!procPipes.process.exited);
|
||||||
|
|
||||||
// Give the program some time to compile and install the signal handler
|
// Give the program some time to compile and install the signal handler
|
||||||
sleep(4.seconds);
|
sleep(4.seconds);
|
||||||
|
|
||||||
procPipes.process.kill();
|
procPipes.process.kill();
|
||||||
procPipes.stdin.write("foo\n");
|
procPipes.stdin.write("foo\n");
|
||||||
|
|
||||||
assert(!procPipes.process.exited);
|
assert(!procPipes.process.exited);
|
||||||
|
|
||||||
assert(procPipes.process.waitOrForceKill(2.seconds) == 9);
|
assert(procPipes.process.waitOrForceKill(2.seconds) == -9);
|
||||||
|
|
||||||
assert(procPipes.process.exited);
|
assert(procPipes.process.exited);
|
||||||
|
|
||||||
outputTask.join();
|
outputTask.join();
|
||||||
|
|
||||||
assert(output == "foo\n");
|
assert(output == "foo\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void testSimpleShell()
|
void testSimpleShell()
|
||||||
{
|
{
|
||||||
auto res = executeShell("echo foo");
|
auto res = executeShell("echo foo");
|
||||||
|
|
||||||
assert(res.status == 0);
|
assert(res.status == 0);
|
||||||
assert(res.output == "foo\n");
|
assert(res.output == "foo\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void testLineEndings()
|
void testLineEndings()
|
||||||
{
|
{
|
||||||
auto program = q{
|
auto program = q{
|
||||||
write("linux\n");
|
write("linux\n");
|
||||||
write("os9\r");
|
write("os9\r");
|
||||||
write("win\r\n");
|
write("win\r\n");
|
||||||
};
|
};
|
||||||
auto res = execute(["rdmd", "--eval", program]);
|
auto res = execute(["rdmd", "--eval", program]);
|
||||||
|
|
||||||
assert(res.status == 0);
|
assert(res.status == 0);
|
||||||
assert(res.output == "linux\nos9\rwin\r\n");
|
assert(res.output == "linux\nos9\rwin\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
// rdmd --eval is only supported in versions >= 2.080
|
import core.stdc.stdlib : abort;
|
||||||
static if (__VERSION__ >= 2080) {
|
import core.time;
|
||||||
runTask({
|
import std.meta : AliasSeq;
|
||||||
auto tasks = [
|
|
||||||
&testEcho,
|
|
||||||
&testCat,
|
|
||||||
&testStderr,
|
|
||||||
&testRandomDeath,
|
|
||||||
&testIgnoreSigterm,
|
|
||||||
&testSimpleShell,
|
|
||||||
&testLineEndings,
|
|
||||||
].map!(fn => runTask({
|
|
||||||
try {
|
|
||||||
fn();
|
|
||||||
} catch (Exception e) {
|
|
||||||
logError("%s", e);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
foreach (task; tasks) {
|
// rdmd --eval is only supported in versions >= 2.080
|
||||||
task.join();
|
static if (__VERSION__ >= 2080) {
|
||||||
}
|
runTask({
|
||||||
|
alias Tasks = AliasSeq!(
|
||||||
|
testEcho,
|
||||||
|
testCat,
|
||||||
|
testStderr,
|
||||||
|
testRandomDeath,
|
||||||
|
testIgnoreSigterm,
|
||||||
|
testSimpleShell,
|
||||||
|
testLineEndings
|
||||||
|
);
|
||||||
|
|
||||||
exitEventLoop();
|
static foreach (alias task; Tasks) {{
|
||||||
});
|
auto t = runTask({
|
||||||
|
logInfo("Running test %s...", __traits(identifier, task));
|
||||||
|
auto tm = setTimer(60.seconds, {
|
||||||
|
logError("Test %s timed out!", __traits(identifier, task));
|
||||||
|
abort();
|
||||||
|
});
|
||||||
|
try {
|
||||||
|
task();
|
||||||
|
} catch (Exception e) {
|
||||||
|
logError("Test %s failed: %s", __traits(identifier, task), e);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
tm.stop();
|
||||||
|
});
|
||||||
|
t.join();
|
||||||
|
}}
|
||||||
|
|
||||||
runEventLoop();
|
exitEventLoop();
|
||||||
}
|
});
|
||||||
|
|
||||||
|
runEventLoop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue