Fordításhoz az alábbi ismertetett könyvtárstruktúrát kell felépíteni.
Az áttekinthetőség kedvéért könyvtár neve után mindig tettünk / jelet.
A fájl avagy könyvtár neve után álló [!] azt jelenti, hogy kötelező a fájl, míg a [?] jelentése az, hogy opcionális. Az opcionális fájlok nagy részénél az üres fájl egyenértékű a nem létező fájllal, de ez nem mindig van így.
A futtatható tartalommal bíró fájlokat [x] jelzi. Ezekre nem szükséges x bitet adnunk, a csomagkészítő rendszer a másolatukat fogja futtatni, és azokra ad x bitet.
Fájlok, melyek utólag a csomag részét fogják képezni. Például ha van egy addons/etc/foo.conf fájl, akkor az /etc/foo.conf-ként bekerül a telepített fájlok közé. Üres könyvtár ily módon nem adható meg. A jogokat ne itt adjuk meg a fájl tényleges jogaként, hanem a perms fájlban vegyük fel. Az addons alatt az összes fájl 644 legyen (könyvtárak meg 755).
A patcheket kell ide tenni. A patchek nevük szerint ábécérendben kerülnek alkalmazásra. A patch program "-p1" argumentumot kap, tehát általában a "diff -urN foobar-1.0.orig foobar-1.0" paranccsal készíthetünk ilyen patch fájlt. A fájlok közül bizonyos mintára illeszkedőek, többek közt a "README", "*.txt" és "*.skip" fájlok nem kerülnek alkalmazásra.
A forráskódokat kell ez a könyvtár alá tenni.
A forráskód beszerzésével és kicsomagolásával kapcsolatos információkat tárolja. Ajánlott (szinte kötelező) a Pozsy-féle dl szkriptet használni (mivel utóbbi is egy szkript, ezért azt kell írni, hogy "#!/usr/bin/env dl". A forrást a "compile" könyvtár alá kell kitömörítenie, további alkönyvtár nélkül.
Csomagnevek (soronként egy), amelyekre a program fordításához szükség van. A chroot rendszer felépítésekor használjuk, az uhubuild-build szkript figyelmen kívül hagyja. A "%" kezdetű értékek makróként kifejtődnek a /usr/lib/uhubuild/uhubuild-depends szkript alapján. A "-" kezdetű csomagok a listából a standard csomagok hozzárakása és a "%" makrók kifejtése után, de még a függőség miatti tranzitív lezárt keresése előtt kikerülnek a csomaglistából (tehát dependencia miatt visszajöhetnek).
A csomag ChangeLogja, egyelőre nem tisztázott szintaxisban, és az sem tisztázott, hogy hogyan kerül be ez a fájl a kész csomagba.
Szkript, amely a tényleges fordítási lépést végzi. A kitömörített forráskódot $UB_COMPILEDIR alatt találja meg a szkript (további alkönyvtár nélkül), ez egyben a szkript kezdeti munkakönyvtára. Az $UB_OBJECTDIR könyvtárat használhatja munkakönyvtárként a szkript, ez például a gcc fordítása során hasznos.
A forráskódon belül nevezhetünk meg fájlokat, melyek automatikusan bemásolódnak /usr/share/doc/<sourcename> alá. Könyvtárat is megadhatunk, rekurzíven másolódik. Soronként egy shell pattern.
A telepítést végző szkript. A szkriptnek a lefordított csomagot az $UB_INSTALLDIR változóban kapott könyvtárba kell telepítenie, ahol egy standard könyvtárstruktúra már megtalálható. A szkript kezdeti munkakönyvtára most is az $UB_COMPILEDIR könyvtár.
A csomag karbantartója valami normális szintaxisban, mint például Teljes Név <e@mail.cím>
A csomagkészítés menetét befolyásoló kulcsszavakat írhatunk bele, soronként egyet. Jelenleg az alábbi kulcsszavaknak van jelentésük:
A csomag release értéke, az UHU verzió nélkül. Ez az, amit a Debianék Debian-revision névre kereszteltek, tehát ami a mainstream csomag verziója után biggyesztődik, mint saját alverzió.
A fő csomag neve. Az a név, amely alatt az ember intuitív módon keresi a forrást. Általában megegyezik az egyik készülő bináris csomag nevével. Az elkészült *.uhu fájlokban a "Source:" mezőben jelenik meg a tartalma, valamint a doksi /usr/share/doc/<sourcename> alá pakolódik.
Az UHU disztrib verziószáma (például 1.0, 1.1), vagy DEV a fejlesztői ág esetén. Egyrészt a készült csomagok release számában fog ez az érték tükröződni, másrészt az uhubuild-chrootbuild szkript ehhez az értékhez igazítja a telepítendő csomagok lelőhelyét. A DEV ágnak speciális jelentése is van, ilyenkor minden csomag release értékéhez egy időcímke is hozzáfűződik.
A mainstream program verziója.
Az egyes készülő csomagokra vonatkozó specifikus adatokat minden esetben a packages/csomagnév könyvtárba kell tenni. Az alábbiakban a fájlnév elől elhagyjuk a packages/csomagnév prefixet.
A hosszú leírás magyarul. Ez fogja a control fájlban szereplő Description érték első sor utáni részét adni. A fájlban épeszű módon szerepel a szöveg, a control fájlt készítő szkript feladata lesz az első oszlopban lévő szóköz, illetve az üres sor helyett lévő pont beszúrása.
A rövid, egysoros leírás magyarul. Ez lesz a control fájlban a Description első sora.
A nyomdahibák kiküszöbölése érdekében a csomagleírást átfuttatjuk a magyarispellen. Ha ez talál hibásnak vélt szót, akkor ordít. Itt felsorolhatunk szavakat, melyek mégsem hibásak, akkor sem, ha a magyarispell annak véli őket.
Konfig fájlok, soronként egy. A bevezető / jel opcionális.
Ha a csomag tartalmaz rendszerindításkor indítandó démont, azt itt adhatjuk meg. Soronként egy bejegyzés. Az első szó a démon neve (a bevezető "daemons/" útvonal opcionális). A további szavak az update-rc.d szkript argumentumai a démon indításához. Ha ez egyetlen "defaults" szó, akkor elhagyható. Példák:
gpm
sshd defaults
alsa start 99 S . stop 01 0 6
A csomag control fájljának Depends opciója egészül ki az itt felsorolt értékekkel. Soronként egy csomagnév.
Könyvtárak, melyek részei lesznek a készülő csomagnak. Soronként egy könyvtárnév. A bevezető / jel opcionális. Két jelentése is van az itt felsorolt könyvtáraknak: egyrészt létrejönnek, és ilyen módon tudunk csak üres könyvtárat rakni egy csomagba. Másrészt az itt felsorolt könyvtárak, valamint a rekurzíven alatta lévő könyvtárak bekerülnek a "stat" fájlba, így azok tulajdonosát és módját ismeri és konfiguráláskor beállítja a rendszer. Tulajdonképpen saját dpkg-kiegészítésként leadminisztráljuk, hogy ezek a könyvtárak ehhez a csomaghoz tartoznak.
Azok a fájlok illetve könyvtárak, amelyek a csomagba kerülnek. Minden sorban opcionálisan pár kontrol szimbólum, majd whitespace-ekkel elválasztva a fájlnév. Kontrol szimbólum egyelőre csak a @ jel lehet, ami szimlinkekre passzol. Fájlnévben három shell pattern jellegű dolog használható. A * és a ? jelentése a szokásos. A ** jel (az rsync exclude/include listájához hasonlóan) tetszőleges számú tetszőleges karakterre illeszkedik, beleértve a / jelet is. Tehát a "@ /usr/lib/**/*.so" jelentése az, hogy nem közvetlen a /usr/lib alatt, hanem legalább egy, de akár nagyon sok könyvtárral lejjebb lévő, *.so nevű szimlinkek. Ha egy adott sorra nem illeszkedik egyetlen fájl sem, akkor semmi nem történik, megy tovább az élet. Így tehát a legtöbb -dev csomaghoz egy közös standard "files" fájl megfelel.
A bináris csomagok közül minden esetben pontsosan egynek kell files fájl nélkülinek lennie.
Amennyiben a csomag csoporto(ka)t hoz létre, az(oka)t ide tehetjük. Egy sor szintaxisa az alábbi:
Az automatikus dependencia keresés fázis az újonnan készülő csomagok itt felsorolt könyvtárain belül is találja meg a libeket. Például a qt csomag készítésekor ide kell írni, hogy /usr/lib/qt/lib.
A konkrét csomag tartalmát befolyásoló kulcsszavakat írhatunk ide, soronként egyet. Jelenleg az alábbi kulcsszavaknak van jelentésük:
Az automatikus függőség keresés lépés kihagyása.
Az fhs ellenőrzés lépés kihagyása.
A fordítást követő telepítési fázis (make install jellegű lépés), könyvtárak létrehozása (dirs) és az addons-beli fájlok másolása után az itt lévő módon átállítja a felsorolt fájlok tulaját, csoportját és módját. Mínusz jel esetén az adott értéket változatlanul hagyja. Például:
root shadow 2755 /usr/bin/passwd
gdm - +x /bin/foobar*
A bevezető / jel opcionális. Soronként egy shell pattern, előtte tulaj, csoport és jog.
Post-install szkript.
Post-remove szkript.
Pre-remove szkript.
A csomag priority mezője. Lehetséges értékek: extra, important, libs, optional, required, standard.
A csomag release értéke. A version fájllal együtt kell szerepelnie vagy nem szerepelnie. Ha nem szerepel, akkor a külső könyvtárban lévő release fájl lesz a mérvadó.
A csomag section mezője. Lehetséges értékek: base, console, daemons, dev, devel, docs, games, gnome, kde, lang, lang/perl, lang/python, libs, perl, utils, x11, xfree86.
Felsorolhatunk /sbin vagy /usr/sbin kezdetű fájlokat, melyekre jó volna, ha lenne /bin illetve /usr/bin alatt root jelszót kérő wrapper.
Amennyiben a csomag felhasználó(ka)t hoz létre, az(oka)t ide tehetjük. Egy sor szintaxisa az alábbi:
A csomag verziója adható meg, amennyiben ez eltér a fő verziótól. Ha van ilyen fájl, akkor ugyanitt release fájlnak is kell lennie, ellenkező esetben nem szabad release fájlnak sem lennie.