Skip to content

Commit 4262e05

Browse files
committed
Build{Options,Requirements}: Use a common templated struct
A bit less copy-pasta is a small but appreciable win.
1 parent deea6c2 commit 4262e05

File tree

6 files changed

+37
-31
lines changed

6 files changed

+37
-31
lines changed

source/dub/compilers/buildsettings.d

+27-21
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ struct BuildSettings {
5757
string[string] postBuildEnvironments;
5858
string[string] preRunEnvironments;
5959
string[string] postRunEnvironments;
60-
@byName BuildRequirements requirements;
61-
@byName BuildOptions options;
60+
@byName Flags!BuildRequirement requirements;
61+
@byName Flags!BuildOption options;
6262

6363
BuildSettings dup()
6464
const {
@@ -153,11 +153,11 @@ struct BuildSettings {
153153
void addPostRunEnvironments(in string[string] value) { add(postRunEnvironments, value); }
154154
void updatePostRunEnvironments(in string[string] value) { update(postRunEnvironments, value); }
155155
void addRequirements(in BuildRequirement[] value...) { foreach (v; value) this.requirements |= v; }
156-
void addRequirements(in BuildRequirements value) { this.requirements |= value; }
156+
void addRequirements(in Flags!BuildRequirement value) { this.requirements |= value; }
157157
void addOptions(in BuildOption[] value...) { foreach (v; value) this.options |= v; }
158-
void addOptions(in BuildOptions value) { this.options |= value; }
158+
void addOptions(in Flags!BuildOption value) { this.options |= value; }
159159
void removeOptions(in BuildOption[] value...) { foreach (v; value) this.options &= ~v; }
160-
void removeOptions(in BuildOptions value) { this.options &= ~value; }
160+
void removeOptions(in Flags!BuildOption value) { this.options &= ~value; }
161161

162162
private:
163163
static auto filterDuplicates(T)(ref string[] arr, in T vals, bool noDuplicates = true)
@@ -342,15 +342,6 @@ enum BuildRequirement {
342342
noDefaultFlags = 1<<9, /// Do not issue any of the default build flags (e.g. -debug, -w, -property etc.) - use only for development purposes
343343
}
344344

345-
struct BuildRequirements {
346-
import dub.internal.vibecompat.data.serialization : ignore;
347-
348-
@ignore BitFlags!BuildRequirement values;
349-
this(BuildRequirement req) { values = req; }
350-
351-
alias values this;
352-
}
353-
354345
enum BuildOption {
355346
none = 0, /// Use compiler defaults
356347
debugMode = 1<<0, /// Compile in debug mode (enables contracts, -debug)
@@ -385,16 +376,24 @@ enum BuildOption {
385376
_ddox = 1<<27, // Compile docs.json
386377
}
387378

388-
struct BuildOptions {
389-
import dub.internal.vibecompat.data.serialization : ignore;
379+
struct Flags (T) {
380+
import dub.internal.vibecompat.data.serialization : ignore;
381+
382+
@ignore BitFlags!T values;
390383

391-
@ignore BitFlags!BuildOption values;
392-
this(BuildOption opt) { values = opt; }
393-
this(BitFlags!BuildOption v) { values = v; }
384+
public this(T opt) @safe pure nothrow @nogc
385+
{
386+
this.values = opt;
387+
}
394388

395-
alias values this;
389+
public this(BitFlags!T v) @safe pure nothrow @nogc
390+
{
391+
this.values = v;
396392
}
397393

394+
alias values this;
395+
}
396+
398397
/**
399398
All build options that will be inherited upwards in the dependency graph
400399
@@ -405,11 +404,18 @@ enum BuildOption {
405404
$(LI The option enabled meta information in dependent projects that are useful for the dependee (e.g. debug information))
406405
)
407406
*/
408-
enum BuildOptions inheritedBuildOptions = BuildOption.debugMode | BuildOption.releaseMode
407+
enum Flags!BuildOption inheritedBuildOptions =
408+
BuildOption.debugMode | BuildOption.releaseMode
409409
| BuildOption.coverage | BuildOption.coverageCTFE | BuildOption.debugInfo | BuildOption.debugInfoC
410410
| BuildOption.alwaysStackFrame | BuildOption.stackStomping | BuildOption.inline
411411
| BuildOption.noBoundsCheck | BuildOption.profile | BuildOption.ignoreUnknownPragmas
412412
| BuildOption.syntaxOnly | BuildOption.warnings | BuildOption.warningsAsErrors
413413
| BuildOption.ignoreDeprecations | BuildOption.deprecationWarnings
414414
| BuildOption.deprecationErrors | BuildOption.property | BuildOption.profileGC
415415
| BuildOption.pic;
416+
417+
deprecated("Use `Flags!BuildOption` instead")
418+
public alias BuildOptions = Flags!BuildOption;
419+
420+
deprecated("Use `Flags!BuildRequirement` instead")
421+
public alias BuildRequirements = Flags!BuildRequirement;

source/dub/compilers/utils.d

+2-2
Original file line numberDiff line numberDiff line change
@@ -187,11 +187,11 @@ void resolveLibs(ref BuildSettings settings, const scope ref BuildPlatform platf
187187
equivalent.
188188
189189
Certain compiler flags should, instead of using compiler-specific syntax,
190-
be specified as build options (`BuildOptions`) or built requirements
190+
be specified as build options (`BuildOption`) or built requirements
191191
(`BuildRequirements`). This function will output warning messages to
192192
assist the user in making the best choice.
193193
*/
194-
void warnOnSpecialCompilerFlags(string[] compiler_flags, BuildOptions options, string package_name, string config_name)
194+
void warnOnSpecialCompilerFlags(string[] compiler_flags, Flags!BuildOption options, string package_name, string config_name)
195195
{
196196
import std.algorithm : any, endsWith, startsWith;
197197
import std.range : empty;

source/dub/generators/generator.d

+1-1
Original file line numberDiff line numberDiff line change
@@ -720,7 +720,7 @@ class ProjectGenerator
720720
{
721721
child.addVersions(parent.versions);
722722
child.addDebugVersions(parent.debugVersions);
723-
child.addOptions(BuildOptions(parent.options & inheritedBuildOptions));
723+
child.addOptions(Flags!BuildOption(parent.options & inheritedBuildOptions));
724724
}
725725

726726
private static void mergeFromDependency(const scope ref BuildSettings child, ref BuildSettings parent, const scope ref BuildPlatform platform)

source/dub/project.d

+2-2
Original file line numberDiff line numberDiff line change
@@ -1054,9 +1054,9 @@ shared static this() {
10541054
return value.byKeyValue.map!(a => a.key ~ "=" ~ a.value);
10551055
else static if( is(typeof(value) == enum) )
10561056
return only(value);
1057-
else static if( is(typeof(value) == BuildRequirements) )
1057+
else static if( is(typeof(value) == Flags!BuildRequirement) )
10581058
return only(cast(BuildRequirement) cast(int) value.values);
1059-
else static if( is(typeof(value) == BuildOptions) )
1059+
else static if( is(typeof(value) == Flags!BuildOption) )
10601060
return only(cast(BuildOption) cast(int) value.values);
10611061
else
10621062
static assert(false, "Type of BuildSettings."~attributeName~" is unsupported.");

source/dub/recipe/json.d

+2-2
Original file line numberDiff line numberDiff line change
@@ -246,13 +246,13 @@ private void parseJson(ref BuildSettingsTemplate bs, Json json, string package_n
246246
case "preRunEnvironments": bs.preRunEnvironments[suffix] = deserializeJson!(string[string])(value); break;
247247
case "postRunEnvironments": bs.postRunEnvironments[suffix] = deserializeJson!(string[string])(value); break;
248248
case "buildRequirements":
249-
BuildRequirements reqs;
249+
Flags!BuildRequirement reqs;
250250
foreach (req; deserializeJson!(string[])(value))
251251
reqs |= to!BuildRequirement(req);
252252
bs.buildRequirements[suffix] = reqs;
253253
break;
254254
case "buildOptions":
255-
BuildOptions options;
255+
Flags!BuildOption options;
256256
foreach (opt; deserializeJson!(string[])(value))
257257
options |= to!BuildOption(opt);
258258
bs.buildOptions[suffix] = options;

source/dub/recipe/packagerecipe.d

+3-3
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,8 @@ struct BuildSettingsTemplate {
214214
string[string][string] postBuildEnvironments;
215215
string[string][string] preRunEnvironments;
216216
string[string][string] postRunEnvironments;
217-
BuildRequirements[string] buildRequirements;
218-
BuildOptions[string] buildOptions;
217+
Flags!BuildRequirement[string] buildRequirements;
218+
Flags!BuildOption[string] buildOptions;
219219

220220

221221
/// Constructs a BuildSettings object from this template.
@@ -354,7 +354,7 @@ struct BuildSettingsTemplate {
354354
logWarn("");
355355
} else {
356356
string[] all_dflags;
357-
BuildOptions all_options;
357+
Flags!BuildOption all_options;
358358
foreach (flags; this.dflags) all_dflags ~= flags;
359359
foreach (options; this.buildOptions) all_options |= options;
360360
.warnOnSpecialCompilerFlags(all_dflags, all_options, package_name, config_name);

0 commit comments

Comments
 (0)