Façon la plus simple d'inverser l'ordre des chaînes de caractères dans une variable
-
09-06-2019 - |
Question
Disons que vous avez une variable dans un fichier makefile fragment comme suit:
MY_LIST=a b c d
Comment puis-je inverser l'ordre de cette liste?J'ai besoin de:
$(warning MY_LIST=${MY_LIST})
pour montrer
MY_LIST=d c b a
Edit:le vrai problème est que
ld -r some_object.o ${MY_LIST}
produit un a.out
avec les symboles non définis, parce que les éléments de MY_LIST
sont en fait des archives, mais dans le mauvais ordre.Si l'ordre de MY_LIST
est inversée, elle permettra de relier correctement (je pense).Si vous connaissez une façon plus intelligente pour obtenir le lien de la commande, selon l'indice de me dans.
La solution
Une solution pure de GNU make:
par défaut:tous
foo = veuillez inverse de moi
inverse = $(si $(1),$(appel inverse,$(liste des mots de 2,$(mots $(1)),$(1)))) $(firstword $(1))
tous :@echo $(appel inverse,$(foo))
Donne:
$ faire
moi inverser veuillez
Autres conseils
Doh!Je pourrais avoir simplement utilisé un script shell-let:
(for d in ${MY_LIST}; do echo $$d; done) | tac
Vous pouvez également définir des groupes de recherche avec ld:
ld -r foo.o -( a.a b.a c.a -)
Va itérer sur un.a, b.a et c.un jusqu'à ce qu'aucune nouvelle non résolues, les symboles peuvent être satisfaits par n'importe quel objet dans le groupe.
Si vous utilisez gnu ld, vous pouvez aussi faire:
ld -r -o foo.o --whole-archive bar.a
Ce qui est légèrement plus forte, en ce qu'elle comprendra tous les objets de la barre.une indépendamment du fait qu'il répond à un symbole non résolu de foo.o.
Une amélioration de la GNU make solution:
inverse = $(si $(liste de mots 2,2,$(1)),$(appel inverse,$(liste des mots de 2,$(mots $(1)),$(1))) $(firstword $(1)),$(1))
- une meilleure condition de s'arrêter, original utilise une chaîne de caractères vide perdre un appel de fonction
- ne pas ajouter un espace à la liste inversée, contrairement à l'original
Jouant sur les deux Ben Collins et elmarco de l' les réponses, voici un punt pour bash qui gère les espaces "correctement"1
reverse = $(shell printf "%s\n" $(strip $1) | tac)
ce qui fait la bonne chose, grâce à $(shell)
automatiquement le nettoyage des espaces et printf
automatiquement le formatage de chaque mot dans son arg liste:
$(info [ $(call reverse, one two three four ) ] )
rendements:
[ four three two one ]
1...d'après mon peu de cas de test (c'est à dire, le $(info ...)
ligne, ci-dessus).