LINUX.ORG.RU

bsd make - зависимость от .h в suffix-transformation rule

 , ,


1

3

Есть в BSD Make такой шаблонный тип правил:

.c.o:
        $CC -o $@ $<

Означает, что для получения любого файла .o, если есть соответствующий .c, можно попробовать выполнить

$CC -o name.o name.c

Никак не могу найти, как добавить в него зависимость от заинклюденых заголовочных файлов, ну чтобы этот .o пересобирался при изменении допустим общего для проекта config.h.

В GNU Make правило с аналогичным функционалом выглядит по-другому:

%.o: %.c
        $CC -o $@ $<
В него дописать config.h в зависимость очевидно как:
%.o: %.c config.h

Но неужели в BSD синтаксисе такого не предусмотрено? Это же прямо везде нужно.

★★★★★

Последнее исправление: firkax (всего исправлений: 1)

А можно попробовать добавить в CPPFLAGS -MMD или -MD и использовать GCC dependency files (*.d)?

Bass ★★★★★
()
Ответ на: комментарий от Bass

Хм, если речь про отдельный файл с зависимостями, то я проверил более простой вариант - можно просто дописать строку с зависимостью конкретного .o файла от конкретного .h файла (в сгенерированных dependency files будет то же самое, как я понял), и она сложится с уже указанным шаблоном для конкретно этого .o. Это намного лучше чем ничего, спасибо. (вобщем-то это дефолтное поведение make, я просто в контексте шаблонов не подумал про него)

Хотя вопрос с добавлением зависимости именно в шаблонное правило это не решает, но видимо так и правда нельзя. Шаблонное правило используется чтобы общую для всех команду запуска компилятора прописать, а зависимости надо каждому персонально прописывать.

firkax ★★★★★
() автор топика
Ответ на: комментарий от firkax

а причем здесь шаблоны ?

прочитайте то что вы спрашиваете в начале

а потом прочитайте то что я вам ответил

сложите вопрос + ответ = и осознайте

anonymous
()
Ответ на: комментарий от anonymous

При том что изначальный вопрос был именно про них - о том, как добавить зависимость в шаблонное правило. В gnu (правило вида %.o: %.c) это можно, в bsd (правило вида .c.o:) нет.

firkax ★★★★★
() автор топика
Последнее исправление: firkax (всего исправлений: 1)

вот универсальный makefile, который отслеживает все хидеры и зависимости, правда завязан на gcc

CC := gcc
PROG := awesome-prog
SOURCES := $(wildcard *.c)
OBJECTS := $(patsubst %c,%o,$(SOURCES))
DEPFILES := $(patsubst %.c,%.d,$(SOURCES))

$(PROG): $(OBJECTS)
        $(CC) -o $@ $^ $(LDFLAGS)

%.o: %.d

%.d: %.c
        $(CC) $(CFLAGS) -MM -MT '$(patsubst %.c,%.o,$<)' $< -MF $@
        
ifeq (0, $(words $(findstring $(MAKECMDGOALS), clean cleanall)))
include $(DEPFILES)
endif

.PHONY: all
all:
        $(MAKE) $(PROG)

надеюсь, это то, что вам надо

IvanR ★★★
()
Последнее исправление: IvanR (всего исправлений: 1)
Ответ на: комментарий от IvanR

Спасибо конечно за ответ, но это makefile для gnu make с %-шаблонами, а я как раз спрашивал как сделать в bsd make где их нет. Впрочем, выше уже разобрались как сделать нужное.

firkax ★★★★★
() автор топика
Ответ на: комментарий от firkax

make rules

Pattern Matching Rules
       A target	entry of the form:

       tp%ts:dp%ds
	    rule

       is a pattern matching rule, in which tp is a target  prefix,  ts	 is  a
       target suffix, dp is a dependency prefix, and ds	is a dependency	suffix
       (any of which may be null). The `%' stands for a	basename  of  zero  or
       more characters that is matched in the target, and is used to construct
       the name	of a dependency. When make encounters a	match  in  its	search
       for  an	implicit  rule,	it uses	the rule in that target	entry to build
       the target from the dependency file.  Pattern-matching  implicit	 rules
       typically  make use of the $@ and $< dynamic macros as placeholders for
       the target and dependency names.	Other, regular dependencies may	 occur
       in  the	dependency list; however, none of the regular dependencies may
       contain `%'. An entry of	the form:

       tp%ts:[dependency ...] dp%ds[dependency ...]
	    rule

       is a valid pattern matching rule.
anonymous
()
$ cat Makefile
.c.o:   config.h
        cc -o $@ $<
$ make main.o
cc -o main.o main.c
$ make main.o
`main.o' is up to date.
$ touch config.h
$ make main.o
cc -o main.o main.c

P.S. bmake, _MAKE_VERSION=20211212

dsdqmhsx
()
Последнее исправление: dsdqmhsx (всего исправлений: 1)
Ответ на: комментарий от dsdqmhsx

Хм, и правда работает. Я в мане от gmake прочёл, что так нельзя и даже не пытался. Но оно и правда в итоге несовместимым с gmake получается, если то важно (тот просто игнорирует всё что после двоеточия кажется).

firkax ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.