Indice

Usare Vala con Meson

Autore: Fabio Di Matteo
Ultima revisione: 15/02/2018 - 10:02

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

<?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])

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 <nome mio progetto>

per creare uno scheletro nuovo di zecca per cominciare un progetto.
Ecco lo script auto-vala