Hallo nochmal,
Nach 3h googlen und lesen über PKGBUILDS und dem .configure, make, make install Käse ( ein Hoch auf Binäre Pakete! ), versuche ich mich mal darin ein wenig das "Anpassen" Mysterium zu lösen.
Das wohl nicht ganz verstandene "Anpassen" am Beispiel von yaourt-1.3 ( welches keiner Anpassung bedarf aber ein gutes Beispiel abgibt und das erste war was mir einfiel )
Angenommen Du hast ein PKGBUILD aus dem AUR bezogen wo das Programm nun in /bin liegt
# Author: Julien MISCHKOWITZ <wain@archlinux.fr>
# Author: tuxce <tuxce.net@gmail.com>
pkgname=yaourt
pkgver=1.3
pkgrel=1
pkgdesc="A pacman wrapper with extended features and AUR support"
arch=('any')
url="http://www.archlinux.fr/yaourt-en/"
license=(GPL)
depends=('diffutils' 'pacman>=4.1' 'package-query>=1.0' 'gettext')
optdepends=('aurvote: vote for favorite packages from AUR'
'customizepkg: automatically modify PKGBUILD during install/upgrade'
'rsync: retrieve PKGBUILD from official repositories')
backup=('etc/yaourtrc')
source=(http://mir.archlinux.fr/~tuxce/releases/$pkgname/$pkgname-$pkgver.tar.gz)
md5sums=('972173967acd160c987c6dce15a431f8')
build() {
cd "$srcdir/$pkgname-$pkgver/"
make PREFIX=/usr sysconfdir=/etc localstatedir=/var
}
package() {
cd "$srcdir/$pkgname-$pkgver/"
make PREFIX=/usr sysconfdir=/etc localstatedir=/var DESTDIR="$pkgdir" install
}
# vim:set ts=2 sw=2 et:
liegt der Hase im Pfeffer an der Stelle:
make PREFIX=/usr sysconfdir=/etc localstatedir=/var
Warum ?
Eigentlich ganz simple ( Trotzdem bitte korrigieren falls ich Müll erzähle). Der Buildprozess wird durch make in Gang gesetzt, make liest aus dem sogenannten Makefile was es zu tun hat.
Schaut man sich die Datei mal an sieht man das:
# yaourt: pacman frontend
VERSION=1.3
DESTDIR =
PREFIX = /usr/local
SHELL = /bin/bash
INSTALL = /usr/bin/env install
MSGFMT = /usr/bin/msgfmt
SED = /bin/sed
bindir = $(PREFIX)/bin
libdir = $(PREFIX)/lib
sysconfdir = $(PREFIX)/etc
completiondir = ${PREFIX}/share/bash-completion/completions
localedir = $(PREFIX)/share/locale
localstatedir = $(PREFIX)/var
mandir = $(PREFIX)/share/man
dbpath = ${localstatedir}/lib/pacman/
cachedir = ${localstatedir}/cache/pacman/pkg/
aururl = https://aur.archlinux.org
SCRIPTS = yaourt.sh pacdiffviewer.sh \
yaourtrc \
lib/util.sh lib/pkgbuild.sh lib/pacman.sh lib/abs.sh
all: $(SCRIPTS)
$(SCRIPTS): ${SCRIPTS:=.in}
@echo ' GEN' $@
@$(SED) -e 's|@VERSION@|$(VERSION)|g' \
-e 's|@localedir@|$(localedir)|g' \
-e 's|@sysconfdir@|$(sysconfdir)|g' \
-e 's|@libdir@|$(libdir)|g' \
-e 's|@localstatedir@|$(localstatedir)|g' \
-e 's|@dbpath@|$(dbpath)|g' \
-e 's|@cachedir@|$(cachedir)|g' \
-e 's|@aururl@|$(aururl)|g' \
$@.in > $@
install: $(SCRIPTS)
$(INSTALL) -d $(DESTDIR)$(bindir)
$(INSTALL) -d $(DESTDIR)$(libdir)/yaourt
$(INSTALL) -d $(DESTDIR)$(sysconfdir)
$(INSTALL) -d $(DESTDIR)$(completiondir)
$(INSTALL) -d $(DESTDIR)$(mandir)/man{5,8}
# Scripts
$(INSTALL) -m755 yaourt.sh $(DESTDIR)$(bindir)/yaourt
$(INSTALL) -m755 pacdiffviewer.sh $(DESTDIR)$(bindir)/pacdiffviewer
# Configuration
$(INSTALL) -m644 yaourtrc $(DESTDIR)$(sysconfdir)/yaourtrc
$(INSTALL) -m644 bashcompletion $(DESTDIR)$(completiondir)/yaourt
# Libs
$(INSTALL) -m644 lib/alpm_backup.sh $(DESTDIR)$(libdir)/yaourt
$(INSTALL) -m644 lib/alpm_query.sh $(DESTDIR)$(libdir)/yaourt
$(INSTALL) -m644 lib/alpm_stats.sh $(DESTDIR)$(libdir)/yaourt
$(INSTALL) -m644 lib/abs.sh $(DESTDIR)$(libdir)/yaourt
$(INSTALL) -m644 lib/aur.sh $(DESTDIR)$(libdir)/yaourt
$(INSTALL) -m644 lib/util.sh $(DESTDIR)$(libdir)/yaourt
$(INSTALL) -m644 lib/io.sh $(DESTDIR)$(libdir)/yaourt
$(INSTALL) -m644 lib/pacman.sh $(DESTDIR)$(libdir)/yaourt
$(INSTALL) -m644 lib/pkgbuild.sh $(DESTDIR)$(libdir)/yaourt
$(INSTALL) -m644 lib/misc.sh $(DESTDIR)$(libdir)/yaourt
# Man
$(INSTALL) -m644 man/*.5 $(DESTDIR)$(mandir)/man5
$(INSTALL) -m644 man/*.8 $(DESTDIR)$(mandir)/man8
# Locales
test -x $(MSGFMT) && for file in po/*/*.po; \
do \
package=$$(echo $$file | $(SED) -e 's#po/\([^/]\+\).*#\1#'); \
lang=$$(echo $$file | $(SED) -e 's#.*/\([^/]\+\).po#\1#'); \
$(INSTALL) -d $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \
$(MSGFMT) -o $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$$package.mo $$file; \
done
dist:
mkdir yaourt-$(VERSION)
cp -a AUTHORS INSTALL COPYING Makefile pacdiffviewer.sh.in yaourt.sh.in yaourtrc.in \
bashcompletion lib man po yaourt-$(VERSION)
$(SED) -i -e 's|^VERSION.*|VERSION=$(VERSION)|g' yaourt-$(VERSION)/Makefile
tar zcvf yaourt-$(VERSION).tar.gz yaourt-$(VERSION)
rm -rf yaourt-$(VERSION)
clean:
rm -f $(SCRIPTS)
rm -f yaourt-$(VERSION).tar.gz
rm -rf yaourt-$(VERSION)
.PHONY: all install clean dist
Und spätestens bei der Zeile:
bindir = $(PREFIX)/bin
geht dem geneigtem User ein Licht auf! ( Sollte es zumindest )
Angenommen im PKGBUILD sieht die Make Zeile so aus:
make sysconfdir=/etc localstatedir=/var DESTDIR="$pkgdir" install
Und im Makefile steht:
bindir = /bin
weiß ich das mein erstelltes Programm in /bin landet.
Also muss ich entweder das PKGBUILD so abändern das es in /usr/bin landet oder eben dem Makefile sagen das es nach /usr/bin soll.
Zu beachten ist aber das ( meiner Meinung nach ) die Pfade für benötigte Libaries ( /lib = /usr/lib ) auch angepasst werden müssen.
Ich komme also um eine Deinstallation und Neucompilierung des betreffenden Programms nicht herum ( bitte auch korrigieren falls ich unrecht habe ).
Zum Schluss noch das Zitat aus
Arch Linux - Die Grundinstallation und mehr von
Farid Mésbahi :
Eltern haften für ihre Kinder
Wer hat nicht schon solch eine Warnung vor Baustellen gesehen? Ich möchte dieses Beispiel als Aufhänger dafür benutzen, dass sämtliche Projekte und Bespiele zwar von mir getestet sind, allerdings zum Teil Einfluss auf das System nehmen. Auf die Gefahren und Folgen weise ich hiermit ausdrücklich hin. Und daher gilt:
Alles was Sie umsetzen, geschieht auf eigene Gefahr!
Links:
https://wiki.archlinux.org/index.php/Arch_Packaging_Standards#Directories
https://en.wikipedia.org/wiki/Configure_script
MfG