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[] injectSourceFiles; /// Files that should be injected when this package is dependent upon by a binary image. 88 string[] copyFiles; /// Files to copy to the target directory 89 string[] extraDependencyFiles; /// Files to check for rebuild dub project 90 string[] versions; /// D version identifiers to set 91 string[] debugVersions; /// D debug version identifiers to set 92 string[] importPaths; 93 string[] cImportPaths; 94 string[] stringImportPaths; 95 string[] preGenerateCommands; /// Commands executed before creating the description, with variables not substituted. 96 string[] postGenerateCommands; /// Commands executed after creating the description, with variables not substituted. 97 string[] preBuildCommands; /// Commands to execute prior to every build, with variables not substituted. 98 string[] postBuildCommands; /// Commands to execute after every build, with variables not substituted. 99 string[] preRunCommands; /// Commands to execute prior to every run, with variables not substituted. 100 string[] postRunCommands; /// Commands to execute after every run, with variables not substituted. 101 string[string] environments; 102 string[string] buildEnvironments; 103 string[string] runEnvironments; 104 string[string] preGenerateEnvironments; 105 string[string] postGenerateEnvironments; 106 string[string] preBuildEnvironments; 107 string[string] postBuildEnvironments; 108 string[string] preRunEnvironments; 109 string[string] postRunEnvironments; 110 @byName BuildRequirement[] buildRequirements; 111 @byName BuildOption[] options; 112 SourceFileDescription[] files; /// A list of all source/import files possibly used by the package 113 } 114 115 116 /** 117 Describes the settings necessary to build a certain binary target. 118 */ 119 struct TargetDescription { 120 string rootPackage; /// Main package associated with this target, this is also the name of the target. 121 string[] packages; /// All packages contained in this target (e.g. for target type "sourceLibrary") 122 string rootConfiguration; /// Build configuration of the target's root package used for building 123 BuildSettings buildSettings; /// Final build settings to use when building the target 124 string cacheArtifactPath; /// The full path of the built target in the cache 125 string[] dependencies; /// List of all dependencies of this target (package names) 126 string[] linkDependencies; /// List of all link-dependencies of this target (target names) 127 } 128 129 /** 130 Description for a single source file known to the package. 131 */ 132 struct SourceFileDescription { 133 @byName SourceFileRole role; /// Main role this file plays in the build process 134 string path; /// Full path to the file 135 } 136 137 /** 138 Determines the role that a file plays in the build process. 139 140 If a file has multiple roles, higher enum values will have precedence, i.e. 141 if a file is used both, as a source file and as an import file, it will 142 be classified as a source file. 143 */ 144 enum SourceFileRole { 145 unusedStringImport, /// Used as a string import for another configuration/platform 146 unusedImport, /// Used as an import for another configuration/platform 147 unusedSource, /// Used as a source file for another configuration/platform 148 stringImport, /// Used as a string import file 149 import_, /// Used as an import file 150 source /// Used as a source file 151 }