Einen (super-)simplen Port bauen... Bin zu doof...

Rosendoktor

Well-Known Member
Hi,

möchte für ein simples Python Skript das als .deb und .rpm vorliegt ein Paket bauen, nur für mich selbst (zunächst mal). Aber irgendwie bin ich noch zu doof dafür... Dabei soll gar nix compiliert werden, sondern einfach nur installiert.

Also, ich hab' das rpm ausgepackt, gepatched, ein .tar.gz daraus gebaut und dieses unter /usr/ports/distfiles abgelegt. Dann gemäß Handbuch ein Makefile und die pkg-plist und pkg-descr Dateien erstellt. Das richtige herunterladen, auspacken und patchen des .rpm kommt dann vielleicht später mal...

Hier mal das sehr einfache Makefile:
Code:
# $FreeBSD$

PORTNAME=    fahcontrol
DISTVERSION=    7.6.9
CATEGORIES=    biology
MASTER_SITES=    https://download.foldingathome.org/releases/public/release/fahclient/centos-6.7-64bit/v${DISTVERSION:R}/

DISTNAME=       fahcontrol-${DISTVERSION}-1

MAINTAINER=    <ich>
COMMENT=   

RUN_DEPENDS=    python2:lang/python27

NO_BUILD=    yes

.include <bsd.port.mk>
Wenn ich dann versuche "make" auszuführen passiert das hier:
Code:
root@alkione:~/Software/FAHControl/port# make
===>   fahcontrol-7.6.9 depends on file: /usr/local/sbin/pkg - found
===> Fetching all distfiles required by fahcontrol-7.6.9 for building
===>  Extracting for fahcontrol-7.6.9
=> SHA256 Checksum OK for fahcontrol-7.6.9-1.tar.gz.
===>  Patching for fahcontrol-7.6.9
===>  Configuring for fahcontrol-7.6.9
===>  Staging for fahcontrol-7.6.9
===>   fahcontrol-7.6.9 depends on executable: python2 - found
===>   Generating temporary packing list
make[1]: cannot open Makefile.

make[1]: stopped in /root/Software/FAHControl/port/work/fahcontrol-7.6.9-1
*** Error code 2

Stop.
make: stopped in /root/Software/FAHControl/port
WTF? Natürlich wird das Makefile geöffnet, sonst würde es ja gar nicht soweit kommen.

Was ist denn da jetzt falsch? Stehe auf dem Schlauch...

Robert
 
Also, auch wenn das komisch klingt, ein Port, bei dem nichts gebaut werden muss, ist nicht der einfachst mögliche Fall. Was dir da auf jeden Fall fehlt ist ein NO_BUILD=yes. Ohne das wird versucht, etwas zu compilieren, und ohne weitere Einstellungen wird davon ausgegangen, dass das mit make zu tun ist -- daher dein Fehler "cannot open Makefile". (edit: bin blind, sorry ;) Aber der nächste Absatz gilt trotzdem, das Ports-Framework versucht wohl ein make install;))

Buildsysteme haben in der Regel auch die Fähigkeit, das compilierte zu installieren, das Ports Framework nutzt das, um in ein "stage" Verzeichnis zu installieren aus dem dann das Paket gebaut wird. Bei einem Port mit NO_BUILD wirst du deshalb in der Regel ein eigenes do-install: target schreiben müssen, das die nötigen Files nach STAGEDIR installiert. Also, definitiv nicht der einfachste Fall :)

Ich wundere mich ein wenig, wieso du nicht einfach den existierenden Port nimmst, aber auf jeden Fall eignet der sich, um sich ein wenig abzuschauen, was so zu tun ist: https://svnweb.freebsd.org/ports/head/biology/linux-foldingathome/Makefile?view=markup

Falls in diesem Port etwas "fehlt" (habe da keine Ahnung, die Software habe ich nie genutzt), wäre es dann nicht vielleicht besser, den schon bestehenden Port zu ergänzen?
 
Zuletzt bearbeitet:
Okay, da war also das Makefile im .tar.gz gemeint und nicht das des Ports... Da gibt's natürlich keins wenn nichts gebaut werden muss. Kann man da nicht ein Dummy hinlegen, damit das händische auflisten der Files in der do-install: Sektion gespart werden kann? Das sind etliche Files unter [...]/python2.7/site-packages/, und das sieht so wie ich es jetzt habe sehr unelegant aus... Egal, bin erst am Anfang. Jedenfalls funktioniert das Erzeugen des Pakets, und es lässt sich sauber installieren und deinstallieren.

Das ganze besteht aus mehreren Paketen, der linux-foldingathome Port enthält den "FAHClient", im wesentlichen ein Daemon der die Rechenarbeit macht. Der ist auch standalone nutzbar, auf Servern auch sinnigerweise nur so.

Das Python Skript "FAHControl" ist eine Desktop App mit der die Daemons überwacht und gesteuert werden können, über Netzwerk. Das muss sinnigerweise getrennt vom Daemon installierbar sein.

Dann gibt's noch den "FAHViewer" als eigenes Paket, der ist eher Spielzeug und läuft eh nicht im Linuxulator.
 
