Makefile :как правильно sed редактировать переменную

БТРФС

sudo btrfstune -u /dev/sdaX

sudo btrfstune -U 0de6bd81-7013-49a8-bdc5-d832ed209d2c /dev/sdaX

Запускbtrfsckрекомендуется, поскольку изменение UUID в BTRFS не является атомарной операцией.

1
29.12.2020, 11:26
2 ответа

Вы должны понимать, что при всем сходстве в их синтаксисе, makeи shellсовершенно разные и должны использоваться с большой осторожностью. Что еще хуже, make очень скуп на предупреждения.

Вы ошиблись в двух местах в своем makeкоде:

## bad code 
DEPENDENCIES := $(echo '$DEPENDENT_FILES' | sed 's/\>/\.o/g')
  • Нет GNU makeвстроенного -в функцию с именем echo l, потому что именно так make понимает это.
  • Когда вам нужно запустить внешнюю утилиту, вам нужно вызвать встроенную -в $(shell...) функцию gnu make.
  • В том, как вы написали код make, скрывается коварная проблема, и это переменная $DEPENDENT_FILES. make проанализирует его как переменную make $D, за которой следует строковый литерал EPENDENT ! Это связано с тем, что если незаключенные круглые скобки или фигурные скобки представляют собой только одну букву, то сделать vars, остальные воспринимаются как буквальная строка.
  • Обратите внимание, что переменная оболочки vars vegin содержит $$, если не используется eval.
0
18.03.2021, 22:40

Then I'd like to append.o to each word.

Нет необходимости в обходе оболочки. Сделать это мощно достаточно, чтобы предоставить помощников для общих операций с именами файлов так. В вашем случае вам нужна функция с понятным именем -addsuffix:

DEPENDENCIES = $(addsuffix.o, $(DEPENDENT_FILES))

Что дает вам a.o b.o c.oсписок ввода a b c. более полный пример:

units = a b c

inc = $(addsuffix.h,$(units))
obj = $(addsuffix.o,$(units))

myprog: $(obj)
    gcc -o $@ $(obj)

header-bundle.h: $(inc)
    cat $< >$@

Если вам нужны более сложные замены, есть множество универсальных подстановок. строковые операции но там, где их достаточно, файловые операции удобнее и ИМО проще понять скромному человеку.

2
18.03.2021, 22:40

Теги

Похожие вопросы