2009-10-20 19 views
8

wafを使って共有ライブラリを構築したいのですが、GNU autotoolsよりもはるかに簡単であふれています。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を使用していますが、これはエンドユーザにはオプションです)。

ライブラリソースがサブディレクトリ内にあること、およびlibをそれぞれ独自のサブディレクトリに使用するプログラムが計画されています。

+0

はこの質問をした後、私も尋ねた: http://stackoverflow.com/questions/1596279/why-has-nobody-created-an-open-source-build-system-for-the-brain-dead 私はそれを調べるように私を導いてきました –

答えて

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を使用するよりもずっと悪いことができます。プロジェクトディレクトリに追加するだけです。

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) 

そして、あなたは以下を実行しますデバッグビルドを設定するには:最終のWScriptは、次のようになり

./waf configure -d debug 

あなたが自分自身のサブディレクトリにライブラリを使用している場合、あなたはおそらくべき最上位レベルのwscriptを持ち、bld.add_subdirs()技術を使用してライブラリ/プログラムディレクトリを追加します。各サブディレクトリには独自のwscript_buildファイルがあります。 export_incdirsuselib_localプロパティを使用して、ライブラリとプログラムの "modules"の間に正しいインクルードディレクトリを指定することができます。

+1

私はそれを使用していませんが、有用かもしれない別のwafモジュールはautowaf.pyです:svn.drobilla.net/lad/trunk/autowaf.py Dave RobillardとNedko ArnaudovのGNU GPL v2以降の "unixeyパッケージ/ライブラリを簡単に構築するためのWafユーティリティ" –

+0

Handy that one、ありがとう。 – richq

0

wafが長年変わってしまったので、問題のコードも答えも現在のwafでもう機能しません。今日であなただけ書く:あなたはtarget = 'libname'を書いていないので、WAFが自動的libプレフィックスを追加します

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

注意を。 Windowsでは、shlib関数呼び出しにdefsキーワード引数を追加する必要があります。

個人的には、wscript_buildファイルを含む再帰的ビルドスクリプトを推奨します。それは(recursive makefilesのように)動作しないわけではなく、すべてのロジックを1つの中規模ビルドスクリプトに保存するほうがずっと簡単です。

関連する問題