Mal noch Gedankenfetzen, die vielleicht irgendwie weiterhelfen:
  • Wenn das reines python ist läuft es vielleicht "native", also ohne abhängigkeit auf die linux-c7 ports? python 2.7 ist allerdings ein Problem, das ist jetzt schon deprecated – gibt es eine Variante für python 3?
  • install rules im Port Makefile müssen nicht kompliziert sein – schon das da gelesen? https://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/install.html – falls da nichts passendes dabei ist, man kann oft auch selbst "geschickt" Schleifen schreiben.
Viel Erfolg beim porten!
 
  • Wenn das reines python ist läuft es vielleicht "native", also ohne abhängigkeit auf die linux-c7 ports? python 2.7 ist allerdings ein Problem, das ist jetzt schon deprecated – gibt es eine Variante für python 3?
Es läuft nativ, der einzige erforderliche Patch ist der Shebang, der muss auf den Python2 Interpreter von FreeBSD zeigen. Eine Python3 Version gibt's bisher nicht.

Ja, aber nur den ersten Abschnitt bis jetzt ;) Wenn das sauber ist, dann mache ich mich daran das originale rpm zu holen und zu patchen. Werd' ich schon hinbekommen.

Viel Erfolg beim porten!
Danke :)
 
Es läuft nativ, der einzige erforderliche Patch ist der Shebang, der muss auf den Python2 Interpreter von FreeBSD zeigen.
Ich empfehle für den shebang patch: #!/usr/bin/env python2.7

Das ist portabel und kann ggf. auch Upstream eingereicht werden. Das ist ein gebräuchlicher Hack um den Interpreter in PATH zu suchen.
 
Ok...

Code:
# $FreeBSD$

PORTNAME=       fahcontrol
DISTVERSION=    7.6.9
CATEGORIES=     biology
MASTER_SITES=   https://download.foldingathome.org/releases/public/release/fahcontrol/centos-6.7-64bit/v${DISTVERSION:R}/
DISTNAME=       fahcontrol-${DISTVERSION}-1
EXTRACT_SUFX=   .noarch.rpm

LICENSE=        GPLv3
LICENSE_FILE=   ${WRKSRC}/usr/share/doc/fahcontrol/LICENSE.txt

MAINTAINER=     ich@beimirzuhause.de
COMMENT=        FAHControl

USES=           python:2.7 shebangfix
SHEBANG_FILES=  usr/bin/FAHControl

RUN_DEPENDS=    python2:lang/python27

NO_BUILD=       yes

NO_WRKSUBDIR=   yes

do-install:
        ${INSTALL_SCRIPT} ${WRKSRC}/usr/bin/FAHControl ${STAGEDIR}${PREFIX}/bin/
        @${MKDIR} ${STAGEDIR}${PREFIX}/lib/python2.7/site-packages/FAHControl-7.6.9-py2.7.egg-info/
        (cd ${WRKSRC}/usr/lib/python2.7/site-packages/FAHControl-7.6.9-py2.7.egg-info && ${COPYTREE_SHARE} . ${STAGEDIR}${PREFIX}/lib/python2.7/site-packages/FAHControl-7.6.9-py2.7.egg-info/)
        @${MKDIR} ${STAGEDIR}${PREFIX}/lib/python2.7/site-packages/fah/
        (cd ${WRKSRC}/usr/lib/python2.7/site-packages/fah && ${COPYTREE_SHARE} . ${STAGEDIR}${PREFIX}/lib/python2.7/site-packages/fah/)
        @${MKDIR} ${STAGEDIR}${PREFIX}/lib/python2.7/site-packages/fah/db/
        (cd ${WRKSRC}/usr/lib/python2.7/site-packages/fah/db && ${COPYTREE_SHARE} . ${STAGEDIR}${PREFIX}/lib/python2.7/site-packages/fah/db/)
        @${MKDIR} ${STAGEDIR}${PREFIX}/lib/python2.7/site-packages/fah/util/
        (cd ${WRKSRC}/usr/lib/python2.7/site-packages/fah/util && ${COPYTREE_SHARE} . ${STAGEDIR}${PREFIX}/lib/python2.7/site-packages/fah/util/)
        @${MKDIR} ${STAGEDIR}${PREFIX}/share/doc/fahcontrol/
        (cd ${WRKSRC}/usr/share/doc/fahcontrol && ${COPYTREE_SHARE} . ${STAGEDIR}${PREFIX}/${DOCSDIR_REL})
        ${INSTALL_DATA} ${WRKSRC}/usr/share/pixmaps/FAHControl.png ${STAGEDIR}${PREFIX}/share/pixmaps/
        ${INSTALL_DATA} ${WRKSRC}/usr/share/applications/FAHControl.desktop ${STAGEDIR}${PREFIX}/share/applications/

.include <bsd.port.mk>
Sieht das nach was ordentlichem aus, oder nach Dilettant? ;) Funktioniert jedenfalls soweit.
 
Sieht auf einen flüchtigen Blick ganz vernünftig aus! Ich denke im Standardfall PORTVERSION==DISTVERSION gibt man allerdings eher PORTVERSION an, DISTVERSION ist damit automatisch gesetzt (ist aber nur meine Interpretation, das machen wohl nicht alle gleich...)

Zum überprüfen eignet sich das "portlint" tool, allerdings ist die Ausgabe nicht immer hilfreich, bzw kann ein wenig nerven :) Nächster Schritt wäre dann "poudriere testport", das spielt alles mal durch und meldet recht zuverlässig, wenn man etwas übersehen hat.
 
Zurück
Oben