Skip to content

Instantly share code, notes, and snippets.

@sulincix
Last active July 28, 2025 10:43
Show Gist options
  • Save sulincix/673cdbebe2f6773d72936bdece6b9970 to your computer and use it in GitHub Desktop.
Save sulincix/673cdbebe2f6773d72936bdece6b9970 to your computer and use it in GitHub Desktop.
Debian paket yapımı ve sürdürülmesi

Derlenmiş fakat deb paketi olmayan bir uygulamayı paketleme

1. İndirme

Uygulamayı sağlayıcıdan indirin. Örneğin:

wget "https://download.mozilla.org/?product=firefox-latest-ssl&os=linux64&lang=en-US" -O firefox.tar.xz

Ardından arşivi bir taslak dizinine açın.

mkdir test
cd test
tar -xf ../firefox.tar.xz

2. Taşıma

Uygulamanın dosyalarını taslak dizinimizin içinde aşağıdaki gibi kurulacak şekilde taşıyalım.

konum amacı
/opt/example Uygulama dosyaları
/usr/share/applications/example.desktop Uygulama başlatıcısı
/usr/share/icons/hicolor/scalable/apps/example.svg Uygulama simgesi (SVG)
/usr/bin/example Uygulama komutu

Eğer uygulama başlatıcısı yoksa aşağıdaki gibi bir tane oluşturabilirsiniz.

[Desktop Entry]
Name=example
Comment=example comment
Exec=example %u
Terminal=false
Type=Application
Icon=example
Categories=System;
StartupWMClass=org.example.application

Uygulamayı çalıştıracak komut dosyası aşağıdaki gibi olabilir:

#!/bin/sh
exec /opt/example/example "$@"

Not: StartupWMClass değerine xprop WM_CLASS komutunu çalıştırıp çalışan uygulamaya tıklayarak öğrenebilirsiniz.

Not: Uygulama simgesini /opt/example içinde tutup uygulama başlatıcısına tam konum yazarak da kullanabilirsiniz.

Bu örneğimizde aşağıdaki gibi yapılabilir:

mkdir -p firefox-deb/opt \
    firefox-deb/usr/bin \
    firefox-deb/usr/share/applications/ \
    firefox-deb//usr/share/icons/hicolor/128x128/apps/
mv ./firefox /firefox-deb/opt/firefox
cp firefox-deb/opt/firefox//browser/chrome/icons/default/default128.png \
    firefox-deb//usr/share/icons/hicolor/128x128/apps/firefox.png
cat > firefox-deb/usr/share/applications/firefox.desktop <<EOF
[Desktop Entry]
Name=Firefox
Comment=Mozilla Firefox
Exec=firefox %u
Terminal=false
Type=Application
Icon=firefox
Categories=Network;WebBrowser;
StartupWMClass=firefox
EOF
cat > firefox-deb//usr/bin/firefox <<EOF
#!/bin/sh
exec /opt/firefox/firefox "$@"
EOF
chmod 755 firefox-deb//usr/bin/firefox

3. Makefile yazma

deb paketi oluşturmak için bir derleme talimatı gereklidir. Her ne kadar biz derleme işlemi yapmasak bile dosyaların gerekli yerlere kopyalanması için Makefile dosyası oluşturmalıyız.

build:
	# make build komutunda hata vermemesi için
	: do nothing
install:
	mkdir -p $(DESTDIR)
	cp -rf usr $(DESTDIR)/
	cp -rf opt $(DESTDIR)/
	# gerekli diğer dosyalar varsa benzer şekilde kopyalanır.

Not: başta dosyaları taşımlak yerine makefile yardımı ile doğrudan istenilen yere kopyalayabilirsiniz.

4. debian dosyaları.

Öncelikle gerekli dosyaları aşağıdaki komut ile oluşturun.

debmake -n -u 0.0.1 -p example

Ardından debian dizini altındaki dosyaları düzenleyin.

Son olarak paket haline getirin.

dpkg-buildpackage -b

Not: binary formattaki dosyalar git üzerinde tutmak için uygun olmadığı için gbp kullanmadık. İsterseniz kullanabilirsiniz.

deb paketi açıp kapatma

Paketi açma

Öncelikle paketin kendisini ar komutu ile açalım.

