====== 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**
**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]]