Newer
Older
dub_jkp / source / dub / description.d
@andre2007 andre2007 on 17 Dec 2018 5 KB extraDependencyFiles attribute added
  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[] extraDependencyFiles; /// Files to check for rebuild dub project
  89. string[] versions; /// D version identifiers to set
  90. string[] debugVersions; /// D debug version identifiers to set
  91. string[] importPaths;
  92. string[] stringImportPaths;
  93. string[] preGenerateCommands; /// commands executed before creating the description
  94. string[] postGenerateCommands; /// commands executed after creating the description
  95. string[] preBuildCommands; /// Commands to execute prior to every build
  96. string[] postBuildCommands; /// Commands to execute after every build
  97. string[] preRunCommands; /// Commands to execute prior to every run
  98. string[] postRunCommands; /// Commands to execute after every run
  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. }