====== Règles ======

Ces règles sont élaborées pour obtenir une homogénéité des packages et une intégration parfaite dans Xfce et tout environnement de bureau respectant les standard freedesktop.\\
Si vous pensez avoir respecté ces rêgles, vous pouvez proposer/soumettre votre package à la communauté.

**A/**
Le nom du package doit être de la forme :\\
$name-$version-$arch-$zenwalk-release.$build.tgz

  - name:Le nom du package: il ne peut contenir que des caractères alphanumériques, "-" est supporté mais devrait être évité.
  - version: la version: celle de l'application (ex 1.5.0.6), avec quelques règles encore:
* les séparateurs "_,()-" sont interdits, utilisez "."
  - arch: l'arche: i486 le plus souvent (il faut une excellente raison pour ne pas le faire)
  - zenwalk-release: la version de zenwalk pour laquelle le package a été construit (ex: zenwalk-4.0 fraîchement installé > 40, zenwalk-4.0 installé mais depuis, vous utilisez le répertoire "snapshot" pour les  mises à jour > 42)
  - build: "compilation, construction": la version du package pour une même application (ex: 1ère compilation de XW-3.0: 40.1, amélioration, nouvelle compilation de XW-3.0: 40.2)
  - Rien ne commence par 0 (ex: 002 doit être convertit en 2)
  - Les mots "alpha, beta, svn, ... sont interdits, utilisez .a, .b, .c

**B/**
Tous les packages doivent s'installer sans que l'utilisateur doive éxécuter quoique ce soit après l'installation pour rendre le package utilisable.

**C/**
Tous les packages doivent contenir un fichier "slack-desc" qui décrit brièvement l'application

**D/**
Le script de post-install (doinst.sh) ne doit contenir que des chemins relatifs à / (ex: /etc/profile est = etc/profile dans doinst.sh)

**E/**
Tous les packages doivent être accompagné de leur signature md5, pour vérifier leur intégrité, ainsi que de leur fichier .dep qui liste les dépendances.\\
Pour l'obtenir :
<code>
# requiredbuilder -z packageX.tgz > packageX.dep
</code>

**F/**
Tous les packages doivent inclure leur ZenBuild, nommé "build-packageX.sh" dans le répertoire "/usr/src/packageX-x.x"

**G/**
Le ZenBuild est un script bash qui automatise la création du package.\\
Il doit contenir au minimum :\\
  * le nom du packager
  * l'url vers la source du package
  * les commandes bash utilisées pour construire le package

**H/**
Les packages (sauf excellente raison) sont compilés avec :\\
CFLAGS="-O2 -march=i486 -mtune=i686"\\
CXXFLAGS="-O2 -march=i486 -mtune=i686"

**I/**
Résumé des principales options de configuration :
<code>
./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc --mandir=/usr/man
</code>

Ce qui veut dire :
  * Le package n'est pas autorisé à installer des fichiers dans /opt et /usr/local
  * /usr est le chemin du préfixe d'installation
  * les fichiers log doivent être installés dans /var
  * les fichiers de configuration : /etc
  * les pages de manuel : /usr/man

**J/**
Tous les binaires et librairies systèmes doivent être strippées de symboles de "débugages"

**K/**
Les pages de manuel doivent être gzippées

**L/**
Les permissions des fichiers installés dans /usr/bin sont: root:root

**M/**
Les fichiers installés dans /usr/doc ne peuvent avoir de permissions d'écriture pour l'utilisateur

**N/**
Tous les packages tournant sous X doivent installer:
  * leur fichier .desktop dans /usr/share/applications
  * leur icône dans usr/share/icons/hicolor/scalable/apps/ (si vectorielle) et/ou       usr/share/icons/hicolor/48x48/apps/ (si png)


====== ZenBuild ======
===== modèle =====
Voici un exemple de modèle de ZenBuild qui, en plus du package.tgz, vous fournira le fichier .md5 ainsi q'un fichier.log traçant la compilation :

<php>
#!/bin/bash
# packager            : Prénom Nom <pseudo> (mon_email@mail.com)
# source location  : http://www.lieu_des_sources/source.tar.gz
# last revised        : date de la dernière mise à jour

softname='Nom_PackageX'
softversion=''
packageversion=''

arch='i486'
cpu='i686'

prefix=/usr

# log ;)
(

# parameters needed for the build process
buildir=$(pwd)
srcpkg="$buildir/$softname-$softversion.tar.gz"
src="$buildir/$softname-$softversion"
package="$softname-$softversion-$arch-$packageversion"
dest="$buildir/$package"

# prepare the build result directory
dest="$buildir/$package"
rm -rf $dest
mkdir -p $dest
mkdir -p $dest/install
mkdir -p $dest/usr/doc/$softname-$softversion
mkdir -p $dest/usr/src/$softname-$softversion

# Slack-desc
cat <<EOF > $dest/install/slack-desc
            |-----handy-ruler------------------------------------------------------|
Nom_PackageX:
Nom_PackageX:
Nom_PackageX:  
Nom_PackageX:  
Nom_PackageX:
Nom_PackageX:
Nom_PackageX:
Nom_PackageX:
Nom_PackageX:
Nom_PackageX:
Nom_PackageX:
EOF

# extract the source code
cd $buildir
tar xvf $srcpkg
cd $src

# build

   export CFLAGS="-O2 -march=$arch -mtune=$cpu"
   export CXXFLAGS="-O2 -march=$arch -mtune=$cpu"

   ./configure \
     --prefix=$prefix \
     --enable-static=no \
     --program-prefix="" \
     --program-suffix="" \
     --build=$arch-slackware-linux

   make
   make install DESTDIR=$dest

# add 'default' files
   cp -a \
     AUTHORS COPYING INSTALL README ChangeLog \
     $dest/usr/doc/$softname-$softversion
     
# Compress Man Pages
gzip -9 $dest/usr/man?/*

# Strip
( cd $dest
 find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
 find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
)

# .desktop file
cat << "EOF" > $dest/usr/share/applications/$softname.desktop
[Desktop Entry]
Encoding=UTF-8
Name=
Name[fr]=
Comment=
Comment[fr]=
Exec=
Icon=
Terminal=false
Type=Application
Categories=Application;System;
StartupNotify=true
EOF

# Make the package freedesktop compliant
cp $buildir/$softname-$softversion/pixmaps/$softname.png $dest/usr/share/icons/hicolor/48x48/apps/

# ZenBuild
cp $buildir/build-$softname.sh $dest/$prefix/src/$softname-$softversion

# set target permissions
chown -R root:root $dest

cd $dest
find . -perm 664 -exec chmod 644 {} \;
find . -perm 600 -exec chmod 644 {} \;
find . -perm 444 -exec chmod 644 {} \;
find . -perm 400 -exec chmod 644 {} \;
find . -perm 440 -exec chmod 644 {} \;
find . -perm 777 -exec chmod 755 {} \;
find . -perm 775 -exec chmod 755 {} \;
find . -perm 511 -exec chmod 755 {} \;
find . -perm 711 -exec chmod 755 {} \;
find . -perm 555 -exec chmod 755 {} \;

# real packaging work
cd $dest
makepkg -l y -c n $dest.tgz

# md5sum signature
cd $buildir
md5sum $package.tgz > $package.md5

# log ;)
) 2>&1 | tee "$softname-$softversion-build.log"

</php>