2015-06-05 2 views
2

Я пытаюсь понять, как формируется autodependency в Makefiles в данной ссылке, я не могу понять следующий фрагмент кода:Autodependency поколение Makefiles

DEPDIR = .deps 
df = $(DEPDIR)/$(*F) 

SRCS = foo.c bar.c ... 

%.o : %.c 
     @$(MAKEDEPEND); \ 
      cp $(df).d $(df).P; \ 
      sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ 
       -e '/^$$/ d' -e 's/$$/ :/' < $(df).d >> $(df).P; \ 
      rm -f $(df).d 
     $(COMPILE.c) -o [email protected] $< 

-include $(SRCS:%.c=$(DEPDIR)/%.P) 

Я получил его от this link. Я знаю, что он будет генерировать зависимость файлы, но я не в состоянии понять, что эта строка:

sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ 
    -e '/^$$/ d' -e 's/$$/ :/' < $(df).d >> $(df).P; \ 

Может кто-нибудь, пожалуйста, объясните мне этот код, поэтому многие подстановочных дать мне бабочка, я новичок в Makefiles.

ответ

2

Это несколько различных команд, поэтому разберите его.

  1. -e 's/#.*//'

    Удалить все, что начинается с # (Комментарии? Директивы препроцессора?)

  2. -e 's/^[^:]*: *//'

    Удалить все до : на любой, который имеет : его ,

  3. -e 's/ *\\$$//'

    Удалять косые линии продолжения (и пространства перед ними) от конца линии.

  4. -e '/^$$/ d'

    Удалить все пустые строки.

  5. -e 's/$$/ :/'

    Добавить : в конце каждой строки.

Это добавляет явные цели для каждого перечисленного файла зависимостей, чтобы «знать», как их создавать, чтобы избежать ошибок «Нет правила для создания цели». Объяснение здесь объясняется в вашей ссылке в an earlier section.

Вкратце, это создает .P файл с исходным списком предпосылок, а затем добавляет к нему цели, принимая каждую строку, удаляя любую существующую информацию о цели и любой строки продолжения (\) символы, а затем добавить целевой разделитель (:) к концу. Это работает со значениями для MAKEDEPEND, которые я предлагаю ниже; возможно, вам понадобится изменить перевод для других генераторов зависимостей, которые вы могли бы использовать.

+0

Большое спасибо, но коды в make-файле contiki немного отличаются друг от друга. В make-файлах contiki вместо 'cp $ (df) .d $ (df) .P;' есть 'cp $ (@ :. o = .d) $ (@ :. o =. $$$$); '. Первый только копирует файлы зависимостей в формате .P, но что делает второй код? Было бы здорово, если бы вы могли мне помочь. – DarthSpeedious

+1

'$ (@ :. o = .d)' расширяется до значения '$ @' с завершающим '.o' замененным на' .d'. Аналогично, '$ (@ :. o =. $$$$)' расширяется до значения '$ @' с завершением '.o' заменяется на'. $$ '(который оболочка затем расширяется до PID текущей оболочки) , Это временный файл, предположительно используемый во время этого правила, чтобы избежать перезаписи целевого файла до завершения процесса (атомное обновление). –

2

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

В настоящее время компиляторы, такие как GCC или Clang, могут сделать это для вас при компиляции кода!

Просто передайте им флаг препроцессора:

# Preprocessor flags 
CPPFLAGS += -MMD 

и включают сгенерированные файлы в Makefile:

-include $(wildcard *.d) 

И вы сделали.


Вы можете узнать больше о параметрах препроцессора here for GCC, Clang просто зеркало этих вариантов.

Относительно хороший пример here.

+0

Можете ли вы дать мне ссылку, где я могу больше узнать об этом флаге и как он работает? – DarthSpeedious

+0

См. Мое добавление. Я лично всегда использую '-MMD -MP' на ежедневной основе. – Chnossos