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
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
;
52 public class InstallerBox
: VBox
54 InstallerUI installerUI
;
56 ProgressBar progressBar
;
60 this(InstallerUI installerUI
)
63 this.installerUI
= installerUI
;
65 progressBar
.setFraction(1.0);
66 progressBar
.setText("");
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);
89 private void cancelInstall(Button button
)
102 private void install()
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");
111 compilerExec
= std
.path
.join(compilerExec
,"dmd.exe");
115 compilerExec
= std
.path
.join(compilerExec
,"dmd");
118 // if ( ok && installerUI.getSelection("gtkD") )
120 // label.setText("");
122 // ok = installGtkD();
127 class CompileThread
: Thread
129 bool delegate() compile
;
132 this(char[] stepLabel
, bool delegate() compile
)
135 this.compile
= compile
;
136 label
.setText(stepLabel
);
137 progressBar
.setText(stepLabel
);
144 std
.gc
.fullCollect();
146 while ( !cancel
&& getState() != Thread
.TS
.TERMINATED
)
149 while ( GtkD
.eventsPending() )
151 GtkD
.mainIterationDo(false);
153 std
.c
.time
.usleep(10000);
165 if ( !cancel
&& ok
&& installerUI
.getSelection("gtkDDev") )
167 ok
= (new CompileThread("GtkD Development", &installGtkDDev
)).ok
;
170 // if ( ok && installerUI.getSelection("gtkDgl") )
172 // label.setText("GtkDgl - openGL bindings");
174 // ok = installGtkDgl();
177 if ( !cancel
&& ok
&& installerUI
.getSelection("duiglDev") )
179 ok
= (new CompileThread("GtkDgl Development", &installGtkDglDev
)).ok
;
182 // if ( !cancel && ok && installerUI.getSelection("leds") )
184 // label.setText("leds");
186 // ok = installLeds();
189 // if ( !cancel && ok && installerUI.getSelection("gtkDdi") )
191 // label.setText("GtkD .di files");
193 // ok = installGtkDdi();
196 // if ( !cancel && ok && installerUI.getSelection("gtkDSource") )
198 // label.setText("GtkD source files");
200 // ok = installGtkDSource();
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") )
220 // label.setText("Leds project for GtkD");
222 // ok = installLedsGtkD();
225 // if ( !cancel && ok && installerUI.getSelection("ledsLeds") )
227 // label.setText("Leds project for leds");
229 // ok = installLedsLeds();
232 // if ( !cancel && ok && installerUI.getSelection("ledsDool") )
234 // label.setText("Leds project for Dool");
236 // ok = installLedsDool();
239 // if ( !cancel && ok && installerUI.getSelection("ledsDante") )
241 // label.setText("Leds project for Dante");
243 // ok = installLedsDante();
246 // if ( !cancel && ok && installerUI.getSelection("ledsPhobos") )
248 // label.setText("Leds project for phobos");
250 // ok = installLedsPhobos();
256 private bool makeDirs(char[] dir
)
265 system("mkdir -p "~dir
);
272 catch ( FileException fe
)
279 private bool installGtkDglSimpleGL()
281 bool ok
= moveGtkDDev();
284 char[] cwd = std
.file
.getcwd();
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");
311 compiler
.addArg("-lkernel32");
312 compiler
.addArg("-luser32");
316 compiler
.addArg("-lpthread");
317 compiler
.addArg("-lm");
320 if ( compiler
.compileStatus
== 0
321 && compiler
.linkStatus
== 0
336 private bool installGtkDglShapesGL()
338 bool ok
= moveGtkDDev();
341 char[] cwd = std
.file
.getcwd();
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");
368 compiler
.addArg("-lkernel32");
369 compiler
.addArg("-luser32");
373 compiler
.addArg("-lpthread");
374 compiler
.addArg("-lm");
377 if ( compiler
.compileStatus
== 0
378 && compiler
.linkStatus
== 0
393 private bool installGtkDglDev()
399 char[] cwd = std
.file
.getcwd();
405 char[] libGtkDgl
= "gtkDgl";
409 char[] libGtkDgl
= "libgtkDgl";
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");
437 compiler
.addArg("-lkernel32");
438 compiler
.addArg("-luser32");
439 compiler
.addArg("-ladvapi32");
443 compiler
.addArg("-lpthread");
444 compiler
.addArg("-lm");
447 if ( compiler
.compileStatus
== 0
448 && compiler
.linkStatus
== 0
464 private bool installGtkDTests()
466 bool ok
= moveGtkDDev();
469 char[] cwd = std
.file
.getcwd();
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");
492 compiler
.addArg("-lkernel32");
493 compiler
.addArg("-luser32");
497 compiler
.addArg("-lpthread");
498 compiler
.addArg("-lm");
501 if ( compiler
.compileStatus
== 0
502 && compiler
.linkStatus
== 0
517 private bool movePackToDestiny(char[] from
, char[] to
)
522 ok
= system("xcopy /s /Y /E /Q "~from
~" "~to
);
526 ok
= system("cp -R "~from
~" "~to
);
533 private bool moveGtkDDev()
537 if ( makeDirs(gtkDDevHome
) )
539 gtkDDevMoved
= movePackToDestiny("*", gtkDDevHome
);
545 // private bool installGtkD()
551 private bool installGtkDDev()
557 char[] cwd = std
.file
.getcwd();
563 char[] libGtkD
= "gtkD";
567 char[] libGtkD
= "libgtkD";
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");
598 compiler
.addArg("-lkernel32");
599 compiler
.addArg("-luser32");
603 compiler
.addArg("-lpthread");
604 compiler
.addArg("-lm");
607 if ( compiler
.compileStatus
== 0
608 && compiler
.linkStatus
== 0
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
);
640 installerBox
.install();
641 windowDelete(null, this);
645 protected int windowDelete(Event event
, Widget widget
)
647 installerBox
.cancel
= true;
648 mainInstaller
.show();
649 return super.windowDelete(event
, widget
);