(Default-)Config eines Ports ausgeben

TCM

Well-Known Member
Hi,

kann man einem Port seine aktuelle/default Config in einem Format entlocken, was gleichzeitig als gültige Config aus /var/db/ports gefressen wird?

Thx
 
Ja, danke. Einfach den Output irgendwie parsen, hätte ich dann auch gemacht, wenn nichts mehr hilft. Mit make showconfig-recursive wirds dann noch ekliger.

Mein Anliegen gleicht mehr oder weniger haargenau dem hier: https://forums.freebsd.org/threads/the-use-of-make-config-in-scripted-environments.46900/

Mir würde es helfen, wenn man irgendwie ein make-Target reinpatchen könnte, was einfach nach der kompletten Konfiguration eines Ports durch default, /var/db/ports, /etc/make.conf, weiß der Geier, was alles geht... die Config noch mal so ausgibt, dass sie 1:1 dem Format aus /var/db/ports entspricht oder meinetwegen auch Knobs in /etc/make.conf, wenn die überhaupt noch universell unterstüzt werden.

Ich stecke halt in Makefiles nicht so wirklich drin und in dem Wust aus Ports-Mechanismen schon gar nicht. Da ändert sich ja anscheinend alle Nase lang irgendwas, weswegen ich auch sehr angewidert bin, einfach irgendwelche Outputs zu parsen, die nicht als "für-Scripte-tauglich" definiert sind.

Gibts da irgendeine Stelle in den Makefiles, wo ich anfangen könnte zu frickeln und wo mir das nicht übermorgen um die Ohren fliegt? Ich denke da spontan daran, einfach das showconfig-Target zu nehmen, den Output anzupassen und direkt nach $PORT_DBDIR schreiben zu lassen. Das Ganze dann analog für showconfig-recursive.

Wäre der Ansatz OK? Wenn dieses unsägliche dialog4ports nicht so absolut unflexibel und ein bisschen mehr scriptbar wäre...
 
Wenn's direkt mit nem Make-Target gehen soll, dann kannst du den Hack mal ausprobieren:
Code:
--- bsd.port.mk.orig    2015-08-13 09:14:17.579881624 +0200
+++ bsd.port.mk 2015-08-13 09:43:26.788983900 +0200
@@ -5191,13 +5191,24 @@
 MULTI_EOL=     : you have to choose at least one of them
 SINGLE_EOL=    : you have to select exactly one of them
 RADIO_EOL=     : you can only select none or one of them
+
+.  if !defined(PORTSDB_OUTPUT)
+indent="      "
+.else
+indent=""
+.endif
+
 showconfig: check-config
 .if !empty(COMPLETE_OPTIONS_LIST)
+.  if !defined(PORTSDB_OUTPUT)
        @${ECHO_MSG} "===> The following configuration options are available for ${PKGNAME}":
+.  endif
 .for opt in ${ALL_OPTIONS}
-       @[ -z "${PORT_OPTIONS:M${opt}}" ] || match="on" ; ${ECHO_MSG} -n "     ${opt}=$${match:-off}"
-.  if !empty(${opt}_DESC)
+       @[ -z "${PORT_OPTIONS:M${opt}}" ] || match="on" ; ${ECHO_MSG} -n "${indent}${opt}=$${match:-off}"
+.  if !defined(PORTSDB_OUTPUT)
+.    if !empty(${opt}_DESC)
        @${ECHO_MSG} -n ": "${${opt}_DESC:Q}
+.    endif
 .  endif
        @${ECHO_MSG} ""
 .endfor
@@ -5205,26 +5216,33 @@
 #multi and conditional multis
 .for otype in MULTI GROUP SINGLE RADIO
 .  for m in ${OPTIONS_${otype}}
-.    if empty(${m}_DESC)
+.    if !defined(PORTSDB_OUTPUT)
+.      if empty(${m}_DESC)
                @${ECHO_MSG} "====> Options available for the ${otype:tl} ${m}${${otype}_EOL}"
-.    else
+.      else
                @${ECHO_MSG} "====> ${${m}_DESC}${${otype}_EOL}"
+.      endif
 .    endif
 .    for opt in ${OPTIONS_${otype}_${m}}
-       @[ -z "${PORT_OPTIONS:M${opt}}" ] || match="on" ; ${ECHO_MSG} -n "     ${opt}=$${match:-off}"
-.      if !empty(${opt}_DESC)
+       @[ -z "${PORT_OPTIONS:M${opt}}" ] || match="on" ; ${ECHO_MSG} -n "${indent}${opt}=$${match:-off}"
+.    if !defined(PORTSDB_OUTPUT)
+.        if !empty(${opt}_DESC)
        @${ECHO_MSG} -n ": "${${opt}_DESC:Q}
-.      endif
+.        endif
+.    endif
        @${ECHO_MSG} ""
 .    endfor
 .  endfor
 .endfor

+.undef indent
 .undef otype
 .undef m
 .undef opt
+.if !defined(PORTSDB_OUTPUT)
        @${ECHO_MSG} "===> Use 'make config' to modify these settings"
 .endif
