De maneira mais simples, para inverter a ordem de seqüências de caracteres em uma variável
-
09-06-2019 - |
Pergunta
Digamos que você tenha uma variável em um makefile fragmento como o seguinte:
MY_LIST=a b c d
Como faço para, em seguida, inverter a ordem da lista?Eu preciso:
$(warning MY_LIST=${MY_LIST})
para mostrar
MY_LIST=d c b a
Editar:o problema real é que
ld -r some_object.o ${MY_LIST}
produz um a.out
com o indefinido símbolos porque os itens MY_LIST
são, na verdade, arquivos, mas na ordem errada.Se a ordem de MY_LIST
é invertida, ela irá vincular corretamente (eu acho).Se você sabe de uma maneira mais inteligente de obter a ordem de ligação direita, pista me.
Solução
Uma solução pura GNU make:
padrão:todos
foo = por favor reverso de mim
reverter = $(se $(1),$(chamada de reversa,$(wordlist 2,$(palavras $(1)),$(1)))) $(firstword $(1))
todos :@echo $(chamada reverse,$(foo))
Dá:
$ make
me inversa, por favor
Outras dicas
Doh!Eu poderia ter usado um script de shell-let:
(for d in ${MY_LIST}; do echo $$d; done) | tac
Você também pode definir grupos de pesquisa com ld:
ld -r foo.o -( a.a b.a c.a -)
Irá iterar através de um.a, b.a e c.até que nenhuma nova não resolvidos símbolos podem ser satisfeitas por qualquer objeto no grupo.
Se você estiver usando o gnu ld, você também pode fazer:
ld -r -o foo.o --whole-archive bar.a
O que é um pouco mais forte, em que ele irá incluir todos os objetos a partir de uma barra.um, independentemente de se satisfaz um símbolo não resolvido de foo.o.
Uma melhoria para o GNU make solução:
reverter = $(se $(wordlist 2,2,$(1)),$(chamada de inversa,$(wordlist 2,$(palavras $(1)),$(1))) $(firstword $(1)),$(1))
- melhor condição de parada, original usa a cadeia vazia, desperdiçando uma chamada de função
- não adicionar um espaço à esquerda para a lista reversa, ao contrário do original
Jogando fora de ambos os Ben Collins e da elmarco respostas, aqui está um punt para o bash, que lida com espaços em branco "corretamente"1
reverse = $(shell printf "%s\n" $(strip $1) | tac)
o que faz a coisa certa, graças a $(shell)
limpeza automática de espaços em branco e printf
automaticamente a formatação de cada palavra em seu arg lista:
$(info [ $(call reverse, one two three four ) ] )
rendimento:
[ four three two one ]
1...de acordo com minha limitada do caso de teste (por exemplo, o $(info ...)
linha, acima).