并行gnu-make跳过命令

时间:2014-12-01 20:40:26

标签: gnu-make

给定一个空文件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

0 个答案:

没有答案