2015-06-10 7 views
5

के साथ कंपाइलर-विशिष्ट झंडे कैसे सेट करें हम अपने निर्माण आधारभूत संरचना के रूप में ऑटोोटूल का उपयोग करते हैं, और हम कंपाइलर्स के रूप में क्लैंग और जीसीसी का उपयोग करते हैं। हाल ही में हमनेautotools

--param max-vartrack-size=100000000 

चुप्पी के लिए (पूरी तरह से जीसीसी के वार्ट्रैकिंग को अक्षम किए बिना) की आवश्यकता है। बजना उस विकल्प को स्वीकार नहीं करता और

argument unused during compilation: '--param max-vartrack-size=100000000' 

मौन करने के लिए है कि, बजना जरूरत

-Qunused-arguments 

उत्पादन और है कि जीसीसी के तहत एक त्रुटि पैदा करता है:

unrecognized command line option ‘-Qunused-arguments’ 
  1. क्या है configure.ac में कंपाइलर-विशिष्ट झंडे को परिभाषित करने का सबसे अच्छा तरीका, एक कंपाइलर के साथ चुना गया है, उदाहरण के लिए AC_PROG_CXX? हम AC_SUBST(AM_CXXFLAGS) तो मुझे लगता है कि मैं AM_CXXFLAGS के भीतर एक कंपाइलर विशिष्ट चर का विस्तार कर रहा हूं।

  2. Makefile.am में प्रति-लक्ष्य विकल्प को केवल एक संकलक के लिए सक्षम करने का सही तरीका क्या है? मैं सोच रहा हूँ:

    if HAVE_GCC 
        SPECIFIC_CXXFLAGS = --param... 
    endif 
    if HAVE_CLANG 
        SPECIFIC_CXXFLAGS = -Q... 
    endif 
    libfoo_la_CXXFLAGS = $(AM_CXXFLAGS) $(SPECIFIC_CXXFLAGS) 
    

लेकिन मैं HAVE_* वार्स configure.ac से subst'ed आवश्यकता होगी। क्या AC_PROG_CXX/CC शायद पहले से ही इस तरह कुछ परिभाषित करता है?

उत्तर

2

AM_CXXFLAGS ऐसा कुछ नहीं है जो आपको AC_SUBST करना चाहिए। यह automake द्वारा उपयोग के लिए आरक्षित है। यदि आप C12+ लक्ष्य के लिए Makefile जेनरेट करते हैं, तो आपको CXXCOMPILE और LTCXXCOMPILE के लिए परिभाषाएं मिलेंगी, जिसमें हमेशा AM_CXXFLAGS चर शामिल है।

आप AM_CXXFLAGS या libfoo_la_CXXFLAGS पर (सशर्त) कंपाइलर ध्वज जोड़ना चाहते हैं। पूर्व सभी सी ++ संकलनों को प्रभावित करेगा, और बाद वाले प्रति-पुस्तकालय संकलन। तो यह सिर्फ SPECIFIC_CXXFLAGSconfigure.ac में प्राप्त करने का मामला है।

AC_PROG_CXX 
... 
FOO_SPECIFIC_CXXFLAGS=; 
if `$CXX -v 2>&1 | grep 'gcc version' >/dev/null 2>&1` ; then 
    FOO_SPECIFIC_CXXFLAGS="--param max-vartrack-size=100000000" 
fi 

AC_SUBST(FOO_SPECIFIC_CXXFLAGS, $FOO_SPECIFIC_CXXFLAGS) 

GXX परीक्षण अपर्याप्त है के रूप में autoconf सिर्फ __GNUC__ मैक्रो (AFAIK) के लिए परीक्षण, इसलिए बजना ++ सेट हो जाएगा: GXX=yes

समस्या है, वहाँ आदेश पंक्ति विकल्प का पता लगाने के लिए एक पोर्टेबल तरीका नहीं है जो अज्ञात हैं। इंटेल का icc -v भी gcc version स्ट्रिंग का पुनरुत्पादन करेगा।तो अगर आप की तरह, एक और फिल्टर जोड़ने के लिए हो सकता है: | grep -v 'icc'

आप वैकल्पिक रूप से जांच कर सकता है कि झंडा काम करता है के रूप में AC_SUBST पहले विज्ञापन कर, लेकिन यह वास्तव में मदद नहीं करता है, तो संकलक केवल एक चेतावनी उत्पन्न करता है:

saved_CXXFLAGS="$CXXFLAGS" 
CXXFLAGS="$CXXFLAGS $FOO_SPECIFIC_CXXFLAGS" 

AC_LANG_PUSH([C++]) 
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])],,[FOO_SPECIFIC_CXXFLAGS=;]) 
AC_LANG_POP([C++]) 
CXXFLAGS="$saved_CXXFLAGS" 
या

AM_CXXFLAGS = $(FOO_SPECIFIC_CXXFLAGS) 

:

फिर Makefile.am में

libfoo_la_CXXFLAGS = $(FOO_SPECIFIC_CXXFLAGS) 
+0

मैं आपके बयान से परेशान हूं कि किसी को 'AC_SUBST' 'AM_CXXFLAGS' नहीं होना चाहिए। हाथ से सभी 15ish 'Makefile.am' में 'AM_CXXFLAGS' सेट करने से अलग कैसे है? 'AC_SUBST'ing' AM_CXXFLAGS' पूरी परियोजना के लिए डिफ़ॉल्ट रूप से चेतावनियां सक्षम करने या जीसीसी 5.1 के साथ पुराने एबीआई को चुनने जैसी चीजों के लिए एकदम सही समाधान है (जो सभी ऑब्जेक्ट्स के लिए समान होना आवश्यक है)। 'Makefile.am' में से प्रत्येक में 'AM_CXXFLAGS' सेट करने से कम, मैं इसे और कैसे प्राप्त करूं? – Irfy

+0

मैंने अपने 'grep' चेक के समतुल्य सशर्त परीक्षण के साथ अपने config.ac,' HAVE_GCC' और 'HAVE_CLANG' में दो' AM_CONDITIONAL को जोड़ने का विकल्प चुना। धन्यवाद! – Irfy

+0

@Irfy - यही है 'CXXFLAGS' के लिए है। आप 'CXXFLAGS' के माध्यम से 'कॉन्फ़िगरेशन' पर कंपाइलर विशिष्ट झंडे पास कर सकते हैं, या' config.ac' में 'CXXFLAGS' झंडे को जोड़/संशोधित कर सकते हैं। यह चर C++ निर्माण नियमों में भी शामिल है। –

2

अगर कुछ झंडा एक त्रुटि उत्पन्न करता है तो यह पता लगाने के लिए कि एमसीएल इस ध्वज का समर्थन करता है, एम 4 मैक्रो लिखना आसान है।

autoconf संग्रह से ax_check_compile_flag जांचें।

+0

मुझे यकीन है कि यह करने के लिए यह सही * तरीका है, लेकिन चूंकि यह एक आंतरिक प्रोजेक्ट है, वितरित नहीं किया गया है, इसलिए मैंने सबसे सरल चीज़ का चयन किया, जो कि दो 'AM_CONDITIONAL' हो गया। – Irfy

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