2010-03-14 8 views
19

का उपयोग SCons मैं आसानी से सेट कर सकते हैं मेरी पथ शामिल है:मैं किस तरह निर्धारित SCons सिस्टम पथ में शामिल

env.Append(CPPPATH=['foo']) 

यह झंडा गुजरता

-Ifoo 

हालांकि मैं कोशिश कर रहा हूँ जीसीसी के लिए कई चेतावनियों को सक्षम करने के लिए संकलित करने के लिए।

env.Append(CPPFLAGS=['-Werror', '-Wall', '-Wextra']) 

जो कुछ बढ़ावा शामिल हैं पर बुरी तरह मर जाता है के साथ विशेष रूप से ... मैं बढ़ावा जोड़कर इसे ठीक कर सकते व्यवस्था करने के लिए भी शामिल है बल्कि जीसीसी व्यवहार करता है के रूप में शामिल पथ प्रणाली अलग ढंग से शामिल की तुलना में पथ शामिल करें।

तो क्या मैं -Ifoo के बजाय जीसीसी के लिए पारित करने के लिए की जरूरत है

-isystem foo 

मुझे लगता है मैं CPPFLAGS चर के साथ ऐसा कर सकता है, लेकिन अगर वहाँ SCons में बनाया गया एक बेहतर समाधान था सोच रहा था है।

उत्तर

12

पास सिस्टम में पास करने के लिए कोई अंतर्निहित तरीका नहीं है, मुख्य रूप से क्योंकि यह बहुत संकलक/मंच विशिष्ट है।

इसे CXXFLAGS में डालने से काम करेगा, लेकिन ध्यान दें कि यह हेडर्स को स्कैन के निर्भरता स्कैनर से छुपाएगा, जो केवल सीपीपीपीएटीएच को देखता है।

यह संभवतः ठीक है अगर आप उन शीर्षकों को कभी भी बदलने की उम्मीद नहीं करते हैं, लेकिन यदि आप बिल्ड परिणाम कैश और/या निहित निर्भरता कैश का उपयोग करते हैं तो अजीब समस्याएं पैदा कर सकती हैं।

+0

मेरी अपेक्षा की पुष्टि के लिए धन्यवाद (लेकिन उम्मीद गलत थी) –

+1

अच्छा जवाब लेकिन वास्तव में, मुझे विश्वास है कि यह एक अच्छी बात है कि उन लोगों को निर्भरता श्रृंखला से बाहर रखा गया है क्योंकि वे पूरी बिल्ड प्रक्रिया को धीमा कर देंगे वास्तविक लाभ बूस्ट हेडर बहुत सारे हैं और वे संभवतः बदल नहीं पाएंगे (और जब वे करते हैं, तो आप इसे जानते हैं और सबकुछ साफ करने का फैसला कर सकते हैं)। – ereOn

+1

दरअसल, "केवल पढ़ने के लिए" हेडर को छोड़कर आपके निर्माण को तेज़ करने का एक शानदार तरीका है। एक अच्छा अभ्यास यह सुनिश्चित करना है कि लाइब्रेरी संस्करण इसकी निर्देशिका पथ (यानी/foo/bar/boost/1.38/include) का हिस्सा है। इस तरह, बूस्ट संस्करण संख्या संकलन कमांड लाइनों पर दिखाई देती है। चूंकि स्कैन में इसके हस्ताक्षर में कमांड लाइन शामिल है, इसलिए कोई भी बढ़ावा अपग्रेड एक अलग निर्देशिका में उतरेगा, जिससे किसी भी मौजूदा निर्माण उत्पाद को अमान्य कर दिया जा सकेगा। यह विशेष रूप से बड़ी टीमों के लिए एक निर्माण कैश को और अधिक मजबूत बनाता है। – BenG

6

यदि आप करते हैं

print env.Dump() 

