diff --git a/source/dub/package_.d b/source/dub/package_.d index 439b25a..b00e4a7 100644 --- a/source/dub/package_.d +++ b/source/dub/package_.d @@ -211,6 +211,20 @@ return ret.data; } + const(Dependency[string]) getDependencies(string config) + const { + Dependency[string] ret; + foreach (k, v; m_info.buildSettings.dependencies) + ret[k] = v; + foreach (ref conf; m_info.configurations) + if (conf.name == config) { + foreach (k, v; conf.buildSettings.dependencies) + ret[k] = v; + break; + } + return ret; + } + /** Overwrites the packge description file using the default filename with the current information. */ void storeInfo() diff --git a/source/dub/project.d b/source/dub/project.d index d156c53..d701bd0 100644 --- a/source/dub/project.d +++ b/source/dub/project.d @@ -402,8 +402,15 @@ } // check for conflicts (packages missing in the final configuration graph) - foreach (p; getTopologicalPackageList()) - enforce(p.name in ret, "Could not resolve configuration for package "~p.name); + void checkPacksRec(in Package pack) { + auto pc = pack.name in ret; + enforce(pc !is null, "Could not resolve configuration for package "~pack.name); + foreach (p, dep; pack.getDependencies(*pc)) { + auto deppack = getDependency(p, dep.optional); + if (deppack) checkPacksRec(deppack); + } + } + checkPacksRec(m_rootPackage); return ret; }