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 }