Всем здравствуйте.
Скажите – как, имея произвольный проект на 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