Самый простой способ изменить порядок строк в переменной make на обратный
-
09-06-2019 - |
Вопрос
Допустим, у вас есть переменная во фрагменте makefile, подобная следующей:
MY_LIST=a b c d
Как мне тогда изменить порядок следования этого списка?Мне нужно:
$(warning MY_LIST=${MY_LIST})
чтобы показать
MY_LIST=d c b a
Редактировать:настоящая проблема заключается в том, что
ld -r some_object.o ${MY_LIST}
производит a.out
с неопределенными символами, поскольку элементы в MY_LIST
на самом деле это архивы, но в неправильном порядке.Если порядок MY_LIST
перевернутый, он будет связываться правильно (я думаю).Если вы знаете более разумный способ расставить ссылки правильно, подскажите мне.
Решение
Решение на чистом GNU make:
По умолчанию:ВСЕ
foo = пожалуйста, переверни меня
обратный = $(если $(1),$(вызов обратный,$(список слов 2,$(слова $(1)),$(1)))) $(первое слово $(1)))
ВСЕ :@echo $(обратный вызов,$(foo))
Дает:
$ сделать
мне нужно повернуть вспять, пожалуйста
Другие советы
Дох!Я мог бы просто использовать сценарий оболочки-пусть:
(for d in ${MY_LIST}; do echo $$d; done) | tac
Вы также можете определить группы поиска с помощью ld:
ld -r foo.o -( a.a b.a c.a -)
Будет выполнять итерацию по a.a, b.a и c.a до тех пор, пока ни один объект в группе не сможет использовать новые неразрешенные символы.
Если вы используете gnu ld, вы также можете сделать:
ld -r -o foo.o --whole-archive bar.a
Который немного сильнее, поскольку он будет включать в себя каждый объект из bar.a независимо от того, удовлетворяет ли он неразрешенному символу из foo.o .
Усовершенствование решения GNU make:
reverse = $(если $(список слов 2,2,$(1)),$( вызовите reverse,$(список слов 2,$(слова $(1)),$(1))) $( первое слово $(1)),$(1))
- лучшее условие остановки, original использует пустую строку, тратя впустую вызов функции
- не добавляет пробел в начале перевернутого списка, в отличие от исходного
Отыгрывание от обоих Бен Коллинз' и эльмарко ответы, вот плоскодонка для bash, которая "правильно" обрабатывает пробелы1
reverse = $(shell printf "%s\n" $(strip $1) | tac)
который поступает правильно, благодаря $(shell)
автоматическая очистка пробелов и printf
автоматическое форматирование каждого слова в списке аргументов:
$(info [ $(call reverse, one two three four ) ] )
урожайность:
[ four three two one ]
1... согласно моему ограниченному тестовому варианту (т.е. $(info ...)
строка выше).