2009-10-20 19 views
8

Chcę zbudować wspólną bibliotekę przy użyciu waf, ponieważ wygląda dużo łatwiej i jest mniej zagracona niż autotools GNU.Jak korzystać z funkcji Waf do budowania biblioteki współdzielonej?

I rzeczywiście kilka pytań do tej pory związane z wscript zacząłem pisać:

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

Linia zawierająca source = '*.c' nie działa. Czy muszę podać każdy plik .c zamiast wieloznacznego?

Jak mogę włączyć na przykład kompilację debugowania (obecnie wskrypt używa CFLAGS, ale chcę, aby było to opcjonalne dla użytkownika końcowego).

Planuje się, że źródła biblioteki znajdują się w podkatalogu i programy używające biblioteki każdy w swoich własnych podkatalogach.

+0

Po tym pytaniem Spytałem też: http://stackoverflow.com/questions/1596279/why-has-nobody-created-an-open-source-build-system-for-the-brain-dead Które doprowadziło mnie do zbadania http://premake.sf.net/ –

Odpowiedz

5

Zakładając, że korzystasz z najnowszej wersji pakietu waf (1.5.9 w chwili pisania), dzikie karty można określić za pomocą metody glob() w kontekście kompilacji. Więc można napisać następujące:

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

Jeśli korzystasz ze starszej wersji WAF, który nie ma glob, to nie jest to metoda find_sources_in_dirs które można użyć:

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

Ta metoda jest nadal w Waf, ale jest przeznaczony na deprecjację i może ostatecznie zniknąć.

Zmienne i opcjonalne są teraz opcjonalne, więc nie są potrzebne - domyślnie są to "." i "buduj" mimo to. Nie powinieneś dodawać "lib" do nazwy docelowej, odbywa się to automatycznie w sposób specyficzny dla platformy (w systemie Windows nie jest dodawana żadna biblioteka, a biblioteki współdzielone korzystają z .dll). Debugowanie vs Wydanie kompilacji jest zaskakująco ciernistą kwestią. Pierwotnie Waf zawierał tę funkcję, ale w pewnym momencie został usunięty i nigdy nie został ponownie dodany. Jest to powszechna prośba na liście mailingowej, która może pojawić się w przyszłości. Tymczasem możesz zrobić dużo gorzej niż użyć gjc's cflags module. Po prostu dodaj go do swojego katalogu projektu. Ostateczna wscript będzie wówczas:

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) 

I założyć build debugowania byś uruchomić następujące:

./waf configure -d debug 

Jeśli używasz bibliotek we własnych podkatalogów, to należy prawdopodobnie mieć najwyższy poziom Wskrypt i używać techniki bld.add_subdirs() do dodawania katalogów biblioteki/programu. Każdy podkatalog miałby własny plik wscript_build. Następnie można użyć właściwości export_incdirs i uselib_local, aby określić odpowiednie katalogi włączone między biblioteką a "modułami" programu.

+1

Chociaż go nie używałem, innym modułem waf, który może być przydatny jest autowaf.py: svn.drobilla.net/lad/trunk/autowaf.py "Waf narzędzia do łatwego budowania standardowych pakietów/bibliotek unixey" to GNU GPL v2 lub później Dave Robillard i Nedko Arnaudov –

+0

Poręczny ten jeden, dzięki. – richq

0

Waf wiele się zmienił na przestrzeni lat, więc ani kod w pytaniu, ani odpowiedź nie działa już z aktualnym gofrem. Obecnie po prostu napisać:

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

Zauważ, że WAF automatycznie dodać przedrostek lib więc nie pisać target = 'libname'. W systemie Windows należy również dodać argument słowa kluczowego defs do wywołania funkcji shlib.

Osobiście polecam przeciwko rekursywnym skryptom do kompilacji z plikami wscript_build. Nie oznacza to, że nie działa (np. recursive makefiles), o wiele łatwiej jest zachować całą logikę w jednym średnim formacie skryptu.

Powiązane problemy