给定一个空文件a.c和以下Makefile -
CC=gcc
l.a : l.a(a.o)
ranlib l.a
echo done
l.a(a.o) : a.c
clean::
rm -f l.a a.o
运行命令" make clean;使"给出以下输出 -
rm -f l.a a.o
gcc -c -o a.o a.c
ar rv l.a a.o
a - a.o
ranlib l.a
echo done
done
运行命令" make clean; make -j2"给出以下输出 -
rm -f l.a a.o
gcc -c -o a.o a.c
ar rv l.a a.o
a - a.o
为什么" make -j2"跳过第一条规则下列出的命令?
在具有gnu make 3.79.1的32位单处理器系统上始终如此 在gnu make 3.81的64位多核系统上不会发生。 这是一个更大的Makefile的缩写示例,我遇到了问题。
所以,我把Makefile的例子做得更多了一些"复杂的"如下 -
AR := flock make.lock ar
RANLIB := flock make.lock ranlib
CC=gcc
l.a : l.a(a.o) l.a(b.o)
echo doing ranlib
$(RANLIB) l.a
echo done
l.a(a.o) : a.c
l.a(b.o) : b.c
clean::
rm -f l.a a.o b.o
flock()技巧是我的发明(也许是一项重新发明)来序列化" ar"。 输出 -
> make clean ; make -j1
rm -f l.a a.o b.o
gcc -c -o a.o a.c
flock make.lock ar rv l.a a.o
ar: creating l.a
a - a.o
gcc -c -o b.o b.c
flock make.lock ar rv l.a b.o
a - b.o
echo doing ranlib
doing ranlib
flock make.lock ranlib l.a
echo done
done
rm a.o b.o
> make clean ; make -j2
rm -f l.a a.o b.o
gcc -c -o a.o a.c
gcc -c -o b.o b.c
flock make.lock ar rv l.a a.o
flock make.lock ar rv l.a b.o
ar: creating l.a
a - a.o
a - b.o
rm a.o b.o