1 /** 2 Types for project descriptions (dub describe). 3 4 Copyright: © 2015-2016 rejectedsoftware e.K. 5 License: Subject to the terms of the MIT license, as written in the included LICENSE.txt file. 6 Authors: Sönke Ludwig 7 */ 8 module dub.description; 9 10 import dub.compilers.buildsettings; 11 import dub.dependency; 12 import dub.internal.vibecompat.data.serialization; 13 14 15 /** 16 Describes a complete project for use in IDEs or build tools. 17 18 The build settings will be specific to the compiler, platform 19 and configuration that has been selected. 20 */ 21 struct ProjectDescription { 22 string rootPackage; /// Name of the root package being built 23 string configuration; /// Name of the selected build configuration 24 string buildType; /// Name of the selected build type 25 string compiler; /// Canonical name of the compiler used (e.g. "dmd", "gdc" or "ldc") 26 string[] architecture; /// Architecture constants for the selected platform (e.g. `["x86_64"]`) 27 string[] platform; /// Platform constants for the selected platform (e.g. `["posix", "osx"]`) 28 PackageDescription[] packages; /// All packages in the dependency tree 29 TargetDescription[] targets; /// Build targets 30 @ignore size_t[string] targetLookup; /// Target index by package name name 31 32 /// Targets by name 33 ref inout(TargetDescription) lookupTarget(string name) inout 34 { 35 import std.exception : enforce; 36 auto pti = name in targetLookup; 37 enforce(pti !is null, "Target '"~name~"' doesn't exist. Is the target type set to \"none\" in the package recipe?"); 38 return targets[*pti]; 39 } 40 41 /// Projects by name 42 ref inout(PackageDescription) lookupPackage(string name) inout 43 { 44 foreach (ref p; packages) 45 if (p.name == name) 46 { 47 return p; 48 } 49 throw new Exception("Package '"~name~"' not found in dependency tree."); 50 } 51 52 /// Root package 53 ref inout(PackageDescription) lookupRootPackage() inout { return lookupPackage(rootPackage); } 54 } 55 56 57 /** 58 Describes the build settings and meta data of a single package. 59 60 This structure contains the effective build settings and dependencies for 61 the selected build platform. This structure is most useful for displaying 62 information about a package in an IDE. Use `TargetDescription` instead when 63 writing a build-tool. 64 */ 65 struct PackageDescription { 66 string path; /// Path to the package 67 string name; /// Qualified name of the package 68 Version version_; /// Version of the package 69 string description; 70 string homepage; 71 string[] authors; 72 string copyright; 73 string license; 74 string[] dependencies; 75 76 bool active; /// Does this package take part in the build? 77 string configuration; /// The configuration that is built 78 @byName TargetType targetType; 79 string targetPath; 80 string targetName; 81 string targetFileName; 82 string workingDirectory; 83 string mainSourceFile; 84 string[] dflags; /// Flags passed to the D compiler 85 string[] lflags; /// Flags passed to the linker 86 string[] libs; /// Library names to link against (typically using "-l<name>") 87 string[] frameworks; /// Framework names to link against. 88 string[] injectSourceFiles; /// Files that should be injected when this package is dependent upon by a binary image. 89 string[] copyFiles; /// Files to copy to the target directory 90 string[] extraDependencyFiles; /// Files to check for rebuild dub project 91 string[] versions; /// D version identifiers to set 92 string[] debugVersions; /// D debug version identifiers to set 93 string[] importPaths; 94 string[] cImportPaths; 95 string[] stringImportPaths; 96 string[] preGenerateCommands; /// Commands executed before creating the description, with variables not substituted. 97 string[] postGenerateCommands; /// Commands executed after creating the description, with variables not substituted. 98 string[] preBuildCommands; /// Commands to execute prior to every build, with variables not substituted. 99 string[] postBuildCommands; /// Commands to execute after every build, with variables not substituted. 100 string[] preRunCommands; /// Commands to execute prior to every run, with variables not substituted. 101 string[] postRunCommands; /// Commands to execute after every run, with variables not substituted. 102 string[string] environments; 103 string[string] buildEnvironments; 104 string[string] runEnvironments; 105 string[string] preGenerateEnvironments; 106 string[string] postGenerateEnvironments; 107 string[string] preBuildEnvironments; 108 string[string] postBuildEnvironments; 109 string[string] preRunEnvironments; 110 string[string] postRunEnvironments; 111 @byName BuildRequirement[] buildRequirements; 112 @byName BuildOption[] options; 113 SourceFileDescription[] files; /// A list of all source/import files possibly used by the package 114 } 115 116 117 /** 118 Describes the settings necessary to build a certain binary target. 119 */ 120 struct TargetDescription { 121 string rootPackage; /// Main package associated with this target, this is also the name of the target. 122 string[] packages; /// All packages contained in this target (e.g. for target type "sourceLibrary") 123 string rootConfiguration; /// Build configuration of the target's root package used for building 124 BuildSettings buildSettings; /// Final build settings to use when building the target 125 string cacheArtifactPath; /// The full path of the built target in the cache 126 string[] dependencies; /// List of all dependencies of this target (package names) 127 string[] linkDependencies; /// List of all link-dependencies of this target (target names) 128 } 129 130 /** 131 Description for a single source file known to the package. 132 */ 133 struct SourceFileDescription { 134 @byName SourceFileRole role; /// Main role this file plays in the build process 135 string path; /// Full path to the file 136 } 137 138 /** 139 Determines the role that a file plays in the build process. 140 141 If a file has multiple roles, higher enum values will have precedence, i.e. 142 if a file is used both, as a source file and as an import file, it will 143 be classified as a source file. 144 */ 145 enum SourceFileRole { 146 unusedStringImport, /// Used as a string import for another configuration/platform 147 unusedImport, /// Used as an import for another configuration/platform 148 unusedSource, /// Used as a source file for another configuration/platform 149 stringImport, /// Used as a string import file 150 import_, /// Used as an import file 151 source /// Used as a source file 152 }