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)