В такой ситуации:
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 для заполнения $<
?