2009-06-18 14 views
6

Amacım, tüm nesne dosyalarını Makefile'nin kökü yerine bir .objs dizininde yerleşik olarak bulundurmak ve projenin bin/ dizinine kopyalanan ikili dosyaları (ve kitaplıkları) bulundurmaktır . Ama bunu nasıl yapacağımı açıklayacak herhangi bir kaynak bulamadım. Bunu yapmak için nasıl giderim?Autotools kütüphanesi ve nesne dosyası çıktı kontrolü

Burada benim configure.ac ve src/Makefile.am var. - Başvurulan iki paylaşılan kitaplık için benzer Makefile.am dosyalarına sahibim. Onlar derlemek ve gerektiği gibi bin/ dizin çalışmalarına kopyalayarak sonra. Sadece bu süreci otomatikleştirmek istiyorum.

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 

Yani, sorum (her Makefile derleme sonuçları için I çıkış dizinleri belirtmek için nasıl onları bin/ kopyalanacak ve nesne dosyaları için her yanlısı obj olmak isteyen Makefile'nin kökü yerine ject. Yardım için

Teşekkür bugüne kadar .. Bu web sitesi büyük bir kaynak olmuştur ve zaten sağlanan bağlantılardan çok şey öğrendik.

cevap

10

GNU Autotools bunu destekleyecek şekilde tasarlanmamıştır yüzden Sistemi, obj/ dizinleri kullanmaz oluşturun.

Ancak bu geçici bir çözüm için iki yoldan düşünebilirsiniz.

bir yükleyici olarak, Sonra herhangi çıktı dosyası builddir/ dizinde oluşturulur

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

yazarak kaynak dizininin dışında herhangi bir paket oluşturabilirsiniz. Bu derleme şeması dışarı salt okunur dizinde saklanan kaynak kodunu derlemek mümkün kılar (bu geri FSF sıkıştırılmamış kaynak koduyla CD'si dağıtırken yıllarda daha mantıklı) veya değişik ayarları ile aynı kaynağı derlemeye (hatta için farklı mimariler). Bir paketleyicisine olarak

, sen obj/ her şeyi inşa etmek paketinizi zorlamak tek yolu senin Makefile.am obj/ koymak ve orada tüm yapı kurallarını bildirmektir. Ben 10 yıl önce, Palm OS Emulator yukarıdaki gibi bir kurulum kullanıyordum POSE unutmayın vb

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

: Bu obj/Makefile.am benzeyen anlamına gelecektir. Gerçekten bakılabilir olmadığından tavsiye etmem. Araçların felsefesine sadık kalmak ve diğer GNU paketleri gibi çalışan bir sistem kurmak çok daha iyi.GNU hakkında bir tanıtım için

Ben Automake kılavuzun girişi okumanızı öneririz Yapı Sistemi: http://www.gnu.org/software/automake/manual/automake.html#GNU-Build-System

Özellikle kullanım-cases bölümü. Bu kullanım durumlarını umursamıyorsanız, en iyi yolun Automake'yi KULLANMADAN ve kendi Makefillerinizi oluşturmamanız gerektiğini düşünüyorum. Aksi takdirde, Automake'nin tasarlanmadığı bir şey yapmasını zorlamaya devam edecek ve sizden hızla nefret edeceksiniz.

EDIT 2013-08-26: BSD'ye using obj/ is not portable adlı bir alt dizini kullanan bir Automake projesinin yapıldığını unutmayın.

0

Eğer bu dosyalar sona istediğiniz dizine "libdir" olarak ayarlayın ve onları orada kopyalamak için yüklemek hedefi kullanmak olacaktır Bunu yapmanın en kolay yolu.

Bu olsa geleneksel anlamda yüklemek hedef kullanmanızı engelleyecektir.

+0

Yapılandırma komut satırı aracılığıyla geçersiz kılınabilecek bir şey değil mi? –