diff --git a/source/dub/compilers/buildsettings.d b/source/dub/compilers/buildsettings.d index 10ec798..2db92dd 100644 --- a/source/dub/compilers/buildsettings.d +++ b/source/dub/compilers/buildsettings.d @@ -19,7 +19,7 @@ /// BuildPlatform specific settings, like needed libraries or additional /// include paths. struct BuildSettings { - import dub.internal.vibecompat.data.serialization; + import dub.internal.vibecompat.data.serialization : byName; TargetType targetType; string targetPath; diff --git a/source/dub/description.d b/source/dub/description.d index 0e4c955..24a00fc 100644 --- a/source/dub/description.d +++ b/source/dub/description.d @@ -33,6 +33,7 @@ /// Targets by name ref inout(TargetDescription) lookupTarget(string name) inout { + import std.exception : enforce; auto pti = name in targetLookup; enforce(pti !is null, "Target '"~name~"' doesn't exist. Is the target type set to \"none\" in the package recipe?"); return targets[*pti]; diff --git a/source/dub/generators/generator.d b/source/dub/generators/generator.d index 49e9f5a..78dc4f1 100644 --- a/source/dub/generators/generator.d +++ b/source/dub/generators/generator.d @@ -143,6 +143,8 @@ private BuildSettings collect(GeneratorSettings settings, Package pack, ref TargetInfo[string] targets, in string[string] configs, ref string[] main_files, string bin_pack) { + import std.algorithm : sort; + if (auto pt = pack.name in targets) return pt.buildSettings; // determine the actual target type @@ -354,6 +356,8 @@ private void finalizeGeneration(in Package pack, in Project proj, in GeneratorSettings settings, in BuildSettings buildsettings, Path target_path, bool generate_binary) { + import std.path : globMatch; + if (buildsettings.postGenerateCommands.length && !isRecursiveInvocation(pack.name)) { logInfo("Running post-generate commands for %s...", pack.name); runBuildCommands(buildsettings.postGenerateCommands, pack, proj, settings, buildsettings); diff --git a/source/dub/generators/targetdescription.d b/source/dub/generators/targetdescription.d index e5b0e02..cd0032e 100644 --- a/source/dub/generators/targetdescription.d +++ b/source/dub/generators/targetdescription.d @@ -25,6 +25,9 @@ protected override void generateTargets(GeneratorSettings settings, in TargetInfo[string] targets) { + import std.algorithm : map; + import std.array : array; + auto configs = m_project.getPackageConfigs(settings.platform, settings.config); targetDescriptions.length = targets.length; size_t i = 0; diff --git a/source/dub/internal/sdlang/lexer.d b/source/dub/internal/sdlang/lexer.d index fa79786..027b849 100644 --- a/source/dub/internal/sdlang/lexer.d +++ b/source/dub/internal/sdlang/lexer.d @@ -990,8 +990,7 @@ millisecond *= 10; } - FracSec fracSecs; - fracSecs.msecs = millisecond; + Duration fracSecs = millisecond.msecs; auto offset = hours(numHours) + minutes(numMinutes) + seconds(numSeconds); @@ -1256,12 +1255,12 @@ if(offset.isNull()) { // Unknown time zone - mixin(accept!("Value", "DateTimeFracUnknownZone(dateTimeFrac.dateTime, dateTimeFrac.fracSec, timezoneStr)")); + mixin(accept!("Value", "DateTimeFracUnknownZone(dateTimeFrac.dateTime, dateTimeFrac.fracSecs, timezoneStr)")); } else { auto timezone = new immutable SimpleTimeZone(offset.get()); - mixin(accept!("Value", "SysTime(dateTimeFrac.dateTime, dateTimeFrac.fracSec, timezone)")); + mixin(accept!("Value", "SysTime(dateTimeFrac.dateTime, dateTimeFrac.fracSecs, timezone)")); } } @@ -1269,7 +1268,7 @@ { auto timezone = TimeZone.getTimeZone(timezoneStr); if(timezone) - mixin(accept!("Value", "SysTime(dateTimeFrac.dateTime, dateTimeFrac.fracSec, timezone)")); + mixin(accept!("Value", "SysTime(dateTimeFrac.dateTime, dateTimeFrac.fracSecs, timezone)")); } catch(TimeException e) { @@ -1277,7 +1276,7 @@ } // Unknown time zone - mixin(accept!("Value", "DateTimeFracUnknownZone(dateTimeFrac.dateTime, dateTimeFrac.fracSec, timezoneStr)")); + mixin(accept!("Value", "DateTimeFracUnknownZone(dateTimeFrac.dateTime, dateTimeFrac.fracSecs, timezoneStr)")); } if(!isEndOfNumber()) diff --git a/source/dub/internal/sdlang/token.d b/source/dub/internal/sdlang/token.d index 5eca619..6be134e 100644 --- a/source/dub/internal/sdlang/token.d +++ b/source/dub/internal/sdlang/token.d @@ -23,7 +23,11 @@ struct DateTimeFrac { DateTime dateTime; - FracSec fracSec; + Duration fracSecs; + deprecated("Use fracSecs instead.") { + @property FracSec fracSec() const { return FracSec.from!"hnsecs"(fracSecs.total!"hnsecs"); } + @property void fracSec(FracSec v) { fracSecs = v.hnsecs.hnsecs; } + } } /++ @@ -39,7 +43,11 @@ struct DateTimeFracUnknownZone { DateTime dateTime; - FracSec fracSec; + Duration fracSecs; + deprecated("Use fracSecs instead.") { + @property FracSec fracSec() { return FracSec.from!"hnsecs"(fracSecs.total!"hnsecs"); } + @property void fracSec(FracSec v) { fracSecs = v.hnsecs.hnsecs; } + } string timeZone; bool opEquals(const DateTimeFracUnknownZone b) const @@ -50,7 +58,7 @@ { return this.dateTime == b.dateTime && - this.fracSec == b.fracSec && + this.fracSecs == b.fracSecs && this.timeZone == b.timeZone; } } @@ -227,16 +235,19 @@ sink.put("%.2s".format(value.dateTime.second)); } - if(value.fracSec.msecs != 0) + if(value.fracSecs.total!"msecs" != 0) { sink.put('.'); - sink.put("%.3s".format(value.fracSec.msecs)); + sink.put("%.3s".format(value.fracSecs.total!"msecs")); } } void toSDLString(Sink)(SysTime value, ref Sink sink) if(isOutputRange!(Sink,char)) { - auto dateTimeFrac = DateTimeFrac(cast(DateTime)value, value.fracSec); + static if (__VERSION__ >= 2067) + auto dateTimeFrac = DateTimeFrac(cast(DateTime)value, value.fracSecs); + else + auto dateTimeFrac = DateTimeFrac(cast(DateTime)value, value.fracSec); toSDLString(dateTimeFrac, sink); sink.put("-"); @@ -286,7 +297,7 @@ void toSDLString(Sink)(DateTimeFracUnknownZone value, ref Sink sink) if(isOutputRange!(Sink,char)) { - auto dateTimeFrac = DateTimeFrac(value.dateTime, value.fracSec); + auto dateTimeFrac = DateTimeFrac(value.dateTime, value.fracSecs); toSDLString(dateTimeFrac, sink); sink.put("-"); diff --git a/source/dub/recipe/io.d b/source/dub/recipe/io.d index 04511de..ef5a967 100644 --- a/source/dub/recipe/io.d +++ b/source/dub/recipe/io.d @@ -38,8 +38,8 @@ PackageRecipe ret; - if (filename.endsWith(".json")) dub.recipe.json.parseJson(ret, parseJsonString(contents, filename), parent_name); - else if (filename.endsWith(".sdl")) dub.recipe.sdl.parseSDL(ret, contents, parent_name, filename); + if (filename.endsWith(".json")) parseJson(ret, parseJsonString(contents, filename), parent_name); + else if (filename.endsWith(".sdl")) parseSDL(ret, contents, parent_name, filename); else assert(false, "readPackageRecipe called with filename with unknown extension: "~filename); return ret; } diff --git a/source/dub/recipe/sdl.d b/source/dub/recipe/sdl.d index a9d68ee..c29e374 100644 --- a/source/dub/recipe/sdl.d +++ b/source/dub/recipe/sdl.d @@ -15,6 +15,7 @@ import dub.recipe.packagerecipe; import std.algorithm : map; +import std.array : array; import std.conv; import std.string : startsWith; @@ -54,7 +55,7 @@ } } - enforce(recipe.name.length > 0, "The package \"name\" field is missing or empty."); + enforceSDL(recipe.name.length > 0, "The package \"name\" field is missing or empty.", sdl); string full_name = parent_name.length ? parent_name ~ ":" ~ recipe.name : recipe.name; // parse general build settings @@ -165,7 +166,7 @@ enforceSDL(t.values.length != 0, "Missing dependency name.", t); enforceSDL(t.values.length == 1, "Multiple dependency names.", t); auto pkg = expandPackageName(t.values[0].get!string, package_name, t); - enforce(pkg !in bs.dependencies, "The dependency '"~pkg~"' is specified more than once." ); + enforceSDL(pkg !in bs.dependencies, "The dependency '"~pkg~"' is specified more than once.", t); Dependency dep = Dependency.ANY; auto attrs = t.attributes;