diff --git a/source/app.d b/source/app.d
index 421a525..bb5df64 100644
--- a/source/app.d
+++ b/source/app.d
@@ -45,7 +45,7 @@
bool verbose, vverbose, quiet, vquiet;
bool help, nodeps, annotate;
LogLevel loglevel = LogLevel.info;
- string build_type = "debug", build_config;
+ string build_type, build_config;
string compiler_name = "dmd";
string arch;
bool rdmd = false;
@@ -237,6 +237,11 @@
enforce(build_config.length == 0 || dub.configurations.canFind(build_config), "Unknown build configuration: "~build_config);
+ if (build_type.length == 0) {
+ if (environment.get("DFLAGS")) build_type = "$DFLAGS";
+ else build_type = "debug";
+ }
+
GeneratorSettings gensettings;
gensettings.platform = build_platform;
gensettings.config = build_config;
@@ -345,7 +350,7 @@
the build type with custom flags.
Possible names:
debug (default), plain, release, unittest, profile,
- docs, ddox, cov, unittest-cov
+ docs, ddox, cov, unittest-cov and custom types
--config=NAME Builds the specified configuration. Configurations can
be defined in package.json
--compiler=NAME Specifies the compiler binary to use. Arbitrary pre-
diff --git a/source/dub/generators/build.d b/source/dub/generators/build.d
index 9ba8276..c12215d 100644
--- a/source/dub/generators/build.d
+++ b/source/dub/generators/build.d
@@ -44,15 +44,7 @@
auto buildsettings = settings.buildSettings;
m_project.addBuildSettings(buildsettings, settings.platform, settings.config);
- bool usedefflags = !(buildsettings.requirements & BuildRequirements.noDefaultFlags);
- if (usedefflags) buildsettings.addDFlags(["-w"]);
- string dflags = environment.get("DFLAGS");
- if( dflags.length ){
- settings.buildType = "$DFLAGS";
- buildsettings.addDFlags(dflags.split());
- } else if (usedefflags) {
- addBuildTypeFlags(buildsettings, settings.buildType);
- }
+ m_project.addBuildTypeSettings(buildsettings, settings.platform, settings.buildType);
auto generate_binary = !buildsettings.dflags.canFind("-o-");
auto is_static_library = buildsettings.targetType == TargetType.staticLibrary || buildsettings.targetType == TargetType.library;
diff --git a/source/dub/generators/generator.d b/source/dub/generators/generator.d
index f7f87d6..0d13b5c 100644
--- a/source/dub/generators/generator.d
+++ b/source/dub/generators/generator.d
@@ -76,22 +76,6 @@
}
}
-void addBuildTypeFlags(ref BuildSettings dst, string build_type)
-{
- switch(build_type){
- default: throw new Exception("Unknown build type: "~build_type);
- case "plain": break;
- case "debug": dst.addDFlags("-g", "-debug"); break;
- case "release": dst.addDFlags("-release", "-O", "-inline"); break;
- case "unittest": dst.addDFlags("-g", "-unittest"); break;
- case "docs": dst.addDFlags("-c", "-o-", "-D", "-Dddocs"); break;
- case "ddox": dst.addDFlags("-c", "-o-", "-D", "-Df__dummy.html", "-Xfdocs.json"); break;
- case "profile": dst.addDFlags("-g", "-O", "-inline", "-profile"); break;
- case "cov": dst.addDFlags("-g", "-cov"); break;
- case "unittest-cov": dst.addDFlags("-g", "-unittest", "-cov"); break;
- }
-}
-
/**
Runs pre-build commands and performs an other required setup before project files are generated.
diff --git a/source/dub/generators/rdmd.d b/source/dub/generators/rdmd.d
index f928578..01602c6 100644
--- a/source/dub/generators/rdmd.d
+++ b/source/dub/generators/rdmd.d
@@ -46,17 +46,9 @@
auto buildsettings = settings.buildSettings;
m_project.addBuildSettings(buildsettings, settings.platform, settings.config);
- bool usedefflags = !(buildsettings.requirements & BuildRequirements.noDefaultFlags);
+ m_project.addBuildTypeSettings(buildsettings, settings.platform, settings.buildType);
// do not pass all source files to RDMD, only the main source file
buildsettings.sourceFiles = buildsettings.sourceFiles.filter!(s => !s.endsWith(".d"))().array();
- if (usedefflags) buildsettings.addDFlags(["-w"]);
- string dflags = environment.get("DFLAGS");
- if( dflags ){
- settings.buildType = "$DFLAGS";
- buildsettings.addDFlags(dflags.split());
- } else if (usedefflags) {
- addBuildTypeFlags(buildsettings, settings.buildType);
- }
settings.compiler.prepareBuildSettings(buildsettings, BuildSetting.commandLine);
auto generate_binary = !buildsettings.dflags.canFind("-o-");
diff --git a/source/dub/generators/visuald.d b/source/dub/generators/visuald.d
index c9a982a..3bf2bb4 100644
--- a/source/dub/generators/visuald.d
+++ b/source/dub/generators/visuald.d
@@ -61,12 +61,6 @@
}
private {
- enum Config {
- Release,
- Debug,
- Unittest
- }
-
void generateSolution(GeneratorSettings settings)
{
auto ret = appender!(char[])();
@@ -200,9 +194,9 @@
%s", guid(projName));
// Several configurations (debug, release, unittest)
- generateProjectConfiguration(ret, pack, Config.Debug, settings);
- generateProjectConfiguration(ret, pack, Config.Release, settings);
- generateProjectConfiguration(ret, pack, Config.Unittest, settings);
+ generateProjectConfiguration(ret, pack, "debug", settings);
+ generateProjectConfiguration(ret, pack, "release", settings);
+ generateProjectConfiguration(ret, pack, "unittest", settings);
// Add all files
auto configs = m_app.getPackageConfigs(settings.platform, settings.config);
@@ -274,7 +268,7 @@
proj.flush();
}
- void generateProjectConfiguration(Appender!(char[]) ret, const Package pack, Config type, GeneratorSettings settings)
+ void generateProjectConfiguration(Appender!(char[]) ret, const Package pack, string type, GeneratorSettings settings)
{
auto project_file_dir = m_app.mainPackage.path ~ projFileName(pack).parentPath;
auto configs = m_app.getPackageConfigs(settings.platform, settings.config);
@@ -282,6 +276,9 @@
auto pbuildsettings = pack.getBuildSettings(settings.platform, configs[pack.name]);
m_app.addBuildSettings(buildsettings, settings.platform, settings.config, pack);
+ BuildSettings btsettings;
+ m_app.addBuildTypeSettings(buildsettings, settings.platform, type);
+
string[] getSettings(string setting)(){ return __traits(getMember, buildsettings, setting); }
string[] getPathSettings(string setting)()
{
@@ -300,16 +297,18 @@
}
ret.formattedWrite("
\n", to!string(type), arch);
+
+ // FIXME: handle compiler options in an abstract way instead of searching for DMD specific flags
// debug and optimize setting
- ret.formattedWrite(" %s\n", type != Config.Release ? "1" : "0");
- ret.formattedWrite(" %s\n", type == Config.Release ? "1" : "0");
- ret.formattedWrite(" %s\n", type == Config.Release ? "1" : "0");
- ret.formattedWrite(" %s\n", type == Config.Release ? "1" : "0");
+ ret.formattedWrite(" %s\n", btsettings.dflags.canFind("-g") ? "1" : "0");
+ ret.formattedWrite(" %s\n", btsettings.dflags.canFind("-O") ? "1" : "0");
+ ret.formattedWrite(" %s\n", btsettings.dflags.canFind("-inline") ? "1" : "0");
+ ret.formattedWrite(" %s\n", btsettings.dflags.canFind("-release") ? "1" : "0");
// Lib or exe?
bool is_lib = pbuildsettings.targetType != TargetType.executable;
- string debugSuffix = type == Config.Debug? "_d" : "";
+ string debugSuffix = type == "debug" ? "_d" : "";
auto bin_path = pack is m_app.mainPackage ? Path(pbuildsettings.targetPath) : Path(".dub/lib/");
bin_path.endsWithSlash = true;
ret.formattedWrite(" %s\n", is_lib ? "1" : "0");
@@ -330,7 +329,6 @@
// Add version identifiers
string versions = join(getSettings!"versions"(), " ");
- if(type == Config.Unittest) versions ~= " " ~ "Unittest";
ret.formattedWrite("
%s", versions);
@@ -342,7 +340,7 @@
// Unittests
ret.formattedWrite("
- %s", type == Config.Unittest? "1" : "0");
+ %s", btsettings.dflags.canFind("-unittest") ? "1" : "0");
// compute directory for intermediate files (need dummy/ because of how -op determines the resulting path)
auto relpackpath = pack.path.relativeTo(project_file_dir);
diff --git a/source/dub/package_.d b/source/dub/package_.d
index 63548fd..fb8e99c 100644
--- a/source/dub/package_.d
+++ b/source/dub/package_.d
@@ -193,6 +193,33 @@
return ret;
}
+ void addBuildTypeSettings(ref BuildSettings settings, in BuildPlatform platform, string build_type)
+ const {
+ if (build_type == "$DFLAGS") {
+ import dub.internal.std.process;
+ string dflags = environment.get("DFLAGS");
+ settings.addDFlags(dflags.split());
+ return;
+ }
+
+ if (auto pbt = build_type in m_info.buildTypes) {
+ pbt.getPlatformSettings(settings, platform, this.path);
+ } else {
+ switch (build_type) {
+ default: throw new Exception(format("Unknown build type for %s: %s", this.name, build_type));
+ case "plain": break;
+ case "debug": settings.addDFlags("-g", "-debug"); break;
+ case "release": settings.addDFlags("-release", "-O", "-inline"); break;
+ case "unittest": settings.addDFlags("-g", "-unittest"); break;
+ case "docs": settings.addDFlags("-c", "-o-", "-D", "-Dddocs"); break;
+ case "ddox": settings.addDFlags("-c", "-o-", "-D", "-Df__dummy.html", "-Xfdocs.json"); break;
+ case "profile": settings.addDFlags("-g", "-O", "-inline", "-profile"); break;
+ case "cov": settings.addDFlags("-g", "-cov"); break;
+ case "unittest-cov": settings.addDFlags("-g", "-unittest", "-cov"); break;
+ }
+ }
+ }
+
string getSubConfiguration(string config, in Package dependency, in BuildPlatform platform)
const {
bool found = false;
@@ -298,6 +325,7 @@
string[] ddoxFilterArgs;
BuildSettingsTemplate buildSettings;
ConfigurationInfo[] configurations;
+ BuildSettingsTemplate[string] buildTypes;
@property const(Dependency)[string] dependencies()
const {
@@ -328,12 +356,19 @@
if (this.buildSettings.targetType != TargetType.autodetect)
deftargettp = this.buildSettings.targetType;
- foreach( settings; value ){
+ foreach (settings; value) {
ConfigurationInfo ci;
ci.parseJson(settings, deftargettp);
this.configurations ~= ci;
}
break;
+ case "buildTypes":
+ foreach (string name, settings; value) {
+ BuildSettingsTemplate bs;
+ bs.parseJson(settings);
+ buildTypes[name] = bs;
+ }
+ break;
}
}
diff --git a/source/dub/project.d b/source/dub/project.d
index cb5dddb..9f22601 100644
--- a/source/dub/project.d
+++ b/source/dub/project.d
@@ -270,6 +270,17 @@
}
}
+ void addBuildTypeSettings(ref BuildSettings dst, in BuildPlatform platform, string build_type)
+ {
+ bool usedefflags = !(dst.requirements & BuildRequirements.noDefaultFlags);
+ if (usedefflags) {
+ dst.addDFlags(["-w"]);
+ BuildSettings btsettings;
+ m_main.addBuildTypeSettings(btsettings, platform, build_type);
+ processVars(dst, m_main.path.toNativeString(), btsettings);
+ }
+ }
+
/// Actions which can be performed to update the application.
Action[] determineActions(PackageSupplier[] packageSuppliers, int option)