Newer
Older
dub_jkp / source / dub / compilers / dmd.d
  1. /**
  2. DMD compiler support.
  3.  
  4. Copyright: © 2013 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.compilers.dmd;
  9.  
  10. import dub.compilers.compiler;
  11. import dub.platform;
  12.  
  13. import std.algorithm;
  14. import std.array;
  15. import std.conv;
  16. import std.exception;
  17. import stdx.process;
  18. import vibecompat.core.log;
  19. import vibecompat.inet.path;
  20.  
  21.  
  22. class DmdCompiler : Compiler {
  23. @property string name() const { return "dmd"; }
  24.  
  25. BuildPlatform determinePlatform(ref BuildSettings settings, string compiler_binary, string arch_override)
  26. {
  27. // TODO: determine platform by invoking the compiler instead
  28. BuildPlatform build_platform;
  29. build_platform.platform = .determinePlatform();
  30. build_platform.architecture = .determineArchitecture();
  31. build_platform.compiler = this.name;
  32.  
  33. switch(arch_override){
  34. default: throw new Exception("Unsupported architecture: "~arch_override);
  35. case "": break;
  36. case "x86":
  37. build_platform.architecture = ["x86"];
  38. settings.addDFlags("-m32");
  39. break;
  40. case "x86_64":
  41. build_platform.architecture = ["x86_64"];
  42. settings.addDFlags("-m64");
  43. break;
  44. }
  45. return build_platform;
  46. }
  47.  
  48. void prepareBuildSettings(ref BuildSettings settings, BuildSetting fields = BuildSetting.all)
  49. {
  50. if( !(fields & BuildSetting.libs) ){
  51. try {
  52. logDebug("Trying to use pkg-config to resolve library flags for %s.", settings.libs);
  53. auto libflags = execute("pkg-config", "--libs" ~ settings.libs.map!(l => "lib"~l)().array());
  54. enforce(libflags.status == 0, "pkg-config exited with error code "~to!string(libflags.status));
  55. settings.addLFlags(libflags.output.split());
  56. } catch( Exception e ){
  57. logDebug("pkg-config failed: %s", e.msg);
  58. logDebug("Falling back to direct -lxyz flags.");
  59. version(Windows) settings.addSourceFiles(settings.libs.map!(l => l~".lib")().array());
  60. else settings.addLFlags(settings.libs.map!(l => "-l"~l)().array());
  61. }
  62. settings.libs = null;
  63. }
  64.  
  65. if( !(fields & BuildSetting.versions) ){
  66. settings.addDFlags(settings.versions.map!(s => "-version="~s)().array());
  67. settings.versions = null;
  68. }
  69.  
  70. if( !(fields & BuildSetting.importPaths) ){
  71. settings.addDFlags(settings.importPaths.map!(s => "-I"~s)().array());
  72. settings.importPaths = null;
  73. }
  74.  
  75. if( !(fields & BuildSetting.stringImportPaths) ){
  76. settings.addDFlags(settings.stringImportPaths.map!(s => "-J"~s)().array());
  77. settings.stringImportPaths = null;
  78. }
  79.  
  80. if( !(fields & BuildSetting.sourceFiles) ){
  81. settings.addDFlags(settings.sourceFiles);
  82. settings.sourceFiles = null;
  83. }
  84.  
  85. if( !(fields & BuildSetting.lflags) ){
  86. settings.addDFlags(settings.lflags.map!(f => "-L"~f)().array());
  87. settings.lflags = null;
  88. }
  89.  
  90. assert(fields & BuildSetting.dflags);
  91. assert(fields & BuildSetting.copyFiles);
  92. }
  93.  
  94. void setTarget(ref BuildSettings settings, Path binary_path)
  95. {
  96. settings.addDFlags("-of"~binary_path.toNativeString());
  97. }
  98. }