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; /// Librariy names to link against (typically using "-l<name>") 87 string[] copyFiles; /// Files to copy to the target directory 88 string[] versions; /// D version identifiers to set 89 string[] debugVersions; /// D debug version identifiers to set 90 string[] importPaths; 91 string[] stringImportPaths; 92 string[] preGenerateCommands; /// commands executed before creating the description 93 string[] postGenerateCommands; /// commands executed after creating the description 94 string[] preBuildCommands; /// Commands to execute prior to every build 95 string[] postBuildCommands; /// Commands to execute after every build 96 @byName BuildRequirement[] buildRequirements; 97 @byName BuildOption[] options; 98 SourceFileDescription[] files; /// A list of all source/import files possibly used by the package 99 } 100 101 102 /** 103 Describes the settings necessary to build a certain binary target. 104 */ 105 struct TargetDescription { 106 string rootPackage; /// Main package associated with this target, this is also the name of the target. 107 string[] packages; /// All packages contained in this target (e.g. for target type "sourceLibrary") 108 string rootConfiguration; /// Build configuration of the target's root package used for building 109 BuildSettings buildSettings; /// Final build settings to use when building the target 110 string[] dependencies; /// List of all dependencies of this target (package names) 111 string[] linkDependencies; /// List of all link-dependencies of this target (target names) 112 } 113 114 /** 115 Description for a single source file known to the package. 116 */ 117 struct SourceFileDescription { 118 @byName SourceFileRole role; /// Main role this file plays in the build process 119 string path; /// Full path to the file 120 } 121 122 /** 123 Determines the role that a file plays in the build process. 124 125 If a file has multiple roles, higher enum values will have precedence, i.e. 126 if a file is used both, as a source file and as an import file, it will 127 be classified as a source file. 128 */ 129 enum SourceFileRole { 130 unusedStringImport, /// Used as a string import for another configuration/platform 131 unusedImport, /// Used as an import for another configuration/platform 132 unusedSource, /// Used as a source file for another configuration/platform 133 stringImport, /// Used as a string import file 134 import_, /// Used as an import file 135 source /// Used as a source file 136 }