run configurar makefile

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