2013-11-27 10 views
8

मैं एक सी ++ परियोजना autoconf & automake का उपयोग करता है पर काम कर रहा हूँ के साथ पथ शामिल सेट करने का तरीका है, और मैं सही ढंग से *CPPFLAGS में शामिल रास्तों की स्थापना के लिए संघर्ष कर रहा हूँ। मैंने लगभग 3 घंटे के दस्तावेजों को पढ़ा है, और मैं इसे अभी तक नहीं समझ सकता। मैं एक हैक की तलाश नहीं कर रहा हूं, लेकिन ऐसा करने के सही तरीके से। यहाँ मेरा conundrum है।autotools

  1. बाहरी पुस्तकालयों कि मेरे पैकेज है, जो configure --with-XXX=<PATH> से कॉन्फ़िगर किया गया है के साथ स्थापित किया जाना चाहिए:

    जैसा कि मैंने इसे देख, वहाँ के लिए 3 पूरी तरह से अलग स्रोत पथ शामिल हैं।

  2. मेरे पैकेज में, कुछ स्रोत फ़ाइलें #include <file.h> का उपयोग करती हैं, भले ही file.h पैकेज का हिस्सा है, इसलिए उन्हें संकलित करने के लिए, मुझे पथ को सही तरीके से सेट करना होगा। (ध्यान दें, यह इन सभी फ़ाइलों को संपादित करने का विकल्प नहीं है।)
  3. सनकी (या नहीं) मानक निर्दिष्ट करते हैं कि उपयोगकर्ता को अपने स्वयं के (अतिरिक्त) पथ निर्दिष्ट करने की अनुमति दी जानी चाहिए। यही है, मुझे CPPFLAGS बिल्कुल सेट नहीं करना चाहिए।

मेरे वर्तमान सेटअप में:

  • प्रकार 1 रास्तों AC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>") द्वारा configure.ac अंदर स्थापित कर रहे हैं।
  • टाइप 2 पथ Makefile.amtest_CPPFLAGS = -I<path> के अंदर सेट हैं।
  • टाइप 3 सेट नहीं किया जा सकता है। अधिक सटीक, यदि उपयोगकर्ता चलाने से पहले CPPFLAGS सेट करता है, तो यह टाइप 1 सेटिंग्स को ओवरराइड करता है, जिससे संकलन विफल हो जाता है। बेशक, उपयोगकर्ता इसके बजाय CXXFLAGS का उपयोग करने का प्रयास कर सकता है, लेकिन उसमें एक अलग उपयोग है (याद रखें, मैं ऐसा करने का सही तरीका पूछ रहा हूं, एक हैक नहीं)।

मैं टाइप 1 रास्तों AM_CPPFLAGSconfigure.ac अंदर का उपयोग कर की स्थापना करके इसे ठीक करने की कोशिश की। (संदर्भ के लिए: यदि आप CPPFLAGS के बजाय AM_CPPFLAGS सेट करते हैं, लेकिन आपको अभी भी AC_CHECK_HEADERS जैसे कुछ चेक चलाने की आवश्यकता है, तो आपको अस्थायी रूप से CPPFLAGS सेट करने की आवश्यकता है और फिर चेक को काम करने के लिए इसे वापस करने की आवश्यकता है; यह here समझाया गया है।) यह CPPFLAGS को मुक्त करता है टाइप 3 पथों के लिए, लेकिन दुर्भाग्य से संकलन विफल रहता है क्योंकि Makefile -s जो configure द्वारा उत्पादित हो जाता है, केवल AM_CPPFLAGS का उपयोग करेगा यदि कोई विशेष <target>_CPPFLAGS मौजूद नहीं है। इसलिए, test_CPPFLAGS टाइप 2 पथ के साथ मौजूद है, test संकलित करना विफल हो जाएगा क्योंकि इसे टाइप 1 पथ नहीं मिलता है।

Makefile.am के अंदर हमेशा एक 0xका उपयोग करने के लिए निर्दिष्ट करना होगा। लेकिन क्या यह "पुस्तक द्वारा" है? क्या मैं इसे वैश्विक तरीके से कर सकता हूं, या क्या मुझे हर target_CPPFLAGS संपादित करना है? क्या कोई और "सही" समाधान है?

+0

