Управление выводом библиотеки Autotools и объектных файлов
Моя цель состоит в том, чтобы все объектные файлы были встроены в a .каталог obj вместо корня файла Makefile, и чтобы двоичные файлы (и библиотеки) копировались в каталог проекта bin/. Но я не смог найти никаких ресурсов, чтобы объяснить, как это сделать. Как бы я это сделал?
Вот мой configure.ac и src/Makefile. am - у меня есть похожие Makefile.am файлы для двух общих библиотек, на которые имеются ссылки. Они компилируются, и после копирования их в каталог bin/ работает как надо. Я просто хочу автоматизировать этот процесс.
Configure.ac
AC_PREREQ([2.63])
AC_INIT([gtkworkbook], [0.12], [j_bellone@users.sourceforge.net])
AC_CONFIG_SRCDIR([gtkworkbook/cell.c])
AM_INIT_AUTOMAKE([gtkworkbook], [0.12])
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
AC_PROG_INSTALL
AC_PROG_MAKE_SET
AC_PROG_RANLIB
AC_PROG_LIBTOOL
AC_PROG_CC_C_O
AC_CHECK_LIB([pthread], [pthread_mutex_init], [], [
echo "pthread library is missing. pthread is required for this program"
exit -1])
# Checks for header files.
AC_CHECK_HEADERS([arpa/inet.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h unistd.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_C_INLINE
AC_TYPE_SIZE_T
# Checks for library functions.
AC_CHECK_FUNCS([gethostbyname memset socket])
AC_OUTPUT([Makefile
csv/Makefile
gtkworkbook/Makefile
src/Makefile])
Src/Makefile. am
AUTOMAKE_OPTIONS= foreign
C_FLAGS= -I/usr/local/include -I/usr/include -I/usr/local/include/gtkextra-2.0 -I$(top_srcdir)/include `pkg-config gtk+-2.0 glib-2.0 --cflags`
L_FLAGS= -L/usr/local/lib -L/usr/lib -L$(top_srcdir)/lib `pkg-config gtk+-2.0 glib-2.0 --libs` -lgtkextra-x11-2.0
bin_PROGRAMS= gtkworkbook
gtkworkbook_SOURCES= application.c config.c main.c parse.c plugin.c
gtkworkbook_CFLAGS= -Wall -lgthread-2.0 -std=c99 $(C_FLAGS)
gtkworkbook_LFLAGS= -ldl $(L_FLAGS)
gtkworkbook_LDFLAGS= $(L_FLAGS)
gtkworkbook_LDADD= ../gtkworkbook/libgtkworkbook.la ../csv/libcsv.la
lib_LTLIBRARIES= realtime.la
realtime_la_SOURCES= realtime/CsvParser.cpp realtime/Network.cpp realtime/Packet.cpp realtime/plugin_main.cpp
realtime/thread_main.cpp realtime/concurrent/Mutex.cpp realtime/concurrent/Semaphore.cpp
realtime/concurrent/Thread.cpp realtime/concurrent/ThreadGroup.cpp realtime/concurrent/ThreadPool.cpp
realtime/proactor/Dispatcher.cpp realtime/proactor/Event.cpp realtime/proactor/Proactor.cpp
realtime/proactor/InputDispatcher.cpp realtime/proactor/Worker.cpp realtime/network/Tcp.cpp
realtime_la_CPPFLAGS= -Wall -Wno-write-strings $(C_FLAGS)
realtime_la_LFLAGS= -lgtkworkbook -lcsv $(L_FLAGS)
realtime_la_LDFLAGS= -module -export-dynamic
realtime_la_LIBADD= ../gtkworkbook/libgtkworkbook.la ../csv/libcsv.la
Итак, мой вопрос заключается в том, как указать выходные каталоги для результатов компиляции каждого файла Makefile (я хочу, чтобы они были скопированы в bin/, а объектные файлы находились в .obj каждого проекта, а не в корне файла Makefile.
Спасибо за помощь до сих пор.. этот сайт имеет это был отличный ресурс, и я многому научился по ссылкам, которые уже были предоставлены.
2 ответа:
Система сборки GNU не использует каталоги
Однако я могу придумать два способа обойти это.obj/
, поэтому autotools не предназначены для поддержки этого.В качестве установщика вы можете построить любой пакет из его исходного каталога, набрав
mkdir builddir cd builddir ../path-to-sourcedir/configure make
Тогда любой выходной файл будет создан в каталоге
Как упаковщик, единственный способ заставить ваш пакет построить все вbuilddir/
. Эта схема компиляции позволяет компилировать исходный код, хранящийся в каталоге только для чтения (это имело больше смысла в те годы, когда FSF распространял компакт-диски с несжатым исходным кодом), или для компиляции одного и того же источника с различными настройками (или даже для разных архитектур).obj/
- это поместить вашMakefile.am
вobj/
и объявить там все ваши правила сборки. Это будет означать, чтоobj/Makefile.am
выглядит следующим образом:bin_PROGRAMS = foo bar foo_SOURCES = ../src/foo/main.c ../src/foo/help.c ../src/foo/list.c bar_SOURCES = ../src/bar/bar.c
И т. д. Я помню, что 10 лет назад POSE, эмулятор Palm OS, использовал установку, подобную описанной выше. Я не рекомендую это, как это не очень ремонтопригодно. Действительно, лучше придерживаться философии инструментов и использовать системы сборки, которые работают как другие пакеты GNU.
Для ознакомления с системой сборки GNU я рекомендую прочитать введение в руководство Automake: http://www.gnu.org/software/automake/manual/automake.html#GNU-Build-System
Особенно раздел прецедентов. Если вы не заботитесь об этих случаях использования, я думаю, что ваш лучший курс-не использовать Automake, и построить свой собственный Makefile. В противном случае вы будете продолжать пытаться заставить Automake делать то, для чего он не предназначен, и вы быстро возненавидите его.
EDIT 2013-08-26 : обратите внимание, что проект Automake, использующий подкаталог с именем using
obj/
, не переносится в BSD make.