Der einfachste Weg, die Reihenfolge der Zeichenfolgen in einer Make-Variablen umzukehren

StackOverflow https://stackoverflow.com/questions/52674

  •  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.

War es hilfreich?

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top