"सनकी" द्वारा, क्या आप आधिकारिक ऑटोकॉन्फ दस्तावेज शामिल करते हैं जो स्पष्ट रूप से बताता है कि CPPFLAGS एक उपयोगकर्ता चर को रखरखाव द्वारा संशोधित नहीं किया जाना चाहिए? (Http://www.gnu.org/software/autoconf/manual/autoconf.html पर अनुभाग 4.8.1 देखें) –

+0

हालांकि आधिकारिक ऑटोमैट दस्तावेज़ से कम अस्पष्ट उदाहरण स्पष्ट हो सकता है, जो कहता है "आपको कभी भी फिर से परिभाषित नहीं करना चाहिए उपयोगकर्ता चर जैसे MakePile.am में CPPFLAGS। " अनुभाग 27.6 में http://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html#Flag-Variables- ऑर्डर –

उत्तर

18

मुझे पता है ऑटोटूल मैनुअल से सीधे जवाब प्राप्त करना मुश्किल है। here और here के कुछ अच्छे स्टार्ट-टू-फिनिश ट्यूटोरियल हैं।

ऑटोकॉन्फ़ में पैकेज-विशिष्ट *CPPFLAGS के लिए मानक चर नहीं है। configure को CPPFLAGS=... के साथ बुलाया जा सकता है, और automake प्रासंगिक मेकफ़ाइल नियमों में CPPFLAGS जोड़ देगा - उदाहरण के लिए Makefile.in फ़ाइल में CPPFLAGS के लिए खोजें।इसी कारण से, मेरा सुझाव है कि आप किसी अन्य चीज़ के लिए इस चर का उपयोग करें।

Makefile.am में AM_CPPFLAGS परिवर्तनीय (सभी प्रीप्रोसेसर कॉल के लिए डिफ़ॉल्ट) में झंडे जोड़ें या target_CPPFLAGS के साथ व्यक्तिगत प्रीप्रोसेसर झंडे को ओवरराइड करें। एक 3 पार्टी पुस्तकालय के उदाहरण में, यह की तरह एक नाम का उपयोग करने के लिए सबसे अच्छा है: FOO_CPPFLAGS, पूर्वप्रक्रमक विकल्पों, जैसे धारण करने के लिए

FOO_CPPFLAGS="-I${FOO_DIR}/include -DFOO_BAR=1" 
... 
AC_SUBST(FOO_CPPFLAGS) 

और में Makefile.am:

AM_CPPFLAGS = -I$(top_srcdir) $(FOO_CPPFLAGS) 
# or: 
target_CPPFLAGS = -I$(top_srcdir) $(FOO_CPPFLAGS) 

top_srcdir चर द्वारा परिभाषित किया गया है configure - मैं दूसरे मामले को चित्रित करने के लिए इसका उपयोग करता हूं। आइए मान लें कि आपके पास file.h शीर्ष निर्देशिका स्तर के तहत other है। -I$(top_srcdir) आपको इसे <other/file.h> के रूप में शामिल करने की अनुमति देता है। वैकल्पिक रूप से, -I$(top_srcdir)/other आपको इसे <file.h> के रूप में शामिल करने की अनुमति देगा। वर्तमान निर्देशिका -

एक अन्य उपयोगी preset variablesrcdir है। -I$(srcdir)में डिफ़ॉल्ट रूप से जोड़ा गया है। तो यदि file.h वर्तमान निर्देशिका में है तो आप इसे <file.h> या यहां तक ​​कि "file.h" के साथ भी शामिल कर सकते हैं। यदि other एक 'भाई' निर्देशिका थी, -I$(srcdir)/.. आपको <other/file.h>, और -I$(srcdir)/../other शामिल करने की अनुमति देगा <file.h> की अनुमति देगा।


मैं भी जोड़ना होगा कि कुछ संकुल एक pkg-config .pc फ़ाइल स्थापित करें। बशर्ते पीकेजी-कॉन्फ़िगरेशन की स्थापना सही निर्देशिकाओं को खोजने के लिए सेट की गई है, तो आपको PKG_CHECK_MODULES मैक्रो बहुत उपयोगी मिल सकता है।

+2

दूसरा '$ (builddir) 'या' $ (top_builddir) है 'जिसका निर्माण किसी भवन के दौरान उत्पन्न होने वाली किसी भी फाइल के लिए किया जाना है। – CMCDragonkai

संबंधित मुद्दे