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
需要targetprereqs
,这反过来又需要Makefile
和my_header.h
。它甚至没有检查两个过滤规则,这两个规则都应该被验证。我认为过滤集合的文件确实是我问题的罪魁祸首。在您的解决方案中,make可能会发出错误,因为targetall
需要targetprereqs
,这反过来又需要Makefile
和my_header.h
。它甚至不检查两个过滤规则,这两个规则都应该被验证。