Автоматически генерировать двоичные файлы в 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" проглатывает его. Не может быть так много хака...

Другие вопросы по тегам