使用.d-dependencies-file

时间:2017-11-23 13:23:13

标签: c makefile

很高兴我重新创建了这个问题以给出我的实际例子:

我的问题是,当第一次构建时遗失httpd-fsdata-erw.h时,规则httpd-fsdata-erw.h::会为我创建它,并且一切正常。

如果我触摸httpd-fsdata-erw.h进行识别,并且正在构建sourcefile1.osourcefile2.o,其他所有内容都会再次出现。精彩!

但是当我删除httpd-fsdata-erw.h时。 Make正在检查先决条件并且什么也不做,因为它说“没什么可做的”虽然httpd-fsdata-erw.h丢失了。

现在,当我触摸sourcefile2.h时,make无法找到制定目标httpd-fsdata-erw.h的规则。

MAYBE我混淆了一些错误消息

我可以使用.PONY: - 目标进行修复,但正如您所知,它会重建大部分内容。

文件的概述:

extension
|
|-- Makefile
|--(httpd-fsdata-erw.h) (created by perl
|--(httpd-fsdata-erw.c) (created by perl)
|--(httpd-fsdata-erw.o)
|-- ext.o
|-- ext.bin


TOPDIR-- Makefile
|-- obj_dir
|   |--sourcefile1.o
|   |--sourcefile1.d
|   |--sourcefile2.o
|   |--sourcefile2.d
|   |--...
|
|-- app
|   |
|   |--sourcefile1.c (needs httpd-fsdata-erw.h)
|   |--sourcefile2.c 
|   |--sourcefile2.h (needs httpd-fsdata-erw.h)
|   |--sourcefile3.c 
|   |--sourcefile4.c 
|   |
|   |--appskt
|   |  |--webserver
|   |  |  |-- Makefile
|   |  |  |...
|   |  |  |--fsdata
|   |  |     |--index.html
|   |  |     |--somejavascript.js
|   |  |
|   |  |
|   |  |--shell
|   |  |  |...
|   |  |--crypto
|   |  |  |...
|   |  |--ftp
|   |  |  |...
|   |  |
|
|
|-- contiki
|   |--Makefile.include
|   
|   
|   
|-- plattform
|   |-- cpu
|   |  |-- Makefile.r7s7210
|   |  |
|   |  |

目录= webserver中的Makefile使用perl脚本httpd-fsdata-erw.h .c和.o创建带有规则的扩展名文件夹

HTTPD_FSDATA_ERW_FILES=httpd-fsdata-erw.c httpd-fsdata-erw.h
$(HTTPD_FSDATA_ERW_FILES): $(PATH_WEBSERVER)/index.html $(PATH_WEBSERVER)/somejavascript.js
    perl makefsdata -d $(HT.... 

web_content: $(HTTPD_FSDATA_ERW_FILES)

TOPDIR-- Makefile:

include $(CONTIKI)/Makefile.include

all: project.bin

project.bin: $(somestuff1) $(somestuff2) $(TARGET_PATH)/$(CONTIKI_PROJECT).$(TARGET)
  @cmd .... nothing important, just a windows batch-file

| - contiki - Makefile.include:

-include $(PATH_...)/Makefile.r7s7210

-include ${addprefix $(OBJECTDIR)/,$(CONTIKI_SOURCEFILES:.c=.d) \
                                   $(PROJECT_SOURCEFILES:.c=.d)}    

#.PHONY: httpd-fsdata-erw.h
httpd-fsdata-erw.h::
    @$(MAKE) -j1 $(EXT_BIN) -C $(EXT_PATH) -f Makefile

$(TARGET_PATH)/%.$(TARGET): %.co $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a
  some linking stuff

| - plattform - cpu - Makefile.r7s7210:

$(OBJECTDIR)/%.o: %.c | $(OBJECTDIR):
  ...
  $(CC) $(CFLAGS)  $(IAR_INCLUDES) ... $< --dependencies=n $(@:.o=.d) -o $@)

1 个答案:

答案 0 :(得分:0)

  

但是当我在第一次构建之后删除&#34; missing.h&#34; -file时,make无法找到目标。

     

这是因为.d文件的结构吗?

是的。

要解决此问题,请在生成.d文件时使用-MP gcc command line switch

  

-MP此选项指示CPP为每个依赖项添加虚假目标          除主文件外,导致每个文件都不依赖。这些          虚拟规则解决错误make如果你删除标题          文件没有更新Makefile匹配。这是典型的输出:

           test.o: test.c test.h
           test.h: