Makefile 确保模式规则存在先决条件

Makefile 确保模式规则存在先决条件,makefile,gnu-make,Makefile,Gnu Make,我理解,如果先决条件成立,“显式”模式规则将优先于隐式规则 all: src/foo.o src/%.o: makefile my_haeder.h src/%.c echo Do something with those source files 如果“my_header.h”有输入错误,则%.o的隐式规则将优先。不仅我的配方不会被执行,而且触及先决条件也不会触发规则。事实上,这是我感兴趣的第二点 make文档提供了使用静态模式规则的验证: SET_OF_FILES=src/foo.

我理解,如果先决条件成立,“显式”模式规则将优先于隐式规则

all: src/foo.o

src/%.o: makefile my_haeder.h src/%.c
    echo Do something with those source files
如果“my_header.h”有输入错误,则%.o的隐式规则将优先。不仅我的配方不会被执行,而且触及先决条件也不会触发规则。事实上,这是我感兴趣的第二点

make文档提供了使用静态模式规则的验证:

SET_OF_FILES=src/foo.o

all: src/foo.o

$(SET_OF_FILES): src/%.o: makefile my_haeder.h src/%.c
    echo Do something with those source files
这导致:

gmake: *** No rule to make target `src/my_haeder.h', needed by `src/foo.o'.  Stop.
makefile:8: target `src/foo.o' doesn't match the target pattern
makefile:9: warning: overriding commands for target `src/foo.o'
makefile:6: warning: ignoring old commands for target `src/foo.o'
makefile:9: warning: overriding commands for target `src/subsrc/bar.o'
makefile:6: warning: ignoring old commands for target `src/subsrc/bar.o'
虽然有一个更大的规则,但这个解决方案很好,只要我不必添加茎可能重叠的规则:

SET_OF_FILES=src/foo.o src/subsrc/bar.o

all: src/foo.o

$(SET_OF_FILES): src/%.o: makefile my_header.h src/%.c
    echo Do something with those source files

$(SET_OF_FILES): src/subsrc/%.o: makefile my_header.h src/subsrc/%.c
    echo Do something with those other source files
其结果是:

gmake: *** No rule to make target `src/my_haeder.h', needed by `src/foo.o'.  Stop.
makefile:8: target `src/foo.o' doesn't match the target pattern
makefile:9: warning: overriding commands for target `src/foo.o'
makefile:6: warning: ignoring old commands for target `src/foo.o'
makefile:9: warning: overriding commands for target `src/subsrc/bar.o'
makefile:6: warning: ignoring old commands for target `src/subsrc/bar.o'
第一条消息出现在这里,因为我没有麻烦$(筛选)设置\u文件。我不知道如何解决下一个警告,这对任何评论者来说都意味着“出了问题”

是否有另一种(更优雅的)方法来验证先决条件实际上是可行的,以避免删除显式模式规则


(使用GNU Make 3.79.1 win32)

添加单独的规则来检查您的先决条件

all: prereqs src/foo.o

prereqs: Makefile my_header.h

src/%.o: src/%.c Makefile my_header.h
    echo Do something with those source files

src/subsrc/%.o: src/subsrc/%.c Makefile my_header.h
    echo Do something with those other source files
这将给你:

make 
make: *** No rule to make target 'my_header.h', needed by 'prereqs'.  Stop

添加单独的规则以检查您的先决条件

all: prereqs src/foo.o

prereqs: Makefile my_header.h

src/%.o: src/%.c Makefile my_header.h
    echo Do something with those source files

src/subsrc/%.o: src/subsrc/%.c Makefile my_header.h
    echo Do something with those other source files
这将给你:

make 
make: *** No rule to make target 'my_header.h', needed by 'prereqs'.  Stop

您的“重叠”示例对我来说没有意义,因为第一个子句应该指定模式规则适用的目标文件。您将两个目标集在一起:这意味着两个规则都应该用于每个目标。您的“重叠”示例对我来说没有意义,因为第一个子句应该指定模式规则适用的目标文件。您将两个目标集在一起:这意味着两个规则都应该用于每个目标。我认为筛选集文件确实是我问题的罪魁祸首。在您的解决方案中,make可能会发出错误,因为target
all
需要target
prereqs
,这反过来又需要
Makefile
my_header.h
。它甚至没有检查两个过滤规则,这两个规则都应该被验证。我认为过滤集合的文件确实是我问题的罪魁祸首。在您的解决方案中,make可能会发出错误,因为target
all
需要target
prereqs
,这反过来又需要
Makefile
my_header.h
。它甚至不检查两个过滤规则,这两个规则都应该被验证。