alternative to assert
[gtkD.git] / gtkD / installer / ui / Installer.d
blobc32d7fe19da57cf40236d9ecf7b75bb15d1f4938
1 /*
2 * This file is part of gtkD.
4 * gtkD is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation; either version 2.1 of the License, or
7 * (at your option) any later version.
9 * gtkD is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public License
15 * along with gtkD; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 module ui.Installer;
21 private import ui.Main;
22 private import ui.Exec;
23 private import gtk.GtkD;
24 private import gtk.MainWindow;
25 private import gtk.Widget;
26 private import gtk.ProgressBar;
27 private import gtk.Label;
28 private import gtk.VBox;
30 private import gdk.Gdk;
31 private import gdk.Event;
33 private import compd.Compiler;
35 private import std.stdio;
37 private import std.path;
38 private import std.file;
39 private import std.process;
41 private import std.thread;
42 private import std.c.time;
44 private import ui.gtkDLogo;
45 private import gtk.Alignment;
46 private import gtk.Button;
47 private import gtkc.gtktypes;
49 /**
52 public class InstallerBox : VBox
54 InstallerUI installerUI;
55 Label label;
56 ProgressBar progressBar;
58 bool cancel = false;
60 this(InstallerUI installerUI)
62 super(false, 7);
63 this.installerUI = installerUI;
64 setup();
65 progressBar.setFraction(1.0);
66 progressBar.setText("");
70 private void setup()
72 VBox vbox = new VBox(false, 7);
73 vbox.setBorderWidth(11);
74 label = new Label("");
76 vbox.packStart(Alignment.west(getGtkDLogo()), false, false, 2);
78 vbox.packStart(new Label("Installing"), false, false, 14);
79 vbox.packStart(label, false, false, 14);
80 progressBar = new ProgressBar();
81 progressBar.setPulseStep(0.01);
82 vbox.packStart(progressBar, false, false, 14);
84 vbox.packEnd(Alignment.east(new Button(StockID.CANCEL, &cancelInstall)), false, false, 14);
86 add(vbox);
89 private void cancelInstall(Button button)
91 cancel = true;
94 char[] dmdHome;
95 char[] gtkDDevHome;
96 char[] phobos;
97 char[] compilerExec;
99 int ccount;
102 private void install()
104 bool ok = true;
105 gtkDDevHome = installerUI.getDirectory("gtkDDevHome");
106 dmdHome = installerUI.getDirectory("dmdHome");
107 phobos = std.path.join(std.path.join(dmdHome,"src"),"phobos");
108 compilerExec = std.path.join(installerUI.getDirectory("dmdHome"),"bin");
109 version(Win32)
111 compilerExec = std.path.join(compilerExec,"dmd.exe");
113 else
115 compilerExec = std.path.join(compilerExec,"dmd");
118 // if ( ok && installerUI.getSelection("gtkD") )
119 // {
120 // label.setText("");
121 // Gdk.flush();
122 // ok = installGtkD();
123 // }
127 class CompileThread : Thread
129 bool delegate() compile;
130 bool ok;
132 this(char[] stepLabel, bool delegate() compile)
134 super(&run);
135 this.compile = compile;
136 label.setText(stepLabel);
137 progressBar.setText(stepLabel);
138 go();
139 //ok = compile();
142 private void go()
144 std.gc.fullCollect();
145 start();
146 while ( !cancel && getState() != Thread.TS.TERMINATED )
148 progressBar.pulse();
149 while ( GtkD.eventsPending() )
151 GtkD.mainIterationDo(false);
153 std.c.time.usleep(10000);
157 int run()
159 ok = compile();
160 return ok;
165 if ( !cancel && ok && installerUI.getSelection("gtkDDev") )
167 ok = (new CompileThread("GtkD Development", &installGtkDDev)).ok;
170 // if ( ok && installerUI.getSelection("gtkDgl") )
171 // {
172 // label.setText("GtkDgl - openGL bindings");
173 // Gdk.flush();
174 // ok = installGtkDgl();
175 // }
177 if ( !cancel && ok && installerUI.getSelection("duiglDev") )
179 ok = (new CompileThread("GtkDgl Development", &installGtkDglDev)).ok;
182 // if ( !cancel && ok && installerUI.getSelection("leds") )
183 // {
184 // label.setText("leds");
185 // Gdk.flush();
186 // ok = installLeds();
187 // }
189 // if ( !cancel && ok && installerUI.getSelection("gtkDdi") )
190 // {
191 // label.setText("GtkD .di files");
192 // Gdk.flush();
193 // ok = installGtkDdi();
194 // }
196 // if ( !cancel && ok && installerUI.getSelection("gtkDSource") )
197 // {
198 // label.setText("GtkD source files");
199 // Gdk.flush();
200 // ok = installGtkDSource();
201 // }
203 if ( !cancel && ok && installerUI.getSelection("gtkDTests") )
205 ok = (new CompileThread("GtkD Test and demo programs", &installGtkDTests)).ok;
208 if ( !cancel && ok && installerUI.getSelection("gtkDglSimple") )
210 ok = (new CompileThread("GtkDgl SimpleGL demo program", &installGtkDglSimpleGL)).ok;
213 if ( !cancel && ok && installerUI.getSelection("gtkDglShapes") )
215 ok = (new CompileThread("GtkDgl ShapeGL and demo program", &installGtkDglShapesGL)).ok;
218 // if ( !cancel && ok && installerUI.getSelection("ledsGtkD") )
219 // {
220 // label.setText("Leds project for GtkD");
221 // Gdk.flush();
222 // ok = installLedsGtkD();
223 // }
225 // if ( !cancel && ok && installerUI.getSelection("ledsLeds") )
226 // {
227 // label.setText("Leds project for leds");
228 // Gdk.flush();
229 // ok = installLedsLeds();
230 // }
232 // if ( !cancel && ok && installerUI.getSelection("ledsDool") )
233 // {
234 // label.setText("Leds project for Dool");
235 // Gdk.flush();
236 // ok = installLedsDool();
237 // }
239 // if ( !cancel && ok && installerUI.getSelection("ledsDante") )
240 // {
241 // label.setText("Leds project for Dante");
242 // Gdk.flush();
243 // ok = installLedsDante();
244 // }
246 // if ( !cancel && ok && installerUI.getSelection("ledsPhobos") )
247 // {
248 // label.setText("Leds project for phobos");
249 // Gdk.flush();
250 // ok = installLedsPhobos();
251 // }
256 private bool makeDirs(char[] dir)
258 bool ok = false;
259 version(Win32)
261 system("md "~dir);
263 else
265 system("mkdir -p "~dir);
269 std.file.isdir(dir);
270 ok = true;
272 catch ( FileException fe )
276 return ok;
279 private bool installGtkDglSimpleGL()
281 bool ok = moveGtkDDev();
282 if ( ok )
284 char[] cwd = std.file.getcwd();
285 Compiler compiler;
286 std.file.chdir(gtkDDevHome);
288 compiler = new Compiler();
289 compiler.setExecutor(new Exec());
290 compiler.setCompilerExec(compilerExec);
292 compiler.addArg("-Isrc");
293 compiler.addArg("-Isrcgl");
294 compiler.addArg("-Idemos");
295 compiler.addArg("demos/gl/SimpleGL.d");
296 compiler.addArg("-I"~phobos);
297 compiler.addArg("-L"~std.path.join(dmdHome,"lib"));
298 compiler.addArg("-o SimpleGL");
299 compiler.addArg("-L .");
300 compiler.addArg("-lgtkD");
301 compiler.addArg("-lgtkDgl");
302 compiler.addArg("-lGL");
303 compiler.addArg("-lGLU");
304 version(linux)compiler.addArg("-ldl");
306 compiler.addArg("-c");
307 compiler.addArg("-op");
309 version(Win32)
311 compiler.addArg("-lkernel32");
312 compiler.addArg("-luser32");
314 else
316 compiler.addArg("-lpthread");
317 compiler.addArg("-lm");
319 compiler.compile();
320 if ( compiler.compileStatus == 0
321 && compiler.linkStatus == 0
324 ok = true;
326 else
328 ok = false;
331 std.file.chdir(cwd);
333 return ok;
336 private bool installGtkDglShapesGL()
338 bool ok = moveGtkDDev();
339 if ( ok )
341 char[] cwd = std.file.getcwd();
342 Compiler compiler;
343 std.file.chdir(gtkDDevHome);
345 compiler = new Compiler();
346 compiler.setExecutor(new Exec());
347 compiler.setCompilerExec(compilerExec);
349 compiler.addArg("-Isrc");
350 compiler.addArg("-Isrcgl");
351 compiler.addArg("demos/gl/TrackBall.d");
352 compiler.addArg("demos/gl/ShapesGL.d");
353 compiler.addArg("-I"~phobos);
354 compiler.addArg("-L"~std.path.join(dmdHome,"lib"));
355 compiler.addArg("-o ShapesGL");
356 compiler.addArg("-L .");
357 compiler.addArg("-lgtkD");
358 compiler.addArg("-lgtkDgl");
359 compiler.addArg("-lGL");
360 compiler.addArg("-lGLU");
361 version(linux)compiler.addArg("-ldl");
363 compiler.addArg("-c");
364 compiler.addArg("-op");
366 version(Win32)
368 compiler.addArg("-lkernel32");
369 compiler.addArg("-luser32");
371 else
373 compiler.addArg("-lpthread");
374 compiler.addArg("-lm");
376 compiler.compile();
377 if ( compiler.compileStatus == 0
378 && compiler.linkStatus == 0
381 ok = true;
383 else
385 ok = false;
388 std.file.chdir(cwd);
390 return ok;
393 private bool installGtkDglDev()
395 bool ok = true;
397 Compiler compiler;
399 char[] cwd = std.file.getcwd();
403 version(Win32)
405 char[] libGtkDgl = "gtkDgl";
407 else
409 char[] libGtkDgl = "libgtkDgl";
414 ok = moveGtkDDev();
415 if ( ok )
417 std.file.chdir(gtkDDevHome);
418 compiler = new Compiler();
419 compiler.setExecutor(new Exec());
420 compiler.setCompilerExec(compilerExec);
422 compiler.addArg("-Isrc");
423 compiler.addArg("-Isrcgl");
424 compiler.addArg("srcgl/glgdk");
425 compiler.addArg("srcgl/glgtk");
426 compiler.addArg("srcgl/lib");
427 compiler.addArg("-I"~phobos);
428 compiler.addArg("-L"~std.path.join(dmdHome,"lib"));
429 compiler.addArg("-olib "~libGtkDgl);
430 compiler.addArg("-L. ");
431 compiler.addArg("-lgtkD ");
432 compiler.addArg("-c");
433 compiler.addArg("-op");
435 version(Win32)
437 compiler.addArg("-lkernel32");
438 compiler.addArg("-luser32");
439 compiler.addArg("-ladvapi32");
441 else
443 compiler.addArg("-lpthread");
444 compiler.addArg("-lm");
446 compiler.compile();
447 if ( compiler.compileStatus == 0
448 && compiler.linkStatus == 0
451 ok = true;
453 else
455 ok = false;
458 std.file.chdir(cwd);
460 return ok;
464 private bool installGtkDTests()
466 bool ok = moveGtkDDev();
467 if ( ok )
469 char[] cwd = std.file.getcwd();
470 Compiler compiler;
471 std.file.chdir(gtkDDevHome);
473 compiler = new Compiler();
474 compiler.setExecutor(new Exec());
475 compiler.setCompilerExec(compilerExec);
477 compiler.addArg("-Isrc");
478 compiler.addArg("-Idemos");
479 compiler.addArg("demos/gtkD");
480 compiler.addArg("-I"~phobos);
481 compiler.addArg("-L"~std.path.join(dmdHome,"lib"));
482 compiler.addArg("-o GtkDTests");
483 compiler.addArg("-L .");
484 compiler.addArg("-lgtkD");
485 version(linux)compiler.addArg("-ldl");
487 compiler.addArg("-c");
488 compiler.addArg("-op");
490 version(Win32)
492 compiler.addArg("-lkernel32");
493 compiler.addArg("-luser32");
495 else
497 compiler.addArg("-lpthread");
498 compiler.addArg("-lm");
500 compiler.compile();
501 if ( compiler.compileStatus == 0
502 && compiler.linkStatus == 0
505 ok = true;
507 else
509 ok = false;
512 std.file.chdir(cwd);
514 return ok;
517 private bool movePackToDestiny(char[] from, char[] to)
519 int ok;
520 version(Win32)
522 ok = system("xcopy /s /Y /E /Q "~from~" "~to);
524 else
526 ok = system("cp -R "~from~" "~to);
528 return ok == 0;
531 bool gtkDDevMoved;
533 private bool moveGtkDDev()
535 if ( !gtkDDevMoved )
537 if ( makeDirs(gtkDDevHome) )
539 gtkDDevMoved = movePackToDestiny("*", gtkDDevHome);
542 return gtkDDevMoved;
545 // private bool installGtkD()
546 // {
547 // // nothing
548 // return true;
549 // }
551 private bool installGtkDDev()
553 bool ok = true;
555 Compiler compiler;
557 char[] cwd = std.file.getcwd();
561 version(Win32)
563 char[] libGtkD = "gtkD";
565 else
567 char[] libGtkD = "libgtkD";
571 ok = moveGtkDDev();
572 if ( ok )
574 std.file.chdir(gtkDDevHome);
575 compiler = new Compiler();
576 compiler.setExecutor(new Exec());
578 compiler.setCompilerExec(compilerExec);
580 compiler.addArg("-Isrc");
581 compiler.addArg("src/atk");
582 compiler.addArg("src/cairoLib");
583 compiler.addArg("src/gdk");
584 compiler.addArg("src/glib");
585 compiler.addArg("src/gobject");
586 compiler.addArg("src/gthread");
587 compiler.addArg("src/gtk");
588 compiler.addArg("src/lib");
589 compiler.addArg("src/pango");
590 compiler.addArg("-I"~phobos);
591 compiler.addArg("-L"~std.path.join(dmdHome,"lib"));
592 compiler.addArg("-olib "~libGtkD);
593 compiler.addArg("-c");
594 compiler.addArg("-op");
596 version(Win32)
598 compiler.addArg("-lkernel32");
599 compiler.addArg("-luser32");
601 else
603 compiler.addArg("-lpthread");
604 compiler.addArg("-lm");
606 compiler.compile();
607 if ( compiler.compileStatus == 0
608 && compiler.linkStatus == 0
611 ok = true;
613 else
615 ok = false;
618 std.file.chdir(cwd);
620 return ok;
627 * From the information collected from the UI this will install GtkD, GtkDgl and or leds
629 class Installer : MainWindow
631 InstallerBox installerBox;
633 this(InstallerUI installerUI)
635 super("Installing GtkD components");
636 setDefaultSize(400,300);
637 installerBox = new InstallerBox(installerUI);
638 add(installerBox);
639 showAll();
640 installerBox.install();
641 windowDelete(null, this);
642 destroy();
645 protected int windowDelete(Event event, Widget widget)
647 installerBox.cancel = true;
648 mainInstaller.show();
649 return super.windowDelete(event, widget);