mkdir test
cd test
ar x ../test.deb
rm -f debian-binary

Ardından data dosyasını açalım

# uzantısı farklı olabilir
tar -xf data.tar.xz
rm -f data.tar.xz

Son olarak control dosyasını açalım

mkdir DEBIAN
cd DEBIAN
# uzantısı farklı olabilir
tar -xf ../control.tar.gz
cd ..
rm -rf control.tar.gz

Bu şekilde paketin içini açmış olduk. İstediğimiz değişikliği yapabiliriz.

Paket kapatma

paket üzerinde değişikliklerimizi yaptıktan sonra aşağıdaki gibi paketi kapatabiliriz. Bu şekilde yeni deb paketi oluşmuş olur.

cd ..
# dosya izinlerinin ve iyeliğinin bozulmaması için fakeroot komutu kullanılmalıdır.
fakeroot dpkg -b ./test

Gbp (Git Build Package) ile Debian paketi oluşturma sürecini özetlemişsiniz.

1. Kaynak Kodun İndirilmesi

Öncelikle, paketlemek istediğiniz yazılımın kaynak kodunu indirelim. Örneğin, GNU Hello uygulamasının kaynak kodunu indirmek için:

wget https://ftp.gnu.org/gnu/hello/hello-2.11.tar.gz

2. Yeni Bir Dizin Oluşturma ve Git Başlatma

Yeni bir dizin oluşturup bu dizinde Git deposu başlatalım:

mkdir hello
cd hello
git init --initial-branch=debian/upstream

3. Arşivin Gbp ile İçe Aktarılması

İndirdiğiniz arşivi gbp ile içe aktaralım:

gbp import-orig ../hello-2.11.tar.gz

4. Debian Dizininin Oluşturulması

Debian dizinini oluşturmak için debmake komutunu kullanalım. Bu komut, gerekli Debian dosyalarını oluşturur:

debmake -u 2.11 -p hello

5. Control Dosyasının Düzenlenmesi

debian/control dosyasını düzenleyerek paket bilgilerini güncelleyebilirsiniz:

nano debian/control

Bu dosyada, paket adı, sürüm, bağımlılıklar gibi bilgileri güncellemeniz gerekebilir.

6. Changelog Oluşturma

dch komutunu kullanarak changelog dosyasını oluşturalım:

dch -i

Bu komut, yeni bir sürüm girişi eklemenizi sağlar.

7. Git'e Yükleme

Değişikliklerinizi bir Git deposuna yüklemek için:

git remote add origin <repository-url>
gbp push

8. Paketin Derlenmesi

Son olarak, paketi derlemek için gbp buildpackage komutunu kullanalım:

gbp buildpackage

Bu komut, Debian paketinizi oluşturacak ve gerekli dosyaları oluşturacaktır.

9. Güncelleme alma

Paketi güncellemek için gbp ile tekrar içe aktaralım:

gbp import-orig ../hello-2.12.tar.gz

Ardından commit oluşturalım:

git add .
git comit

Son olarak changelog oluşturup gönderelim:

dch -i
gbp push

Meta paket yapımı

Meta paketler arşivi bulunmayan native formatına sahip paketlerdir. Oluşturmak için boş bir dizin açın ve içerisine aşağıdaki komut ile şablon oluşturun.

mkdir example
cd example
debmake -n -u 0.0.1 -p example

Ardından oluşan control dosyasını düzenleyin.

Source: example
Section: metapackages
Priority: optional
Maintainer: Sagopa Kajmer <[email protected]>
Build-Depends: debhelper (>= 12)
Standards-Version: 4.5.0

Package: example
Architecture: all
Depends: package1, package2, package3
Description: This is a meta package that depends on package1, package2, and package3.
 This package is used to install a set of related packages.

Ardından changelog güncelleyelim.

gbp dch -Rc

Ardından git üzerine gönderebilirsiniz.

git init
git add debian
git commit -m "create a new metapackage"
git remote add origin <git-url>
git push -u origin master

Derlemek için gbp buildpackage kullanabiliriz.

gbp buildpackage --git-export-dir=/home/pingu/deb-exports/example

Debianda var olan paketi yamalamak

Öncelikle düzenlenecek olan paketi git üzerinden çekin.

git clone <upstream-git-adresi>

Ardından içine girip gbp ile yama dalı oluşturun.

