diff --git a/build-files.txt b/build-files.txt index ffc06e0..58e2808 100644 --- a/build-files.txt +++ b/build-files.txt @@ -20,6 +20,7 @@ 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 diff --git a/source/dub/commandline.d b/source/dub/commandline.d index 4a2605c..d5c202a 100644 --- a/source/dub/commandline.d +++ b/source/dub/commandline.d @@ -811,7 +811,7 @@ } else if (m_stringImportPaths) { dub.listStringImportPaths(m_buildPlatform, config); } else { - auto desc = dub.project.describe(m_buildPlatform, config); + auto desc = dub.project.describe(m_buildPlatform, config, m_buildType); writeln(desc.serializeToPrettyJson()); } diff --git a/source/dub/compilers/buildsettings.d b/source/dub/compilers/buildsettings.d index 0708615..83e9322 100644 --- a/source/dub/compilers/buildsettings.d +++ b/source/dub/compilers/buildsettings.d @@ -19,6 +19,8 @@ /// BuildPlatform specific settings, like needed libraries or additional /// include paths. struct BuildSettings { + import dub.internal.vibecompat.data.serialization; + TargetType targetType; string targetPath; string targetName; @@ -39,8 +41,8 @@ string[] postGenerateCommands; string[] preBuildCommands; string[] postBuildCommands; - BuildRequirements requirements; - BuildOptions options; + @byName BuildRequirements requirements; + @byName BuildOptions options; BuildSettings dup() const { diff --git a/source/dub/description.d b/source/dub/description.d index 64eda56..ea8cc10 100644 --- a/source/dub/description.d +++ b/source/dub/description.d @@ -22,10 +22,12 @@ string rootPackage; alias mainPackage = rootPackage; /// Compatibility alias string configuration; + string buildType; string compiler; string[] architecture; string[] platform; - PackageDescription[] packages; + PackageDescription[] packages; /// All packages in the dependency tree + TargetDescription[] targets; /// Build targets } @@ -66,6 +68,15 @@ SourceFileDescription[] files; } +struct TargetDescription { + string rootPackage; + string[] packages; + string rootConfiguration; + BuildSettings buildSettings; + string[] dependencies; + string[] linkDependencies; +} + /** Description for a single source file. */ diff --git a/source/dub/generators/targetdescription.d b/source/dub/generators/targetdescription.d new file mode 100644 index 0000000..5010952 --- /dev/null +++ b/source/dub/generators/targetdescription.d @@ -0,0 +1,37 @@ +/** + Pseudo generator to output build descriptions. + + Copyright: © 2015 rejectedsoftware e.K. + License: Subject to the terms of the MIT license, as written in the included LICENSE.txt file. + Authors: Sönke Ludwig +*/ +module dub.generators.targetdescription; + +import dub.description; +import dub.generators.generator; +import dub.project; + +class TargetDescriptionGenerator : ProjectGenerator { + TargetDescription[] targetDescriptions; + + this(Project project) + { + super(project); + } + + protected override void generateTargets(GeneratorSettings settings, in TargetInfo[string] targets) + { + targetDescriptions.length = targets.length; + size_t i = 0; + foreach (t; targets) { + TargetDescription d; + d.rootPackage = t.pack.name; + d.packages = t.packages.map!(p => p.name).array; + d.rootConfiguration = t.config; + d.buildSettings = t.buildSettings.dup; + d.dependencies = t.dependencies.dup; + d.linkDependencies = t.linkDependencies.dup; + targetDescriptions[i++] = d; + } + } +} diff --git a/source/dub/project.d b/source/dub/project.d index 36a1ab6..058cf99 100644 --- a/source/dub/project.d +++ b/source/dub/project.d @@ -573,24 +573,42 @@ }*/ /// Outputs a build description of the project, including its dependencies. - ProjectDescription describe(BuildPlatform platform, string config) + ProjectDescription describe(BuildPlatform platform, string config, string build_type = null) { + import dub.generators.targetdescription; + + // store basic build parameters ProjectDescription ret; ret.rootPackage = m_rootPackage.name; ret.configuration = config; + ret.buildType = build_type; ret.compiler = platform.compiler; ret.architecture = platform.architecture; ret.platform = platform.platform; + // collect high level information about projects (useful for IDE display) auto configs = getPackageConfigs(platform, config); - - // FIXME: use the generator system to collect the list of actually used build dependencies and source files - ret.packages ~= m_rootPackage.describe(platform, config); - foreach (dep; m_dependencies) ret.packages ~= dep.describe(platform, configs[dep.name]); + if (build_type.length) { + // collect build target information (useful for build tools) + GeneratorSettings settings; + settings.platform = platform; + settings.compiler = getCompiler(platform.compilerBinary); + settings.config = config; + settings.buildType = build_type; + auto gen = new TargetDescriptionGenerator(this); + try { + gen.generate(settings); + ret.targets = gen.targetDescriptions; + } catch (Exception e) { + logDiagnostic("Skipping targets description: %s", e.msg); + logDebug("Full error: %s", e.toString().sanitize); + } + } + return ret; } /// ditto