Barra laterale

programmazione:vala:crosscompilare_applicazioni_vala_per_windows

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 Mxe come abbiamo fatto qui: Mettere il file della gui creata con glade dentro l'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 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 .


programmazione/vala/crosscompilare_applicazioni_vala_per_windows.txt · Ultima modifica: 18/04/2018 - 15:48 (modifica esterna)