configurar - makefile windows
La forma más simple de invertir el orden de las cadenas en una variable make (5)
Doh! Podría haber usado un script de shell-let:
(for d in ${MY_LIST}; do echo $$d; done) | tac
Supongamos que tiene una variable en un fragmento de archivo MAKE como el siguiente:
MY_LIST=a b c d
¿Cómo puedo invertir el orden de esa lista? Necesito:
$(warning MY_LIST=${MY_LIST})
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 indefinidos porque los artículos en MY_LIST
son en realidad archivos, pero en el orden incorrecto. 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, avísame.
Jugando con las respuestas de Ben Collins y de Elmarco , aquí hay un puntapié para golpear que maneja el espacio en blanco "correctamente" 1
reverse = $(shell printf "%s/n" $(strip $1) | tac)
que hace lo correcto, gracias a $(shell)
limpiando automáticamente los espacios en blanco y printf
formateando automáticamente cada palabra en su lista arg:
$(info [ $(call reverse, one two three four ) ] )
rendimientos:
[ four three two one ]
1 ... según mi caso de prueba limitado (es decir, la línea $(info ...)
, arriba).
También puede 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 ningún objeto en el grupo pueda satisfacer nuevos símbolos no resueltos.
Si está usando gnu ld, también puede hacer:
ld -r -o foo.o --whole-archive bar.a
Lo cual es un poco más fuerte, ya que incluirá todos los objetos de la barra.a independientemente de si satisface un símbolo no resuelto de foo.o.
Una mejora de la solución de GNU make:
reverse = $ (si $ (lista de palabras 2,2, $ (1)), $ (call reverse, $ (lista de palabras 2, $ (palabras $ (1)), $ (1))) $ (firstword $ (1) ), $ (1))
- mejor condición de detención, el original usa la cadena vacía desperdiciando una llamada de función
- no agrega un espacio inicial a la lista invertida, a diferencia del original
Una solución en puro GNU make:
predeterminado: todo
foo = por favor revésenme
reverse = $ (si $ (1), $ (call reverse, $ (lista de palabras 2, $ (palabras $ (1)), $ (1)))) $ (firstword $ (1))
todo: @echo $ (call reverse, $ (foo))
Da:
$ make
me reverso por favor