2010-01-26 4 views
20

Я искал ответ на этот вопрос, но не смог найти ничего хорошего. Возможно, они старые, и что-то изменилось, поэтому я снова спрашиваю.Automake генерирует двоичные файлы в bin/вместо src/

У меня есть структура каталогов, как:

my_project

  • Src

  • бин

Я хочу, чтобы, когда я сделать в корневой директории, двоичные файлы помещаются в ./bin, а не загромождать ./src. Но как?

EDIT: Я использую C++. У моего Makefile.am нет ничего особенного. Просто переменные bin_PROGRAM и _SOURCES.

Когда я запускаю make, генерируемые двоичные файлы помещаются в ./src. Я просто хочу их в ./bin.

+0

Запишите, что вы сделали (ваш make-файл), уточните структуру своего каталога выше, тогда вам будет намного легче помочь (также может быть уместен язык программирования, который вы используете) – KevinDTimm

+0

Вы используете полный стек Autotools? Если это так, как упоминал @Braden, просто используйте скрипт 'configure', сгенерированный Autoconf. – Plamen

+0

http: // stackoverflow.com/questions/1015700/autotools-library-and-object-file-output-control –

ответ

29

У вас здесь неправильная идея.

Ваше дерево сборки находится там, где вы запустили configure. Вот как работает autoconf. Пользователи вашего пакета (которые не хотят загромождать свое исходное дерево) будут ожидать, что он будет работать таким образом.

Этот подход является более общим решением с гораздо большей гибкостью, чем организация, которую вы представляете. Например, нет ничего необычного в том, чтобы поддерживать источники и создавать файлы в отдельных файловых системах.

18

Automake не очень хорошо справляется, если вы попытаетесь настроить свои каталоги по-другому, чем ожидаете. То, что вы хотите, связано с написанием дополнительных правил для перемещения двоичных файлов до ../bin после их компиляции, что излишне сложно.

Если вы не хотите загромождать исходный каталог, попробуйте следующее:

cd my_project 
mkdir build 
cd build 
../configure 
make 

Это поставит все сгенерированные файлы (например, Makefiles, двоичные файлы, объектные файлы) в подкаталогах my_project/build.

+0

Он работает, но немного clusmy. Я мог бы это сделать, но что, если другие используют мое программное обеспечение? У них будет их ./src. Может быть, я мог бы просто добавить эти команды во все правило Makefile? –

+1

'configure' - это то, что генерирует make-файлы, поэтому вы не можете поместить эту команду в make-файл. Я могу с уверенностью сказать, что большинство людей не заботятся о том, что их ./src загромождали, потому что Automake всегда работает именно так. Это стандартное решение для тех, кто заботится. И что, если они предпочитают иметь двоичные файлы в одном каталоге? Если вы все еще хотите настроить его, я не думаю, что есть способ сделать это, не отказываясь от Automake (хотя вы все равно можете использовать Autoconf.) – ptomato

+2

Плюс, если другие люди используют ваше программное обеспечение и видят, что это использует autoconf/automake, они не ожидали, что он будет создавать материал в отдельном каталоге (если только они не организуют его, запустив configure elsewere, как показал ptomato). Это всего лишь философия GNU Build System, а Autoconf/Automake - это инструменты для внедрения GNU Build System, а не что-то еще. Вы можете взглянуть на вводную главу Automake для пользовательских типичных случаев использования GNU Build System: http://sources.redhat.com/automake/automake.html#Use-Cases – adl

14

Один из способов сказать Automake для создания двоичных файлов в определенном каталоге - это добавить этот каталог прямо к имени в переменной «bin_PROGRAMS».

Рассмотрим следующий SRC/Makefile.am:

bin_PROGRAMS = foo 
foo_SOURCES = ... 
foo_CPPFLAGS = ... 
foo_LDFLAGS = ... 

Это создает двоичный "Src/Foo", но вы можете сказать Automake использовать источники в ЦСИ создать двоичный "bin/Foo" :

bin_PROGRAMS = $(top_builddir)/bin/foo 
__top_builddir__bin_foo_SOURCES = ... 
__top_builddir__bin_foo_CPPFLAGS = ... 
__top_builddir__bin_foo_LDFLAGS = ... 

Я попробовал его с некоторыми пакетами, и даже «сделать distcheck» проглатывает его. Не может быть так много взлома, хотя ...

+0

Это лучшее решение, я думаю. Не идеально, потому что все .o и файлы, созданные процессом компиляции, все еще находятся в src, но ... –

+1

Есть ли все-таки переместить * все * сборку, связанную с подпапкой, такой как build/(включая объектные файлы, сгенерированные текстовые файлы , .desktop файлы и т. д.), аналогично тому, что я распространен в мире Java, например, Maven. – lanoxx

+2

Вы можете попробовать выполнить скрипт configure из другой папки; например, вы можете создать подпапку «build», выполнить «cd build; ../configure; make». Это оставит все вне «build» нетронутым и сгенерирует все файлы внутри «build», включая объекты и двоичные файлы. –