Самый простой способ изменить порядок строк в переменной make - PullRequest
12 голосов
/ 09 сентября 2008

Допустим, у вас есть переменная во фрагменте make-файла, подобная следующей:

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 обратный, он будет связываться правильно (я думаю). Если вы знаете более разумный способ получить правильный порядок ссылок, подскажите мне.

Ответы [ 5 ]

19 голосов
/ 24 апреля 2009

Решение в чистом GNU make:

по умолчанию: все

foo = пожалуйста, переверните меня

reverse = $ (если $ (1), $ (вызов обратный, $ (список слов 2, $ (слова $ (1)), $ (1)))) $ (первое слово $ (1))

all: @echo $ (обратный вызов, $ (foo))

Дает:

$ make

мне поменять пожалуйста

4 голосов
/ 10 января 2013

Улучшение решения GNU make:

reverse = $ (if $ (список слов 2,2, $ (1)), $ (обратный вызов, $ (список слов 2, $ (слов $ (1)), $ (1))) $ (первое слово $ (1)), $ (1))

  • лучшее условие остановки, оригинал использует пустую строку, теряющую вызов функции
  • не добавляет начальный пробел в обратный список, в отличие от оригинала
4 голосов
/ 10 сентября 2008

Вы также можете определить группы поиска с помощью 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.

4 голосов
/ 09 сентября 2008

Doh! Я мог бы просто использовать скрипт оболочки-let:

(for d in ${MY_LIST}; do echo $$d; done) | tac

1 голос
/ 28 мая 2013

Воспроизведение ответов Бена Коллинза и Эльмарко , вот вариант с ударом, который обрабатывает пробелы "правильно" 1

reverse = $(shell printf "%s\n" $(strip $1) | tac)

, который делает все правильно, благодаря $(shell), автоматически очищающему пробел и printf, автоматически форматирующему каждое слово в списке аргументов:

$(info [ $(call reverse,  one two   three four  ) ] )

дает:

[ four three two one ]

1 ... в соответствии с моим ограниченным тестовым примером (то есть, строка $(info ...) выше).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...