2010-09-15 15 views
11

पर फोर्स स्कोन आउटपुट (exe, obj, lib और dll) मैं एक विशिष्ट निर्माण निर्देशिका में exe, obj, lib और dll फ़ाइलों को आउटपुट करने के लिए स्कैन प्राप्त करने का प्रयास कर रहा हूं।विशिष्ट निर्माण निर्देशिका

मेरे फ़ाइल संरचना इस तरह दिखता है:

/projectdir 
    /build 
    /bin 
    /obj 
    /source 
    /subdirs 
    /.. 
    SConstruct 

असल में, क्या मैं अब मिल मेरे स्रोत निर्देशिका obj फाइलों के साथ प्रदूषित हो जाता है। मैं इसे सब एक जगह में रखना चाहूंगा।

SConstruct फ़ाइल इस तरह दिखता है:

env.VariantDir('build', 'source', duplicate = 0) 
env.Program('Hierarchy', source = ['source/sconstest.cpp', 'source/utils/IntUtil.cpp']) 

मैं इस साइट पर कुछ अन्य इसी तरह के सवाल पढ़ा है, लेकिन अभी तक havn't एक अच्छा समाधान मिल गया।

धन्यवाद

उत्तर

8

मुझे मिला सबसे आसान तरीका 2 फाइलों, एक स्कैनस्ट्रक्चर फ़ाइल और एक अलग स्कॉन्स्क्रिप्ट का उपयोग करना है। फिर 'main.scons' आप अपने निर्माण के मांस कर में

# content SConstruct 
SConscript('main.scons', variant_dir='build', duplicate=0) 

:

SConstruct में आप बस अन्य फ़ाइल कॉल और निर्माण उत्पादन के लिए निर्देशिका निर्दिष्ट। आप इस फ़ाइल में संस्करण निर्देशिका के बारे में भूल सकते हैं।

# content of main.scons 
env = Environment() 
env.Program('Hierarchy', 
      source = ['source/sconstest.cpp', 'source/utils/IntUtil.cpp']) 
+0

धन्यवाद, यह काम करता है। हालांकि सिर्फ एक फ़ाइल होने के कारण बहुत साफ है। मुझे लगता है कि मुझे इसके साथ रहना होगा! –

3

VariantDir (भी user guide में वर्णित) बताता है SCons एक अलग निर्देशिका में उत्पन्न फ़ाइलों डालने के लिए। स्कॉन्स के पुराने संस्करणों में इस फ़ंक्शन को BuildDir नाम दिया गया था।

आप स्रोत निर्देशिका को डुप्लिकेट करने से बचने के लिए भी पढ़ सकते हैं (उपयोगकर्ता मार्गदर्शिका और विकी दोनों में वर्णित)।

+1

हाँ, कि मैं क्या करने की कोशिश की है: env.VariantDir ('निर्माण', 'स्रोत', नकल = 0) env.Program ('पदानुक्रम', स्रोत = [ 'स्रोत/sconstest.cpp', 'स्रोत /utils/IntUtil.cpp ']) और इसका बिल्कुल असर नहीं है :( –

+0

संकलन करने के लिए फ़ाइल स्रोत में नहीं होनी चाहिए बल्कि फ़ोल्डर बनाना चाहिए:' env.Program ('पदानुक्रम', स्रोत = ['बिल्ड/sconstest.cpp ',' build/utils/IntUtil.cpp ']) ' – Phong

5

यह VariantDir केवल एक SConstruct फ़ाइल (एक छोटे से परियोजना के लिए) का उपयोग कर काम कर पाने के कि मुश्किल नहीं है, लेकिन यह बहुत भ्रमित के रूप में विन्यास एक फ़ाइल और दो फ़ाइल उपयोग के मामले के लिए अलग अलग है।

केवल SConstruct:

env = Environment() 
env.VariantDir('build', 'src', duplicate=0) 
files = Glob('build\*.c') 
env.Program("build\program", files) 

सूचना कैसे स्रोत फ़ाइलों .\src में स्थित हैं लेकिन .\build स्थान के रूप में निर्दिष्ट किया जाता है। उत्पादन को .\build के साथ "prefixed" भी होना चाहिए अन्यथा संकलित प्रोग्राम SConstruct फ़ाइल की निर्देशिका में रहेंगे।

जब आप स्क्रिप्ट को निष्पादित करते हैं तो स्कैन फ़ाइलों को .\src से संकलित करेगा और परिणामस्वरूप ऑब्जेक्ट्स को .\build पर रखेगा।

कोई आश्चर्य नहीं कि उन्होंने बिल्डडियर को VariantDir का नाम बदल दिया है ताकि भ्रम से बचने की कोशिश की जा सके (बिना सफलता के)।

1

मैं समृद्ध के उत्तर जैसे दो-फ़ाइल विधि का उपयोग कर रहा था, लेकिन हालांकि अंतिम निर्माण उत्पाद (libs, प्रोग्राम्स) सही संस्करण निर्देशिका में जा रहे थे, ऑब्जेक्ट फ़ाइलें अभी भी स्रोत निर्देशिका में जा रही थीं।

समाधान स्रोत फ़ाइलों को निरपेक्ष के बजाय सापेक्ष पथ से ग्लोब करने के लिए निकला। मुझे कोई जानकारी नहीं है की क्यों।

मेरी दूसरी स्कॉन्स फ़ाइल मूल रूप से इस तरह दिखाई दे रही थी। नोट पूर्ण पथ द्वारा globbing - जब मैंने पहली बार यह लिखा था, मुझे नहीं पता था कि पथ स्वचालित रूप से स्कैन फ़ाइल के सापेक्ष होंगे।

import os, inspect 
env = Environment() 
packageDir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 
src = Glob(os.path.join(packageDir, "src/*/*.c*"), strings=True, source=True) 
env.Program('Foo', source = src) 

और इसके परिणामस्वरूप * .obj src/और प्रोग्राम को मेरे संस्करण डीआईआर के तहत समाप्त हो गया। - मैं अपेक्षाकृत दोनों SCons और अजगर करने के लिए नया हूँ - लेकिन मैंने सोचा था कि मैं

env = Environment() 
src = Glob("src/*/*.c*", strings=True, source=True) 
env.Program('Foo', source = src) 

पूर्ण पथ का उपयोग करना शायद एक noob गलती है: जब मैं यह निम्नलिखित के लिए बदल गया है, वस्तु फ़ाइलों को भी संस्करण निर्देशिका के लिए चला गया अगर किसी और के पास एक ही निराशाजनक समस्या है तो इसे साझा करें।

+0

आपकी इंटरमीडिएट फाइलों का कारण स्रोत निर्देशिका में समाप्त हो रहे थे क्योंकि आप वहां से उनसे पूछ रहे थे। अगर आपने उन्हें वैरिएंट डायर, या रिश्तेदार डीआईआर से पूछा, तो एस विपक्ष स्रोतों में स्रोतों को पॉप्युलेट करेगा और उसके बाद आउटपुट भी तैयार करेगा। (बेशक अगर आप प्रतिलिपि बनाने के लिए भिन्नता से पूछते हैं तो यह वहां स्रोतों की प्रतिलिपि नहीं करेगा, लेकिन वेरिएंट डीआईआर में आउटपुट फाइलों को उत्पादित करेगा) – bdbaddog

+0

आहा, जो थोड़ा और समझ में आता है। सुराग के लिए धन्यवाद! – Soleil

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