2009-10-20 20 views
8

मैं के रूप में यह बहुत आसान है और ग्नू Autotools से अव्यवस्था कम लग रहा है waf का उपयोग कर एक साझा पुस्तकालय का निर्माण करना चाहते हैं।मैं साझा लाइब्रेरी बनाने के लिए वेफ का उपयोग कैसे करूं?

VERSION='0.0.1' 
APPNAME='libmylib' 

srcdir = '.' 
blddir = 'build' 

def set_options(opt): 
opt.tool_options('compiler_cc') 
pass 

def configure(conf): 
conf.check_tool('compiler_cc') 
conf.env.append_value('CCFLAGS', '-std=gnu99 -Wall -pedantic -ggdb') 

def build(bld): 
bld.new_task_gen(
    features = 'cc cshlib', 
    source = '*.c', 
    target='libmylib') 

source = '*.c' युक्त लाइन काम नहीं करता:

मैं वास्तव में कई सवाल अब तक WScript मैं लिखने के लिए शुरू कर दिया है करने के लिए संबंधित है। क्या मुझे वाइल्डकार्ड का उपयोग करने के बजाय प्रत्येक और .c फ़ाइल निर्दिष्ट करना होगा?

मैं उदाहरण के लिए एक डीबग बिल्ड कैसे सक्षम कर सकते हैं (वर्तमान में WScript डिबग उपयोग कर रहा है CFLAGS बनाता है, लेकिन मैं यह अंत उपयोगकर्ता के लिए वैकल्पिक बनाना चाहते)।

यह पुस्तकालय स्रोतों के लिए प्रोग्राम हैं जो अपने खुद के उप निर्देशिका में प्रत्येक lib का उपयोग की योजना बनाई है एक उप निर्देशिका के भीतर हो सकता है, और।

+0

इस सवाल पूछने के बाद मैं भी पूछा: http://stackoverflow.com/questions/1596279/why-has-nobody-created-an-open-source-build-system-for-the-brain-dead जिसने मुझे http://premake.sf.net/ –

उत्तर

5

मान लीजिए कि आप वैफ के नवीनतम संस्करण (लेखन के समय 1.5.9) का उपयोग कर रहे हैं, जंगली कार्ड्स को निर्माण संदर्भ पर glob() विधि के माध्यम से निर्दिष्ट किया जा सकता है। तो अगर आप लिख सकते हैं निम्नलिखित:

lib = bld.new_task_gen(
    features = 'cc cshlib', 
    target = 'mylib') 
lib.find_sources_in_dirs('.') 

इस विधि:

bld.new_task_gen(
    features = 'cc cshlib', 
    source = bld.glob('*.c'), 
    target='mylib') 

आप waf कि ग्लोब नहीं है के एक पुराने संस्करण का उपयोग कर रहे हैं, तो एक विधि find_sources_in_dirs है कि आप उपयोग कर सकते हैं अभी भी वाफ में है लेकिन विचलन के लिए तैयार है और अंततः गायब हो सकता है।

srcdir और blddir चर वैकल्पिक हैं इसलिए आपको उनकी आवश्यकता नहीं है - वे "।" और वैसे भी "निर्माण"। आपको लक्ष्य नाम पर "lib" प्रीपेड नहीं करना चाहिए, यह स्वचालित रूप से प्लेटफॉर्म विशिष्ट तरीके से किया जाता है (विंडोज़ पर कोई lib नहीं जोड़ा जाता है और साझा लाइब्रेरीज़ .dll का उपयोग करते हैं)। डीबग बनाम रिलीज बिल्ड एक आश्चर्यजनक रूप से कांटेदार मुद्दा है। मूल रूप से वाफ ने इस सुविधा को शामिल किया था, लेकिन इसे किसी बिंदु पर गिरा दिया गया था और कभी भी पुनः जोड़ा नहीं गया था। यह मेलिंग सूची पर एक आम अनुरोध है, इसलिए भविष्य में पुनरुत्थान हो सकता है। इस बीच आप gjc's cflags module उपयोग से बहुत खराब कर सकते हैं। बस इसे अपनी परियोजना निर्देशिका में जोड़ें। अंतिम WScript तो होगा:

VERSION='0.0.1' 
APPNAME='mylib' 

def set_options(opt): 
    opt.tool_options('compiler_cc') 
    opt.tool_options('cflags', tooldir='.') 

def configure(conf): 
    conf.check_tool('compiler_cc') 
    conf.check_tool('cflags', tooldir='.') 

def build(bld): 
    bld.new_task_gen(
     features = 'cc cshlib', 
     source = bld.glob('*.c'), 
     target=APPNAME) 

और एक डीबग बिल्ड आप निम्नलिखित चल पाएंगे स्थापित करने के लिए: यदि आप अपने स्वयं के एक उप-निर्देशिका में पुस्तकालयों का उपयोग कर रहे हैं, तो

./waf configure -d debug 

, तो आप शायद चाहिए लाइब्रेरी/प्रोग्राम निर्देशिका जोड़ने के लिए शीर्ष स्तर की wscript है और bld.add_subdirs() तकनीक का उपयोग करें। प्रत्येक उप-निर्देशिका में अपनी स्वयं की wscript_build फ़ाइल होगी। इसके बाद आप लाइब्रेरी और प्रोग्राम "मॉड्यूल" के बीच सही निर्देशिका शामिल करने के लिए export_incdirs और uselib_local गुणों का उपयोग कर सकते हैं।

+1

की जांच करने का नेतृत्व किया है, हालांकि मैंने इसका उपयोग नहीं किया है, फिर भी एक और वैफ मॉड्यूल उपयोगी हो सकता है autowaf.py: svn.drobilla.net/lad/trunk/autowaf.py "मानक यूनिक्स पैकेज/पुस्तकालयों को आसानी से बनाने के लिए वेफ यूटिलिटीज" यह जीएनयू जीपीएल वी 2 या बाद में डेव रोबिलार्ड और नेडको अर्नाउडोव –

+0

है, धन्यवाद। – richq

0

waf पिछले कुछ वर्षों में बहुत कुछ बदल तो न प्रश्न में कोड और न ही उत्तर वर्तमान waf साथ अब और काम करता है किया गया है। आजकल तुम सिर्फ लिखने:

def options(ctx): 
    ctx.load('compiler_c') 
def configure(ctx): 
    ctx.load('compiler_c') 
def build(ctx): 
    ctx.shlib(source = ctx.path.ant_glob('src/*.c'), 
       target = 'name') 

नोट ताकि आप target = 'libname' बारे में नहीं है कि waf स्वचालित रूप से lib उपसर्ग जोड़ देगा। विंडोज़ पर, आपको shlib फ़ंक्शन कॉल पर defs कीवर्ड तर्क भी जोड़ना होगा।

व्यक्तिगत रूप से मैं wscript_build फ़ाइलों से जुड़े रिकर्सिव बिल्ड स्क्रिप्ट के खिलाफ अनुशंसा करता हूं। ऐसा नहीं है कि यह काम नहीं करता है (जैसे recursive makefiles), सभी तर्क को एक मध्यम आकार की बिल्ड स्क्रिप्ट में रखना बहुत आसान है।