Il modo più semplice per invertire l'ordine delle stringhe in una variabile make
-
09-06-2019 - |
Domanda
Supponiamo che tu abbia una variabile in un frammento di makefile come il seguente:
MY_LIST=a b c d
Come posso quindi invertire l'ordine di tale elenco?Ho bisogno:
$(warning MY_LIST=${MY_LIST})
mostrare
MY_LIST=d c b a
Modificare:il vero problema è quello
ld -r some_object.o ${MY_LIST}
produce un a.out
con simboli non definiti perché gli elementi in MY_LIST
sono in realtà archivi, ma nell'ordine sbagliato.Se l'ordine di MY_LIST
è invertito, si collegherà correttamente (credo).Se conosci un modo più intelligente per ottenere l'ordine corretto dei collegamenti, dammelo.
Soluzione
Una soluzione in puro GNU realizza:
predefinito:Tutto
foo = per favore invertimi
Reverse = $ (se $ (1), $ (chiama Reverse, $ (WordList 2, $ (Words $ (1)), $ (1)))) $ (Firstword $ (1))
Tutto :@echo $(chiamata inversa,$(foo))
Dà:
$ fare
fammi invertire, per favore
Altri suggerimenti
Doh!Avrei potuto semplicemente usare uno script-let di shell:
(for d in ${MY_LIST}; do echo $$d; done) | tac
Puoi anche definire i gruppi di ricerca con ld:
ld -r foo.o -( a.a b.a c.a -)
Itererà attraverso a.a, b.a e c.a finché nessun nuovo simbolo irrisolto potrà essere soddisfatto da alcun oggetto nel gruppo.
Se stai usando gnu ld, puoi anche fare:
ld -r -o foo.o --whole-archive bar.a
Il che è leggermente più forte, in quanto includerà ogni oggetto di bar.a indipendentemente dal fatto che soddisfi o meno un simbolo irrisolto di foo.o.
Un miglioramento alla soluzione make GNU:
reverse = $(if $(lista di parole 2,2,$(1)),$(chiama reverse,$(lista di parole 2,$(parole $(1)),$(1))) $(prima parola $(1) ),$(1))
- migliore condizione di arresto, l'originale utilizza la stringa vuota sprecando una chiamata di funzione
- non aggiunge uno spazio iniziale all'elenco invertito, a differenza dell'originale
Giocare su entrambi Ben Collins' E di Elmarco risposte, ecco un punto su bash che gestisce gli spazi bianchi "correttamente"1
reverse = $(shell printf "%s\n" $(strip $1) | tac)
che fa la cosa giusta, grazie a $(shell)
pulizia automatica degli spazi bianchi e printf
formattando automaticamente ogni parola nel suo elenco di argomenti:
$(info [ $(call reverse, one two three four ) ] )
produce:
[ four three two one ]
1...secondo il mio caso di test limitato (vale a dire, il $(info ...)
linea, sopra).