+.endif
 .endif # showconfig

 .if !target(showconfig-recursive)

Mit "make showconfig" ändert sich dann nicht (viel): Die Einrückung ist leider nur einfach, keine Ahnung, wie man da mehrere Spaces reinbekommt.
Mit "make showconfig -DPORTSDB_OUTPUT" wird das zurück gegeben, was du haben möchtest.
 
Cool, danke. Ich spiel mal rum.

Edit: Moment, wenn ich mir den Patch angucke, dann entfernt der ja quasi nur die Kommentare und Beschreibungen um den eigentlichen showconfig-Output.

Der showconfig-Output ist doch aber vom Aufbau her grundverschieden zu dem, was in PORT_DBDIR landet. Das sieht z.B. so aus:

Code:
# This file is auto-generated by 'make config'.
# Options for openjdk8-8.51.16
_OPTIONS_READ=openjdk8-8.51.16
_FILE_COMPLETE_OPTIONS_LIST=POLICY TEST TZUPDATE DEBUG DEBUGFAST RELEASE
OPTIONS_FILE_SET+=POLICY
OPTIONS_FILE_UNSET+=TEST
OPTIONS_FILE_SET+=TZUPDATE
OPTIONS_FILE_UNSET+=DEBUG
OPTIONS_FILE_UNSET+=DEBUGFAST
OPTIONS_FILE_SET+=RELEASE

make showconfig:

Code:
===> The following configuration options are available for openjdk8-8.51.16:
     POLICY=on: Install the Unlimited Strength Policy Files
     TEST=off: Run regression tests
     TZUPDATE=on: Update the time zone data
====> Select OpenJDK build type: you have to select exactly one of them
     DEBUG=off: Build for debugging (without optimizations)
     DEBUGFAST=off: Build for debugging (with optimizations)
     RELEASE=on: Build for release (default)
===> Use 'make config' to modify these settings

Ich will quasi in einem vollautomatischen Ports-Build mitkriegen können, dass z.B. Optionen dazugekommen sind, weggefallen sind, oder aber auch, dass eine vorher explizit gesetzte Option jetzt Default geworden ist etc. und das dem Nutzer mitteilen, ohne direkt eine Eingabe zu erfordern.

Bei mir läuft das Ports-Bauen son bisschen nach eigenem Muster. :)
 
Achja, und das ganze Gewurschtel dann immer rekursiv für alle Abhängigkeiten.

Ich bin nebenbei noch am Durchsteigen durch die Makefiles. Ich denke mal, es wird daraus hinauslaufen, dass ich einfach dieses dialog4ports rauspatche und den Output stumpf ausgebe. Die weitere Behandlung werde ich dann außerhalb der Ports einfach durch ein wechselndes PORT_DBDIR machen, z.B. die Default-Configs nach ${PORT_DBDIR}.default sichern, bei jedem Build ${PORT_DBDIR}.temp anlegen und mit .default vergleichen und danach dem User bescheidsagen. Tatsächliche Configs würden dann z.B. in ${PORT_DBDIR}.prod landen oder sogar rein über /etc/make.conf eingestellt werden.

Ich will ja nicht unbedingt alle Default-Configs nochmal explizit festschreiben. Ich will nur Änderungen zuverlässig bemerken, d.h. den expliziten Output in PORT_DBDIR brauch ich nur, damit mein Script bescheidsagen kann. Der eigentliche Build wird dann nur mit expliziten Nutzeroptionen, die vom default abweichen, und ansonsten leerem PORT_DBDIR laufen.
 
Ach so, sorry, ich hätte vorher vielleicht gucken sollen, wie die Dateien eigentlich aussehen :)

So wie du es haben möchtest, wird's dann etwas komplizierter...
 
Ich will quasi in einem vollautomatischen Ports-Build mitkriegen können, dass z.B. Optionen dazugekommen sind, weggefallen sind, oder aber auch, dass eine vorher explizit gesetzte Option jetzt Default geworden ist etc. und das dem Nutzer mitteilen, ohne direkt eine Eingabe zu erfordern.
Hi,
Ich verstehe immer noch nicht genau für was du das nutzen möchtest aber ich habe einen anderen Vorschlag für dich. Bau deine Pakete mit poudriere! [1] Unter /usr/local/etc/poudriere.d/options/ gibt es für jeden Port ein Verzechnis mit einer Datei options welche die Einstellungen enthält. So wie oben bei dir im Beispiel:
Code:
# This file is auto-generated by 'make config'.
# Options for php56-5.6.10
_OPTIONS_READ=php56-5.6.10
_FILE_COMPLETE_OPTIONS_LIST=CLI CGI FPM EMBED PHPDBG DEBUG DTRACE IPV6 MAILHEAD LINKTHR ZTS
OPTIONS_FILE_SET+=CLI
OPTIONS_FILE_SET+=CGI
OPTIONS_FILE_SET+=FPM
OPTIONS_FILE_UNSET+=EMBED
OPTIONS_FILE_UNSET+=PHPDBG
OPTIONS_FILE_UNSET+=DEBUG
OPTIONS_FILE_UNSET+=DTRACE
OPTIONS_FILE_UNSET+=IPV6
OPTIONS_FILE_SET+=MAILHEAD
OPTIONS_FILE_SET+=LINKTHR
OPTIONS_FILE_SET+=ZTS
Dieses Verzeichnis würde ich in svn/git einchecken. Ändert sich etwas am Port, kannst du alles verfolgen. Weiter bekommst du natürlich über poudriere selber ein Logfile über die Builds.

