diff --git a/source/dub/compilers/buildsettings.d b/source/dub/compilers/buildsettings.d index 18410f4..e909c4f 100644 --- a/source/dub/compilers/buildsettings.d +++ b/source/dub/compilers/buildsettings.d @@ -57,8 +57,8 @@ string[string] postBuildEnvironments; string[string] preRunEnvironments; string[string] postRunEnvironments; - @byName BuildRequirements requirements; - @byName BuildOptions options; + @byName Flags!BuildRequirement requirements; + @byName Flags!BuildOption options; BuildSettings dup() const { @@ -153,11 +153,11 @@ void addPostRunEnvironments(in string[string] value) { add(postRunEnvironments, value); } void updatePostRunEnvironments(in string[string] value) { update(postRunEnvironments, value); } void addRequirements(in BuildRequirement[] value...) { foreach (v; value) this.requirements |= v; } - void addRequirements(in BuildRequirements value) { this.requirements |= value; } + void addRequirements(in Flags!BuildRequirement value) { this.requirements |= value; } void addOptions(in BuildOption[] value...) { foreach (v; value) this.options |= v; } - void addOptions(in BuildOptions value) { this.options |= value; } + void addOptions(in Flags!BuildOption value) { this.options |= value; } void removeOptions(in BuildOption[] value...) { foreach (v; value) this.options &= ~v; } - void removeOptions(in BuildOptions value) { this.options &= ~value; } + void removeOptions(in Flags!BuildOption value) { this.options &= ~value; } private: static auto filterDuplicates(T)(ref string[] arr, in T vals, bool noDuplicates = true) @@ -342,15 +342,6 @@ noDefaultFlags = 1<<9, /// Do not issue any of the default build flags (e.g. -debug, -w, -property etc.) - use only for development purposes } - struct BuildRequirements { - import dub.internal.vibecompat.data.serialization : ignore; - - @ignore BitFlags!BuildRequirement values; - this(BuildRequirement req) { values = req; } - - alias values this; - } - enum BuildOption { none = 0, /// Use compiler defaults debugMode = 1<<0, /// Compile in debug mode (enables contracts, -debug) @@ -385,16 +376,24 @@ _ddox = 1<<27, // Compile docs.json } - struct BuildOptions { - import dub.internal.vibecompat.data.serialization : ignore; +struct Flags (T) { + import dub.internal.vibecompat.data.serialization : ignore; - @ignore BitFlags!BuildOption values; - this(BuildOption opt) { values = opt; } - this(BitFlags!BuildOption v) { values = v; } + @ignore BitFlags!T values; - alias values this; + public this(T opt) @safe pure nothrow @nogc + { + this.values = opt; } + public this(BitFlags!T v) @safe pure nothrow @nogc + { + this.values = v; + } + + alias values this; +} + /** All build options that will be inherited upwards in the dependency graph @@ -405,7 +404,8 @@ $(LI The option enabled meta information in dependent projects that are useful for the dependee (e.g. debug information)) ) */ -enum BuildOptions inheritedBuildOptions = BuildOption.debugMode | BuildOption.releaseMode +enum Flags!BuildOption inheritedBuildOptions = + BuildOption.debugMode | BuildOption.releaseMode | BuildOption.coverage | BuildOption.coverageCTFE | BuildOption.debugInfo | BuildOption.debugInfoC | BuildOption.alwaysStackFrame | BuildOption.stackStomping | BuildOption.inline | BuildOption.noBoundsCheck | BuildOption.profile | BuildOption.ignoreUnknownPragmas @@ -413,3 +413,9 @@ | BuildOption.ignoreDeprecations | BuildOption.deprecationWarnings | BuildOption.deprecationErrors | BuildOption.property | BuildOption.profileGC | BuildOption.pic; + +deprecated("Use `Flags!BuildOption` instead") +public alias BuildOptions = Flags!BuildOption; + +deprecated("Use `Flags!BuildRequirement` instead") +public alias BuildRequirements = Flags!BuildRequirement; diff --git a/source/dub/compilers/utils.d b/source/dub/compilers/utils.d index d6632af..e047113 100644 --- a/source/dub/compilers/utils.d +++ b/source/dub/compilers/utils.d @@ -187,11 +187,11 @@ equivalent. Certain compiler flags should, instead of using compiler-specific syntax, - be specified as build options (`BuildOptions`) or built requirements + be specified as build options (`BuildOption`) or built requirements (`BuildRequirements`). This function will output warning messages to assist the user in making the best choice. */ -void warnOnSpecialCompilerFlags(string[] compiler_flags, BuildOptions options, string package_name, string config_name) +void warnOnSpecialCompilerFlags(string[] compiler_flags, Flags!BuildOption options, string package_name, string config_name) { import std.algorithm : any, endsWith, startsWith; import std.range : empty; diff --git a/source/dub/generators/generator.d b/source/dub/generators/generator.d index 38ea369..534b38c 100644 --- a/source/dub/generators/generator.d +++ b/source/dub/generators/generator.d @@ -720,7 +720,7 @@ { child.addVersions(parent.versions); child.addDebugVersions(parent.debugVersions); - child.addOptions(BuildOptions(parent.options & inheritedBuildOptions)); + child.addOptions(Flags!BuildOption(parent.options & inheritedBuildOptions)); } private static void mergeFromDependency(const scope ref BuildSettings child, ref BuildSettings parent, const scope ref BuildPlatform platform) diff --git a/source/dub/project.d b/source/dub/project.d index 4ae164f..7ed0d9a 100644 --- a/source/dub/project.d +++ b/source/dub/project.d @@ -1054,9 +1054,9 @@ return value.byKeyValue.map!(a => a.key ~ "=" ~ a.value); else static if( is(typeof(value) == enum) ) return only(value); - else static if( is(typeof(value) == BuildRequirements) ) + else static if( is(typeof(value) == Flags!BuildRequirement) ) return only(cast(BuildRequirement) cast(int) value.values); - else static if( is(typeof(value) == BuildOptions) ) + else static if( is(typeof(value) == Flags!BuildOption) ) return only(cast(BuildOption) cast(int) value.values); else static assert(false, "Type of BuildSettings."~attributeName~" is unsupported."); diff --git a/source/dub/recipe/json.d b/source/dub/recipe/json.d index c1d776d..9967a55 100644 --- a/source/dub/recipe/json.d +++ b/source/dub/recipe/json.d @@ -246,13 +246,13 @@ case "preRunEnvironments": bs.preRunEnvironments[suffix] = deserializeJson!(string[string])(value); break; case "postRunEnvironments": bs.postRunEnvironments[suffix] = deserializeJson!(string[string])(value); break; case "buildRequirements": - BuildRequirements reqs; + Flags!BuildRequirement reqs; foreach (req; deserializeJson!(string[])(value)) reqs |= to!BuildRequirement(req); bs.buildRequirements[suffix] = reqs; break; case "buildOptions": - BuildOptions options; + Flags!BuildOption options; foreach (opt; deserializeJson!(string[])(value)) options |= to!BuildOption(opt); bs.buildOptions[suffix] = options; diff --git a/source/dub/recipe/packagerecipe.d b/source/dub/recipe/packagerecipe.d index e1e4663..d7ed15b 100644 --- a/source/dub/recipe/packagerecipe.d +++ b/source/dub/recipe/packagerecipe.d @@ -214,8 +214,8 @@ string[string][string] postBuildEnvironments; string[string][string] preRunEnvironments; string[string][string] postRunEnvironments; - BuildRequirements[string] buildRequirements; - BuildOptions[string] buildOptions; + Flags!BuildRequirement[string] buildRequirements; + Flags!BuildOption[string] buildOptions; /// Constructs a BuildSettings object from this template. @@ -354,7 +354,7 @@ logWarn(""); } else { string[] all_dflags; - BuildOptions all_options; + Flags!BuildOption all_options; foreach (flags; this.dflags) all_dflags ~= flags; foreach (options; this.buildOptions) all_options |= options; .warnOnSpecialCompilerFlags(all_dflags, all_options, package_name, config_name);