sed в makefile, использование - PullRequest
       16

sed в makefile, использование

3 голосов
/ 27 сентября 2010

Я нахожусь в процессе обучения созданию make-файла.

Текущая цель - отсканировать $(SOURCEDIR) для .c файлов и создать (в соответствии с этим .c путей к файлам в формате/path/file.c) хороший $(VPATH), поэтому мне не нужно использовать рекурсивные make-файлы (иначе боль в a ..).

Atm Я застрял с этим, где $(SOURCETREE) будет пустым на $(ECHO)

SOURCES := $(shell find $(SOURCEDIR) -name '*.c')
SOURCETREE := $(dir $(SOURCES))
SOURCETREE := $(shell $(ECHO) $(SOURCETREE) | $(SED) -e "s/[[:space:]]/\n/g" | uniq | $(SED) -e "s/\n/[[:space:]]/g");

Может быть, я просто не понимаю (опоздал еще раз: /)

Спасибо за любую помощь.

Примечание: в оболочке bash этоотлично работает на моем рабочем столе linux (соответственно заменяю переменные) Примечание: я не sed pro, поэтому, пожалуйста, объясните, если вы делаете вуду с sed, спасибо

1 Ответ

5 голосов
/ 27 сентября 2010

Комментарии:

  1. Снять галочки. Они не нужны; функция $(shell) уже фиксирует вывод команды.

  2. Цепь echo / sed / uniq / sed может быть заменена на ls / uniq. ls напечатает одно имя файла в строке, поэтому нет необходимости в песне и танце для замены и отмены.

  3. Похоже, вы теряете результат из $(dir), потому что вы используете $(SOURCES) вместо $(SOURCETREE) в третьем назначении.

Результат:

SOURCES := $(shell find $(SOURCEDIR) -name '*.c')
SOURCETREE := $(dir $(SOURCES))
SOURCETREE := $(shell ls $(SOURCETREE) | uniq);

На самом деле, даже этот сокращенный вызов оболочки не нужен. Функция $(sort) отсортирует список имен и удалит дубликаты. Из документации make: «Кстати, поскольку сортировка удаляет повторяющиеся слова, вы можете использовать ее для этой цели, даже если вам не важен порядок сортировки».

SOURCES := $(shell find $(SOURCEDIR) -name '*.c')
SOURCETREE := $(sort $(dir $(SOURCES)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...