मैं एक सी ++ परियोजना autoconf
& automake
का उपयोग करता है पर काम कर रहा हूँ के साथ पथ शामिल सेट करने का तरीका है, और मैं सही ढंग से *CPPFLAGS
में शामिल रास्तों की स्थापना के लिए संघर्ष कर रहा हूँ। मैंने लगभग 3 घंटे के दस्तावेजों को पढ़ा है, और मैं इसे अभी तक नहीं समझ सकता। मैं एक हैक की तलाश नहीं कर रहा हूं, लेकिन ऐसा करने के सही तरीके से। यहाँ मेरा conundrum है।autotools
- बाहरी पुस्तकालयों कि मेरे पैकेज है, जो
configure --with-XXX=<PATH>
से कॉन्फ़िगर किया गया है के साथ स्थापित किया जाना चाहिए:जैसा कि मैंने इसे देख, वहाँ के लिए 3 पूरी तरह से अलग स्रोत पथ शामिल हैं।
- मेरे पैकेज में, कुछ स्रोत फ़ाइलें
#include <file.h>
का उपयोग करती हैं, भले हीfile.h
पैकेज का हिस्सा है, इसलिए उन्हें संकलित करने के लिए, मुझे पथ को सही तरीके से सेट करना होगा। (ध्यान दें, यह इन सभी फ़ाइलों को संपादित करने का विकल्प नहीं है।) - सनकी (या नहीं) मानक निर्दिष्ट करते हैं कि उपयोगकर्ता को अपने स्वयं के (अतिरिक्त) पथ निर्दिष्ट करने की अनुमति दी जानी चाहिए। यही है, मुझे
CPPFLAGS
बिल्कुल सेट नहीं करना चाहिए।
मेरे वर्तमान सेटअप में:
- प्रकार 1 रास्तों
AC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>")
द्वाराconfigure.ac
अंदर स्थापित कर रहे हैं। - टाइप 2 पथ
Makefile.am
test_CPPFLAGS = -I<path>
के अंदर सेट हैं। - टाइप 3 सेट नहीं किया जा सकता है। अधिक सटीक, यदि उपयोगकर्ता चलाने से पहले
CPPFLAGS
सेट करता है, तो यह टाइप 1 सेटिंग्स को ओवरराइड करता है, जिससे संकलन विफल हो जाता है। बेशक, उपयोगकर्ता इसके बजायCXXFLAGS
का उपयोग करने का प्रयास कर सकता है, लेकिन उसमें एक अलग उपयोग है (याद रखें, मैं ऐसा करने का सही तरीका पूछ रहा हूं, एक हैक नहीं)।
मैं टाइप 1 रास्तों AM_CPPFLAGS
configure.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
संपादित करना है? क्या कोई और "सही" समाधान है?
"सनकी" द्वारा, क्या आप आधिकारिक ऑटोकॉन्फ दस्तावेज शामिल करते हैं जो स्पष्ट रूप से बताता है कि CPPFLAGS एक उपयोगकर्ता चर को रखरखाव द्वारा संशोधित नहीं किया जाना चाहिए? (Http://www.gnu.org/software/autoconf/manual/autoconf.html पर अनुभाग 4.8.1 देखें) –
हालांकि आधिकारिक ऑटोमैट दस्तावेज़ से कम अस्पष्ट उदाहरण स्पष्ट हो सकता है, जो कहता है "आपको कभी भी फिर से परिभाषित नहीं करना चाहिए उपयोगकर्ता चर जैसे MakePile.am में CPPFLAGS। " अनुभाग 27.6 में http://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html#Flag-Variables- ऑर्डर –