diff --git a/source/dub/platform.d b/source/dub/platform.d index face9ca..37122d7 100644 --- a/source/dub/platform.d +++ b/source/dub/platform.d @@ -188,16 +188,14 @@ */ bool matchesSpecification(in BuildPlatform platform, const(char)[] specification) { - import std.string : format; + import std.string : chompPrefix, format; import std.algorithm : canFind, splitter; import std.exception : enforce; if (specification.empty) return true; if (platform == BuildPlatform.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. + auto splitted = specification.chompPrefix("-").splitter('-'); enforce(!splitted.empty, format("Platform specification, if present, must not be empty: \"%s\"", specification)); if (platform.platform.canFind(splitted.front)) { @@ -220,16 +218,19 @@ /// unittest { - auto platform=BuildPlatform(["posix", "linux"], ["x86_64"], "dmd"); + auto platform = BuildPlatform(["posix", "linux"], ["x86_64"], "dmd"); assert(platform.matchesSpecification("")); - assert(platform.matchesSpecification("-posix")); - assert(platform.matchesSpecification("-linux")); - assert(platform.matchesSpecification("-linux-dmd")); - assert(platform.matchesSpecification("-linux-x86_64-dmd")); + assert(platform.matchesSpecification("posix")); + assert(platform.matchesSpecification("linux")); + assert(platform.matchesSpecification("linux-dmd")); + assert(platform.matchesSpecification("linux-x86_64-dmd")); + assert(platform.matchesSpecification("x86_64")); + assert(!platform.matchesSpecification("windows")); + assert(!platform.matchesSpecification("ldc")); + assert(!platform.matchesSpecification("windows-dmd")); + + // Before PR#2279, a leading '-' was required assert(platform.matchesSpecification("-x86_64")); - assert(!platform.matchesSpecification("-windows")); - assert(!platform.matchesSpecification("-ldc")); - assert(!platform.matchesSpecification("-windows-dmd")); } /// Represents a platform a package can be build upon. @@ -281,5 +282,3 @@ assert(!bp.isWindows); } } - - diff --git a/source/dub/recipe/json.d b/source/dub/recipe/json.d index e96e5a9..9c9c7f6 100644 --- a/source/dub/recipe/json.d +++ b/source/dub/recipe/json.d @@ -160,7 +160,7 @@ { auto idx = indexOf(name, "-"); string basename, suffix; - if( idx >= 0 ) { basename = name[0 .. idx]; suffix = name[idx .. $]; } + if( idx >= 0 ) { basename = name[0 .. idx]; suffix = name[idx + 1 .. $]; } else basename = name; switch(basename){ default: break; @@ -260,6 +260,13 @@ private Json toJson(const scope ref BuildSettingsTemplate bs) { + static string withSuffix (string pre, string post) + { + if (!post.length) + return pre; + return pre ~ "-" ~ post; + } + auto ret = Json.emptyObject; if( bs.dependencies !is null ){ auto deps = Json.emptyObject; @@ -274,47 +281,47 @@ if (!bs.workingDirectory.empty) ret["workingDirectory"] = bs.workingDirectory; if (!bs.mainSourceFile.empty) ret["mainSourceFile"] = bs.mainSourceFile; if (bs.subConfigurations.length > 0) ret["subConfigurations"] = serializeToJson(bs.subConfigurations); - foreach (suffix, arr; bs.dflags) ret["dflags"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.lflags) ret["lflags"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.libs) ret["libs"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.sourceFiles) ret["sourceFiles"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.sourcePaths) ret["sourcePaths"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.excludedSourceFiles) ret["excludedSourceFiles"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.injectSourceFiles) ret["injectSourceFiles"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.copyFiles) ret["copyFiles"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.extraDependencyFiles) ret["extraDependencyFiles"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.versions) ret["versions"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.debugVersions) ret["debugVersions"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.versionFilters) ret["-versionFilters"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.debugVersionFilters) ret["-debugVersionFilters"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.importPaths) ret["importPaths"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.stringImportPaths) ret["stringImportPaths"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.preGenerateCommands) ret["preGenerateCommands"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.postGenerateCommands) ret["postGenerateCommands"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.preBuildCommands) ret["preBuildCommands"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.postBuildCommands) ret["postBuildCommands"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.preRunCommands) ret["preRunCommands"~suffix] = serializeToJson(arr); - foreach (suffix, arr; bs.postRunCommands) ret["postRunCommands"~suffix] = serializeToJson(arr); - foreach (suffix, aa; bs.environments) ret["environments"~suffix] = serializeToJson(aa); - foreach (suffix, aa; bs.buildEnvironments) ret["buildEnvironments"~suffix] = serializeToJson(aa); - foreach (suffix, aa; bs.runEnvironments) ret["runEnvironments"~suffix] = serializeToJson(aa); - foreach (suffix, aa; bs.preGenerateEnvironments) ret["preGenerateEnvironments"~suffix] = serializeToJson(aa); - foreach (suffix, aa; bs.postGenerateEnvironments) ret["postGenerateEnvironments"~suffix] = serializeToJson(aa); - foreach (suffix, aa; bs.preBuildEnvironments) ret["preBuildEnvironments"~suffix] = serializeToJson(aa); - foreach (suffix, aa; bs.postBuildEnvironments) ret["postBuildEnvironments"~suffix] = serializeToJson(aa); - foreach (suffix, aa; bs.preRunEnvironments) ret["preRunEnvironments"~suffix] = serializeToJson(aa); - foreach (suffix, aa; bs.postRunEnvironments) ret["postRunEnvironments"~suffix] = serializeToJson(aa); + foreach (suffix, arr; bs.dflags) ret[withSuffix("dflags", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.lflags) ret[withSuffix("lflags", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.libs) ret[withSuffix("libs", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.sourceFiles) ret[withSuffix("sourceFiles", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.sourcePaths) ret[withSuffix("sourcePaths", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.excludedSourceFiles) ret[withSuffix("excludedSourceFiles", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.injectSourceFiles) ret[withSuffix("injectSourceFiles", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.copyFiles) ret[withSuffix("copyFiles", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.extraDependencyFiles) ret[withSuffix("extraDependencyFiles", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.versions) ret[withSuffix("versions", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.debugVersions) ret[withSuffix("debugVersions", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.versionFilters) ret[withSuffix("-versionFilters", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.debugVersionFilters) ret[withSuffix("-debugVersionFilters", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.importPaths) ret[withSuffix("importPaths", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.stringImportPaths) ret[withSuffix("stringImportPaths", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.preGenerateCommands) ret[withSuffix("preGenerateCommands", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.postGenerateCommands) ret[withSuffix("postGenerateCommands", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.preBuildCommands) ret[withSuffix("preBuildCommands", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.postBuildCommands) ret[withSuffix("postBuildCommands", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.preRunCommands) ret[withSuffix("preRunCommands", suffix)] = serializeToJson(arr); + foreach (suffix, arr; bs.postRunCommands) ret[withSuffix("postRunCommands", suffix)] = serializeToJson(arr); + foreach (suffix, aa; bs.environments) ret[withSuffix("environments", suffix)] = serializeToJson(aa); + foreach (suffix, aa; bs.buildEnvironments) ret[withSuffix("buildEnvironments", suffix)] = serializeToJson(aa); + foreach (suffix, aa; bs.runEnvironments) ret[withSuffix("runEnvironments", suffix)] = serializeToJson(aa); + foreach (suffix, aa; bs.preGenerateEnvironments) ret[withSuffix("preGenerateEnvironments", suffix)] = serializeToJson(aa); + foreach (suffix, aa; bs.postGenerateEnvironments) ret[withSuffix("postGenerateEnvironments", suffix)] = serializeToJson(aa); + foreach (suffix, aa; bs.preBuildEnvironments) ret[withSuffix("preBuildEnvironments", suffix)] = serializeToJson(aa); + foreach (suffix, aa; bs.postBuildEnvironments) ret[withSuffix("postBuildEnvironments", suffix)] = serializeToJson(aa); + foreach (suffix, aa; bs.preRunEnvironments) ret[withSuffix("preRunEnvironments", suffix)] = serializeToJson(aa); + foreach (suffix, aa; bs.postRunEnvironments) ret[withSuffix("postRunEnvironments", suffix)] = serializeToJson(aa); foreach (suffix, arr; bs.buildRequirements) { string[] val; foreach (i; [EnumMembers!BuildRequirement]) if (arr & i) val ~= to!string(i); - ret["buildRequirements"~suffix] = serializeToJson(val); + ret[withSuffix("buildRequirements", suffix)] = serializeToJson(val); } foreach (suffix, arr; bs.buildOptions) { string[] val; foreach (i; [EnumMembers!BuildOption]) if (arr & i) val ~= to!string(i); - ret["buildOptions"~suffix] = serializeToJson(val); + ret[withSuffix("buildOptions", suffix)] = serializeToJson(val); } return ret; } diff --git a/source/dub/recipe/packagerecipe.d b/source/dub/recipe/packagerecipe.d index 33bf25c..d32578e 100644 --- a/source/dub/recipe/packagerecipe.d +++ b/source/dub/recipe/packagerecipe.d @@ -165,7 +165,7 @@ const { if( platforms.empty ) return true; foreach(p; platforms) - if( platform.matchesSpecification("-"~p) ) + if (platform.matchesSpecification(p)) return true; return false; } diff --git a/source/dub/recipe/sdl.d b/source/dub/recipe/sdl.d index d7c7418..0897562 100644 --- a/source/dub/recipe/sdl.d +++ b/source/dub/recipe/sdl.d @@ -241,12 +241,12 @@ void add(string name, string value, string namespace = null) { ret ~= new Tag(namespace, name, [Value(value)]); } void adda(string name, string suffix, in string[] values, string namespace = null) { ret ~= new Tag(namespace, name, values[].map!(v => Value(v)).array, - suffix.length ? [new Attribute(null, "platform", Value(suffix[1 .. $]))] : null); + suffix.length ? [new Attribute(null, "platform", Value(suffix))] : null); } void addaa(string name, string suffix, in string[string] values, string namespace = null) { foreach (k, v; values) { ret ~= new Tag(namespace, name, [Value(k), Value(v)], - suffix.length ? [new Attribute(null, "platform", Value(suffix[1 .. $]))] : null); + suffix.length ? [new Attribute(null, "platform", Value(suffix))] : null); } } @@ -369,7 +369,7 @@ { string platform; if ("platform" in t.attributes) - platform = "-" ~ t.attributes["platform"][0].value.get!string; + platform = t.attributes["platform"][0].value.get!string; dst[platform] ~= t.values.map!(v => v.get!string).array; } private void parsePlatformStringAA(Tag t, ref string[string][string] dst) @@ -377,7 +377,7 @@ import std.string : format; string platform; if ("platform" in t.attributes) - platform = "-" ~ t.attributes["platform"][0].value.get!string; + platform = t.attributes["platform"][0].value.get!string; enforceSDL(t.values.length == 2, format("Values for '%s' must be 2 required.", t.fullName), t); enforceSDL(t.values[0].peek!string !is null, format("Values for '%s' must be strings.", t.fullName), t); enforceSDL(t.values[1].peek!string !is null, format("Values for '%s' must be strings.", t.fullName), t); @@ -388,7 +388,7 @@ { string platform; if ("platform" in t.attributes) - platform = "-" ~ t.attributes["platform"][0].value.get!string; + platform = t.attributes["platform"][0].value.get!string; foreach (v; t.values) { if (platform !in dst) dst[platform] = Es.init; dst[platform] |= v.get!string.to!E; @@ -606,9 +606,9 @@ PackageRecipe rec; parseSDL(rec, sdl, null, "testfile"); assert(rec.buildSettings.dflags.length == 3); - assert(rec.buildSettings.dflags["-windows-x86"] == ["-a", "-b", "-c"]); + assert(rec.buildSettings.dflags["windows-x86"] == ["-a", "-b", "-c"]); assert(rec.buildSettings.dflags[""] == ["-e", "-f", "-g"]); - assert(rec.buildSettings.dflags["-linux"] == ["-h", "-i", "-j"]); + assert(rec.buildSettings.dflags["linux"] == ["-h", "-i", "-j"]); } unittest { // test for missing name field @@ -638,7 +638,7 @@ PackageRecipe p; p.name = "test"; p.authors = ["foo", "bar"]; - p.buildSettings.dflags["-windows"] = ["-a"]; + p.buildSettings.dflags["windows"] = ["-a"]; p.buildSettings.lflags[""] = ["-b", "-c"]; auto sdl = toSDL(p).toSDLDocument(); assert(sdl ==