आप _CPPINCFLAGS देखेंगे, और आप CCCOM (या _CCCOMCOM) में प्रयोग किया जाता है कि चर देखेंगे। _CPPINCFLAGS आम तौर पर इस तरह दिखता है:

'$(${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' 

इस से आप शायद तुम कैसे _CPPSYSTEMINCFLAGS या कुछ इस तरह की तरह साथ ही एक "isystem" के सेट जोड़ सकते हैं शामिल हैं, देख सकते हैं। बस अपने स्वयं के उपसर्ग, पथ var नाम (उदा। CPPSYSTEMPATH) और प्रत्यय को परिभाषित करें और उपसर्ग को संयोजित करने के लिए उपरोक्त मुहावरे का उपयोग करें। फिर बस अपने _CPPSYSTEMINCFLAGS को सीसीसीओएम या _सीसी कॉमकॉम में संलग्न करें और आप जाएं।

बेशक यह सिस्टम-विशिष्ट है लेकिन आप सशर्त रूप से कंपाइलर कमांड लाइन में अपने नए चर को शामिल कर सकते हैं और जब चाहें।

2

the SCons release notes के अनुसार, "-सिस्टम" पर्यावरण के सीसीएफएलजीएस के लिए संस्करण 2.3.4 के बाद से समर्थित है।

तो, आप, उदाहरण के लिए, निम्न कर सकते हैं:

env.AppendUnique(CCFLAGS=('-isystem', '/your/path/to/boost')) 

फिर भी, आप सुनिश्चित करें कि आपके संकलक उस विकल्प का समर्थन करता है की जरूरत है।

+0

रिलीज नोट्स का कहना है कि पार्सफ्लैग अब पार्स-सिस्टम कर सकते हैं, जो निम्न कार्यों का अर्थ नहीं है। या तुमने कोशिश की? – bdbaddog

+0

मैंने कोशिश की और यह कम से कम 2.5.0 के साथ, मेरे लिए काम करता है। – LangerJan

+0

क्या कोई भी निर्भरता पेड़ में प्रदर्शित होती है (--tree = prune से आउटपुट)? या यदि आप ऊपर करते हैं तो वे छोड़े जाते हैं? – bdbaddog

0

@LangerJan और @BenG द्वारा प्रस्तावित विचार पर विस्तार ...यहाँ एक पूर्ण पार मंच उदाहरण (अपने विंडोज़ मंच की जाँच के साथ env['IS_WINDOWS'] की जगह)

from SCons.Util import is_List 
def enable_extlib_headers(env, include_paths): 
    """Enables C++ builders with current 'env' to include external headers 
    specified in the include_paths (list or string value). 
    Special treatment to avoid scanning these for changes and/or warnings. 
    This speeds up the C++-related build configuration. 
    """ 
    if not is_List(include_paths): 
     include_paths = [include_paths] 

    include_options = [] 
    if env['IS_WINDOWS']: 
     # Simply go around SCons scanners and add compiler options directly 
     include_options = ['-I' + p for p in include_paths] 
    else: 
     # Tag these includes as system, to avoid scanning them for dependencies, 
     # and make compiler ignore any warnings 
     for p in include_paths: 
      include_options.append('-isystem') 
      include_options.append(p) 
    env.Append(CXXFLAGS = include_options) 

है अब, जब बाहरी पुस्तकालयों के उपयोग को विन्यस्त, के बजाय

env.AppendUnique(CPPPATH=include_paths) 

कॉल

enable_extlib_headers(env, include_paths) 

मेरे मामले में यह छिद्रित निर्भरता पेड़ को कम करता है (जैसा कि --tree=prune के साथ उत्पादित किया गया है) लिनक्स पर 1000x और विंडोज़ पर 3000x! इसने 5-7x द्वारा नो-एक्शन बिल्ड टाइम (यानी सभी लक्ष्यों को अद्यतित) बढ़ाया। इस परिवर्तन से पहले छिद्रित निर्भरता पेड़ बूस्ट से 4 मिलियन था। यह पागलपन है।

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