2009-10-20 123 views
8

我想用waf構建一個共享庫,因爲它看起來比GNU自動工具更容易,也更簡單。如何使用waf構建共享庫?

其實我有幾個問題至今有關我已經開始寫的WScript:

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'線不起作用。我必須指定每個.c文件而不是使用通配符嗎?如何啓用一個調試版本的例子(目前wscript正在使用調試版本CFLAGS,但我想讓最終用戶可選)。

計劃將圖書館資源放在子目錄中,並在每個子目錄中使用這些圖書館的程序。

+0

提問後,我也問: http://stackoverflow.com/questions/1596279/why-has-nobody-created-an-open-source-build-system-for-the-brain-dead 這導致我調查http://premake.sf.net/ – 2009-10-21 08:39:00

回答

5

假設您使用waf的最新版本(寫作時爲1.5.9),可以通過構建上下文中的glob()方法指定通配符。所以,你可以寫:

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

如果您使用的是沒有水珠WAF的舊版本,那麼還有一個方法find_sources_in_dirs,您可以使用:

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

這種方法仍然在Waf,但將被棄置,最終可能會消失。

srcdirblddir變量現在是可選的,因此您不需要它們 - 它們默認爲「。」。和「建設」無論如何。您不應該在目標名稱前加上「lib」,這是以平臺特定的方式自動完成的(在Windows上沒有添加lib並且共享庫使用.dll)。調試與發佈構建是一個令人驚訝的棘手問題。最初Waf包含了這個功能,但它在某個時候被丟棄了,並且從未重新添加過。這是郵件列表中的一個常見請求,所以可能會在未來重新出現。同時你可能會比使用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_incdirsuselib_local屬性在庫和程序「模塊」之間指定正確的包含目錄。

+1

儘管我沒有使用它,但另一個可能有用的waf模塊是autowaf.py:svn.drobilla.net/lad/trunk/autowaf.py 「用於輕鬆構建標準unixey程序包/庫的Waf公用程序」是Dave Robillard和Nedko Arnaudov的GNU GPL v2或更高版本 – 2009-10-21 10:06:54

+0

方便的那個,謝謝。 – richq 2009-10-21 11:12:11

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') 

注意,WAF將自動添加lib前綴,所以你不寫target = 'libname'。在Windows上,您還必須將defs關鍵字參數添加到shlib函數調用中。

就我個人而言,我會建議不要遞歸構建腳本涉及wscript_build文件。並不是說它不起作用(如recursive makefiles),只需將所有邏輯保存在一箇中等大小的構建腳本中就簡單多了。