【问题标题】:how to tell make to check files' time stamps in dependency file?如何告诉make检查依赖文件中的文件时间戳?
【发布时间】:2017-10-03 07:29:52
【问题描述】:

考虑这个简单的规则:

foo.o: foo.c foo.d
    gcc -c ...

foo.d: foo.c
    gcc -M ...

现在,如果 foo.d 和 foo.o 都比 foo.c 新 - foo.o 的配方将不会被执行。

但是,foo.c 中包含的其中一个标头可能已更改,因此我确实需要运行该配方。

所以问题是如何告诉 make 如果 foo.d 中列出的文件之一比 foo.o 新,那么它必须运行 foo.o 的配方?

谢谢。

【问题讨论】:

    标签: makefile build gnu-make incremental-build


    【解决方案1】:

    依赖文件的重点不是它们是目标先决条件,而是它们用正确的依赖完成你的目标。它们实际上需要包含在您的 Makefile 中。

    这是一个基本的例子:

    SRC = foo.c main.c
    OBJ = $(SRC:.c=.o)
    DEPS = $(SRC:.c=.d)
    
    -include $(DEPS)
    
    all: myapp.o
    
    myapp.o: foo.o main.o
        gcc -c main.o foo.o -o myapp.o
    main.o: main.c
        gcc -M ...
    foo.o: foo.c
        gcc -M ...
    
    .PHONY: all
    

    现在发生的情况是 $(DEPS) 中每个文件的内容将被复制粘贴到您的 Makefile 中。由于main.c 可能使用foo.c 并因此包括foo.h,这就是main.d 的样子:

    main.o: \
     foo.c \
     foo.h
    

    如果我们在 Makefile 中应用包含,这就是 GNU make 最终分析的内容:

    SRC = foo.c main.c
    OBJ = $(SRC:.c=.o)
    DEPS = $(SRC:.c=.d)
    
    -include $(DEPS)
    
    all: myapp.o
    
    myapp.o: foo.o main.o
        gcc -c main.o foo.o -o myapp.o
    main.o: main.c foo.c foo.h
        gcc -M ...
    foo.o: foo.c
        gcc -M ...
    
    .PHONY: all
    

    观察 foo.c 和 foo.h 现在如何成为 main.o 的先决条件。这意味着如果其中任何一个发生更改,则必须重建 main.o。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 2010-10-21
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      相关资源
      最近更新 更多