====== Usare Vala con Meson ====== Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//15/02/2018 - 10:02//** \\ \\ {{:programmazione:vala:vala-clickme-count.png?400|}} ===== Utilizzo base con gtk ===== project('valaprog', 'vala', 'c') gtk_dep = dependency('gtk+-3.0') executable('valaprog', 'main.vala', dependencies : [gtk_dep]) Compilare con: meson build cd build ninja ===== Creare un primo progetto ===== Il progetto in questione avra' la gui inserita nel file di risorse e utilizzerà Meson per la generazione dello stesso e la compilazione del progetto. Ecco la struttura della cartella: . ├── compile_resources.sh ├── gui │   ├── gui.ui │   └── resources.xml ├── main.vala └── meson.build **compile_resources.sh** #!/bin/bash cd gui echo "Building resources.c ..." glib-compile-resources --generate-source resources.xml mv resources.c ../ **gui.ui** False True False vertical True False You have clicked 0 times False True 0 Cliccami True True True False True 1 **resources.xml** gui.ui **main.vala** using Gtk; public class mainWindow : GLib.Object { public Button btn; public Window window; public Label myLabel; int c=0; public void on_button1_clicked () { c++; window.set_title("You have clicked "+ c.to_string()+" times"); myLabel.set_text("You have clicked "+ c.to_string()+" times"); } public mainWindow() { } public void show() { try { var builder = new Builder (); builder.add_from_resource("/myapp/res/gui.ui"); btn=builder.get_object ("button1") as Button; myLabel=builder.get_object("label1") as Label; btn.clicked.connect(on_button1_clicked); window = builder.get_object ("window1") as Window; window.destroy.connect(Gtk.main_quit); window.show_all (); } catch (Error e) { stderr.printf ("Problem on gui loading: %s\n", e.message); } } } int main (string[] args) { Gtk.init (ref args); mainWindow myWin = new mainWindow(); myWin.show(); Gtk.main (); return 0; } **meson.build** project('valaprog', 'vala', 'c') gtk_dep = dependency('gtk+-3.0') r = run_command('compile_resources.sh') if r.returncode() != 0 error('Errors on compile resources') endif executable('valaprog', 'main.vala', 'resources.c', dependencies : [gtk_dep]) ===== Note su windows ===== Se si vuole evitare l'apertura del terminale quando eseguiamo la nostra applicazione è necessario compilare il progetto con il seguente comando: valac -X -mwindows --pkg gtk+-3.0 main.vala resources.c dove **-X -mwindows** fanno il lavoro. Dunque la direttiva di meson diventa: executable('valaprog', 'main.vala', 'resources.c', dependencies : [gtk_dep], link_args : ['-mwindows']) Aggiungendo una direttiva su meson.build possiamo far in modo che se si è su windows vengano aggiunti gli argomenti per il linking corretti, altrimenti no. Ecco di seguito il meson.build corretto: project('valaprog', 'vala', 'c') gtk_dep = dependency('gtk+-3.0') r = run_command('compile_resources.sh') if r.returncode() != 0 error('Errors on compile resources') endif #check os os=build_machine.system() if os == 'linux' executable('valaprog', 'main.vala', 'resources.c', dependencies : [gtk_dep]) endif if os == 'windows' executable('valaprog', 'main.vala', 'resources.c', dependencies : [gtk_dep], link_args : ['-mwindows']) endif ===== Automatizzare il tutto ===== Grazie allo script ''auto-vala'' è possibile automatizzare la creazione del progetto . Basta in fatti impartire: auto-vala per creare uno scheletro nuovo di zecca per cominciare un progetto. \\ Ecco lo script [[http://www.freemedialab.org/wiki/doku.php?id=programmazione:gtk:creazione_scheletro_per_applicazioni_gtkbuilder#versione_vala|auto-vala]]