Mehrere Source Trees mit eigenem obj-Verzeichnis

Daemotron

Well-Known Member
Moin,

ich versuche gerade herauszufinden, ob man ein make {buildworld,buildkernel,...} dazu bekommt, nicht /usr/obj sondern ein beliebiges anderes Verzeichnis zum bauen zu benutzen. MAKEOBJDIRPREFIX auf etwas anderes zu setzen hat zwar den Effekt, dass nichts mehr in /usr/obj landet - leider baut damit zumindest releng/10.0 nicht mehr durch, sondern stirbt irgendwo beim bauen von rescue/cat - dem Anschein nach, weil es sich in den Pfaden verheddert.

Mit der Aktion wollte ich eigentlich nur sicherstellen, dass sich verschiedene Versionen beim Bauen nicht versehentlich in die Quere kommen.
 
Der Trick ist, dass MAKEOBJDIRPREFIX nicht als Eintrag in der /etc/make.conf gesetzt werden darf. Es darf auch nicht make per Argument übergeben werden. Es muss stattdessen zwingend als Umgebungvariable gesetzt werden. Ich habe mir da mal einen Wolf nach gesucht und den entsprechen Hinweis irgendwann im dritten Kreis der Selbstzweifel in einer der vielen Makefiles gefunden. Also ca. so im csh-Syntax:
Code:
% setenv MAKEOBJDIRPREFIX /usr/obj_beispiel
% make -j10 buildworld
Ab FreeBSD 10.0 kann man damit die Welt sogar als Nutzer bauen. Zum Installieren muss man aber natürlich noch immer root sein.
 
Das ist nicht supportet aber es geht (src.conf):

Code:
KERNCONF?=	S403

.if ${.CURDIR:M/usr/src} && !make(dummy)
.if defined(TARGET_ARCH) && (${TARGET_ARCH} != ${MACHINE_ARCH})
MAKEOBJDIRPREFIX?=	/usr/obj/${KERNCONF}
.else
MAKEOBJDIRPREFIX?=	/usr/obj/${KERNCONF}/${MACHINE_ARCH}
.endif
.endif

.sinclude "/root/kernels/${KERNCONF}.mk"

Ich habe meine Kernel Configs unter /root/kernels/ liegen. Optional kann ich zu jeder Config eine .mk Datei anlegen um individuelle Einstellungen zu machen (.sinclude wirft keinen Fehler wenn die Datei nicht da ist). Da käme dann zum Beispiel CPUTYPE und TARGET_ARCH rein.

Die Magie steckt im Stück Code in der Mitte. Das Build-System führt ein make dummy aus um festzustellen ob MAKEOBJDIRPREFIX im Makefile gesetzt ist. Das wird hier ausgetrickst.

Die ARCH-Unterscheidung liegt daran, dass das Build-System beim Cross-Compile automatisch die Architektur mit in den Pfad einbaut. Hier wird das beim nativen kompilieren Nachempfunden. Ich habe früher alle meine Builds auf einem Rechner gemacht und /usr/obj über NFS verteilt. Dabei war das sehr nützlich.
 
Kamikaze, der Trick mit der Verzeichnis-Bedingung und make dummy für die src.conf ist genial - das erleichtert die Sache ungemein (und funktioniert perfekt). Vielen Dank!

Edit meint, es sei vielleicht noch wichtig zu erwähnen, dass das gewählte obj-Verzeichnis nicht auf einer noexec gemounteten Partition liegen darf - nosuid ist aber kein Problem.
 
Zuletzt bearbeitet:
Zurück
Oben