Make: Snippet не работает должным образом - PullRequest
0 голосов
/ 03 ноября 2010

Я пытаюсь сделать следующее в Makefile.По какой-то причине я не могу заставить его работать правильно:

  1. Получить первую строку файла
  2. Проверьте, начинается ли строка с '/'
  3. ЕслиСтрока не, добавьте путь к каждой строке в файле

Вот код, который я имею:

if test $${$(shell head -n 1 ./root/lib/modules/$(KERNEL_VERSION)/modules.dep):0:1} -ne '/' then \
    cat ./root/lib/modules/$(KERNEL_VERSION)/modules.dep | while read line; do echo "/lib/modules/$(KERNEL_VERSION)/$$line"; done > /tmp/modules.dep.new; \
    cp /tmp/modules.dep.new ./root/lib/modules/$(KERNEL_VERSION)/modules.dep; \
    rm /tmp/modules.dep.new; \
fi

Команда head ничего не возвращает.Если я запускаю только команду head, я получаю первую строку файла.

1 Ответ

0 голосов
/ 03 ноября 2010

Я не могу получить ваш if test a -ne b подход к работе (сценарии оболочки не являются моей сильной стороной), но лично я бы сделал это так:

FILE = ./root/lib/modules/$(KERNEL_VERSION)/modules.dep

PREFIX = /lib/modules/$(KERNEL_VERSION)

foo:
  sed -i -e 'H;$$!d;x;s/.//;/^\//!{s|^|$(PREFIX)|;s|\n|\n$(PREFIX)|g}' $(FILE)

РЕДАКТИРОВАТЬ:

Если подумать, это немного элегантнее:

  sed -i '1{h;s/\(.\).*/\1/;s/\//a$(PREFIX)/;s/.//;x};H;g;s/\n.*//;x;s/\n//' $(FILE)

РЕДАКТИРОВАНИЕ:

Подождите, это еще лучше:

@sed -i '1{/^\//!{x;s/^/$(PREFIX)/;x}};G;s/\(.*\)\n\(.*\)/\2\1/' $(FILE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...