Newer
Older
dub_jkp / source / dub / description.d
  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. }