Почему Gnumake из родительского каталога ведет себя по-другому? - PullRequest
0 голосов
/ 22 апреля 2010

Я озадачен тем, почему, когда я делаю gnumake из родительского каталога, он ведет себя некорректно, тогда как, если я перехожу в подкаталог и делаю gnumake, он работает правильно.

В родительском make-файле у меня естьправило, подобное этому:

.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

В родительском make-файле есть что-то, что попадает в make-файл подкаталога и заставляет его работать неправильно, но я не знаю, как его найти.

Симптом, который я вижу, состоит в том, что сгенерированное в подкаталоге правило make-файла для zlib пропускает зависимости, и я получаю этот результат сразу по 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 ]

1 голос
/ 16 июня 2010

запустить make -D, чтобы включить отладку

1 голос
/ 22 апреля 2010
pushd zlib-1.2.5; make; popd

должно быть

make -C zlib-1.2.5

Флаг / переключатель -C изменяет каталог так же, как ваш код с командами pushd и popd. Разница заключается в поведении, поскольку этот процесс make является рекурсивным. И на самом деле, вы можете использовать $(MAKE) вместо make в том случае, если вместо команды BSD make используется команда, такая как gmake (поскольку это сборочный файл GNU).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...