Автоматически генерировать двоичные файлы в bin/ вместо src/
Я искал ответ на этот вопрос, но не нашел ничего хорошего. Может быть, они старые и что-то изменилось, поэтому я спрашиваю снова.
У меня есть структура каталогов как:
мой проект
ЦСИ
бункер
Я хочу, чтобы, когда я делал make в корневом каталоге, двоичные файлы помещались в./bin, а не загромождали./src. Но как?
РЕДАКТИРОВАТЬ: я использую C++. Мой Makefile.am не имеет ничего особенного. Просто переменные bin_PROGRAM и _SOURCES.
Когда я запускаю make, сгенерированные двоичные файлы помещаются в./src. Я просто хочу их в./bin.
3 ответа
Вы ошиблись идеей здесь.
Ваше дерево сборки находится там, где вы работаете configure
, Вот как autoconf предназначен для работы. Пользователи вашего пакета (которые не хотят загромождать свое исходное дерево) будут ожидать, что он будет работать таким образом.
Этот подход является более общим решением с гораздо большей гибкостью, чем организация, которую вы себе представляете. Например, весьма необычно хотеть поддерживать исходные тексты и создавать файлы в отдельных файловых системах.
Automake не очень хорошо справляется, если вы пытаетесь настроить каталоги не так, как ожидалось. То, что вы хотите, включает в себя написание дополнительных правил для перемещения двоичных файлов в ../bin
после их компиляции, что излишне сложно.
Если вы не хотите загромождать исходный каталог, попробуйте это:
cd my_project
mkdir build
cd build
../configure
make
Это поместит все сгенерированные файлы (такие как make-файлы, двоичные файлы, объектные файлы) в подкаталоги my_project/build
,
Один из способов сообщить Automake о создании двоичных файлов в определенном каталоге - добавить этот каталог прямо к имени в переменной "bin_PROGRAMS".
Рассмотрим следующий src/Makefile.am:
bin_PROGRAMS = foo
foo_SOURCES = ...
foo_CPPFLAGS = ...
foo_LDFLAGS = ...
Он создает двоичный файл "src/foo", но вы можете указать Automake использовать исходники в src для создания двоичного файла "bin/foo":
bin_PROGRAMS = $(top_builddir)/bin/foo
__top_builddir__bin_foo_SOURCES = ...
__top_builddir__bin_foo_CPPFLAGS = ...
__top_builddir__bin_foo_LDFLAGS = ...
Я попробовал это с некоторыми пакетами, и даже "make distcheck" проглатывает его. Не может быть так много хака...