make Problem

Kamikaze

Warrior of Sunlight
Staff member
Ich habe folgenden code der Eine datei in eine temporäre Datei parst und diese dann per include ausführt. Das Problem ist, das make nicht immer wartet bis die Datei komplett geschrieben ist und versucht eine unvollständige Datei zu lesen, was dann zu Fehlern führt.
Code:
# Parse configuration into a make file.
BUILDFLAGS!=		[ "${BUILDFLAGS_CONF}" -nt "${BUILDFLAGS_TMP}" ] && ${BUILDFLAGS_PARSER} ${BUILDFLAGS_CONF} > ${BUILDFLAGS_TMP} || exit 0

# Include that make file.
.if exists(${BUILDFLAGS_TMP})
.include "${BUILDFLAGS_TMP}"
.endif
Nun dachte ich mir folgender Code würde die temporäre Datei überflüssig machen:
Code:
BUILDFLAGS!=		${BUILDFLAGS_PARSER} ${BUILDFLAGS_CONF}
${BUILDFLAGS}
Ich habe extra awk gelernt um einen Parser zu schreiben der schnell genug ist um ihn jedes mal auszuführen (für meine Konfiguration 0.03 statt 2 Sekunden). Jedoch interpretiert make nicht den Inhalt der Variable sondern meldet etwas in der Richtung 'operator needed'.

Wo ist mein Denkfehler, wie kann ich den Inhalt der Variable ausführen?
 
make(1) ist keine imperative Programmiersprache, sondern erlaubt nur das deklarieren von Datenabhaengigkeiten. Was du versuchst ist von vorne herein zum Scheitern verdammt.

Eine moegliche Loesung waere, ueber ein sub-make zu gehen.

Was genau willst du denn erreichen?
 
Ich will entweder darauf verzichten eine temporäre Datei zu verwenden oder make dazu zwingen zu warten bis die Datei fertig geschrieben ist.

Portconf macht das so:
Code:
# Begin portconf settings
# Do not touch these lines
.if !empty(.CURDIR:M/usr/ports*) && exists(${PKG_PREFIX}/libexec/portconf)
_PORTCONF!=${PKG_PREFIX}/libexec/portconf
.for i in ${_PORTCONF:S/|/ /g}
${i:S/%/ /g}
.endfor
.endif
# End portconf settings

Warum das funktioniert verstehe ich nicht.
 
Last edited:
Das Problem liegt darin make mit -j aufzurufen, dann kann es vorkommen, dass die Datei neu erzeugt wird während sie von einem weiteren Prozess eingelesen wird.

Wenn ich wie im Moment die Datei nur neu Parse wenn sie verändert wird, kann das Probleme mit Pfaden verursachen, da der Parser Symlinks volgt und durch die physischen Pfade ersetzt. Wenn sich ein Link ändert müsste die Datei auch neu erzeugt werden.
 
Igitt. (das bezieht sich auf portconf)

Ja, das sollte gehen, da make(1) Schleifen beim Einlesen auswalzt und dann neu parsed. make(1) an sich kennt ja keine Schleifen, weswegen es diesen Hack gibt.
 
Tja, ich finde meine Lösung auch besser als portconf. Ich hoffe der Commit findet bald statt.

Portconf würde bei mir gar nicht funktionieren, weil /usr/ports bei mir ein Link ist.
 
Last edited:
Back
Top