मैं निम्नलिखित (मैं बहुत आम सोचा होगा) निर्देशिका पदानुक्रम के साथ वाला ऐप के साथ 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
कहता है, इस तरह:
gcc -o src/foo.o src/foo.c
ऐसा कई कारणों से समस्याग्रस्त है
- मेरे प्रोग्राम के भीतर, फाइलें
src
निर्देशिका से संबंधित पथ दे रही हैं। उदाहरण के लिए,more.c
मेंfoo.h
#include "foo.h"
के साथ शामिल हो सकता है। यह विफल रहता है क्योंकि जीसीसी मूल निर्देशिका से चलाया जाता है। मैं अपने शामिल को#include "src/foo.h"
में बदलना नहीं चाहता हूं। - मैं लॉगिंग जैसी चीजों के लिए
__FILE__
विशेष मैक्रो का उपयोग करता हूं। जब शीर्ष-स्तरीय निर्देशिका से बनाया गया है, तो जीसीसी सभी फाइलनामों के सामने "src/
" रखता है, क्योंकि यह संकलन करने के लिए दिया गया पथ था। यह picky प्रतीत हो सकता है, लेकिन मुझे यह नहीं चाहिए, क्योंकि मैंsrc
निर्देशिका के सापेक्ष होने के नाते अपने स्रोत पेड़ के बारे में सोचता हूं।
(संपादित:। मुझे लगता है कि स्पष्ट रूप से # 1 जीसीसी के लिए एक ध्वज के रूप में -Isrc
जोड़कर तय किया जा सकता है जोड़ना चाहिए, लेकिन यह मुख्य मुद्दा भर में और अधिक हैक्स की तरह लगता है)
मैं कैसे कर सकते हैं gcc
पर कॉल करने से पहले src
निर्देशिका में स्कैन cd
?
- मैं
src
निर्देशिका से छुटकारा और सब कुछ ऊपर ले जाएँ, क्योंकि वहाँ शीर्ष स्तर पर अन्य (गैर कोड) फ़ाइलों के बहुत सारे हैं करने के लिए नहीं चाहते। - मैं नहीं चाहता कि स्कैन
cd
प्रत्येक उपनिर्देशिका में। यहcd
src
में होना चाहिए और फिर वहां से पदानुक्रम में सभी फाइलें बनाना चाहिए। src
निर्देशिका के अंदरSConscript
को स्थानांतरित करके और इसे वहां से चलाकर, इसे शीर्ष स्तर परMakefile
का उपयोग करके हल कर सकता है। लेकिन यह काफी हैकी लगता है, और मैंsrc
की तुलना में अन्य निर्देशिकाओं में निर्माण (गैर-कोड) संपत्तियों के निर्माण के लिए स्कैन का उपयोग करना चाहता हूं।
मैंने पढ़ा है कि आप एक कस्टम Builder
बना सकते हैं और इसे निर्देशिका बदल सकते हैं। हालांकि, मैं सी/सी ++ के लिए एक नया नया Builder
लिखना नहीं चाहता हूं। स्क्रैच से लिखने के बिना मौजूदा बिल्डर के व्यवहार को संशोधित करने का कोई तरीका है? इसके अलावा, एक मंच पर, किसी ने कहा कि Builder
के भीतर से निर्देशिका बदलना समानांतर बिल्ड तोड़ देगा क्योंकि यह उस निर्देशिका को बदल देगा जो अन्य कार्यों से बना है। क्या ये सच है?
यह मैं क्या मेरी समस्या के लिए चाहते हैं की तरह साथ ही लगता है: इस बात की पुष्टि के लिए https://stackoverflow.com/questions/45519577/scons-link-program-without-build-directory-in-link-path –