2009-06-18 23 views
6

मेरा लक्ष्य मेकफ़ाइल की जड़ की बजाय .objs निर्देशिका में निर्मित सभी ऑब्जेक्ट फ़ाइलों को रखना है और प्रोजेक्ट के बिन/ निर्देशिका में बाइनरी (और लाइब्रेरीज़) की प्रतिलिपि बनाने के लिए है । लेकिन मैं यह समझाने के लिए कोई संसाधन नहीं ढूंढ पाया कि यह कैसे करें। मैं ऐसा कैसे कर पाऊंगा?ऑटोटूल लाइब्रेरी और ऑब्जेक्ट फ़ाइल आउटपुट कंट्रोल

यहां मेरा config.ac और src/Makefile.am - मेरे पास दो साझा पुस्तकालयों के लिए समान Makefile.am फ़ाइलें हैं जिन्हें संदर्भित किया गया है। वे संकलित करते हैं, और बिन/ निर्देशिका कार्य को कॉपी करने के बाद उन्हें काम करते हैं। मैं बस इस प्रक्रिया को स्वचालित करने के लिए देख रहा हूँ।

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 

तो, मेरे सवाल (मैं प्रत्येक Makefile का संकलन परिणामों के लिए उत्पादन निर्देशिकाओं को निर्दिष्ट करने के लिए कैसे है उन्हें बिन/ पर कॉपी करने की इच्छा है, और ऑब्जेक्ट फ़ाइलों के लिए में .obj प्रत्येक प्रो के लिए मेकफ़ाइल की जड़ में इसके बजाय ject।

इस प्रकार सहायता के लिए धन्यवाद .. यह वेबसाइट एक महान संसाधन रहा है, और मैंने पहले से दिए गए लिंक से बहुत कुछ सीखा है।

उत्तर

10

जीएनयू बिल्ड सिस्टम obj/ निर्देशिकाओं का उपयोग नहीं करता है, इसलिए ऑटोोटूल को इसका समर्थन करने के लिए डिज़ाइन नहीं किया गया है।

हालांकि मैं इसके आसपास काम करने के दो तरीकों के बारे में सोच सकता हूं।

एक इंस्टॉलर के रूप में, आप

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

तो किसी भी आउटपुट फ़ाइल builddir/ निर्देशिका में बनाया जाएगा टाइप करके अपने स्रोत निर्देशिका से बाहर किसी भी पैकेज बना सकते हैं। यह संकलन योजना एक पाठक निर्देशिका में संग्रहीत स्रोत कोड को संकलित करना संभव बनाता है (यह उन वर्षों में अधिक समझ में आया है जहां एफएसएफ असंपीड़ित स्रोत कोड के साथ सीडी वितरित कर रहा था), या अलग स्रोतों के साथ उसी स्रोत को संकलित करने के लिए (या यहां तक ​​कि विभिन्न वास्तुकला)।

एक बंडल के रूप में, एक ही रास्ता आप obj/ में सब कुछ का निर्माण करने के लिए अपने पैकेज के लिए मजबूर कर सकता है आपके obj/ में Makefile.am रखा, और वहाँ अपने सभी निर्माण नियमों की घोषणा करने के लिए है। इसका मतलब यह होगा एक 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 साल पहले, मुद्रा, पाम ओएस एम्यूलेटर, ऊपर की तरह एक सेटअप का उपयोग किया गया था। मैं इसकी अनुशंसा नहीं करता क्योंकि यह वास्तव में रखरखाव योग्य नहीं है। उपकरण के दर्शन के साथ रहना वाकई बेहतर है, और अन्य जीएनयू पैकेजों की तरह काम करने वाली बिल्ड सिस्टम का उपयोग करना बेहतर है।

जीएनयू के परिचय के लिए बिल्ड सिस्टम, मैं Automake मैनुअल की शुरूआत पढ़ने की सलाह देते: http://www.gnu.org/software/automake/manual/automake.html#GNU-Build-System

विशेष रूप से उपयोग-मामले अनुभाग। यदि आप इन उपयोग मामलों के बारे में परवाह नहीं करते हैं, तो मुझे लगता है कि आपका सबसे अच्छा कोर्स ऑटोमैक का उपयोग नहीं करना है, और अपनी खुद की मेकफ़ाइल बनाएं। अन्यथा आप ऑटोमैक को कुछ ऐसा करने के लिए मजबूर करने की कोशिश करते रहेंगे जो इसे डिजाइन नहीं किया गया है, और आप इसे जल्दी से नफरत करेंगे।

संपादित करें 2013-08-26: ध्यान दें कि बीएसडी में using obj/ is not portable नामक एक उपनिर्देशिका का उपयोग कर ऑटोमैक प्रोजेक्ट।

0

ऐसा करने का सबसे आसान तरीका निर्देशिका में "libdir" सेट करना होगा, जिसे आप इन फ़ाइलों को समाप्त करना चाहते हैं, और उन्हें कॉपी करने के लिए इंस्टॉल लक्ष्य का उपयोग करें।

यह आपको परंपरागत अर्थ में इंस्टॉल लक्ष्य का उपयोग करने से रोक देगा।

+0

यह ऐसा कुछ नहीं है जिसे कॉन्फ़िगर कमांड लाइन के माध्यम से ओवरराइड किया जा सके? –