Damit nur die Ports einen Konfigurationsordner erhalten, kannst du folgendes verwenden:
Code:
poudriere options -n -c <PORT>
Alle anderen Einstellungen für sämtliche Ports bleiben dann default. Ohne "-n" würde für alle abhängigen Ports ein Verzeichnis mit der Konfiguration erstellt werden.

Vielleicht hilft dir das ein bisschen weiter :)

Gruss

[1] https://wiki.bsdforen.de/kategorie:howto:poudriere
 
Mein make showconfig sieht jetzt so aus:

Code:
java_openjdk8: POLICY=on: Install the Unlimited Strength Policy Files
java_openjdk8: TEST=off: Run regression tests
java_openjdk8: TZUPDATE=on: Update the time zone data
java_openjdk8: (BUILD_SINGLE): Select OpenJDK build type: you have to select exactly one of them
java_openjdk8: (BUILD_SINGLE): DEBUG=off: Build for debugging (without optimizations)
java_openjdk8: (BUILD_SINGLE): DEBUGFAST=off: Build for debugging (with optimizations)
java_openjdk8: (BUILD_SINGLE): RELEASE=on: Build for release (default)

Das reicht mir erstmal als minimalinvasive Frickellösung. :) Das kann ich sortieren und diffen und bei Unterschieden Alarm schreien. Weiter verwursten tu ich das erstmal nicht.

Edit: Und showconfig-recursive funktioniert "naturally" ebenso. Das brauchte ich gar nicht anfassen, bis auf den Kommentar, den es ausspuckt.

Quasi:

Code:
--- bsd.port.mk.orig    2015-08-09 22:40:19.543178000 +0200
+++ bsd.port.mk 2015-08-13 18:59:35.925750061 +0200
@@ -5176,9 +5176,8 @@
 RADIO_EOL=     : you can only select none or one of them
 showconfig: check-config
 .if !empty(COMPLETE_OPTIONS_LIST)
-       @${ECHO_MSG} "===> The following configuration options are available for ${PKGNAME}":
 .for opt in ${ALL_OPTIONS}
-       @[ -z "${PORT_OPTIONS:M${opt}}" ] || match="on" ; ${ECHO_MSG} -n "     ${opt}=$${match:-off}"
+       @[ -z "${PORT_OPTIONS:M${opt}}" ] || match="on" ; ${ECHO_MSG} -n "${OPTIONS_NAME}: ${opt}=$${match:-off}"
 .  if !empty(${opt}_DESC)
        @${ECHO_MSG} -n ": "${${opt}_DESC:Q}
 .  endif
@@ -5189,12 +5188,12 @@
 .for otype in MULTI GROUP SINGLE RADIO
 .  for m in ${OPTIONS_${otype}}
 .    if empty(${m}_DESC)
-               @${ECHO_MSG} "====> Options available for the ${otype:tl} ${m}${${otype}_EOL}"
+               @${ECHO_MSG} "${OPTIONS_NAME}: (${m}_${otype}): ${otype:tl} ${m}${${otype}_EOL}"
 .    else
-               @${ECHO_MSG} "====> ${${m}_DESC}${${otype}_EOL}"
+               @${ECHO_MSG} "${OPTIONS_NAME}: (${m}_${otype}): ${${m}_DESC}${${otype}_EOL}"
 .    endif
 .    for opt in ${OPTIONS_${otype}_${m}}
-       @[ -z "${PORT_OPTIONS:M${opt}}" ] || match="on" ; ${ECHO_MSG} -n "     ${opt}=$${match:-off}"
+       @[ -z "${PORT_OPTIONS:M${opt}}" ] || match="on" ; ${ECHO_MSG} -n "${OPTIONS_NAME}: (${m}_${otype}): ${opt}=$${match:-off}"
 .      if !empty(${opt}_DESC)
        @${ECHO_MSG} -n ": "${${opt}_DESC:Q}
 .      endif
@@ -5206,13 +5205,11 @@
 .undef otype
 .undef m
 .undef opt
-       @${ECHO_MSG} "===> Use 'make config' to modify these settings"
 .endif
 .endif # showconfig
 
 .if !target(showconfig-recursive)
 showconfig-recursive:
-       @${ECHO_MSG} "===> The following configuration options are available for ${PKGNAME} and dependencies";
        @for dir in ${.CURDIR} $$(${ALL-DEPENDS-LIST}); do \
                (cd $$dir; ${MAKE} showconfig); \
        done
 
Zurück
Oben