Gnu make GNU使忘记先决条件?

Gnu make GNU使忘记先决条件?,gnu-make,Gnu Make,这有点复杂,所以我上传了一个例子 如何测试它: 下载tarball并将其解压缩 cd制作问题/制作 制作aclean(忘记从存档中删除存档;)) 创建alib(将重新创建您刚刚删除的简单而愚蠢的归档文件) /奇怪的 sh所做的只是触摸一个源文件,重新制作,触摸另一个源文件,重新制作,几次 这是使用GNU Make 3.81在我的Linux系统上的输出: $ ./weird.sh #### 1 #### gcc -c -g -Wall -Wextra -o ../swu/1/src/fo

这有点复杂,所以我上传了一个例子

如何测试它:

  • 下载tarball并将其解压缩
  • cd制作问题/制作
  • 制作aclean(忘记从存档中删除存档;))
  • 创建alib(将重新创建您刚刚删除的简单而愚蠢的归档文件)
  • /奇怪的
sh所做的只是触摸一个源文件,重新制作,触摸另一个源文件,重新制作,几次

这是使用GNU Make 3.81在我的Linux系统上的输出:

$ ./weird.sh #### 1 #### gcc -c -g -Wall -Wextra -o ../swu/1/src/foo1.o ../swu/1/src/foo1.c ar cr ../make/libmine.a ../swu/1/src/foo1.o ==== 1 ==== gcc -c -g -Wall -Wextra -o ../swu/1/src/bar1.o ../swu/1/src/bar1.c ar cr ../make/libmine.a ../swu/1/src/bar1.o #### 2 #### gcc -c -g -Wall -Wextra -o ../swu/1/src/foo2.o ../swu/1/src/foo2.c ==== 2 ==== gcc -c -g -Wall -Wextra -o ../swu/1/src/bar2.o ../swu/1/src/bar2.c #### 3 #### gcc -c -g -Wall -Wextra -o ../swu/1/src/foo3.o ../swu/1/src/foo3.c ==== 3 ==== gcc -c -g -Wall -Wextra -o ../swu/1/src/bar3.o ../swu/1/src/bar3.c #### 4 #### gcc -c -g -Wall -Wextra -o ../swu/1/src/foo4.o ../swu/1/src/foo4.c ==== 4 ==== gcc -c -g -Wall -Wextra -o ../swu/1/src/bar4.o ../swu/1/src/bar4.c #### 5 #### gcc -c -g -Wall -Wextra -o ../swu/1/src/foo5.o ../swu/1/src/foo5.c ==== 5 ==== gcc -c -g -Wall -Wextra -o ../swu/1/src/bar5.o ../swu/1/src/bar5.c #### 6 #### gcc -c -g -Wall -Wextra -o ../swu/1/src/foo6.o ../swu/1/src/foo6.c ==== 6 ==== gcc -c -g -Wall -Wextra -o ../swu/1/src/bar6.o ../swu/1/src/bar6.c #### 7 #### gcc -c -g -Wall -Wextra -o ../swu/1/src/foo7.o ../swu/1/src/foo7.c ==== 7 ==== gcc -c -g -Wall -Wextra -o ../swu/1/src/bar7.o ../swu/1/src/bar7.c ar cr ../make/libmine.a ../swu/1/src/bar7.o #### 8 #### gcc -c -g -Wall -Wextra -o ../swu/1/src/foo8.o ../swu/1/src/foo8.c ==== 8 ==== gcc -c -g -Wall -Wextra -o ../swu/1/src/bar8.o ../swu/1/src/bar8.c $ 美元/天 #### 1 #### gcc-c-g-Wall-Wextra-o../swu/1/src/foo1.o../swu/1/src/foo1.c ar cr../make/libmine.a../swu/1/src/foo1.o ==== 1 ==== gcc-c-g-Wall-Wextra-o../swu/1/src/bar1.o../swu/1/src/bar1.c ar cr../make/libmine.a../swu/1/src/bar1.o #### 2 #### gcc-c-g-Wall-Wextra-o../swu/1/src/foo2.o../swu/1/src/foo2.c ==== 2 ==== gcc-c-g-Wall-Wextra-o../swu/1/src/bar2.o../swu/1/src/bar2.c #### 3 #### gcc-c-g-Wall-Wextra-o../swu/1/src/foo3.o../swu/1/src/foo3.c ==== 3 ==== gcc-c-g-Wall-Wextra-o../swu/1/src/bar3.o../swu/1/src/bar3.c #### 4 #### gcc-c-g-Wall-Wextra-o../swu/1/src/foo4.o../swu/1/src/foo4.c ==== 4 ==== gcc-c-g-Wall-Wextra-o../swu/1/src/bar4.o../swu/1/src/bar4.c #### 5 #### gcc-c-g-Wall-Wextra-o../swu/1/src/foo5.o../swu/1/src/foo5.c ==== 5 ==== gcc-c-g-Wall-Wextra-o../swu/1/src/bar5.o../swu/1/src/bar5.c #### 6 #### gcc-c-g-Wall-Wextra-o../swu/1/src/foo6.o../swu/1/src/foo6.c ==== 6 ==== gcc-c-g-Wall-Wextra-o../swu/1/src/bar6.o../swu/1/src/bar6.c #### 7 #### gcc-c-g-Wall-Wextra-o../swu/1/src/foo7.o../swu/1/src/foo7.c ==== 7 ==== gcc-c-g-Wall-Wextra-o../swu/1/src/bar7.o../swu/1/src/bar7.c ar cr../make/libmine.a../swu/1/src/bar7.o #### 8 #### gcc-c-g-Wall-Wextra-o../swu/1/src/foo8.o../swu/1/src/foo8.c ==== 8 ==== gcc-c-g-Wall-Wextra-o../swu/1/src/bar8.o../swu/1/src/bar8.c $ 现在我希望每次接触到一个源文件时都能重新构建归档文件,但这显然没有发生

