Правило Makefile с использованием автоматической переменной $ ^ без зависимостей

Из руководства GNU Make я узнал, что знак $^ - это автоматическая переменная, которая представляет имена всех предварительных условий. Однако я наткнулся на такой make-файл:

SVR_OBJECT_FILES =      server.o\
                        server_func.o

CLT_OBJECT_FILES =      client.o

CFLAGS =                -Wall -Werror -W


CC =                    gcc

all:                   client/client server/serveur

client/client:         $(CLT_OBJECT_FILES)

server/serveur:        $(SVR_OBJECT_FILES)

client/client server/serveur:
    @mkdir -p $(dir $@)
    $(CC) $(CFLAGS) $^ -o $@

%.o: %.c
    $(CC) -c $<

clean:
    rm -f client/client server/serveur *.o

Что отлично работает, поэтому мой вопрос: как команда ниже может связывать правильные объектные файлы, в то время как переменная $ ^ вообще не ссылается на предварительные требования. (правило не имеет предпосылок)

 $(CC) $(CFLAGS) $^ -o $@

person Jpaille    schedule 06.04.2013    source источник


Ответы (1)


$^ содержит все предварительные условия цели, а не только те, которые упоминаются в самом правиле. Один и тот же файл может появляться в качестве цели несколько раз в правилах без команд:

sometarget: dependency1
…
sometarget: dependency2
        assemble -o $@ $^
…
sometarget: dependency3

sometarget зависят от dependency1, dependency2 и dependency3, и когда команда assemble вызывается make sometarget, она получит все три в качестве аргументов.

Здесь $^ будет содержать все $(CLT_OBJECT_FILES) или $(SRV_OBJECT_FILES) в зависимости от того, для какой цели выполняется команда.

person Gilles 'SO- stop being evil'    schedule 06.04.2013