Meson kullanarak alt dizinleri ve Vala kaynaklarını derlemek

Meson kullanarak alt dizinleri ve Vala kaynaklarını derlemek

Giriş

Şimdiye kadar Vala kaynaklarını nasıl derleyeceğimizi öğrendik.

Ancak bu kaynakları elle derlemek yerine Meson kullanabiliriz.

Meson ile alt dizin kullanımı

Önceki derslerde geliştirdiğimiz kullanıcının saati klavyeden değiştirebildiği küçük uygulamayı kullanacağız.

Önce ana dizinde bir Meson kütüğü oluşturalım.

Kütüğü meson.build ismi ile kaydediniz.

project('rize', 'vala', 'c')

gnome = import('gnome')

uygulamaIsmi = meson.project_name()

subdir('veri')
subdir('kaynak')

Burada uygulamaIsmi isimli değişken geliştirdiğimiz uygulamanın ismini tutuyor.

gnome isimli değişkeni ise kaynakları derlemek için kullanacağız.

subdir komutu ile alt dizinleri ekliyoruz.

Uygulamanın kaynakları veri dizininde, kaynak kütükleri ise kaynak dizininde olacak.

Kaynak dizini

Uygulamanın veri dizininde bir başka meson.build kütüğü oluşturuyoruz.

kaynaklar = gnome.compile_resources(
    uygulamaIsmi + '-resources',
    'rize.xml'
)

Yukarıda kaynaklar değişkeninde derlenecek kaynakları belirtiyoruz.

Aynı dizinde daha önceki derslerde oluşturduğumuz rize.glade ve rize.xml kütükleri bulunuyor.

Xml kütüğümüz aşağıdaki gibidir.

<?xml version="1.0" encoding="UTF-8"?>
<gresources>
  <gresource prefix="/bir/cay/koy">
    <file compressed="true" preprocess="xml-stripblanks">rize.glade</file>
  </gresource>
</gresources>

Pencere desenimiz de aşağıdaki gibi idi.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 -->
<interface>
  <requires lib="gtk+" version="3.24"/>
  <template class="Pencere" parent="GtkWindow">
    <property name="can-focus">False</property>
    <property name="title" translatable="yes">Çay</property>
    <property name="window-position">center</property>
    <property name="default-width">320</property>
    <signal name="key-press-event" handler="tusaBasildi" swapped="no"/>
    <child>
      <object class="GtkBox" id="kutu">
        <property name="visible">True</property>
        <property name="can-focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkLabel" id="saat">
            <property name="visible">True</property>
            <property name="can-focus">False</property>
            <property name="margin-top">69</property>
            <property name="margin-bottom">69</property>
            <property name="label" translatable="yes">00:00</property>
            <property name="justify">center</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>
      </object>
    </child>
  </template>
</interface>

Kaynak kod dizini

Kaynak kodumuz ise kaynak dizininde bulunuyor.

Buradaki meson.build kütüğüne bakalım.

gerekliPaketler = [
                    dependency('glib-2.0'),
                    dependency('gobject-2.0'),
                    dependency('gtk+-3.0')
]

kaynakKutukler = files('rize.vala')

executable(uygulamaIsmi,
           kaynaklar,
           kaynakKutukler,
           vala_args: [ '--gresourcesdir=veri/' ],
           dependencies : gerekliPaketler,
           install: true)

Burada Vala'ya kaynakların veri dizininde olduğunu belirtiyoruz.

rize.vala kütüğünde ise kullanıcının saati arttırıp azaltabildiği ufak uygulamamızın kaynak kodu bulunuyor.

using Gtk;
using Gdk;

[GtkTemplate (ui = "/bir/cay/koy/rize.glade")]
class Pencere : Gtk.Window
{
    public Pencere ()
    {
        saat.set_label("07:10");
        show_all();
    }
    [GtkChild]
    private unowned Label saat;

    private int saniyeyeCevir(string sure)
    {
        int dakika = sure.split(":")[0].to_int();
        int saniye = sure.split(":")[1].to_int();
        return dakika * 60 + saniye;
    }

    private string metneCevir(int sureDakika)
    {
        int dakika = sureDakika / 60;
        int saniye = sureDakika - dakika * 60;
        if (dakika > 9)
            if (saniye > 9)
                return (dakika.to_string() + ":" + saniye.to_string());
            else
                return (dakika.to_string() + ":" + "0" + saniye.to_string());
        else
            if (saniye > 9)
                return ("0" + dakika.to_string() + ":" + saniye.to_string());
            else
                return ("0" + dakika.to_string() + ":" + "0" + saniye.to_string());
    }

    private void saatiAzalt()
    {
        int simdikiSaat = saniyeyeCevir(saat.get_label());
        stdout.printf("Saati azaltıyorum\n");
        if (simdikiSaat != 0)
            simdikiSaat = simdikiSaat - 1;
        stdout.printf("Şimdiki saat %s\n", metneCevir(simdikiSaat));
        saat.set_label(metneCevir(simdikiSaat));
    }

    private void saatiArttir()
    {
        int simdikiSaat = saniyeyeCevir(saat.get_label());
        stdout.printf("Saati arttırıyorum\n");
        simdikiSaat = simdikiSaat + 1;
        stdout.printf("Şimdiki saat %s\n", metneCevir(simdikiSaat));
        saat.set_label(metneCevir(simdikiSaat));
    }


    [GtkCallback]
    private bool tusaBasildi(EventKey tus )
    {
        string tusIsmi = Gdk.keyval_name(tus.keyval);

        if (tusIsmi == "minus" || tusIsmi == "KP_Subtract")
            saatiAzalt();
        if (tusIsmi == "plus" || tusIsmi == "KP_Add")
            saatiArttir();
        stdout.printf("%s tuşuna basıldı\n", tusIsmi);
        return true;
    }
}

int main (string[] secenekler)
{
    Gtk.init (ref secenekler);
    var pencere = new Pencere();
    pencere.destroy.connect(Gtk.main_quit);
    Gtk.main();
    return 0;
}

Uygulamanın kaynak kodu

Uygulamanın kaynağını buradan indirebilirsiniz.

Eğer git kullanarak indirmek indirmek isterseniz

git clone https://codeberg.org/erdem/rizeden.git --branch Ders5

komutu ile bu dersi indirebilirsiniz.

Dersi derlemek

rizeden dizinin içine giriniz.

cd rizeden

Öncelikle derleme yapacağımız dizini oluşturuyoruz.

meson setup oluştur

Sonra bu oluşturduğumuz dizine girelim.

cd oluştur/

Burada uygulamayı derleyip kurmak için

sudo ninja install

komutunu verebilirsiniz.

Artık uygulamaya rize yazarak erişebilirsiniz. + ve - tuşlarına basmayı deneyiniz.

Uygulamayı kaldırmak için aynı dizinin içinde

sudo ninja uninstall

komutu vermek yeterlidir.

Yorumlar

yorum yaz

Yorum yaz

Henüz yorum yok.