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 }