Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
4a4aebf
Upgrade Json/serialization code to latest vibe.d version.
s-ludwig Apr 21, 2015
ff7d73e
Fix compilation of the updated vibe.d modules on all supported DMD ve…
s-ludwig May 13, 2015
3328fd0
Enable file names/line numbers and field names for the updated JSON m…
s-ludwig Apr 23, 2015
d50fba6
Fix field existence check in Project.setUpgradeCache.
s-ludwig Apr 23, 2015
62d8834
Make the describe() API strongly typed.
s-ludwig Apr 21, 2015
8a7295e
Change Build(Options/Requirements) to BitFlags.
s-ludwig May 13, 2015
538bb53
Add "targets" field to "dub describe" output.
s-ludwig May 13, 2015
881c826
Add 'dub describe --data='.
May 22, 2015
dcee6b0
Split --data=libs into two: --data=libs (for installed/system libs) a…
Jun 3, 2015
8d06069
Add 'dub describe --data-format=' to format the output of --data= dir…
Jun 5, 2015
8b70101
Replace --data-format with --compiler and --data-list.
Jun 5, 2015
16c2596
Fixed: When formatting output for a compiler, if the package is a lib…
Jun 5, 2015
ba9384f
Add --data-0 to output --data= info null-delimited for (ex.) xargs -0
Jun 14, 2015
50c4140
Allow comma-separated list in --data, for brevity.
Jun 17, 2015
e059178
Replace 'getBuildSettingBitField' with 'to!BuildSetting'.
Jun 19, 2015
c9d1bc4
buildPath -> buildNormalizedPath
Jun 19, 2015
eba861e
Make targetLookup return an index into targets[], instead of a redund…
Jun 19, 2015
6b82b54
Accidentally left in some old commented-out code.
Jun 19, 2015
145d23c
Rework --data's handling of sourceFiles and static library dependencies.
Jun 21, 2015
50fbfbb
Skip DMD-centric tests when DMD isn't available.
Jun 21, 2015
2db082f
Again, rework --data's handling of sourceFiles and static library dep…
Jun 24, 2015
a09d883
Change order of describe-data tests, list should run before dmd as it…
Jun 24, 2015
ac3bf05
TargetDescriptionGenerator: Don't add linker files to BuildSettings.s…
Abscissa Jun 25, 2015
1eedd12
Fixed: --data=linker-files misses linker files specified in dub.json.
Abscissa Jun 25, 2015
c80094b
Fixed: Compile error on anything before DMD 2.067.
Abscissa Jun 26, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,7 @@ __dummy.html
/test/ignore-hidden-2/ignore-hidden-2
/test/expected-import-path-output
/test/expected-string-import-path-output
/test/expected-describe-data-1-list-output
/test/expected-describe-data-2-dmd-output
/test/describe-project/dummy.dat
/test/describe-project/dummy-dep1.dat
3 changes: 3 additions & 0 deletions build-files.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ source/app.d
source/dub/commandline.d
source/dub/dependency.d
source/dub/dependencyresolver.d
source/dub/description.d
source/dub/dub.d
source/dub/init.d
source/dub/packagemanager.d
Expand All @@ -19,6 +20,7 @@ source/dub/generators/build.d
source/dub/generators/cmake.d
source/dub/generators/generator.d
source/dub/generators/sublimetext.d
source/dub/generators/targetdescription.d
source/dub/generators/visuald.d
source/dub/internal/libInputVisitor.d
source/dub/internal/sdlang/ast.d
Expand All @@ -33,6 +35,7 @@ source/dub/internal/utils.d
source/dub/internal/vibecompat/core/file.d
source/dub/internal/vibecompat/core/log.d
source/dub/internal/vibecompat/data/json.d
source/dub/internal/vibecompat/data/serialization.d
source/dub/internal/vibecompat/data/utils.d
source/dub/internal/vibecompat/inet/path.d
source/dub/internal/vibecompat/inet/url.d
Expand Down
66 changes: 55 additions & 11 deletions source/dub/commandline.d
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import dub.dub;
import dub.generators.generator;
import dub.internal.vibecompat.core.file;
import dub.internal.vibecompat.core.log;
import dub.internal.vibecompat.data.json;
import dub.internal.vibecompat.inet.url;
import dub.package_;
import dub.packagemanager;
Expand Down Expand Up @@ -748,6 +749,9 @@ class DescribeCommand : PackageBuildCommand {
private {
bool m_importPaths = false;
bool m_stringImportPaths = false;
bool m_dataList = false;
bool m_dataNullDelim = false;
string[] m_data;
}

this()
Expand All @@ -760,14 +764,28 @@ class DescribeCommand : PackageBuildCommand {
"their dependencies in a format similar to a JSON package "
"description file. This is useful mostly for IDEs.",
"",
"When --import-paths is supplied, the import paths for a project ",
"will be printed line-by-line instead. The paths for D source "
"files across all dependent projects will be included.",
"All usual options that are also used for build/run/generate apply.",
"",
"--string-import-paths can can supplied to print the string "
"import paths for a project.",
"When --data=VALUE is supplied, specific build settings for a project ",
"will be printed instead (by default, formatted for the current compiler).",
"",
"All usual options that are also used for build/run/generate apply."
"The --data=VALUE option can be specified multiple times to retrieve "
"several pieces of information at once. A comma-separated list is "
"also acceptable (ex: --data=dflags,libs). The data will be output in "
"the same order requested on the command line.",
"",
"The accepted values for --data=VALUE are:",
"",
"main-source-file, dflags, lflags, libs, linker-files, "
"source-files, versions, debug-versions, import-paths, "
"string-import-paths, import-files, options",
"",
"The following are also accepted by --data if --data-list is used:",
"",
"target-type, target-path, target-name, working-directory, "
"copy-files, string-import-files, pre-generate-commands,"
"post-generate-commands, pre-build-commands, post-build-commands, "
"requirements",
];
}

