1 module Build; 2 3 import core.stdc.stdlib: exit; 4 5 import std.algorithm; 6 import std.array; 7 import std.file; 8 import std.getopt; 9 import std.path; 10 import std.process; 11 import std.stdio; 12 import std.string; 13 14 string dcflags; 15 string ldflags; 16 17 int main(string[] args) 18 { 19 version(Posix) 20 { 21 writeln("This build script is currently Windows only."); 22 return(1); 23 } 24 25 getopt(args, "dcflags", &dcflags, "ldflags", &ldflags); 26 args.popFront(); 27 28 foreach ( arg; args ) 29 { 30 if ( !["gtkd", "gtkdgl", "sv", "gstreamer", "vte", "peas", "all"].canFind(arg) ) 31 { 32 writefln("Unknown option: %s", arg); 33 return 1; 34 } 35 } 36 37 if ( args.length == 0 ) 38 args = ["gtkd", "sv"]; 39 40 if ( args.canFind("all") ) 41 args = ["gtkd", "sv", "gstreamer", "peas"]; 42 43 foreach ( arg; args ) 44 { 45 switch ( arg ) 46 { 47 case "gtkd": 48 build("generated\\gtkd", "gtkd"); 49 break; 50 case "gtkdgl": 51 build("generated\\gtkdgl", "gtkdgl"); 52 break; 53 case "sv": 54 build("generated\\sourceview", "gtkdsv"); 55 break; 56 case "gstreamer": 57 build("generated\\gstreamer", "gstreamerd"); 58 break; 59 case "peas": 60 build("generated\\peas", "peasd"); 61 break; 62 default: 63 assert(false); 64 break; 65 } 66 } 67 68 return(0); 69 } 70 71 void build(string dir, string lib) 72 { 73 version(Win64) 74 { 75 std.file.write("build.rf", format("-m64 -c -lib %s %s -Igenerated/gtkd -of%s.lib %s", dcflags, ldflags, lib, dFiles(dir))); 76 auto pid = spawnProcess(["dmd", "@build.rf"]); 77 78 if ( wait(pid) != 0 ) 79 exit(1); 80 } 81 else 82 { 83 if (lib == "gtkd") 84 { 85 string[] subDirs = ["atk", "cairo", "gdk", "gdkpixbuf", "gio", "glib", "gobject", "gthread", "gtk", "gtkc", "gtkd", "pango", "rsvg"]; 86 87 foreach(directory; subDirs) 88 buildObj(dFiles("generated\\gtkd\\"~ directory), directory); 89 90 string objects; 91 foreach(directory; subDirs) 92 objects ~= directory ~".obj "; 93 94 executeShell(format("dmd -lib %s -of%s.lib %s", ldflags, lib, objects)); 95 96 foreach(directory; subDirs) 97 std.file.remove(directory ~".obj"); 98 } 99 else 100 { 101 buildObj(dFiles(dir), lib); 102 executeShell(format("dmd -lib %s -of%s.lib %s.obj", ldflags, lib, lib)); 103 std.file.remove(lib ~".obj"); 104 } 105 } 106 107 std.file.remove("build.rf"); 108 } 109 110 void buildObj(string files, string objName) 111 { 112 std.file.write("build.rf", format("-c %s -Igenerated/gtkd -of%s.obj %s", dcflags, objName, files)); 113 auto pid = spawnProcess(["dmd", "@build.rf"]); 114 if ( wait(pid) != 0 ) 115 exit(1); 116 } 117 118 string dFiles(string sourceDir) 119 { 120 string files; 121 auto entries = dirEntries(sourceDir, SpanMode.breadth); 122 123 foreach ( DirEntry entry; entries ) 124 { 125 if ( entry.isDir == false && entry.name.extension == ".d" ) 126 { 127 files ~= entry.name ~ " "; 128 } 129 } 130 131 return files; 132 }