Избегайте дублирования правил GNU Make - PullRequest
5 голосов
/ 22 августа 2011

Я писал Makefile, который выполняет генерацию зависимостей, и мне пришлось дублировать правила, потому что (устаревшая) кодовая база содержит смесь файлов .cpp и .cc. Это кажется немного неприглядным. Можно ли в любом случае указать, что предварительными условиями для цели могут быть .cpp или .cc файлы?

Так что вместо того, чтобы:

%.d : %.cpp
    $(CPP) -MM $(CPPFLAGS) $<

%.d : %.cc
    $(CPP) -MM $(CPPFLAGS) $<

Создайте что-нибудь без дублирования, например:

%.d : %.(cpp | cc)
    $(CPP) -MM $(CPPFLAGS) $<

Или это принудительное резервирование - просто неудачный элемент дизайна GNU Make?

Ответы [ 2 ]

3 голосов
/ 24 августа 2011

Первый вариант, используйте переменную, чтобы определить тело правила один раз, и используйте его при необходимости:

DEPGEN=$(CPP) -MM $(CPPFLAGS) $<
%.d: %.cpp ; $(DEPGEN)
%.d: %.cc  ; $(DEPGEN)

Второй вариант, используйте $(eval) для динамического создания правил:

$(foreach src,cpp cc,$(eval %.d: %.$(src) ; $$(CPP) -MM $$(CPPFLAGS) $$<))
1 голос
/ 22 августа 2011

Это должно работать:

%.d :: %.cpp
    $(CPP) -MM $(CPPFLAGS) $<

%.d :: %.cc
    $(CPP) -MM $(CPPFLAGS) $<

Другая идея:

%.d : %.c
    $(CPP) -MM $(CPPFLAGS) $<

%.c : %.cpp
    ln $< $@  # or cp -p

Другая идея состоит в том, чтобы заставить GNU make генерировать два правила шаблона. Существуют два способа сделать это:

  • записывайте их в make-файлы (%-cc.mk или аналогичные), которые вы включаете в свой фактический make-файл с помощью оператора include GNU make
  • генерирует и оценивает их в соответствии с функциями GNU make $(eval) и $(call)

Как и большинство всего остального в инструментальной цепочке разработки C / Unix, эти методы, по сути, являются формой предварительной обработки, облегчая их понимание за счет того, что они действительно сложны в использовании (множество двойного или тройного побега, действительно трудно сохранить отслеживание того, что расширяется, когда; отладка может быть королевской болью, по крайней мере, по моему опыту).

Так что зарезервируйте их для более сложных случаев использования (из которых Stack Overflow перечисляет несколько).

...