project('valaprog', 'vala', 'c') gtk_dep = dependency('gtk+-3.0') executable('valaprog', 'main.vala', dependencies : [gtk_dep])
Compilare con:
meson build cd build ninja
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
<?xml version="1.0" encoding="UTF-8"?> <!-- Generated with glade 3.20.2 --> <interface> <requires lib="gtk+" version="3.20"/> <object class="GtkWindow" id="window1"> <property name="can_focus">False</property> <child> <object class="GtkBox"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="orientation">vertical</property> <child> <object class="GtkLabel" id="label1"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="label" translatable="yes">You have clicked 0 times</property> <attributes> <attribute name="scale" value="5"/> </attributes> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkButton" id="button1"> <property name="label" translatable="yes">Cliccami</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <placeholder/> </child> </object> </child> <child> <placeholder/> </child> </object> </interface>
resources.xml
<?xml version="1.0" encoding="UTF-8"?> <gresources> <gresource prefix="/myapp/res"> <file>gui.ui</file> </gresource> </gresources>
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])
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
Grazie allo script auto-vala
è possibile automatizzare la creazione del progetto . Basta in fatti impartire:
auto-vala <nome mio progetto>
per creare uno scheletro nuovo di zecca per cominciare un progetto.
Ecco lo script auto-vala