2009-06-18 12 views
6

Il mio obiettivo è quello di creare tutti i file oggetto in una directory .objs anziché nella radice del Makefile e di avere i file binari e le librerie copiati nella directory bin/ del progetto. . Ma non sono stato in grado di trovare risorse per spiegare come farlo. Come potrei fare questo?Controllo output libreria oggetti e file oggetto

Ecco il mio configure.ac e src/Makefile.am - Ho simili file Makefile.am per due librerie condivise a cui fanno riferimento. Si compilano e dopo averli copiati nella cartella bin/ funzionano come dovrebbero. Sto solo cercando di automatizzare questo processo.

configure.ac

AC_PREREQ([2.63]) 
AC_INIT([gtkworkbook], [0.12], [[email protected]]) 
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 

Quindi, la mia domanda è come specificare le directory di output per i risultati di compilazione di ogni Makefile (I Desidero che vengano copiati in bin/ e che i file oggetto siano in .obj di ciascun professionista ject invece che nella radice del Makefile.

Grazie per l'aiuto fino ad ora .. questo sito è stato una grande risorsa, e ho imparato molto dai collegamenti forniti già.

risposta

10

Il sistema di generazione GNU non utilizza le directory obj/, pertanto gli autotools non sono progettati per supportarlo.

Tuttavia, posso pensare a due modi per aggirare questo problema.

Come un programma di installazione, si può costruire qualsiasi pacchetto fuori dalla sua directory di origine digitando

mkdir builddir 
cd builddir 
../path-to-sourcedir/configure 
make 

Poi verrà creato alcun file di output nella directory builddir/. Questo schema di compilazione rende possibile compilare il codice sorgente memorizzato in una directory di sola lettura (questo aveva più senso negli anni in cui FSF distribuiva CD con codice sorgente non compresso), o per compilare la stessa fonte con impostazioni diverse (o anche per diverse architetture).

Come confezionatore, l'unico modo per forzare il tuo pacchetto per costruire tutto in obj/ è quello di mettere il vostro Makefile.am in obj/, e dichiarare tutte le regole costruire lì. Ciò significherebbe un obj/Makefile.am che sembra:

bin_PROGRAMS = foo bar 
foo_SOURCES = ../src/foo/main.c ../src/foo/help.c ../src/foo/list.c 
bar_SOURCES = ../src/bar/bar.c 

ecc Ricordo che 10 anni fa, POSE, il Palm OS Emulator, stava usando una configurazione come sopra. Non lo consiglio perché non è veramente mantenibile. È davvero meglio attenersi alla filosofia degli strumenti e utilizzare sistemi di compilazione che funzionano come gli altri pacchetti GNU.

Per un'introduzione alla GNU Build System, vi consiglio di leggere l'introduzione del manuale Automake: http://www.gnu.org/software/automake/manual/automake.html#GNU-Build-System

in particolare la sezione casi d'uso. Se non ti preoccupi di questi casi d'uso, penso che il tuo miglior corso NON sia quello di usare Automake e costruire i tuoi Makefile. Altrimenti continuerai a cercare di costringere Automake a fare qualcosa per cui non è stato progettato, e presto lo odierai.

EDIT 2013/08/26: Si noti che un progetto di Automake utilizzando una sottodirectory denominata using obj/ is not portable a BSD make.

0

Il modo più semplice per farlo sarebbe impostare "libdir" nella directory in cui si desidera che questi file finiscano e utilizzare la destinazione di installazione per copiarli lì.

Ciò impedirebbe comunque di utilizzare il target di installazione nel senso convenzionale.

+0

Questo non è qualcosa che può essere ignorato tramite la riga di comando configure? –

Problemi correlati