Der einfachste Weg, die Reihenfolge der Zeichenfolgen in einer Make-Variablen umzukehren
-
09-06-2019 - |
Frage
Nehmen wir an, Sie haben eine Variable in einem Makefile-Fragment wie die folgende:
MY_LIST=a b c d
Wie kann ich dann die Reihenfolge dieser Liste umkehren?Ich brauche:
$(warning MY_LIST=${MY_LIST})
zeigen
MY_LIST=d c b a
Bearbeiten:Das eigentliche Problem ist das
ld -r some_object.o ${MY_LIST}
erzeugt eine a.out
mit undefinierten Symbolen, da die Elemente in MY_LIST
sind eigentlich Archive, allerdings in der falschen Reihenfolge.Wenn die Reihenfolge von MY_LIST
umgekehrt ist, wird es korrekt verlinkt (glaube ich).Wenn Sie eine intelligentere Möglichkeit kennen, die Linkreihenfolge richtig festzulegen, geben Sie mir Bescheid.
Lösung
Eine Lösung im reinen GNU-Make:
Standard:alle
foo = Bitte kehre mich um
Reverse = $ (wenn $ (1), $ (call Reverse, $ (WordList 2, $ (Wörter $ (1)), $ (1))) $ (Erstwort $ (1))
alle :@echo $(call reverse,$(foo))
Gibt:
$ machen
Ich bitte den Rückwärtsgang
Andere Tipps
Doh!Ich hätte einfach ein Shell-Skript verwenden können:
(for d in ${MY_LIST}; do echo $$d; done) | tac
Sie können Suchgruppen auch mit ld definieren:
ld -r foo.o -( a.a b.a c.a -)
Durchläuft a.a, b.a und c.a, bis kein neues ungelöstes Symbol mehr von einem Objekt in der Gruppe erfüllt werden kann.
Wenn Sie gnu ld verwenden, können Sie auch Folgendes tun:
ld -r -o foo.o --whole-archive bar.a
Was etwas stärker ist, da es jedes Objekt aus bar.a einschließt, unabhängig davon, ob es ein ungelöstes Symbol aus foo.o erfüllt.
Eine Verbesserung der GNU-Make-Lösung:
reverse = $(if $(wordlist 2,2,$(1)),$(call reverse,$(wordlist 2,$(words $(1)),$(1))) $(firstword $(1) ),$(1))
- bessere Stoppbedingung, das Original verwendet die leere Zeichenfolge und verschwendet einen Funktionsaufruf
- Fügt der umgekehrten Liste im Gegensatz zum Original kein führendes Leerzeichen hinzu
Beides ausspielen Ben Collins‘ Und Elmarcos Antworten, hier ist ein Vorschlag, der mit Leerzeichen „richtig“ umgeht.1
reverse = $(shell printf "%s\n" $(strip $1) | tac)
was das Richtige tut, dank $(shell)
Automatisches Bereinigen von Leerzeichen und printf
Jedes Wort in seiner Argumentliste wird automatisch formatiert:
$(info [ $(call reverse, one two three four ) ] )
Erträge:
[ four three two one ]
1...gemäß meinem begrenzten Testfall (d. h. dem $(info ...)
Zeile oben).