Expand All @@ -776,11 +794,28 @@ class DescribeCommand : PackageBuildCommand {
super.prepare(args);

args.getopt("import-paths", &m_importPaths, [
"List the import paths for project."
"Shortcut for --data=import-paths --data-list"
]);

args.getopt("string-import-paths", &m_stringImportPaths, [
"List the string import paths for project."
"Shortcut for --data=string-import-paths --data-list"
]);

args.getopt("data", &m_data, [
"Just list the values of a particular build setting, either for this "~
"package alone or recursively including all dependencies. Accepts a "~
"comma-separated list. See above for more details and accepted "~
"possibilities for VALUE."
]);

args.getopt("data-list", &m_dataList, [
"Output --data information in list format (line-by-line), instead "~
"of formatting for a compiler command line.",
]);

args.getopt("data-0", &m_dataNullDelim, [
"Output --data information using null-delimiters, rather than "~
"spaces or newlines. Result is usable with, ex., xargs -0.",
]);
}

Expand All @@ -791,6 +826,11 @@ class DescribeCommand : PackageBuildCommand {
"--import-paths and --string-import-paths may not be used together."
);

enforceUsage(
!(m_data && (m_importPaths || m_stringImportPaths)),
"--data may not be used together with --import-paths or --string-import-paths."
);

