2013-05-04 10 views
5

मैं निम्नलिखित (मैं बहुत आम सोचा होगा) निर्देशिका पदानुक्रम के साथ वाला ऐप के साथ src/निर्देशिका के सापेक्ष:बिल्डिंग SCons

/src 
    subdir1/ # Subdirs with more source files. 
     more.c 
     SConscript 
    foo.c  # Source files. 
    foo.h 
    SConscript 
/other  # Other top-level directories with no source code. 
/stuff  # However, there are other assets I may want to build. 
README  # Other top-level files. 
SConstruct 

समस्या यह है कि जब मैं शीर्ष स्तर की डायरेक्टरी से scons चलाने , यह src में cd आईएनजी बिना कि निर्देशिका से gcc कहता है, इस तरह:

0:

gcc -o src/foo.o src/foo.c 

ऐसा कई कारणों से समस्याग्रस्त है

  1. मेरे प्रोग्राम के भीतर, फाइलें src निर्देशिका से संबंधित पथ दे रही हैं। उदाहरण के लिए, more.c में foo.h#include "foo.h" के साथ शामिल हो सकता है। यह विफल रहता है क्योंकि जीसीसी मूल निर्देशिका से चलाया जाता है। मैं अपने शामिल को #include "src/foo.h" में बदलना नहीं चाहता हूं।
  2. मैं लॉगिंग जैसी चीजों के लिए __FILE__ विशेष मैक्रो का उपयोग करता हूं। जब शीर्ष-स्तरीय निर्देशिका से बनाया गया है, तो जीसीसी सभी फाइलनामों के सामने "src/" रखता है, क्योंकि यह संकलन करने के लिए दिया गया पथ था। यह picky प्रतीत हो सकता है, लेकिन मुझे यह नहीं चाहिए, क्योंकि मैं src निर्देशिका के सापेक्ष होने के नाते अपने स्रोत पेड़ के बारे में सोचता हूं।

(संपादित:। मुझे लगता है कि स्पष्ट रूप से # 1 जीसीसी के लिए एक ध्वज के रूप में -Isrc जोड़कर तय किया जा सकता है जोड़ना चाहिए, लेकिन यह मुख्य मुद्दा भर में और अधिक हैक्स की तरह लगता है)

मैं कैसे कर सकते हैं gcc पर कॉल करने से पहले src निर्देशिका में स्कैन cd?

  • मैं src निर्देशिका से छुटकारा और सब कुछ ऊपर ले जाएँ, क्योंकि वहाँ शीर्ष स्तर पर अन्य (गैर कोड) फ़ाइलों के बहुत सारे हैं करने के लिए नहीं चाहते।
  • मैं नहीं चाहता कि स्कैन cd प्रत्येक उपनिर्देशिका में। यह cdsrc में होना चाहिए और फिर वहां से पदानुक्रम में सभी फाइलें बनाना चाहिए।
  • src निर्देशिका के अंदर SConscript को स्थानांतरित करके और इसे वहां से चलाकर, इसे शीर्ष स्तर पर Makefile का उपयोग करके हल कर सकता है। लेकिन यह काफी हैकी लगता है, और मैं src की तुलना में अन्य निर्देशिकाओं में निर्माण (गैर-कोड) संपत्तियों के निर्माण के लिए स्कैन का उपयोग करना चाहता हूं।

मैंने पढ़ा है कि आप एक कस्टम Builder बना सकते हैं और इसे निर्देशिका बदल सकते हैं। हालांकि, मैं सी/सी ++ के लिए एक नया नया Builder लिखना नहीं चाहता हूं। स्क्रैच से लिखने के बिना मौजूदा बिल्डर के व्यवहार को संशोधित करने का कोई तरीका है? इसके अलावा, एक मंच पर, किसी ने कहा कि Builder के भीतर से निर्देशिका बदलना समानांतर बिल्ड तोड़ देगा क्योंकि यह उस निर्देशिका को बदल देगा जो अन्य कार्यों से बना है। क्या ये सच है?

+0

यह मैं क्या मेरी समस्या के लिए चाहते हैं की तरह साथ ही लगता है: इस बात की पुष्टि के लिए https://stackoverflow.com/questions/45519577/scons-link-program-without-build-directory-in-link-path –

उत्तर

3

यह व्यवहार स्कैन काम करता है, और इससे बचने/बदलने के लिए यह संभव नहीं है। मैं अपने समर्थन में कुछ सहायक दस्तावेज ढूंढ रहा हूं, और किसी को भी मिला है। इसका सिर्फ कुछ ही उपयोग किया जाता है।

जैसा कि आप उल्लेख करते हैं, पथ शामिल करने के लिए सरल हैं। कठिन हिस्सा __FILE__ मैक्रो है। जब तक आपने इसका उल्लेख नहीं किया तब तक मैंने कभी यह नहीं देखा था।दुर्भाग्य से, मुझे लगता है कि इसके चारों ओर एकमात्र तरीका लॉगर में पथ को पट्टी करना है, जो बदसूरत फिक्स है।

+0

धन्यवाद मेरे संदेह खैर, मैंने अपने लॉगर को अपडेट किया है ताकि यह पूरे पथ को बाहर कर सके, और केवल फ़ाइल नाम दिखाता है (यह शायद वैसे भी बेहतर है, क्योंकि लॉग बहुत साफ दिखते हैं और यदि आपको आवश्यकता हो तो आप आम तौर पर पथ का अनुमान लगा सकते हैं)। मुझे लगता है कि मैं अब इसके साथ रह सकता हूं :) – mgiuca

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