porg
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Ubuntu 24.04 Noble Numbat
Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
Ein klassisches Problem bei Kompilierung eines Programms aus dem Quellcode ist, dass man (als Nicht-Entwickler) häufig nicht nachvollziehen kann, welche Dateien bei der Installation wohin kopiert werden. Das macht eine Deinstallation so gut wie unmöglich, wenn der ursprüngliche Entwickler keinen make uninstall-Befehl hinterlegt hat.
Porg 🇬🇧 (Package Organizer) ist ein Kommandozeilenwerkzeug, um ein Protokoll der installierten Dateien anzulegen. Mit Hilfe dieses Protokolls können selbstkompilierte Programme anschließend wieder rückstandsfrei entfernt werden. Das Programm ist der Nachfolger von "paco", unterscheidet sich bei der Nutzung aber praktisch nicht.
Eine andere Möglichkeit der Kompilierung, die die Erstellung eines DEB-Pakets einschließt, ist checkinstall.
Installation¶
Das Programm ist seit Ubuntu 16.10 Bestandteil der offiziellen Paketquellen. Folgendes Paket muss installiert werden [1]:
porg (universe; bis 24.10)
Befehl zum Installieren der Pakete:
sudo apt-get install porg
porg kompilieren¶
porg ist nur noch bis zum alten Noble Numbat in den Ubuntu Repositories als DEB-Fertigpaket verfügbar. porg ist aber ungemein praktisch und wird sicherlich von dem einen oder anderen Nutzer vermisst. Daher hier ein alias für die $HOME/.bashrc, mit dem sich porg, porgball und grop bequem und schnell in einem Rutsch selbst bauen und installieren lassen.
alias porgneu='INSTALLATIONSDISK=$HOME/Installationsdisk && \
PORG_BASE=$INSTALLATIONSDISK/Porg_Base && \
PORG_SRC=$PORG_BASE/porg && \
ID=$(id --user) && \
PORG_VERSION=0.10 && \
sudo apt-get install build-essential make binutils libc6-dev autotools-dev libgtkmm-3.0-dev && \
echo "apt-get OK" || echo "apt-get Error" && \
[ ! -d $INSTALLATIONSDISK ] && mkdir -pv $INSTALLATIONSDISK || echo "$INSTALLATIONSDISK exists" && \
[ ! -d $PORG_BASE ] && mkdir -pv $PORG_BASE || echo "$PORG_BASE exists" && \
[ -d $PORG_SRC ] && yes | rm -rf $PORG_SRC && \
echo "Builddir removed, OK" || echo "No need remove Builddir, OK." && \
[ ! -d $PORG_SRC ] && mkdir -pv $PORG_SRC || echo "Builddir exists. Ok." && \
sudo mount -v tmpfs $PORG_SRC -t tmpfs -o mode=777,uid=$ID && \
[ ! -d $PORG_SRC/.git ] && git clone https://github.com/drfiemost/porg.git $PORG_SRC && \
printf "\n \033[45m\033[1;36m==> porg Sourcecode cloned. \033[0m\033[42m\033[1;36m ==> ... \033[0m \n \n" || \
printf "\n \033[45m\033[1;36m==> porg Sourcecode found. \033[0m\033[42m\033[1;36m ==> ... \033[0m \n \n" && \
printf "\n \033[45m\033[1;36m==> Update porg Sourcecode. \033[0m\033[42m\033[1;36m ==> ... \033[0m \n \n" && \
git -C $PORG_SRC pull && echo "git pull done." || echo "No git pull." && \
printf "\n \033[45m\033[1;36m==> Config porg for build. \033[0m\033[42m\033[1;36m ==> ... \033[0m \n \n" && \
[ ! -f $PORG_BASE/porg-$PORG_VERSION.tar.gz ] &&
wget -O $PORG_BASE/porg-$PORG_VERSION.tar.gz https://sourceforge.net/projects/porg/files/porg-$PORG_VERSION.tar.gz/download || \
echo "$PORG_BASE/porg-$PORG_VERSION.tar.gz exists. Ok." && \
[ -f $PORG_BASE/porg-$PORG_VERSION.tar.gz ] && \
[ -d $PORG_BASE/extracted ] && yes | rm -rf $PORG_BASE/extracted && \
echo "extracted removed, OK" || echo "No need remove extracted, OK." && \
[ ! -d $PORG_BASE/extracted ] && mkdir -pv $PORG_BASE/extracted || echo "extracted exists. Ok." && \
sudo mount -v tmpfs $PORG_BASE/extracted -t tmpfs -o mode=777,uid=$ID && \
tar -xf $PORG_BASE/porg-$PORG_VERSION.tar.gz -C $PORG_BASE/extracted || echo "Error extracting archive" && \
cp -frv $PORG_BASE/extracted/porg-$PORG_VERSION/build $PORG_SRC/ || \
echo "Error no $PORG_BASE/extracted/porg-$PORG_VERSION/build found." && \
cd $PORG_SRC && \
autoreconf -v && \
$PORG_SRC/configure --prefix=/usr --sysconfdir=/etc && \
printf "\n \033[45m\033[1;36m==> Compile porg. \033[0m\033[42m\033[1;36m ==> ... \033[0m \n \n" && \
time make -j $(nproc --all) && \
printf "\n \033[45m\033[1;36m==> Install porg. \033[0m\033[42m\033[1;36m ==> ... \033[0m \n \n" && \
sudo make install && sudo rm -f /usr/share/porg/*.png /usr/share/porg/*.html 2>/dev/null && \
sudo strip --strip-unneeded /usr/bin/grop /usr/bin/porg && \
sudo porg -lp porg "make install && rm -f /usr/share/porg/*.png /usr/share/porg/*.html 2>/dev/null && \
strip --strip-unneeded /usr/bin/grop /usr/bin/porg" && \
sudo porg -lp porg "make install && rm -f /usr/share/porg/*.png /usr/share/porg/*.html 2>/dev/null && \
strip --strip-unneeded /usr/bin/grop /usr/bin/porg" && \
printf "\n \033[45m\033[1;36m==> porg successful install. \033[0m\033[42m\033[1;36m ==> Done.\033[0m \n \n" && \
printf "\n \033[45m\033[1;36m==> porg deinstall: \033[0m\033[43m\033[1;36m sudo porg -rv porg <== \033[0m \n \n" || \
printf "\n \033[41m\033[1;36m==> porg build or install failed.\033[0m \n \n" | tee -a $HOME/buildfail.log ; \
cd $HOME ; \
sudo umount -fv $PORG_SRC ; \
sudo umount -fv $PORG_BASE/extracted ; \
[ -d $PORG_SRC ] && yes | sudo rm -rf $PORG_SRC && echo "Builddir cleaned." || echo "Builddir was clean." ; \
[ -d $PORG_BASE/extracted ] && yes | sudo rm -rf $PORG_BASE/extracted && \
echo "$PORG_BASE/extracted cleaned." || echo "$PORG_BASE/extracted was clean." ; \
cd $HOME'Der Mehrfachinstallationsvorgang im "porgneu" Bash alias ist Absicht, da es der einfachste Weg war, um eine Eigenart von porg zu überlisten. porg kann dann ganz einfach so installiert, oder aktualisiert werden:
porgneu
Der alias "porgneu" ist mit Questing Quokka getestet. Voraussetzung zum kompilieren müssen gegebenenfalls zuvor selbst installiert werden, falls etwas fehlt. Siehe auch im Wiki:
Verwendung¶
Zwei einfache Beispiele, die die Verwendung von porg demonstrieren [2]:
tar xvf foo-1.0.tar.gz cd foo-1.0 ./configure make sudo porg -lp foo-1.0 "make install"
Der einzige Unterschied zum sonst üblichen Dreisatz aus configure, make und sudo make install ist in der letzten Zeile zu finden. Die Option -lp besteht aus zwei Parametern: -l (log) sorgt dafür, dass ein Installationsprotokoll angelegt wird, während -p (package) sich auf das Programm foo in der Version 1.0 bezieht.
Eine Deinstallation erfolgt mit dem Befehl:
sudo porg -r foo-1.0
Weitere Beispiele¶
Welche Programme wurden über porg installiert?
porg -a
foo-1.0
Welche Dateien gehören zum Programm
foo-1.0?porg -f foo-1.0
/usr/local/bin/foo /usr/local/bin/bar /usr/local/bin/foobar
Zu welchem Programm gehört die Datei
foo:porg -q /usr/local/bin/foo
/usr/local/bin/foo: foo-1.0
Neben diesen Beispielen besitzt das Programm eine Reihe weiterer Optionen, die der Manpage zu entnehmen sind. porg verwendet /var/lib/porg/ als Standardordner für Installationsprotokolle und die Datei /etc/porgrc für systemweite Einstellungen.
paco2porg¶
Wer bereits mit paco gearbeitet hat, kann mit paco2porg vorhandene Daten konvertieren.
porgball¶
Mit diesem Zusatzprogramm können Binärpakete im TGZ-Format erzeugt werden. Des Weiteren kann es benutzt werden, um diese Pakete zu (re)installieren.
Grafische Oberfläche¶
Wenn die grundlegenden Vorgänge verstanden worden sind, kann man alternativ zur Kommandozeilenversion auch eine ausschließlich englischsprachige grafische Oberfläche nutzen. Diese kann allerdings kein Installationsprotokoll erstellen, sondern dient in erster Linie zur Verwaltung der über porg installierten Programme.
grop (universe; bis 24.10)
Befehl zum Installieren der Pakete:
sudo apt-get install grop
Anschließend kann das Programm bei Ubuntu-Varianten mit einem Anwendungsmenü über den Eintrag „System → Package Organizer“ oder den Befehl grop gestartet werden. Zum Entfernen eines systemweit installierten Programms werden Root-Rechte benötigt [3].
Problembehebung¶
Nachträgliche Nutzung¶
Um ein selbstkompiliertes und bereits per sudo make install installiertes Programm mit porg deinstallieren zu können, wiederholt man die Installation des selbstkompilierten Programms wie oben angegeben.
Daneben gibt es eine zweite Möglichkeit, ein bereits installiertes Programm mit porg zu verwalten. Diese Methode funktioniert aber nur, wenn bekannt ist, dass ausschließlich ein bestimmter Ordner verwendet wird. Beispiel:
find /opt/bar-1.1 | porg -lp bar-1.1
Einschränkungen¶
Grundsätzlich werden von porg nur Dateien protokolliert, aber keine Verzeichnisse (Ordner). Falls eine Installationsroutine einen neuen Ordner anlegt, aber keine Datei in diesem speichert, wird das nicht erfasst. Das gilt auch für während der Laufzeit eines Programms erstellte Dateien und Ordner, z.B. im Homeverzeichnis.
Durch Beschränkungen von LD_PRELOAD kann porg nicht mit SUID-Programmen verwendet werden. Als Beispiel soll der folgende Befehl dienen:
porg -lp foobar-1.0 "sudo make install"
Zwar wird nun das Programm foobar-1.0 wie gewünscht installiert, aber ein Installationsprotokoll kann nicht erstellt werden.
Links¶
Projektseite 🇬🇧
Manpage 🇬🇧
Programme kompilieren Übersichtsartikel