// disable all log output and use "writeln" to output the JSON description
auto ll = getLogLevel();
setLogLevel(LogLevel.none);
Expand All @@ -806,11 +846,15 @@ class DescribeCommand : PackageBuildCommand {
auto config = m_buildConfig.length ? m_buildConfig : m_defaultConfig;

if (m_importPaths) {
dub.listImportPaths(m_buildPlatform, config);
dub.listImportPaths(m_buildPlatform, config, m_buildType, m_dataNullDelim);
} else if (m_stringImportPaths) {
dub.listStringImportPaths(m_buildPlatform, config);
dub.listStringImportPaths(m_buildPlatform, config, m_buildType, m_dataNullDelim);
} else if (m_data) {
dub.listProjectData(m_buildPlatform, config, m_buildType, m_data,
m_dataList? null : m_compiler, m_dataNullDelim);
} else {
dub.describeProject(m_buildPlatform, config);
auto desc = dub.project.describe(m_buildPlatform, config, m_buildType);
writeln(desc.serializeToPrettyJson());
}

return 0;
Expand Down
114 changes: 107 additions & 7 deletions source/dub/compilers/buildsettings.d
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,15 @@ import dub.internal.vibecompat.inet.path;
import std.array : array;
import std.algorithm : filter;
import std.path : globMatch;
static if (__VERSION__ >= 2067)
import std.typecons : BitFlags;


/// BuildPlatform specific settings, like needed libraries or additional
/// include paths.
struct BuildSettings {
import dub.internal.vibecompat.data.serialization;

TargetType targetType;
string targetPath;
string targetName;
Expand All @@ -25,6 +29,7 @@ struct BuildSettings {
string[] dflags;
string[] lflags;
string[] libs;
string[] linkerFiles;
string[] sourceFiles;
string[] copyFiles;
string[] versions;
Expand All @@ -37,8 +42,8 @@ struct BuildSettings {
string[] postGenerateCommands;
string[] preBuildCommands;
string[] postBuildCommands;
BuildRequirements requirements;
BuildOptions options;
@byName BuildRequirements requirements;
@byName BuildOptions options;

BuildSettings dup()
const {
Expand All @@ -60,6 +65,7 @@ struct BuildSettings {
addDFlags(bs.dflags);
addLFlags(bs.lflags);
addLibs(bs.libs);
addLinkerFiles(bs.linkerFiles);
addSourceFiles(bs.sourceFiles);
addCopyFiles(bs.copyFiles);
addVersions(bs.versions);
Expand All @@ -78,6 +84,7 @@ struct BuildSettings {
void removeDFlags(in string[] value...) { remove(dflags, value); }
void addLFlags(in string[] value...) { lflags ~= value; }
void addLibs(in string[] value...) { add(libs, value); }
void addLinkerFiles(in string[] value...) { add(linkerFiles, value); }
void addSourceFiles(in string[] value...) { add(sourceFiles, value); }
void prependSourceFiles(in string[] value...) { prepend(sourceFiles, value); }
void removeSourceFiles(in string[] value...) { removePaths(sourceFiles, value); }
Expand All @@ -94,9 +101,12 @@ struct BuildSettings {
void addPostGenerateCommands(in string[] value...) { add(postGenerateCommands, value, false); }
void addPreBuildCommands(in string[] value...) { add(preBuildCommands, value, false); }
void addPostBuildCommands(in string[] value...) { add(postBuildCommands, value, false); }
void addRequirements(in BuildRequirements[] value...) { foreach (v; value) this.requirements |= v; }
void addOptions(in BuildOptions[] value...) { foreach (v; value) this.options |= v; }
void removeOptions(in BuildOptions[] value...) { foreach (v; value) this.options &= ~v; }
void addRequirements(in BuildRequirement[] value...) { foreach (v; value) this.requirements |= v; }
void addRequirements(in BuildRequirements value) { this.requirements |= value; }
void addOptions(in BuildOption[] value...) { foreach (v; value) this.options |= v; }
void addOptions(in BuildOptions value) { this.options |= value; }
void removeOptions(in BuildOption[] value...) { foreach (v; value) this.options &= ~v; }
void removeOptions(in BuildOptions value) { this.options &= ~value; }

// Adds vals to arr without adding duplicates.
private void add(ref string[] arr, in string[] vals, bool no_duplicates = true)
Expand Down Expand Up @@ -203,7 +213,7 @@ enum TargetType {
object
}

enum BuildRequirements {
enum BuildRequirement {
none = 0, /// No special requirements
allowWarnings = 1<<0, /// Warnings do not abort compilation
silenceWarnings = 1<<1, /// Don't show warnings
Expand All @@ -217,7 +227,46 @@ enum BuildRequirements {
noDefaultFlags = 1<<9, /// Do not issue any of the default build flags (e.g. -debug, -w, -property etc.) - use only for development purposes
}

enum BuildOptions {
struct BuildRequirements {
import dub.internal.vibecompat.data.serialization : ignore;

static if (__VERSION__ >= 2067) {
@ignore BitFlags!BuildRequirement values;
this(BuildRequirement req) { values = req; }
deprecated("Use BuildRequirement.* instead.") {
enum none = BuildRequirement.none;
enum allowWarnings = BuildRequirement.allowWarnings;
enum silenceWarnings = BuildRequirement.silenceWarnings;
enum disallowDeprecations = BuildRequirement.disallowDeprecations;
enum silenceDeprecations = BuildRequirement.silenceDeprecations;
enum disallowInlining = BuildRequirement.disallowInlining;
enum disallowOptimization = BuildRequirement.disallowOptimization;
enum requireBoundsCheck = BuildRequirement.requireBoundsCheck;
enum requireContracts = BuildRequirement.requireContracts;
enum relaxProperties = BuildRequirement.relaxProperties;
enum noDefaultFlags = BuildRequirement.noDefaultFlags;
}
} else {
@ignore BuildRequirement values;
this(BuildRequirement req) { values = req; }
BuildRequirement[] toRepresentation()
const {
BuildRequirement[] ret;
for (int f = 1; f <= BuildRequirement.max; f *= 2)
if (values & f) ret ~= cast(BuildRequirement)f;
return ret;
}
static BuildRequirements fromRepresentation(BuildRequirement[] v)
{
BuildRequirements ret;
foreach (f; v) ret.values |= f;
return ret;
}
}
alias values this;
}

enum BuildOption {
none = 0, /// Use compiler defaults
debugMode = 1<<0, /// Compile in debug mode (enables contracts, -debug)
releaseMode = 1<<1, /// Compile in release mode (disables assertions and bounds checks, -release)
Expand All @@ -241,3 +290,54 @@ enum BuildOptions {
deprecationErrors = 1<<19, /// Stop compilation upon usage of deprecated features (-de)
property = 1<<20, /// DEPRECATED: Enforce property syntax (-property)
}

struct BuildOptions {
import dub.internal.vibecompat.data.serialization : ignore;

static if (__VERSION__ >= 2067) {
@ignore BitFlags!BuildOption values;
this(BuildOption opt) { values = opt; }
deprecated("Use BuildOption.* instead.") {
enum none = BuildOption.none;
enum debugMode = BuildOption.debugMode;
enum releaseMode = BuildOption.releaseMode;
enum coverage = BuildOption.coverage;
enum debugInfo = BuildOption.debugInfo;
enum debugInfoC = BuildOption.debugInfoC;
enum alwaysStackFrame = BuildOption.alwaysStackFrame;
enum stackStomping = BuildOption.stackStomping;
enum inline = BuildOption.inline;
enum noBoundsCheck = BuildOption.noBoundsCheck;
enum optimize = BuildOption.optimize;
enum profile = BuildOption.profile;
enum unittests = BuildOption.unittests;
enum verbose = BuildOption.verbose;
enum ignoreUnknownPragmas = BuildOption.ignoreUnknownPragmas;
enum syntaxOnly = BuildOption.syntaxOnly;
enum warnings = BuildOption.warnings;
enum warningsAsErrors = BuildOption.warningsAsErrors;
enum ignoreDeprecations = BuildOption.ignoreDeprecations;
enum deprecationWarnings = BuildOption.deprecationWarnings;
enum deprecationErrors = BuildOption.deprecationErrors;
enum property = BuildOption.property;
}
} else {
@ignore BuildOption values;
this(BuildOption opt) { values = opt; }
BuildOption[] toRepresentation()
const {
BuildOption[] ret;
for (int f = 1; f <= BuildOption.max; f *= 2)
if (values & f) ret ~= cast(BuildOption)f;
return ret;
}
static BuildOptions fromRepresentation(BuildOption[] v)
{
BuildOptions ret;
foreach (f; v) ret.values |= f;
return ret;
}
}

alias values this;
}
46 changes: 23 additions & 23 deletions source/dub/compilers/compiler.d
Original file line number Diff line number Diff line change
Expand Up @@ -106,22 +106,22 @@ void warnOnSpecialCompilerFlags(string[] compiler_flags, BuildOptions options, s
];

struct SpecialOption {
BuildOptions[] flags;
BuildOption[] flags;
string alternative;
}
static immutable SpecialOption[] s_specialOptions = [
{[BuildOptions.debugMode], "Call DUB with --build=debug"},
{[BuildOptions.releaseMode], "Call DUB with --build=release"},
{[BuildOptions.coverage], "Call DUB with --build=cov or --build=unittest-cov"},
{[BuildOptions.debugInfo], "Call DUB with --build=debug"},
{[BuildOptions.inline], "Call DUB with --build=release"},
{[BuildOptions.noBoundsCheck], "Call DUB with --build=release-nobounds"},
{[BuildOptions.optimize], "Call DUB with --build=release"},
{[BuildOptions.profile], "Call DUB with --build=profile"},
{[BuildOptions.unittests], "Call DUB with --build=unittest"},
{[BuildOptions.warnings, BuildOptions.warningsAsErrors], "Use \"buildRequirements\" to control the warning level"},
{[BuildOptions.ignoreDeprecations, BuildOptions.deprecationWarnings, BuildOptions.deprecationErrors], "Use \"buildRequirements\" to control the deprecation warning level"},
{[BuildOptions.property], "This flag is deprecated and has no effect"}
{[BuildOption.debugMode], "Call DUB with --build=debug"},
{[BuildOption.releaseMode], "Call DUB with --build=release"},
{[BuildOption.coverage], "Call DUB with --build=cov or --build=unittest-cov"},
{[BuildOption.debugInfo], "Call DUB with --build=debug"},
{[BuildOption.inline], "Call DUB with --build=release"},
{[BuildOption.noBoundsCheck], "Call DUB with --build=release-nobounds"},
{[BuildOption.optimize], "Call DUB with --build=release"},
{[BuildOption.profile], "Call DUB with --build=profile"},
{[BuildOption.unittests], "Call DUB with --build=unittest"},
{[BuildOption.warnings, BuildOption.warningsAsErrors], "Use \"buildRequirements\" to control the warning level"},
{[BuildOption.ignoreDeprecations, BuildOption.deprecationWarnings, BuildOption.deprecationErrors], "Use \"buildRequirements\" to control the deprecation warning level"},
{[BuildOption.property], "This flag is deprecated and has no effect"}
];

bool got_preamble = false;
Expand Down Expand Up @@ -169,16 +169,16 @@ void warnOnSpecialCompilerFlags(string[] compiler_flags, BuildOptions options, s
*/
void enforceBuildRequirements(ref BuildSettings settings)
{
settings.addOptions(BuildOptions.warningsAsErrors);
if (settings.requirements & BuildRequirements.allowWarnings) { settings.options &= ~BuildOptions.warningsAsErrors; settings.options |= BuildOptions.warnings; }
if (settings.requirements & BuildRequirements.silenceWarnings) settings.options &= ~(BuildOptions.warningsAsErrors|BuildOptions.warnings);
if (settings.requirements & BuildRequirements.disallowDeprecations) { settings.options &= ~(BuildOptions.ignoreDeprecations|BuildOptions.deprecationWarnings); settings.options |= BuildOptions.deprecationErrors; }
if (settings.requirements & BuildRequirements.silenceDeprecations) { settings.options &= ~(BuildOptions.deprecationErrors|BuildOptions.deprecationWarnings); settings.options |= BuildOptions.ignoreDeprecations; }
if (settings.requirements & BuildRequirements.disallowInlining) settings.options &= ~BuildOptions.inline;
if (settings.requirements & BuildRequirements.disallowOptimization) settings.options &= ~BuildOptions.optimize;
if (settings.requirements & BuildRequirements.requireBoundsCheck) settings.options &= ~BuildOptions.noBoundsCheck;
if (settings.requirements & BuildRequirements.requireContracts) settings.options &= ~BuildOptions.releaseMode;
if (settings.requirements & BuildRequirements.relaxProperties) settings.options &= ~BuildOptions.property;
settings.addOptions(BuildOption.warningsAsErrors);
if (settings.requirements & BuildRequirement.allowWarnings) { settings.options &= ~BuildOption.warningsAsErrors; settings.options |= BuildOption.warnings; }
if (settings.requirements & BuildRequirement.silenceWarnings) settings.options &= ~(BuildOption.warningsAsErrors|BuildOption.warnings);
if (settings.requirements & BuildRequirement.disallowDeprecations) { settings.options &= ~(BuildOption.ignoreDeprecations|BuildOption.deprecationWarnings); settings.options |= BuildOption.deprecationErrors; }
if (settings.requirements & BuildRequirement.silenceDeprecations) { settings.options &= ~(BuildOption.deprecationErrors|BuildOption.deprecationWarnings); settings.options |= BuildOption.ignoreDeprecations; }
if (settings.requirements & BuildRequirement.disallowInlining) settings.options &= ~BuildOption.inline;
if (settings.requirements & BuildRequirement.disallowOptimization) settings.options &= ~BuildOption.optimize;
if (settings.requirements & BuildRequirement.requireBoundsCheck) settings.options &= ~BuildOption.noBoundsCheck;
if (settings.requirements & BuildRequirement.requireContracts) settings.options &= ~BuildOption.releaseMode;
if (settings.requirements & BuildRequirement.relaxProperties) settings.options &= ~BuildOption.property;
}


Expand Down
Loading