2008-11-27 15 views
17

मेरे पास कई स्रोत निर्देशिकाओं वाला एक प्रोजेक्ट है:Autotools: वैश्विक संकलन ध्वज कैसे सेट करें

src/A 
    /B 
    /C 

प्रत्येक में, Makefile.am में

AM_CXXFLAGS = -fPIC -Wall -Wextra 

प्रत्येक स्रोत फ़ोल्डर में इसे दोहराने से कैसे बच सकता है?

मैंने srcifiy src/makefile.am और config.in को संशोधित करने की कोशिश की, लेकिन सफलता के बिना। मैंने सोचा कि मैं वैश्विक स्तर पर संकलन झंडे सेट करने के लिए AC_PROG_CXX का उपयोग कर सकता हूं लेकिन उन मैक्रो का उपयोग करने के तरीके पर अधिक दस्तावेज नहीं मिल सकता है (क्या आपके पास ऐसे दस्तावेज के लिए कोई सूचक है?)।

अग्रिम

में धन्यवाद

उत्तर

23

आप कई बातें कर सकते हैं:

(1) एक समाधान अपने सभी Makefile.am रों पर एक आम makefile टुकड़ा शामिल करने के लिए है: उस मामले में

include $(top_srcdir)/common.mk 
... 
bin_PROGRAMS = foo 
foo_SOURCES = ... 

आप

AM_CXXFLAGS = -fpic -Wall -Wextra 

लिखते थे common.mk को और भविष्य में इस फ़ाइल को संपादित करके सभी Makefile.am के लिए अधिक मैक्रोज़ या नियम जोड़ना आसान हो जाएगा।

(2) एक अन्य समाधान अपने configure.ac में विश्व स्तर पर इन चरों स्थापित करने के लिए (नाम configure.in बहुत पहले पदावनत किया गया है) के रूप में में, होगा:

... 
AC_SUBST([AM_CXXFLAGS], [-fpic -Wall -Wextra]) 
... 

तो फिर तुम भी कुछ भी कहने के लिए नहीं है आपके Makefile.am एस में, वे स्वचालित रूप से इस वैश्विक परिभाषा का उत्तराधिकारी हैं। दोष यह है कि आप आसानी से ऑप्ट-आउट नहीं कर सकते हैं (पहले समाधान के साथ common.mk शामिल न करने का निर्णय लेना आसान है) और निर्भरता तीसरे पक्ष के लोगों के लिए वास्तव में स्पष्ट नहीं है (जब वे Makefile.am पढ़ते हैं तो उनके पास कोई संकेत नहीं है झंडे से आ सकते हैं)।

(3) एक तीसरा समाधान orsogufo के रूप में करना होगा सुझाव दिया गया है: configure.ac में उपयोगकर्ता चर CXXFLAGS को ओवरराइट करना। मैं इसके खिलाफ सलाह दूंगा, क्योंकि यह जीएनयू बिल्ड सिस्टम की विशेषताओं में से एक को हरा देता है: उपयोगकर्ताओं को इस चर को make-टाइम पर ओवरराइड करने की अनुमति है। उदाहरण के लिए आप जब कोड का एक टुकड़ा डिबगिंग टाइप करने के लिए

make CXXFLAGS='-O0 -ggdb' 

चाहते हो सकता है, और इस CXXFLAGS के किसी भी परिभाषा (लेकिन नहीं उन AM_CXXFLAGS में) ऊपर लिख देगा। ईमानदार होने के लिए, अधिकांश परियोजनाएं इसे सही तरीके से समर्थन करने में विफल होती हैं क्योंकि वे CXXFLAGS के साथ चालें बजाती हैं।

अंत में, मुझे यह उल्लेख करना चाहिए कि -fpic, -Wall, और -Werror पोर्टेबल विकल्प नहीं हैं। अपनी प्रोजेक्ट के दायरे के आधार पर आप इन (gnulib ने चेतावनी झंडे के परीक्षणों के लिए हाल ही में अधिग्रहित नए मैक्रोज़ के लिए कॉन्फ़िगरेशन चेक जोड़ना चाहेंगे, और libtool साझा पुस्तकालयों के निर्माण के लिए उपयोग किया जा सकता है)।

+0

Makefile.am में मुहावरा शामिल का उपयोग Makefile और Makefile.in के लिए उत्पादन निर्भरता के कारण automake कि अंततः को वापस पाने के कर देगा फ़ाइल और automake फ़ाइल शामिल थे। तो इसे बदलने से बाद में अपडेट भी हो जाएंगे। – johnny

+1

यदि आप ध्वज AC_SUBST करते हैं तो यह वास्तव में ऑप्ट आउट करना बहुत आसान है। Makefile.am में, यदि आप AM_CPPFLAGS असाइन करते हैं, तो वे ओवरराइड करते हैं। आप कुछ भी नहीं कर सकते हैं, या AM_CPPFLAGS = @ AM_CPPFLAGS @ ... करके, या असाइनमेंट में @ AM_CPPFLAGS @ डालकर ऑप्ट आउट कर सकते हैं। –

+1

चेतावनी झंडे सीपीपीएफएलजीएस में आपके जैसा दावा नहीं करते हैं, क्योंकि वे प्री-प्रोसेसर के विपरीत कंपाइलर द्वारा उपयोग किए जाते हैं। – kusma

0

कॉन्फ़िगरेशन में EXTRA_CFLAGS का उपयोग करें।एसी

अपने मामले के लिए उदाहरण के लिए यह इस होगा:

EXTRA_CFLAGS=-fPIC -Wall -Wextra

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