diff --git a/source/dub/compilers/compiler.d b/source/dub/compilers/compiler.d index 3005e40..06d7831 100644 --- a/source/dub/compilers/compiler.d +++ b/source/dub/compilers/compiler.d @@ -251,6 +251,8 @@ /// Compiled frontend version (e.g. 2065) int frontendVersion; + enum any = BuildPlatform(null, null, null, null, -1); + /// Build platforms can be specified via a string specification. /// /// Specifications are build upon the following scheme, where each component @@ -270,9 +272,11 @@ /// Returns: /// true if the given specification matches this BuildPlatform, false otherwise. (The empty string matches) /// - bool matchesSpecification(const(char)[] specification) const { - if (specification.empty) - return true; + bool matchesSpecification(const(char)[] specification) + const { + if (specification.empty) return true; + if (this == any) return true; + auto splitted=specification.splitter('-'); assert(!splitted.empty, "No valid platform specification! The leading hyphen is required!"); splitted.popFront(); // Drop leading empty match. diff --git a/source/dub/package_.d b/source/dub/package_.d index 0bbb13f..b8f6f1c 100644 --- a/source/dub/package_.d +++ b/source/dub/package_.d @@ -277,6 +277,23 @@ return ret; } + /// Returns the combination of all build settings for all configurations and platforms + BuildSettings getCombinedBuildSettings() + const { + BuildSettings ret; + m_info.buildSettings.getPlatformSettings(ret, BuildPlatform.any, this.path); + foreach(ref conf; m_info.configurations) + conf.buildSettings.getPlatformSettings(ret, BuildPlatform.any, this.path); + + // construct default target name based on package name + if (ret.targetName.empty) ret.targetName = this.name.replace(":", "_"); + + // special support for DMD style flags + getCompiler("dmd").extractBuildOptions(ret); + + return ret; + } + void addBuildTypeSettings(ref BuildSettings settings, in BuildPlatform platform, string build_type) const { if (build_type == "$DFLAGS") { @@ -378,6 +395,7 @@ // save build settings BuildSettings bs = getBuildSettings(platform, config); + BuildSettings allbs = getCombinedBuildSettings(); foreach (string k, v; bs.serializeToJson()) dst[k] = v; dst.remove("requirements"); @@ -402,24 +420,19 @@ bopts ~= Json(to!string(cast(BuildOptions)i)); dst.options = bopts; - // prettify files output + // collect all possible source files and determine their types + string[string] sourceFileTypes; + foreach (f; allbs.stringImportFiles) sourceFileTypes[f] = "unusedStringImport"; + foreach (f; allbs.importFiles) sourceFileTypes[f] = "unusedImport"; + foreach (f; allbs.sourceFiles) sourceFileTypes[f] = "unusedSource"; + foreach (f; bs.stringImportFiles) sourceFileTypes[f] = "stringImport"; + foreach (f; bs.importFiles) sourceFileTypes[f] = "import"; + foreach (f; bs.sourceFiles) sourceFileTypes[f] = "source"; Json[] files; - foreach (f; bs.sourceFiles) { + foreach (f; sourceFileTypes.byKey.array.sort) { auto jf = Json.emptyObject; - jf.path = f; - jf["type"] = "source"; - files ~= jf; - } - foreach (f; bs.importFiles) { - auto jf = Json.emptyObject; - jf.path = f; - jf["type"] = "import"; - files ~= jf; - } - foreach (f; bs.stringImportFiles) { - auto jf = Json.emptyObject; - jf.path = f; - jf["type"] = "stringImport"; + jf["path"] = f; + jf["type"] = sourceFileTypes[f]; files ~= jf; } dst.files = Json(files);