Skip to content

Commit

Permalink
Add environment variables to BuildSettings (#2121)
Browse files Browse the repository at this point in the history
  • Loading branch information
shoo authored May 19, 2021
1 parent 3545293 commit 7bf3584
Show file tree
Hide file tree
Showing 26 changed files with 861 additions and 92 deletions.
29 changes: 29 additions & 0 deletions changelog/add_env.dd
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
Added support for environment variables to use compilation and run(or test) option to the $(LINK2 https://dub.pm/settings, dub settings file) and dub.json/dub.sdl.

The following items have been added to the dub setting file: `defaultEnvironments`, `defaultBuildEnvironments`, `defaultRunEnvironments`, `defaultPreGenerateEnvironments`, `defaultPostGenerateEnvironments`, `defaultPreBuildEnvironments`, `defaultPostBuildEnvironments`, `defaultPreRunEnvironments`, `defaultPostRunEnvironments`.
They are used when there are no project-specific settings.

```
{
"defaultEnvironments": {
"VAR": "Foo"
}
}
```

The following items are available in each project-specific setting: `environments`, `buildEnvironments`, `runEnvironments`, `preGenerateEnvironments`, `postGenerateEnvironments`, `preBuildEnvironments`, `postBuildEnvironments`, `preRunEnvironments`, `postRunEnvironments`.

In JSON
```
{
"environments": {
"VAR": "Foo"
}
}
```

In SDL
```
environments "VAR" "Foo"
```

9 changes: 9 additions & 0 deletions source/dub/commandline.d
Original file line number Diff line number Diff line change
Expand Up @@ -999,6 +999,15 @@ abstract class PackageBuildCommand : Command {
if (!m_compilerName.length) m_compilerName = dub.defaultCompiler;
if (!m_arch.length) m_arch = dub.defaultArchitecture;
if (dub.defaultLowMemory) m_buildSettings.options |= BuildOption.lowmem;
if (dub.defaultEnvironments) m_buildSettings.addEnvironments(dub.defaultEnvironments);
if (dub.defaultBuildEnvironments) m_buildSettings.addBuildEnvironments(dub.defaultBuildEnvironments);
if (dub.defaultRunEnvironments) m_buildSettings.addRunEnvironments(dub.defaultRunEnvironments);
if (dub.defaultPreGenerateEnvironments) m_buildSettings.addPreGenerateEnvironments(dub.defaultPreGenerateEnvironments);
if (dub.defaultPostGenerateEnvironments) m_buildSettings.addPostGenerateEnvironments(dub.defaultPostGenerateEnvironments);
if (dub.defaultPreBuildEnvironments) m_buildSettings.addPreBuildEnvironments(dub.defaultPreBuildEnvironments);
if (dub.defaultPostBuildEnvironments) m_buildSettings.addPostBuildEnvironments(dub.defaultPostBuildEnvironments);
if (dub.defaultPreRunEnvironments) m_buildSettings.addPreRunEnvironments(dub.defaultPreRunEnvironments);
if (dub.defaultPostRunEnvironments) m_buildSettings.addPostRunEnvironments(dub.defaultPostRunEnvironments);
m_compiler = getCompiler(m_compilerName);
m_buildPlatform = m_compiler.determinePlatform(m_buildSettings, m_compilerName, m_arch);
m_buildSettings.addDebugVersions(m_debugVersions);
Expand Down
51 changes: 50 additions & 1 deletion source/dub/compilers/buildsettings.d
Original file line number Diff line number Diff line change
Expand Up @@ -46,17 +46,33 @@ struct BuildSettings {
string[] postBuildCommands;
string[] preRunCommands;
string[] postRunCommands;
string[string] environments;
string[string] buildEnvironments;
string[string] runEnvironments;
string[string] preGenerateEnvironments;
string[string] postGenerateEnvironments;
string[string] preBuildEnvironments;
string[string] postBuildEnvironments;
string[string] preRunEnvironments;
string[string] postRunEnvironments;
@byName BuildRequirements requirements;
@byName BuildOptions options;

BuildSettings dup()
const {
import std.traits: FieldNameTuple;
import std.algorithm: map;
import std.typecons: tuple;
import std.array: assocArray;
BuildSettings ret;
foreach (m; __traits(allMembers, BuildSettings)) {
foreach (m; FieldNameTuple!BuildSettings) {
static if (is(typeof(__traits(getMember, ret, m) = __traits(getMember, this, m).dup)))
__traits(getMember, ret, m) = __traits(getMember, this, m).dup;
else static if (is(typeof(add(__traits(getMember, ret, m), __traits(getMember, this, m)))))
add(__traits(getMember, ret, m), __traits(getMember, this, m));
else static if (is(typeof(__traits(getMember, ret, m) = __traits(getMember, this, m))))
__traits(getMember, ret, m) = __traits(getMember, this, m);
else static assert(0, "Cannot duplicate BuildSettings." ~ m);
}
assert(ret.targetType == targetType);
assert(ret.targetName == targetName);
Expand Down Expand Up @@ -115,6 +131,24 @@ struct BuildSettings {
void addPostBuildCommands(in string[] value...) { add(postBuildCommands, value, false); }
void addPreRunCommands(in string[] value...) { add(preRunCommands, value, false); }
void addPostRunCommands(in string[] value...) { add(postRunCommands, value, false); }
void addEnvironments(in string[string] value) { add(environments, value); }
void updateEnvironments(in string[string] value) { update(environments, value); }
void addBuildEnvironments(in string[string] value) { add(buildEnvironments, value); }
void updateBuildEnvironments(in string[string] value) { update(buildEnvironments, value); }
void addRunEnvironments(in string[string] value) { add(runEnvironments, value); }
void updateRunEnvironments(in string[string] value) { update(runEnvironments, value); }
void addPreGenerateEnvironments(in string[string] value) { add(preGenerateEnvironments, value); }
void updatePreGenerateEnvironments(in string[string] value) { update(preGenerateEnvironments, value); }
void addPostGenerateEnvironments(in string[string] value) { add(postGenerateEnvironments, value); }
void updatePostGenerateEnvironments(in string[string] value) { update(postGenerateEnvironments, value); }
void addPreBuildEnvironments(in string[string] value) { add(preBuildEnvironments, value); }
void updatePreBuildEnvironments(in string[string] value) { update(preBuildEnvironments, value); }
void addPostBuildEnvironments(in string[string] value) { add(postBuildEnvironments, value); }
void updatePostBuildEnvironments(in string[string] value) { update(postBuildEnvironments, value); }
void addPreRunEnvironments(in string[string] value) { add(preRunEnvironments, value); }
void updatePreRunEnvironments(in string[string] value) { update(preRunEnvironments, value); }
void addPostRunEnvironments(in string[string] value) { add(postRunEnvironments, value); }
void updatePostRunEnvironments(in string[string] value) { update(postRunEnvironments, value); }
void addRequirements(in BuildRequirement[] value...) { foreach (v; value) this.requirements |= v; }
void addRequirements(in BuildRequirements value) { this.requirements |= value; }
void addOptions(in BuildOption[] value...) { foreach (v; value) this.options |= v; }
Expand All @@ -137,6 +171,21 @@ private:
foreach (val; vals)
arr ~= filterDuplicates(arr, [val], noDuplicates);
}
// Append vals to AA
static void add(ref string[string] aa, in string[string] vals)
{
// vals might contain duplicated keys, add each val individually
foreach (key, val; vals)
if (key !in aa)
aa[key] = val;
}
// Update vals to AA
static void update(ref string[string] aa, in string[string] vals)
{
// If there are duplicate keys, they will be ignored and overwritten.
foreach (key, val; vals)
aa[key] = val;
}

unittest
{
Expand Down
6 changes: 3 additions & 3 deletions source/dub/compilers/compiler.d
Original file line number Diff line number Diff line change
Expand Up @@ -95,17 +95,17 @@ interface Compiler {
This method should be used by `Compiler` implementations to invoke the
compiler or linker binary.
*/
protected final void invokeTool(string[] args, void delegate(int, string) output_callback)
protected final void invokeTool(string[] args, void delegate(int, string) output_callback, string[string] env = null)
{
import std.string;

int status;
if (output_callback) {
auto result = executeShell(escapeShellCommand(args));
auto result = executeShell(escapeShellCommand(args), env);
output_callback(result.status, result.output);
status = result.status;
} else {
auto compiler_pid = spawnShell(escapeShellCommand(args));
auto compiler_pid = spawnShell(escapeShellCommand(args), env);
status = compiler_pid.wait();
}

Expand Down
12 changes: 10 additions & 2 deletions source/dub/compilers/dmd.d
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,11 @@ config /etc/dmd.conf
std.file.write(res_file.toNativeString(), escapeArgs(args).join("\n"));

logDiagnostic("%s %s", platform.compilerBinary, escapeArgs(args).join(" "));
invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback);
string[string] env;
foreach (aa; [settings.environments, settings.buildEnvironments])
foreach (k, v; aa)
env[k] = v;
invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback, env);
}

void invokeLinker(in BuildSettings settings, in BuildPlatform platform, string[] objects, void delegate(int, string) output_callback)
Expand All @@ -343,7 +347,11 @@ config /etc/dmd.conf
std.file.write(res_file.toNativeString(), escapeArgs(args).join("\n"));

logDiagnostic("%s %s", platform.compilerBinary, escapeArgs(args).join(" "));
invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback);
string[string] env;
foreach (aa; [settings.environments, settings.buildEnvironments])
foreach (k, v; aa)
env[k] = v;
invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback, env);
}

string[] lflagsToDFlags(in string[] lflags) const
Expand Down
12 changes: 10 additions & 2 deletions source/dub/compilers/gdc.d
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,11 @@ class GDCCompiler : Compiler {
std.file.write(res_file.toNativeString(), join(settings.dflags.map!(s => escape(s)), "\n"));

logDiagnostic("%s %s", platform.compilerBinary, join(cast(string[])settings.dflags, " "));
invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback);
string[string] env;
foreach (aa; [settings.environments, settings.buildEnvironments])
foreach (k, v; aa)
env[k] = v;
invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback, env);
}

void invokeLinker(in BuildSettings settings, in BuildPlatform platform, string[] objects, void delegate(int, string) output_callback)
Expand All @@ -224,7 +228,11 @@ class GDCCompiler : Compiler {
args ~= "-L--no-as-needed"; // avoids linker errors due to libraries being specified in the wrong order
}
logDiagnostic("%s", args.join(" "));
invokeTool(args, output_callback);
string[string] env;
foreach (aa; [settings.environments, settings.buildEnvironments])
foreach (k, v; aa)
env[k] = v;
invokeTool(args, output_callback, env);
}

