LINUX.ORG.RU

Сборка вне дерева исходников с использованием GNU Make

 ,


0

2

Всем здравствуйте.

Скажите – как, имея произвольный проект на 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
★★★★★
Ответ на: комментарий от aol

Спасибо. Нет, мой вопрос как раз про сферических коней. Ядро приведено сугубо для примера.

Bass ★★★★★
() автор топика

Не думаю, что это возможно в общем случае. $(VPATH) используется только для целей/зависимостей, но на те же команды в правилах оно совершенно никак не влияет.

Делается это всё для вытаскивания списка целей из Makefile’а.

И зачем это делать в другом каталоге? На случай, если что-то всё же будет исполнено?

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

И зачем это делать в другом каталоге? На случай, если что-то всё же будет исполнено?

Да. Потому как -q и -n в общем случае не дают никаких гарантий.

Bass ★★★★★
() автор топика
Ответ на: комментарий от kawaii_neko

Я в gentoo делаю так (вместо копирования гибибайтов исходников)

$ make -C /usr/src/linux O=/tmp/linux menuconfig
$ cd /tmp/linux
$ make
anonymous
()

P. S. Делается это всё для вытаскивания списка целей из Makefile’а. Что характерно, remake на той же задаче (ядро Linux) выводит на stdout и stderr ровно тот же мусор, что и обычный make.

Смотрел уже как bash/zsh completion для мейкфайлов работают?

NeXTSTEP ★★
()
Ответ на: комментарий от NeXTSTEP

Да.

make -qnp и дальше скрипт на sed (или awk).

Тот код, который у меня есть сейчас, уже работает лучше, чем bash-completion. Но всё равно не решает задачу в общем случае.

Bass ★★★★★
() автор топика
Последнее исправление: Bass (всего исправлений: 1)
Ответ на: комментарий от Bass

это частный случай

В общем случае это не решается.

Это и есть основной минус make из-за чего пишут другие сборочные системы и другие новые убийцы make.

anonymous
()

Никак, конечно же. make ничего не знает какие из аргументов пути, какие из них входные и какие выходные, даже связь с именем цели не гарантируется, соответсвенно и подставить src/bin каталоги не может.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.