La forma más sencilla de invertir el orden de las cadenas en una variable de creación
-
09-06-2019 - |
Pregunta
Digamos que tienes una variable en un fragmento de archivo MAKE como el siguiente:
MY_LIST=a b c d
¿Cómo invierto entonces 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 elementos en MY_LIST
En realidad son archivos, pero en el orden incorrecto.Si el orden de MY_LIST
está invertido, se vinculará correctamente (creo).Si conoce una forma más inteligente de acertar en el orden de los enlaces, infórmeme.
Solución
Una solución puramente GNU:
por defecto:todo
foo = por favor invierteme
reverso = $ (si $ (1), $ (llame al revés, $ (lista de palabras 2, $ (palabras $ (1)), $ (1))) $ (Firstword $ (1))
todo :@echo $(llamada inversa,$(foo))
Da:
$ hacer
yo al revés por favor
Otros consejos
¡Doh!Podría haber usado un script de shell: let:
(for d in ${MY_LIST}; do echo $$d; done) | tac
También puedes definir grupos de búsqueda con ld:
ld -r foo.o -( a.a b.a c.a -)
Iterará a través de a.a, b.a y c.a hasta que ningún objeto del grupo pueda satisfacer nuevos símbolos sin resolver.
Si estás usando gnu ld, también puedes 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 bar.a independientemente de si satisface un símbolo no resuelto de foo.o.
Una mejora a la solución make de GNU:
inversa = $(si $(lista de palabras 2,2,$(1)),$(llamar inversa,$(lista de palabras 2,$(palabras $(1)),$(1))) $(primera palabra $(1) ),$(1))
- mejor condición de parada, 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
Jugando con ambos Ben Collins y elmarco respuestas, aquí hay una apuesta por bash que maneja los espacios en blanco "correctamente"1
reverse = $(shell printf "%s\n" $(strip $1) | tac)
que hace lo correcto, gracias a $(shell)
limpieza automática de espacios en blanco y printf
formateando automáticamente cada palabra en su lista de argumentos:
$(info [ $(call reverse, one two three four ) ] )
rendimientos:
[ four three two one ]
1...de acuerdo con mi caso de prueba limitado (es decir, el $(info ...)
línea, arriba).