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之间的时间小于文件系统的时间戳分辨率,则将seeslibmine.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结构中,以保存每个时间戳的纳秒部分。