cd hello
gbp pq import
git switch patch-queue/master

Ardından yapılacak değişikliklikleri yapın ve commit oluşturun.

sed -i "s/Hello, World/Selamun Aleykum/g" src/hello.c
git add src/hello.c
git commit -m "replace hello message with islamic one"

Ardından gbp ile yamayı oluşturun.

gbp pq export

Son olarak changelog dosyasını güncelleyelim.

git add debian/patches
git commit -m "Patch for islamic hello message"
gbp dch -Rc

Şimdi kodu kendi git adresinize gönderebilirsiniz.

git remote set-url origin <git-adresi>
# upstream eklemek için
git remote add upstream <upstream-git-adresi>

Güncelleme yapmak

Upstream üzerinden güncelleme yapmak için git pull yapmanız ve ardından changelog güncellemeniz yeterlidir..

git pull --rebase upstream master
gbp dch -Rc

Python gtk uygulama oluşturma ve paketleme

1. Uygulama taslağı

Öncelikle proje hilerarşisini oluşturalım.

├── data
│   ├── org.example.application.desktop # uygulama başlatıcısı
│   ├── org.example.application.gschema.xml # glib şeması
│   ├── org.example.application.policy # polkit kuralı
│   ├── org.example.application.svg # uygulama simgesi
│   └── ...
├── src
│   ├── Actions.py # yetkili kullanıcı ile çalıştırılacak dosya
│   ├── main.py # ana dosya
│   ├── MainWindow.py # uygulama penceresi dosyası
│   ├── ui
│   │   └── MainWindow.ui # glabe şeması
│   ├── util.py # İşe yarar fonksiyonlar için
│   └── ...
├── example.py # uygulama başlatıcı dosya
├── meson.build # derleme talimatı
├── po
│   ├── example.pot # dil dosyası şeması
│   ├── LINGUAS # dil listesi
│   ├── meson.build # dil derleme dosyası
│   ├── tr.po # türkçe çeviri
|   └── ...
├── README.md # uygulama açıklaması
└── update-translation.sh # dil dosyası güncelleyici betik

Not: Bu şemadaki bazı dosyalar ihitiyaca göre bulunmayabilir.

2. Uygulama kodu

Her uygulamanın bir idsi bulunur. Bu örnekte org.example.application olarak ele aldık.

main.py

Bu dosyanın amacı uygulamanın id değeri ile uygulamayı başlatmak ve ana pencereyi göstermektir. Bu dosyada argument işlemleri gibi işlemler de gerçekleştirilir.

#!/usr/bin/python3

import sys
import gi

gi.require_version('Gtk', '3.0')
from gi.repository import GLib, Gio, Gtk

from MainWindow import MainWindow

class Application(Gtk.Application):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, application_id="org.example.application",
                         flags=Gio.ApplicationFlags.FLAGS_NONE, **kwargs
        )
        self.window = None
        GLib.set_prgname("org.example.application")

    def do_activate(self):
        if not self.window:
            self.window = MainWindow(self)
        else:
            self.window.present()


app = Application()
app.run(sys.argv)

MainWindow.py

Bu dosyanın amacı uygulamanın ana penceresini oluşturmaktır. Bu dosyada uygulamanın grafiksel işlemleri gerçekleştirilir. (Örneğin bir tuşa basınca çalışacak eylem)

#!/usr/bin/env python3

import gi
import os

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

try:
    import locale
    from locale import gettext as _

    # Translation Constants:
    APPNAME = "example"
    TRANSLATIONS_PATH = "/usr/share/locale"
    locale.bindtextdomain(APPNAME, TRANSLATIONS_PATH)
    locale.textdomain(APPNAME)
except:
    # locale load fallback
    def _(msg):
        return msg


class MainWindow:
    def __init__(self, application):
        self.builder = Gtk.Builder()

        # Import UI file:
        glade_file = (
            os.path.dirname(os.path.abspath(__file__)) + "/ui/MainWindow.ui"
        )

        self.builder.add_from_file(glade_file)
        self.builder.connect_signals(self)

        self.ui_window_main.set_application(application)

        # show main window
        self.ui_window_main.show()

        # do some stuff
        print(_("Hello World"))

Burada glade üzerindeki bir elemanı kod tarafında çekmek için self.builder.get_object("element-adı") kullanılabilir.

