为什么来自父目录的Gnumake表现不同?

时间:2010-04-22 00:48:24

标签: gnu-make recursion

我很难过为什么当我从父目录执行gnumake时,它的行为不正确,而如果我cd到子目录并执行gnumake它可以正常工作。

在父makefile中,我有这样的规则:

.PHONY: zlib-1.2.5
zlib-1.2.5:
    @ echo Issuing $(MAKE) in $@ ...
    pushd zlib-1.2.5; make; popd

我也在上面的最后一行尝试过这样的故障:

    make -C zlib-1.2.5

与从顶层

做同样的结果不同
pushd zlib-1.2.5; make; popd

父makefile中有一些内容正在进入子目录makefile并导致其行为不正确,但我不知道如何找到它。

我看到的症状是zlib的子目录配置生成的makefile规则错过了依赖关系,我得到的结果直接转到ar而不先生成.o(s):

cd ~/src; make zlib-1.2.5
CPPFLAGS_AUTO = <  >
Issuing make in zlib-1.2.5 ...
pushd zlib-1.2.5; make; popd
~/src/zlib-1.2.5 ~/src
make[1]: Entering directory `/disk2/user/src/zlib-1.2.5'
ar rc libz.a adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o 
ar: adler32.o: No such file or directory
make[1]: *** [libz.a] Error 1
gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map -O3 -fPIC -D_LARGEFILE64_SOURCE=1 -o libz.so.1.2.5 adler32.lo compress.lo crc32.lo deflate.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo uncompr.lo zutil.lo  -lc -L. libz.a
gcc: adler32.lo: No such file or directory
gcc: compress.lo: No such file or directory
gcc: crc32.lo: No such file or directory
gcc: deflate.lo: No such file or directory
[...]
make[1]: *** [libz.so.1.2.5] Error 1
make[1]: Target `all' not remade because of errors.
make[1]: Leaving directory `/disk2/user/src/zlib-1.2.5'
~/src

从zlib目录开始,它正常工作:

cd ~/src/zlib-1.2.5; make
gcc -O3 -D_LARGEFILE64_SOURCE=1   -c -o example.o example.c
gcc -O3 -D_LARGEFILE64_SOURCE=1   -c -o adler32.o adler32.c
gcc -O3 -D_LARGEFILE64_SOURCE=1   -c -o compress.o compress.c
gcc -O3 -D_LARGEFILE64_SOURCE=1   -c -o crc32.o crc32.c
[...]
gcc -O3 -D_LARGEFILE64_SOURCE=1   -c -o zutil.o zutil.c
ar rc libz.a adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o 
(ranlib libz.a || true) >/dev/null 2>&1
gcc -O3 -D_LARGEFILE64_SOURCE=1 -o example example.o -L. libz.a
gcc -O3 -D_LARGEFILE64_SOURCE=1   -c -o minigzip.o minigzip.c
gcc -O3 -D_LARGEFILE64_SOURCE=1 -o minigzip minigzip.o -L. libz.a
mkdir objs 2>/dev/null || test -d objs
gcc -O3 -fPIC -D_LARGEFILE64_SOURCE=1 -DPIC -c -o objs/adler32.o adler32.c
mv objs/adler32.o adler32.lo
mkdir objs 2>/dev/null || test -d objs
gcc -O3 -fPIC -D_LARGEFILE64_SOURCE=1 -DPIC -c -o objs/compress.o compress.c
mv objs/compress.o compress.lo
[...]
mkdir objs 2>/dev/null || test -d objs
gcc -O3 -fPIC -D_LARGEFILE64_SOURCE=1 -DPIC -c -o objs/zutil.o zutil.c
mv objs/zutil.o zutil.lo
gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map -O3 -fPIC -D_LARGEFILE64_SOURCE=1 -o libz.so.1.2.5 adler32.lo compress.lo crc32.lo deflate.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo uncompr.lo zutil.lo  -lc -L. libz.a
rm -f libz.so libz.so.1
ln -s libz.so.1.2.5 libz.so
ln -s libz.so.1.2.5 libz.so.1
rmdir objs
gcc -O3 -D_LARGEFILE64_SOURCE=1 -o examplesh example.o -L. libz.so.1.2.5
gcc -O3 -D_LARGEFILE64_SOURCE=1 -o minigzipsh minigzip.o -L. libz.so.1.2.5
gcc -O3 -D_LARGEFILE64_SOURCE=1 -o example64 example64.o -L. libz.a
gcc -O3 -D_LARGEFILE64_SOURCE=1 -o minigzip64 minigzip64.o -L. libz.a

2 个答案:

答案 0 :(得分:1)

pushd zlib-1.2.5; make; popd

应该是

make -C zlib-1.2.5

-C标志/开关更改目录,类似于您的代码使用pushdpopd命令执行的操作。不同之处在于行为,因为此make过程是递归的。实际上,如果使用诸如$(MAKE)之类的命令而不是可能是BSD make的命令,则可以使用gmake而不是make(因为它是GNU生成文件)。

答案 1 :(得分:1)

运行make -D打开调试