diff --git a/source/dub/generators/generator.d b/source/dub/generators/generator.d index cba8f09..2c87ee9 100644 --- a/source/dub/generators/generator.d +++ b/source/dub/generators/generator.d @@ -383,45 +383,21 @@ visited.clear(); // 1. downwards inherits versions, debugVersions, and inheritable build settings - static void configureDependencies(const scope ref TargetInfo ti, TargetInfo[string] targets, - BuildSettings[string] dependBS, size_t level = 0) + static void configureDependencies(const scope ref TargetInfo ti, TargetInfo[string] targets, size_t level = 0) { - static void applyForcedSettings(const scope ref BuildSettings forced, ref BuildSettings child) { - child.addDFlags(forced.dflags); - } - // do not use `visited` here as dependencies must inherit // configurations from *all* of their parents logDebug("%sConfigure dependencies of %s, deps:%(%s, %)", ' '.repeat(2 * level), ti.pack.name, ti.dependencies); foreach (depname; ti.dependencies) { - BuildSettings forcedSettings; auto pti = &targets[depname]; mergeFromDependent(ti.buildSettings, pti.buildSettings); - - if (auto matchedSettings = depname in dependBS) - forcedSettings = *matchedSettings; - else if (auto matchedSettings = "*" in dependBS) - forcedSettings = *matchedSettings; - - applyForcedSettings(forcedSettings, pti.buildSettings); - configureDependencies(*pti, targets, ["*" : forcedSettings], level + 1); + configureDependencies(*pti, targets, level + 1); } } - BuildSettings[string] dependencyBuildSettings; - foreach (key, value; rootPackage.recipe.buildSettings.dependencyBuildSettings) - { - BuildSettings buildSettings; - if (auto target = key in targets) - { - value.getPlatformSettings(buildSettings, genSettings.platform, target.pack.path); - buildSettings.processVars(m_project, target.pack, buildSettings, genSettings, true); - dependencyBuildSettings[key] = buildSettings; - } - } - configureDependencies(*roottarget, targets, dependencyBuildSettings); + configureDependencies(*roottarget, targets); // 2. add Have_dependency_xyz for all direct dependencies of a target // (includes incorporated non-target dependencies and their dependencies) @@ -529,6 +505,54 @@ overrideStringImports(targets[depname], *roottarget, targets, roottarget.buildSettings.stringImportFiles); + // 6. downwards inherits dependency build settings + static void applyForcedSettings(const scope ref TargetInfo ti, TargetInfo[string] targets, + BuildSettings[string] dependBS, size_t level = 0) + { + + static void apply(const scope ref BuildSettings forced, ref BuildSettings child) { + child.addDFlags(forced.dflags); + } + + // apply to all dependencies + foreach (depname; ti.dependencies) + { + BuildSettings forcedSettings; + auto pti = &targets[depname]; + + // fetch the forced dependency build settings + if (auto matchedSettings = depname in dependBS) + forcedSettings = *matchedSettings; + else if (auto matchedSettings = "*" in dependBS) + forcedSettings = *matchedSettings; + + apply(forcedSettings, pti.buildSettings); + + // recursively apply forced settings to all dependencies of his dependency + applyForcedSettings(*pti, targets, ["*" : forcedSettings], level + 1); + } + } + + // apply both top level and configuration level forced dependency build settings + foreach (configured_dbs; [ + cast(const(BuildSettingsTemplate[string])) rootPackage.recipe.buildSettings.dependencyBuildSettings, + rootPackage.getBuildSettings(genSettings.config).dependencyBuildSettings]) + { + BuildSettings[string] dependencyBuildSettings; + foreach (key, value; configured_dbs) + { + BuildSettings buildSettings; + if (auto target = key in targets) + { + // get platform specific build settings and process dub variables (BuildSettingsTemplate => BuildSettings) + value.getPlatformSettings(buildSettings, genSettings.platform, target.pack.path); + buildSettings.processVars(m_project, target.pack, buildSettings, genSettings, true); + dependencyBuildSettings[key] = buildSettings; + } + } + applyForcedSettings(*roottarget, targets, dependencyBuildSettings); + } + // remove targets without output foreach (name; targets.keys) { diff --git a/test/depen-build-settings/.no_build_dmd b/test/depen-build-settings/.no_build_dmd new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/depen-build-settings/.no_build_dmd diff --git a/test/depen-build-settings/.no_build_gdc b/test/depen-build-settings/.no_build_gdc new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/depen-build-settings/.no_build_gdc diff --git a/test/depen-build-settings/depend/depend2/source/depend2.d b/test/depen-build-settings/depend/depend2/source/depend2.d index 31b6367..3fff78b 100644 --- a/test/depen-build-settings/depend/depend2/source/depend2.d +++ b/test/depen-build-settings/depend/depend2/source/depend2.d @@ -1,5 +1,7 @@ import std.stdio; +version (must_be_defined) {} else static assert(0, "Expected must_be_defined to be set"); + extern (C) void depend2_func() { writeln("depend2_func"); diff --git a/test/depen-build-settings/depend/source/depend.d b/test/depen-build-settings/depend/source/depend.d index d9bb981..2db3cac 100644 --- a/test/depen-build-settings/depend/source/depend.d +++ b/test/depen-build-settings/depend/source/depend.d @@ -1,5 +1,7 @@ import std.stdio; +version (must_be_defined) {} else static assert(0, "Expected must_be_defined to be set"); + extern (C) void depend2_func(); extern (C) void depend1_func() diff --git a/test/depen-build-settings/dub.json b/test/depen-build-settings/dub.json index 1769ac1..4e8ccfd 100644 --- a/test/depen-build-settings/dub.json +++ b/test/depen-build-settings/dub.json @@ -4,5 +4,15 @@ "dependencies": { "depend1": { "version" : "*", "dflags" : ["-X"] } - } + }, + + "configurations": [ + { + "name" : "defaultconfig", + "targetType": "executable", + "dependencies": { + "depend1": { "version" : "*", "dflags" : ["--d-version=must_be_defined"] } + } + } + ] } diff --git a/test/depen-build-settings/source/app.d b/test/depen-build-settings/source/app.d index 8893119..dbba31e 100644 --- a/test/depen-build-settings/source/app.d +++ b/test/depen-build-settings/source/app.d @@ -3,10 +3,13 @@ extern (C) void depend1_func(); +version (must_be_defined) static assert(0, "Expected must_be_defined not to be set"); + void main() { writeln("Edit source/app.d to start your project."); depend1_func(); + assert(!exists("depen-build-settings.json")); assert(exists("depend2.json")); assert(exists("depend.json")); }