有人能解释一下吗?
并解释如何确保它始终按预期工作?

这里的问题是文件修改时间戳的分辨率相对较低,这会导致make在连续快速运行两次时感到困惑,就像您的
怪异.sh一样

具体来说,
weird.sh
将:

  • 触摸
    foo1.c
  • 运行make,哪个
  • 重建
    foo1.o
  • 重建
    libmine.a
  • 触摸
    bar1.c
  • 运行make,哪个
  • 重建
    bar1.o
  • 也许(见下文)重建了
    libmine.a
  • 如果步骤2.2和步骤4.2之间的时间小于文件系统的时间戳分辨率,则将sees
    libmine.a
    设置为已具有与
    bar1.o
    相同的时间戳,因此不重建它

    Linux ext3文件系统的时间戳分辨率为1秒。这将更详细地描述这个问题,并且还提到Solaris具有更好的时间戳分辨率,这可能解释了为什么您的示例可以按预期工作


    如果这在实际应用程序中是一个问题,您可以尝试ext4文件系统,它具有纳秒级的时间戳。否则,只需在
    weird.sh
    中的每个make命令后放置一个
    sleep 1
    ,问题就消失了:-)

    对于Solaris 10和GNU make 3.80,它实际上似乎可以按预期工作。在Linux下,使用GNU Make 3.80,我得到了与上面所看到的相同的行为。有人知道GNU Make存在与平台相关的问题吗?对不起,上传的示例中充斥着垃圾。现在,它被一个更干净的版本所取代(并且不需要初始的“make aclean”),如果问题被简化为问题中包含的一个小makefile片段,我会对这个问题进行投票。谢谢,这让我有点好奇hi-res时间戳是如何读取的,因为它们不能在正常的stat结构中。但这是一条旁道。如果可以的话,我会在问题本身中给出一个简短的例子,但是因为有很多文本,我想这会更好。抱歉,如果我计算错了。额外的字段被添加到stat结构中,以保存每个时间戳的纳秒部分。