Il modo più semplice per invertire l'ordine delle stringhe in una variabile make

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

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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top