2009-10-20 4 views
8

Ich möchte eine gemeinsame Bibliothek mit waf erstellen, da es viel einfacher und weniger überladen als GNU Autotools aussieht.Wie verwende ich Waf, um eine gemeinsame Bibliothek zu erstellen?

Ich habe tatsächlich einige Fragen so im Zusammenhang weit nach wscript ich angefangen habe zu schreiben:

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

Die Linie source = '*.c' enthält, funktioniert nicht. Muss ich jede .c-Datei angeben, anstatt einen Platzhalter zu verwenden?

Wie kann ich zum Beispiel ein Debug-Build aktivieren (derzeit verwendet das Wscript das Debug-Build CFLAGS, aber ich möchte dies für den Endbenutzer optional machen).

Es ist geplant, dass sich die Bibliotheksquellen innerhalb eines Unterverzeichnisses befinden und dass Programme die lib jeweils in ihren eigenen Unterverzeichnissen verwenden.

+0

Nach dieser Frage Ich fragte auch: http://stackoverflow.com/questions/1596279/why-has-nobody-created-an-open-source-build-system-for-the-brain-dead Was hat mich dazu gebracht, zu untersuchen http://premake.sf.net/ –

Antwort

5

Angenommen, Sie verwenden die neueste Version von waf (1.5.9 zum Zeitpunkt des Schreibens), können Platzhalter über die glob()-Methode für den Build-Kontext angegeben werden. So können Sie schreiben folgendes:

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

Wenn Sie eine ältere Version von waf wurden verwenden, die nicht glob hat, dann gibt es ein Verfahren find_sources_in_dirs die Sie verwenden können:

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

Diese Methode ist immer noch in Waf, aber ist für die Abwertung geplant und kann schließlich verschwinden.

Die Variablen srcdir und blddir sind jetzt optional, Sie brauchen sie also nicht - sie sind standardmäßig auf "." und "baue" trotzdem. Sie sollten dem Zielnamen nicht "lib" voranstellen, dies erfolgt automatisch auf plattformspezifische Weise (unter Windows wird keine Lib hinzugefügt und gemeinsame Bibliotheken verwenden .dll). Debug vs Build ist ein überraschend heikles Thema. Ursprünglich enthielt Waf diese Funktion, wurde aber irgendwann entfernt und nie wieder hinzugefügt. Es ist eine häufige Anfrage auf der Mailing-Liste, so dass es in Zukunft wieder erscheinen kann. In der Zwischenzeit könnten Sie viel schlechter als gjc's cflags module verwenden. Fügen Sie es einfach Ihrem Projektverzeichnis hinzu. Der letzte wscript wäre dann:

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) 

Und ein Debug-Build einrichten Sie folgende laufen würde:

./waf configure -d debug 

Wenn Sie Bibliotheken verwenden in ihren eigenen Unterverzeichnisse, dann sollten Sie wahrscheinlich habe ein wscript auf oberster Ebene und benutze die bld.add_subdirs() Technik um Bibliotheken/Programmverzeichnisse hinzuzufügen. Jedes Unterverzeichnis hätte seine eigene Datei wscript_build. Sie können dann die Eigenschaften export_incdirs und uselib_local verwenden, um die richtigen Include-Verzeichnisse zwischen Bibliotheks- und Programm- "Modulen" anzugeben.

+1

Obwohl ich es nicht verwendet habe, ist ein anderes waf-Modul, das nützlich sein könnte, autowaf.py: svn.drobilla.net/lad/trunk/autowaf.py "Waf-Dienstprogramme für die einfache Erstellung von Standard-Unix-Paketen/Bibliotheken" es ist GNU GPL v2 oder höher von Dave Robillard und Nedko Arnaudov –

+0

Handlich, danke. – richq

0

waf hat sich im laufe der jahre stark verändert, so dass weder der code in der frage noch die antwort mit dem aktuellen waf mehr funktioniert. Heute schreiben Sie einfach:

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

Beachten Sie, dass waf automatisch die lib Präfix wird hinzufügen, damit Sie nicht target = 'libname' schreiben Sie. Unter Windows müssen Sie außerdem das Schlüsselwort defs dem Funktionsaufruf shlib hinzufügen.

Persönlich würde ich gegen rekursive Build-Skripte mit wscript_build Dateien empfehlen. Nicht, dass es nicht funktioniert (wie recursive makefiles), es ist einfach viel einfacher, alle Logik in einem mittelgroßen Build-Skript zu halten.