====== Crosscompilare applicazioni Vala su host Linux per Windows ====== Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//06/06/2015 - 11:49//** \\ \\ Vedremo, di seguito, come sviluppare su una postazioni Gnu/Linux applicazioni Vala che verranno compilate staticamente per Windows. C'e' da dire che il passaggio non è unico, nel senso che il sorgente vala viene prima trasformato in codice C da compilatore Vala e in seguito lo compileremo staticamente tramite il pacchetto [[http://mxe.cc/|Mxe]] come abbiamo fatto qui: [[programmazione:gtk:gui_glade_dentro_eseguibile]] . Automatizzeremo tutto con un unico makefile. ===== Il codice ===== **intermedio.vala** using Gtk; int main (string[] args) { Gtk.init (ref args); var window = new Window (); window.title = "First GTK+ Program"; window.border_width = 10; window.window_position = WindowPosition.CENTER; window.set_default_size (350, 70); window.destroy.connect (Gtk.main_quit); var button = new Button.with_label ("Click me!"); button.clicked.connect (() => { button.label = "Thank you"; }); window.add (button); window.show_all (); Gtk.main (); return 0; } ===== Il makefile ===== CPP = valac OPTS = --pkg gtk+-2.0 --pkg gmodule-2.0 CPP_WIN = i686-pc-mingw32-gcc OPTS_WIN_C = `i686-pc-mingw32-pkg-config --cflags --libs gio-2.0 gtk+-2.0 gmodule-2.0` all: $(CPP) -C intermedio.vala $(OPTS) $(CPP_WIN) intermedio.c -o intermedio.exe $(OPTS_WIN_C) strip intermedio.exe clean: rm intermedio.c intermedio.exe ====== Applicazioni che fanno uso di Gtkbuilder ====== Per quanto riguarda le applicazioni che fanno uso di Gtkbuilder c'è da dire che nelle mie prove non hanno funzionato con il collegamento statico delle Gtk. Ho dovuto percio' ricorrere al collegamento dinamico alle stesse. Prima di tutto ho scaricato il [[http://www.gtk.org/download/win32.php|Pacchetto bundle]] e l'ho messo all'interno di una mia cartella "bin" dentro la mia home. In seguito mi sono ricavato i flag di compilazione lanciando tramite wine **pkg-config.exe** dentro la bin/ del bundle . ===== Il sorgente ===== Sorgente preso dagli esempi ufficiali. \\ \\ **intermedio.vala** using Gtk; static Window window ; //Le callbacks sono nel file esterno.vala int main (string[] args) { Gtk.init (ref args); try { // If the UI contains custom widgets, their types must've been instantiated once // Type type = typeof(Foo.BarEntry); // assert(type != 0); var builder = new Builder (); builder.add_from_file ("gui.ui"); builder.connect_signals (null); window = builder.get_object ("window") as Window; window.show_all (); Gtk.main (); } catch (Error e) { stderr.printf ("Could not load UI: %s\n", e.message); return 1; } return 0; } **esterno.vala** using Gtk; static int c=0; [CCode (cname = "G_MODULE_EXPORT on_button1_clicked")] public void on_button1_clicked (Button source) { c++; source.label = "Click "+ c.to_string(); } Come si puo' notare se si vuole usare la funzione **builder.connect_signals** (per autoconnettere i segnali alle callbacks) e' necessario inoltre aggiungere la seguente macro prima della definizione della callbacks stessa (solo su windows). [CCode (cname = "G_MODULE_EXPORT on_button1_clicked")] ===== Makefile ===== CPP = valac OPTS = --pkg gtk+-2.0 --pkg gmodule-2.0 CPP_WIN = i686-pc-mingw32-gcc OPTS_WIN_C = -mms-bitfields -I/home/fabio/bin/gtk+-bundle_2.24.10-20120208_win32/include/glib-2.0 -I/home/fabio/bin/gtk+-bundle_2.24.10-20120208_win32/lib/glib-2.0/include -I/home/fabio/bin/gtk+-bundle_2.24.10-20120208_win32/include/gtk-2.0 -I/home/fabio/bin/gtk+-bundle_2.24.10-20120208_win32/lib/gtk-2.0/include -I/home/fabio/bin/gtk+-bundle_2.24.10-20120208_win32/include/atk-1.0 -I/home/fabio/bin/gtk+-bundle_2.24.10-20120208_win32/include/cairo -I/home/fabio/bin/gtk+-bundle_2.24.10-20120208_win32/include/gdk-pixbuf-2.0 -I/home/fabio/bin/gtk+-bundle_2.24.10-20120208_win32/include/pango-1.0 -I/home/fabio/bin/gtk+-bundle_2.24.10-20120208_win32/include -I/home/fabio/bin/gtk+-bundle_2.24.10-20120208_win32/include/freetype2 -I/home/fabio/bin/gtk+-bundle_2.24.10-20120208_win32/include/libpng14 -L/home/fabio/bin/gtk+-bundle_2.24.10-20120208_win32/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgthread-2.0 -lgmodule-2.0 -lglib-2.0 -lintl all: $(CPP) -C intermedio.vala -C esterno.vala $(OPTS) $(CPP_WIN) esterno.c intermedio.c -o intermedio.exe $(OPTS_WIN_C) strip intermedio.exe clean: rm intermedio.c intermedio.exe Ricordarsi di aggiustare il path dei flag di compilazione dei sorgenti C nel mekefile. Ricavati lanciando ''wine pkg-config.exe'' dentro la bin/ del bundle . \\ Se non si è provveduto ad installare le gtk in path per avviare l'eseguibile è sufficiente copiare lo stesso e il file dell'interfaccia dentro la directory "bin" del bundle gtk. Per intenderci nella stessa cartella di pkg-config.exe .