util.py

Bu dosyanın amacı grafiksel olmayan işlemlerin gerçekleştirildiği yerdir. (Örneğin config dosyası okuma yazma işi). Duruma göre birden çok dosya oluşturabilir ve farklı isimler verebilirsiniz.

Actions.py

Bu dosyanın amacı yetkili kullanıcı ile çalıştırılacak işlemleri içermesidir. Güvenlik sebebi ile bu dosyayı oluştururken dikkatli olmalı ve parametre olarak gelen değerleri doğrudan çalıştırmamalısınız.

glade dosyaları

Bu dosyanın amacı gtk uygulamanız için şema oluşturmaktır. glade üzerinden bu dosyayı oluşturup düzenleyebilirsiniz.

.py dosyası

Bu dosya komut olarak çalışacak ana dosyadır. Asıl görevi uygulamanın bulunduğu dizini sys.path içerisine ekleyip ana uygulamayı çalıştırmaktır. Bu dosya kaynak kod üzerinden çalıştırılma durumunda kullanılmaz. O yüzden bu dosyaya extra bir kod yazılmamalıdır. İçeriği aşağıdaki gibi olabilir.

#!/usr/bin/env python3
import sys
sys.path.insert(0, '/usr/share/example/')
import Main

desktop dosyası

Bu dosya uygulama başlatıcısı dosyasıdır. İçeriği aşağıdaki gibi olmalıdır

[Desktop Entry]
Name=Example
Name[tr]=Örnek
Comment=Example Comment
Comment[tr]=Örnek Açıklama
Categories=System;X-Pardus-Apps;
Keywords=keyword;keyword;keyword;

Exec=example
Icon=org.example.application
Terminal=false
Type=Application
StartupNotify=true
X-GNOME-UsesNotifications=true

meson.build dosyası

Bu dosya uygulamanın ne şekilde paketleneceği ve neyin nereye kopyalanması gerektiğini belirler.

İçeriği aşağıdaki gibi olmalıdır.

project(
    'example',
    version : '1.0.0',
    license: ['GplV3']
)

subdir('po')

prefix = get_option('prefix')
appdir = prefix / 'share/pardus/example'

glibdir = get_option('prefix')/'share/glib-2.0/schemas/'
icondir = get_option('prefix')/'share/icons/hicolor/scalable/apps'
desktopdir = get_option('prefix')/'share/applications'
policydir = get_option('prefix')/'polkit-1/actions'

install_data('data/org.example.application.svg', install_dir : icondir)
install_data('data/org.example.application.desktop', install_dir : desktopdir)
install_data('data/org.example.application.gschema.xml', install_dir : glibdir)
install_data('data/org.example.application.policy', install_dir : policydir)

install_subdir('src/', install_dir: appdir, strip_directory : true)
install_data('example.py', install_dir : bindir, rename: 'example')

Çeviri dosyaları

Çeviri için öncelikle pot dosyasına ihtiyacımız bulunur. Bunun için ise bir betikten yardım alırız.

#!/bin/bash

if ! command -v xgettext &> /dev/null
then
	echo "xgettext could not be found."
	echo "you can install the package with 'apt install gettext' command on debian."
	exit
fi


echo "updating pot file"
xgettext -o po/example.pot --from-code="utf-8" \
    `find example -type f -iname "*.py"` \
    `find example -type f -iname "*.ui"`

for lang in $(cat po/LINGUAS); do
	if [[ -f po/$lang.po ]]; then
		echo "updating $lang.po"
		msgmerge -o po/$lang.po po/$lang.po po/example.pot
	else
		echo "creating $lang.po"
		cp po/example.pot po/$lang.po
	fi
done

Bu betik ve ayrıca derleme talimatı için dil listesi gerekmektedir. Bunu po/LINGUAS dizini içine alt alta ekleyebilirsiniz. Uygulama içerisindeki yazılar ingilizce yazılacağı için ingilizce çeviri dosyasına gerek yoktur.

tr
pt
es

Ardından bu betiği çalıştıralım ve pot dosyasını oluşturalım. Çeviri dosyalarını da ekledikten sonra derleme yapmak için meson dosyasını po/meson.build içine yazalım.

i18n = import('i18n')
i18n.gettext(meson.project_name(), preset: 'glib')

