added export_includes/export_defines parameters to read_shlib/read_stlib

This commit is contained in:
Thomas Nagy 2013-05-25 15:17:25 +02:00
parent f4a6a218e3
commit 856db9cc90
3 changed files with 104 additions and 4 deletions

View File

@ -0,0 +1,10 @@
#if A == 1
#include "external.h"
int main() {
return zero();
}
#endif

View File

@ -0,0 +1,90 @@
#! /usr/bin/env python
# encoding: utf-8
# Thomas Nagy, 2013 (ita)
VERSION='0.0.1'
APPNAME='dynamic_build3'
"""
An advanced dynamic build simulating a call to an external system.
That external build system produces a library which is then used in the current build.
"""
import os, shutil, sys, subprocess
from waflib import Utils, Build, Logs
top = '.'
out = 'build'
def options(opt):
opt.load('compiler_c')
def configure(conf):
conf.load('compiler_c')
def build(bld):
bld.post_mode = Build.POST_LAZY
# build the external library
bld(rule=some_fun, target='external_lib/flag.file')
# once it is done create a second build group
bld.add_group()
# read the library
bld.read_shlib('foo', paths=['build/external_lib'], export_includes='build/external_lib', export_defines=['A=1'])
# and use this library, for a target
# no additional build group needed since "app" will wait on "foo" through the use= system
bld.program(source='main.c', target='app', use='foo')
# -----------------------------------------------------------------------------------------
# the following is a pointless exercise simulating the execution of an external buildsystem
# do not spend too much time on it :-)
SNIP = """
top = '.'
out = '.'
def options(opt):
opt.load('compiler_c')
def configure(conf):
conf.load('compiler_c')
def build(bld):
bld.shlib(source='external.c', target='foo', includes='.')
"""
def some_fun(task):
# first, clean everything
output_dir = task.outputs[0].parent
shutil.rmtree(output_dir.abspath())
os.makedirs(output_dir.abspath())
# we have a clean directory, create a fake project in it
h_node = output_dir.make_node('external.h')
h_node.write('int zero();\n', flags='w')
c_node = output_dir.make_node('external.c')
c_node.write('int zero() { return 0; }\n', flags='w')
w_node = output_dir.make_node('wscript')
w_node.write(SNIP)
cmd = [sys.executable, sys.argv[0], 'configure', 'build']
cwd = output_dir.abspath()
try:
task.generator.bld.cmd_and_log(cmd, cwd=cwd, quiet=0, output=0)
except Exception as e:
try:
print(e.stderr)
except AttributeError:
pass
Logs.error("Build of the external library failed")
return -1
Logs.info(' (the external library has been compiled)')
# then write a lock file, so that a rebuild occurs if everything is removed manually
task.outputs[0].write('ok')

View File

@ -568,7 +568,7 @@ class fake_stlib(stlink_task):
return Task.SKIP_ME
@conf
def read_shlib(self, name, paths=[]):
def read_shlib(self, name, paths=[], export_includes=[], export_defines=[]):
"""
Read a system shared library, enabling its use as a local library. Will trigger a rebuild if the file changes::
@ -576,14 +576,14 @@ def read_shlib(self, name, paths=[]):
bld.read_shlib('m')
bld.program(source='main.c', use='m')
"""
return self(name=name, features='fake_lib', lib_paths=paths, lib_type='shlib')
return self(name=name, features='fake_lib', lib_paths=paths, lib_type='shlib', export_includes=export_includes, export_defines=export_defines)
@conf
def read_stlib(self, name, paths=[]):
def read_stlib(self, name, paths=[], export_includes=[], export_defines=[]):
"""
Read a system static library, enabling a use as a local library. Will trigger a rebuild if the file changes.
"""
return self(name=name, features='fake_lib', lib_paths=paths, lib_type='stlib')
return self(name=name, features='fake_lib', lib_paths=paths, lib_type='stlib', export_includes=export_includes, export_defines=export_defines)
lib_patterns = {
'shlib' : ['lib%s.so', '%s.so', 'lib%s.dylib', 'lib%s.dll', '%s.dll'],