Всем здравствуйте.
Скажите – как, имея произвольный проект на GNU Make, собрать его в произвольном каталоге (например, в $(mktemp -d))? Хочется поведения CMake, когда мухи и котлеты исходники и бинарники отдельно.
С GNU Autotools всё понятно, там VPATH – и вперёд!
Но на произвольном проекте это, увы, не работает:
$ pwd
/usr/src/linux-source-4.9
$ make -qnpRrs .DEFAULT > /dev/null
scripts/basic/fixdep.c:449:1: fatal error: opening dependency file scripts/basic/.fixdep.d: Permission denied
}
^
compilation terminated.
scripts/Makefile.host:100: *** [scripts/basic/fixdep] Error 1
Makefile:444: *** [scripts_basic] Error 2
remake: *** No rule to make target '.DEFAULT'. Stop.
Ладно, я обычный пользователь, мне нельзя. Давайте попробуем в другом каталоге:
$ mktemp -d
/tmp/tmp.tQiZe6PcOT
$ cd /tmp/tmp.tQiZe6PcOT
$ make -qnpRrs VPATH=/usr/src/linux-source-4.9 -f /usr/src/linux-source-4.9/Makefile .DEFAULT > /dev/null
/usr/src/linux-source-4.9/Makefile:305: scripts/Kbuild.include: No such file or directory
/usr/src/linux-source-4.9/Makefile:648: arch/x86/Makefile: No such file or directory
/bin/bash: ./scripts/gcc-goto.sh: No such file or directory
/usr/src/linux-source-4.9/Makefile:685: scripts/Makefile.gcc-plugins: No such file or directory
/usr/src/linux-source-4.9/Makefile:843: scripts/Makefile.kasan: No such file or directory
/usr/src/linux-source-4.9/Makefile:844: scripts/Makefile.extrawarn: No such file or directory
/usr/src/linux-source-4.9/Makefile:845: scripts/Makefile.ubsan: No such file or directory
remake: *** No rule to make target 'scripts/Makefile.ubsan'. Stop.
Шиш. Т. е. в VPATH ищутся исходники, но не Makefile’ы, которые включаются через include.
P. S. Делается это всё для вытаскивания списка целей из Makefile’а. Что характерно, remake на той же задаче (ядро Linux) выводит на stdout и stderr ровно тот же мусор, что и обычный make.
stdout:
$ remake --tasks 2>/dev/null
HOSTCC scripts/basic/fixdep
scripts/Makefile.host:101: recipe for target 'scripts/basic/fixdep' failed
#0 scripts/basic/fixdep at /usr/src/linux-source-4.9/scripts/Makefile.host:100
#1 __build at /usr/src/linux-source-4.9/scripts/Makefile.build:95
Makefile:445: recipe for target 'scripts_basic' failed
#0 scripts_basic at /usr/src/linux-source-4.9/Makefile:444
#1 silentoldconfig at ??
...
stderr:
$ remake --tasks >/dev/null
scripts/basic/fixdep.c:449:1: fatal error: opening dependency file scripts/basic/.fixdep.d: Permission denied
}
^
compilation terminated.
scripts/Makefile.host:100: *** [scripts/basic/fixdep] Error 1
Makefile:444: *** [scripts_basic] Error 2


