2009-10-20 4 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, но я хочу сделать это необязательным для конечного пользователя).

Планируется, что источники библиотеки будут находиться в пределах вспомогательной директории и программы, которые используют 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

Предполагая, что вы используете последнюю версию waf (1.5.9 на момент написания), дикие карты можно указать с помощью метода glob() в контексте построения. Таким образом, вы можете написать следующее:

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

Если вы используете старую версию WAF, которая не имеет Glob, то есть метод find_sources_in_dirs, что вы можете использовать:

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

Этот метод по-прежнему находится в Вафе, но для устаревания и может исчезнуть.

Переменные srcdir и blddir являются необязательными, поэтому они вам не нужны - они по умолчанию «.». и "строить" в любом случае. Вы не должны добавлять «lib» к целевому имени, это делается автоматически определенным образом на платформе (в Windows no lib добавлено, а совместно используемые библиотеки используют .dll). Debug vs Release build - удивительно тернистая проблема. Первоначально 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_incdirs и uselib_local для указания правильных включенных каталогов между библиотекой и «модулями» программы.

+1

Хотя я еще не использовал его, другим модулем waf, который может быть полезным, является autowaf.py: svn.drobilla.net/lad/trunk/autowaf.py «Утилиты Waf для простого создания стандартных пакетов/библиотек unixey» это GNU GPL v2 или более поздняя версия от Dave Robillard и Nedko Arnaudov –

+0

Handy, один, спасибо. – richq

0

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), гораздо проще сохранить всю логику в одном сценарии сборки среднего размера.

Смежные вопросы