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 				static if (__VERSION__ > 2065)
48 					return p;
49 				else
50 					return *cast(inout(PackageDescription)*)&p;
51 			}
52 		throw new Exception("Package '"~name~"' not found in dependency tree.");
53 	}
54 
55 	/// Root package
56 	ref inout(PackageDescription) lookupRootPackage() inout { return lookupPackage(rootPackage); }
57 }
58 
59 
60 /**
61 	Describes the build settings and meta data of a single package.
62 
63 	This structure contains the effective build settings and dependencies for
64 	the selected build platform. This structure is most useful for displaying
65 	information about a package in an IDE. Use `TargetDescription` instead when
66 	writing a build-tool.
67 */
68 struct PackageDescription {
69 	string path; /// Path to the package
70 	string name; /// Qualified name of the package
71 	Version version_; /// Version of the package
72 	string description;
73 	string homepage;
74 	string[] authors;
75 	string copyright;
76 	string license;
77 	string[] dependencies;
78 
79 	bool active; /// Does this package take part in the build?
80 	string configuration; /// The configuration that is built
81 	@byName TargetType targetType;
82 	string targetPath;
83 	string targetName;
84 	string targetFileName;
85 	string workingDirectory;
86 	string mainSourceFile;
87 	string[] dflags; /// Flags passed to the D compiler
88 	string[] lflags; /// Flags passed to the linker
89 	string[] libs; /// Librariy names to link against (typically using "-l<name>")
90 	string[] copyFiles; /// Files to copy to the target directory
91 	string[] versions; /// D version identifiers to set
92 	string[] debugVersions; /// D debug version identifiers to set
93 	string[] importPaths;
94 	string[] stringImportPaths;
95 	string[] preGenerateCommands; /// commands executed before creating the description
96 	string[] postGenerateCommands; /// commands executed after creating the description
97 	string[] preBuildCommands; /// Commands to execute prior to every build
98 	string[] postBuildCommands; /// Commands to execute after every build
99 	@byName BuildRequirement[] buildRequirements;
100 	@byName BuildOption[] options;
101 	SourceFileDescription[] files; /// A list of all source/import files possibly used by the package
102 }
103 
104 
105 /**
106 	Describes the settings necessary to build a certain binary target.
107 */
108 struct TargetDescription {
109 	string rootPackage; /// Main package associated with this target, this is also the name of the target.
110 	string[] packages; /// All packages contained in this target (e.g. for target type "sourceLibrary")
111 	string rootConfiguration; /// Build configuration of the target's root package used for building
112 	BuildSettings buildSettings; /// Final build settings to use when building the target
113 	string[] dependencies; /// List of all dependencies of this target (package names)
114 	string[] linkDependencies; /// List of all link-dependencies of this target (target names)
115 }
116 
117 /**
118 	Description for a single source file known to the package.
119 */
120 struct SourceFileDescription {
121 	@byName SourceFileRole role; /// Main role this file plays in the build process
122 	string path; /// Full path to the file
123 }
124 
125 /**
126 	Determines the role that a file plays in the build process.
127 
128 	If a file has multiple roles, higher enum values will have precedence, i.e.
129 	if a file is used both, as a source file and as an import file, it will
130 	be classified as a source file.
131 */
132 enum SourceFileRole {
133 	unusedStringImport, /// Used as a string import for another configuration/platform
134 	unusedImport,       /// Used as an import for another configuration/platform
135 	unusedSource,       /// Used as a source file for another configuration/platform
136 	stringImport,       /// Used as a string import file
137 	import_,            /// Used as an import file
138 	source              /// Used as a source file
139 }