2009-10-20 17 views
8

Quiero construir una biblioteca compartida usando waf ya que parece mucho más fácil y menos recargada que las autotools de GNU.¿Cómo uso waf para construir una biblioteca compartida?

realidad tengo varias preguntas hasta ahora relacionados con la wscript he empezado a escribir:

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

La línea que contiene source = '*.c' no funciona. ¿Debo especificar cada archivo .c en lugar de usar un comodín?

Cómo puedo habilitar una compilación de depuración, por ejemplo (actualmente, el wscript está utilizando las compilaciones de depuración CFLAGS, pero quiero que esto sea opcional para el usuario final).

Está previsto que las fuentes de la biblioteca estén dentro de un subdirectorio, y los programas que utilizan la lib cada uno en sus propios subdirectorios.

+0

Después de hacer esta pregunta también me preguntó: http://stackoverflow.com/questions/1596279/why-has-nobody-created-an-open-source-build-system-for-the-brain-dead Lo cual me ha llevado a investigar http://premake.sf.net/ –

Respuesta

5

Suponiendo que está utilizando la última versión de waf (1.5.9 al momento de escribir este documento), las comodines pueden especificarse mediante el método glob() en el contexto de compilación. Así que usted puede escribir lo siguiente:

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

Si estaba utilizando una versión anterior del WAF que no tiene pegote, entonces no es un método find_sources_in_dirs que puede utilizar:

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

Este método todavía está en Waf, pero está programado para desaprobarse y puede desaparecer.

Las variables srcdir y blddir son opcionales ahora, por lo que no las necesita, por defecto son "." y "construir" de todos modos. No debe anteponer "lib" al nombre de destino, esto se hace automáticamente de una manera específica de plataforma (en Windows no se agrega lib y las bibliotecas compartidas usan .dll). La creación de Debug vs Release es un problema sorprendentemente espinoso. Originalmente, Waf incluía esta función, pero se eliminó en algún momento y nunca se volvió a agregar. Es una solicitud común en la lista de correo por lo que puede resurgir en el futuro. Mientras tanto, podrías hacer mucho peor que usar gjc's cflags module. Solo agréguelo al directorio de su proyecto. El wscript final sería entonces:

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) 

y la creación de una versión de depuración debe ejecutar el siguiente:

./waf configure -d debug 

Si está utilizando las bibliotecas en sus propios subdirectorios, entonces probablemente debería tener un wscript de nivel superior y usar la técnica bld.add_subdirs() para agregar directorios de biblioteca/programa. Cada subdirectorio tendría su propio archivo wscript_build. A continuación, puede usar las propiedades export_incdirs y uselib_local para especificar los directorios de inclusión correctos entre la biblioteca y los "módulos" del programa.

+1

Aunque no lo he usado, otro módulo waf que podría ser útil es autowaf.py: svn.drobilla.net/lad/trunk/autowaf.py "Utilidades Waf para construir fácilmente paquetes/bibliotecas unixey estándar" es GNU GPL v2 o posterior por Dave Robillard y Nedko Arnaudov –

+0

Muy útil, gracias. – richq

0

waf ha cambiado mucho a lo largo de los años, por lo que ni el código de la pregunta ni la respuesta funcionan con waf actual. Hoy en día que acaba de escribir:

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

Tenga en cuenta que WAF añadirá automáticamente el prefijo lib por lo que no se escribe target = 'libname'. En Windows, también debe agregar el argumento de palabra clave defs a la llamada a la función shlib.

Personalmente recomendaría en contra de los scripts recursivos de compilación que implican wscript_build archivos. No es que no funcione (como recursive makefiles), es mucho más simple mantener toda la lógica en una secuencia de comandos de compilación de tamaño mediano.

Cuestiones relacionadas