GNU Make, значение `$ <` из нескольких обязательных строк - PullRequest
0 голосов
/ 05 июля 2018

В такой ситуации:

sample.o: sample.hpp
%.o: %.cpp
     $(CXX) -o $@ -c $<

sample.o: utility.hpp

при компиляции sample.o, что является первым предварительным условием (значение $<)? sample.hpp? sample.cpp? ... utility.hpp? sample.hpp является первым предварительным условием, найденным make. sample.cpp - это первый реквизит правила, которое содержит рецепт, и именно это имеет смысл. utility.hpp не имеет смысла использоваться в качестве первой предпосылки, но я поставил ее для полноты.

Что если?

sample.o: sample.hpp utility.hpp
# implicit rule %.o: %.cpp

Что если?

%.o: %.cpp # Removal of implicit rule/recipe.
sample.o: sample.hpp
%.o: %.cpp %.d
     $(CXX) $(DEPFLAGS) -o $@ -c $<

Здесь первым предварительным условием может быть sample.cpp из первой строки или sample.hpp, поскольку %.o: %.cpp переопределяется на %.o: %.cpp %.d, а sample.hpp является новым первым предварительным условием; или sample.cpp снова, потому что это первая предпосылка правила, содержащего рецепт.

Что если?

sample.o: sample.hpp
%.o: %.cpp
sample.o: utility.hpp
%.o: %.cpp %.d
     $(CXX) $(DEPFLAGS) -o $@ -c $<

Тот же аргумент, это может быть sample.hpp или sample.cpp для четвертой строки.

Короче говоря, каковы критерии или алгоритм, используемый GNU Make для заполнения $<?

1 Ответ

0 голосов
/ 05 июля 2018

В информационном файле написано (мой акцент):

$<

Имя первой предпосылки. Если цель получила свой рецепт из неявного правила, это будет первым предварительным условием, добавленным неявное правило .

Это подтверждает гипотезу, которую вы говорите «имеет больше смысла».

...