Самый простой способ изменить порядок строк в переменной make на обратный

StackOverflow https://stackoverflow.com/questions/52674

  •  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 ...) строка выше).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top