string[] lflagsToDFlags(in string[] lflags) const
Expand Down
12 changes: 10 additions & 2 deletions source/dub/compilers/ldc.d
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,11 @@ config /etc/ldc2.conf (x86_64-pc-linux-gnu)
std.file.write(res_file.toNativeString(), escapeArgs(args).join("\n"));

logDiagnostic("%s %s", platform.compilerBinary, escapeArgs(args).join(" "));
invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback);
string[string] env;
foreach (aa; [settings.environments, settings.buildEnvironments])
foreach (k, v; aa)
env[k] = v;
invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback, env);
}

void invokeLinker(in BuildSettings settings, in BuildPlatform platform, string[] objects, void delegate(int, string) output_callback)
Expand All @@ -256,7 +260,11 @@ config /etc/ldc2.conf (x86_64-pc-linux-gnu)
std.file.write(res_file.toNativeString(), escapeArgs(args).join("\n"));

logDiagnostic("%s %s", platform.compilerBinary, escapeArgs(args).join(" "));
invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback);
string[string] env;
foreach (aa; [settings.environments, settings.buildEnvironments])
foreach (k, v; aa)
env[k] = v;
invokeTool([platform.compilerBinary, "@"~res_file.toNativeString()], output_callback, env);
}

string[] lflagsToDFlags(in string[] lflags) const
Expand Down
9 changes: 9 additions & 0 deletions source/dub/description.d
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,15 @@ struct PackageDescription {
string[] postBuildCommands; /// Commands to execute after every build
string[] preRunCommands; /// Commands to execute prior to every run
string[] postRunCommands; /// Commands to execute after every run
string[string] environments;
string[string] buildEnvironments;
string[string] runEnvironments;
string[string] preGenerateEnvironments;
string[string] postGenerateEnvironments;
string[string] preBuildEnvironments;
string[string] postBuildEnvironments;
string[string] preRunEnvironments;
string[string] postRunEnvironments;
@byName BuildRequirement[] buildRequirements;
@byName BuildOption[] options;
SourceFileDescription[] files; /// A list of all source/import files possibly used by the package
Expand Down
Loading

0 comments on commit 7bf3584

Please sign in to comment.