2008-09-09 7 views
11

Digamos que tiene una variable en un fragmento de makefile como la siguiente:forma más sencilla de invertir el orden de las cuerdas en una variable maquillaje

MY_LIST=a b c d 

¿Cómo entonces invertir el orden de la lista? Necesito:

$(warning MY_LIST=${MY_LIST}) 

para mostrar

MY_LIST=d c b a 

Editar: el verdadero problema es que

ld -r some_object.o ${MY_LIST} 

produce un a.out con símbolos sin definir debido a que los elementos de MY_LIST son en realidad archivos, pero en el orden equivocado Si el orden de MY_LIST se invierte, se vinculará correctamente (creo). Si conoces una forma más inteligente de obtener el orden correcto para el enlace, dame una pista.

+0

¡divertido! Espero que sea solo por la advertencia :) – elmarco

Respuesta

19

Una solución en la pura GNU make:

por defecto: todas

foo = por favor me revertir

inversa = $ (si $ (1), $ (llamar inversa, $ (2 lista de palabras, palabras $ ($ (1)), $ (1)))) $ ($ FirstWord (1))

todo: @ echo $ (llamar a revertir, $ (foo))

Da:

$ hacen

yo invierto favor

+1

Gracias! Éste resolvió mi problema exacto, a saber, concatenar archivos PDF en orden del año en orden descendente. :) –

2

Doh! Me podría haber utilizado un script de shell-let:

(for d in ${MY_LIST}; do echo $$d; done) | tac

+0

$ para d en uno dos tres; hacer eco $ d; hecho | tac tres dos uno Superflous \ n. Pero es genial aprender sobre tac. – elmarco

4

También es posible definir grupos de búsqueda con ld:

ld -r foo.o -(a.a b.a c.a -) 

se repetirá a través de AA, BA y CA hasta que no haya nuevos símbolos sin resolver puede ser satisfecho por cualquier objeto en el grupo.

Si estás usando GNU ld, también se puede hacer:

ld -r -o foo.o --whole-archive bar.a 

que es ligeramente más fuerte, en el que incluirá todos los objetos de bar.a independientemente de si se satisface un símbolo sin resolver de foo .o.

4

Una mejora a la solución GNU make:

inversa = $ (si $ (lista de palabras 2 , 2, $ (1)), $ (call reverse, $ (lista de palabras 2, $ (palabras $ (1)), $ (1))) $ (primera palabra $ (1)), $ (1))

  • mejor condición de parada, original utiliza la cadena vacía perder una llamada de función
  • no añade un espacio que lleva a la lista invertido, a diferencia del original
1

Jugar fuera de ambos y Ben Collins'elmarco's respuestas, aquí está una batea para golpear a los espacios en blanco que se ocupa de "adecuada"

reverse = $(shell printf "%s\n" $(strip $1) | tac) 

el que hace lo correcto, gracias a $(shell) limpieza automática de espacios en blanco y printf formatear automáticamente cada palabra en su lista arg:

$(info [ $(call reverse, one two three four ) ]) 

rendimientos:

[ four three two one ] 

... según mi limitada caso de prueba (es decir, la línea $(info ...), arriba).

Cuestiones relacionadas