3. Paket haline getirme

Paket haline getirmek için debian dizinine ihtiyacımız bulunmaktadır.

debian/
├── changelog # değişiklikler listesi
├── compat # debian sürümü
├── control # paket bilgisi
├── copyright # lisans bilgisi
├── meson.build # paket sürümü çekmek için gereken meson dosyası
├── rules # nasıl derleneceğini anlatan dosya
└── source
    └── format # paket formatı

source/format

bu dosyaya 3.0 (native) yazabilirsiniz. Debian 12 ile beraber bu dosya olmasa da olur.

changelog

Bu dosya yapılan değişiklikleri ve uygulama sürümünü belirtir. dch -i ile oluşturabilirsiniz.

example (1.0.0) unstable; urgency=medium

  * Fix typo on parentheses

 -- Sagopa Kajmer <[email protected]>  Mon, 28 Aug 2023 19:46:36 +0300

Sürüm adlarında dikkat ettiklerimiz:

  • Sürüm 3 basamaklıdır.
  • Uygulama kararlı hale gelene kadar 1.x.x olamaz.

compat

Bu dosya uyumlu olan debian sürümünü belirtir. (pardus için (sürüm+1)/2 örn: 23 için (23+1)/2 = 12)

control dosyası

paket bilgisini içerir. İçeriği aşağıdaki gibidir.

Source: example
Section: devel
Priority: optional
Maintainer: Sagopa Kajmer <[email protected]>
Build-Depends: meson, debhelper (>= 12)

Package: example
Architecture: all
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Örnek paket
 Buda paketin uzun aciklamasi
 istedigimiz kadar uzatabiliyoruz burayi

Not: Eğer kodun içinde derlenebilen bir kod varsa (C gibi) Architecture kısmını any yoksa all yapın.

copyright dosyası

Bu dosya lisans bilgisi içerir.

Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: example
Source: https://example.org/example

Files: *
Copyright: 2025 Sagopa Kajmer <[email protected]>
License: GPL-3.0+

License: GPL-3.0+
  ...

meson.build dosyası

Bu dosyanın tek amacı changelog dosyasını okuyup içerisindeki sürüm bilgisini çekmek ve bir dosyaya yazmaktır.

# Define the output file
output_file = '__version__'

# Define the command to extract the version
cmd = ['bash', '-c', 'head -n 1 changelog | sed "s/.*(//g;s/).*//g" > '+meson.current_build_dir()+'/__version__']

# Create a custom target
run_command(cmd, check:true)

install_data(meson.current_build_dir() / output_file, install_dir : '/usr/share/example')

Bu dosyayı kullanmak için projenin ana meson dosyasına subdir('debian') satırı ekleyin.

Not: Bu dosyayı kullanmak yerine elle sürüm bilgisi yazıp güncelleyebilirsiniz.

rules dosyası

Bu dosya nasıl derlenmesi gerektiğini belirtir. İçeriği aşağıdaki gibi olmalıdır.

#!/usr/bin/make -f

%:
	dh $@ --buildsystem=meson

4. paket haline getirilmesi

Uygulama dosyalarımızı ve debian dizinimizi oluşturduktan sonra git üzerine atmaya hazır hale gelmiş demektir. Bunun için öncelikle gitignore dosyasını yazmamız ve git üzerine atmamız gerekmektedir. gitignore içeriği aşağıdaki gibi olmalıdır

*.pyc
*.mo
debian/debhelper-build-stamp
debian/files
debian/example.debhelper.log
debian/example.substvars
debian/example
debian/.debhelper

Derlemeden önce eğer changelog güncellemişsek güncelleyelim.

gbp dch -Rc

Ardından git üzerine aşağıdaki gibi gönderelim.

gbp push

Not: Bu aşamadan sonraki kısımları bir sanal makina veya container ortamı içinde gerçekleştirmemiz gerekmektedir.

Derleme ortamımızda aşağıdaki değişkenleri ayarlayalım.

export DEBEMAIL="[email protected]"
export DEBFULLNAME="Sagopa Kajmer"

Şimdi gerekli paketleri yükleyelim.

mk-build-deps -ir

Son olarak paket haline getirelim.

gbp buildpackage --git-export-dir=/tmp/build-gdebi -us -uc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment