aboutsummaryrefslogtreecommitdiffstats
path: root/wscript
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2019-07-28 02:32:21 +0200
committerDavid Robillard <d@drobilla.net>2019-07-29 22:43:19 +0200
commit94f747857f6ea5e83c41ccae71980f0385240db3 (patch)
treef61288a89ba27e528ef632ceb4803675073dc3d4 /wscript
parentb0a92df939138ba3fb92d0d5b3cafcc822df4fec (diff)
downloadpugl-94f747857f6ea5e83c41ccae71980f0385240db3.tar.gz
pugl-94f747857f6ea5e83c41ccae71980f0385240db3.tar.bz2
pugl-94f747857f6ea5e83c41ccae71980f0385240db3.zip
Build separate libraries
This builds separate libraries for the core and backends, and installs different pkg-config files for different configurations.
Diffstat (limited to 'wscript')
-rw-r--r--wscript227
1 files changed, 146 insertions, 81 deletions
diff --git a/wscript b/wscript
index df3bc3f..c7dc05c 100644
--- a/wscript
+++ b/wscript
@@ -94,6 +94,39 @@ def configure(conf):
"Verbose console output": conf.is_defined('PUGL_VERBOSE')})
+def _build_pc_file(bld, name, desc, target, libname, deps={}, requires=[]):
+ "Builds a pkg-config file for a library"
+ env = bld.env
+ prefix = env.PREFIX
+ xprefix = os.path.dirname(env.LIBDIR)
+
+ uselib = deps.get('uselib', [])
+ pkg_deps = [l for l in uselib if 'PKG_' + l.lower() in env]
+ lib_deps = [l for l in uselib if 'PKG_' + l.lower() not in env]
+
+ link_flags = [env.LIB_ST % l for l in deps.get('lib', [])]
+ for l in lib_deps:
+ link_flags += [env.LIB_ST % l for l in env['LIB_' + l]]
+ for f in deps.get('framework', []):
+ link_flags += ['-framework', f]
+
+ bld(features='subst',
+ source='pugl.pc.in',
+ target='%s-%s.pc' % (target, PUGL_MAJOR_VERSION),
+ install_path=os.path.join(env.LIBDIR, 'pkgconfig'),
+
+ PREFIX=prefix,
+ EXEC_PREFIX='${prefix}' if xprefix == prefix else xprefix,
+ LIBDIR='${exec_prefix}/' + os.path.basename(env.LIBDIR),
+ INCLUDEDIR=env.INCLUDEDIR.replace(prefix, '${prefix}', 1),
+
+ NAME=name,
+ DESCRIPTION=desc,
+ PUGL_MAJOR_VERSION=PUGL_MAJOR_VERSION,
+ REQUIRES=' '.join(requires + [p.lower() for p in pkg_deps]),
+ LIBS=' '.join(link_flags))
+
+
def build(bld):
# C Headers
includedir = '${INCLUDEDIR}/pugl-%s/pugl' % PUGL_MAJOR_VERSION
@@ -104,102 +137,134 @@ def build(bld):
bld.install_files(detaildir, bld.path.ant_glob('pugl/detail/*.h'))
bld.install_files(detaildir, bld.path.ant_glob('pugl/detail/*.c'))
- # Pkgconfig file
- autowaf.build_pc(bld, 'PUGL', PUGL_VERSION, PUGL_MAJOR_VERSION, [],
- {'PUGL_MAJOR_VERSION': PUGL_MAJOR_VERSION})
+ # Library dependencies of pugl libraries (for buiding tests)
+ deps = {}
+
+ def build_pugl_lib(name, **kwargs):
+ deps[name] = {}
+ for k in ('lib', 'framework', 'uselib'):
+ deps[name][k] = kwargs.get(k, [])
+
+ args = kwargs.copy()
+ args.update({'includes': ['.'],
+ 'export_includes': ['.'],
+ 'install_path': '${LIBDIR}',
+ 'vnum': PUGL_VERSION})
+
+ if bld.env.BUILD_SHARED:
+ bld(features = 'c cshlib',
+ name = name,
+ target = 'pugl_' + name,
+ cflags = ['-DPUGL_INTERNAL', '-DPUGL_SHARED'],
+ **args)
+
+ if bld.env.BUILD_STATIC:
+ bld(features = 'c cstlib',
+ name = 'pugl_%s_static' % name,
+ target = 'pugl_' + name,
+ cflags = ['-DPUGL_INTERNAL'],
+ **args)
+
+ def build_platform(platform, **kwargs):
+ build_pugl_lib(platform, **kwargs)
+ _build_pc_file(bld, 'Pugl', 'Pugl GUI library core',
+ 'pugl', 'pugl_%s' % platform,
+ deps=kwargs)
+
+ def build_backend(platform, backend, **kwargs):
+ name = '%s_%s' % (platform, backend)
+ label = 'OpenGL' if backend == 'gl' else backend.title()
+ build_pugl_lib(name, **kwargs)
+ _build_pc_file(bld, 'Pugl %s' % label,
+ 'Pugl GUI library with %s backend' % label,
+ 'pugl-%s' % backend, 'pugl_' + name,
+ deps=kwargs,
+ requires=['pugl-%s' % PUGL_MAJOR_VERSION])
- libflags = []
- framework = []
- libs = []
lib_source = ['pugl/detail/implementation.c']
if bld.env.TARGET_PLATFORM == 'win32':
- lib_source += ['pugl/detail/win.c']
- libs = ['gdi32', 'user32']
+ platform = 'win'
+ build_platform('win',
+ lib=['gdi32', 'user32'],
+ source=lib_source + ['pugl/detail/win.c'])
+
if bld.is_defined('HAVE_GL'):
- lib_source += ['pugl/detail/win_gl.c']
- libs += ['opengl32']
+ build_backend('win', 'gl',
+ lib=['gdi32', 'user32', 'opengl32'],
+ source=['pugl/detail/win_gl.c'])
+
if bld.is_defined('HAVE_CAIRO'):
- lib_source += ['pugl/detail/win_cairo.c']
- libs += ['cairo']
+ build_backend('win', 'cairo',
+ uselib=['CAIRO'],
+ lib=['gdi32', 'user32'],
+ source=['pugl/detail/win_cairo.c'])
+
elif bld.env.TARGET_PLATFORM == 'darwin':
- lib_source += ['pugl/detail/mac.m']
- framework = ['Cocoa']
+ platform = 'mac'
+ build_platform('mac',
+ framework=['Cocoa'],
+ source=lib_source + ['pugl/detail/mac.m'])
+
if bld.is_defined('HAVE_GL'):
- lib_source += ['pugl/detail/mac_gl.m']
- framework += ['OpenGL']
+ build_backend('mac', 'gl',
+ framework=['Cocoa', 'OpenGL'],
+ source=['pugl/detail/mac_gl.m'])
+
if bld.is_defined('HAVE_CAIRO'):
- lib_source += ['pugl/detail/mac_cairo.m']
+ build_backend('mac', 'cairo',
+ framework=['Cocoa'],
+ uselib=['CAIRO'],
+ source=['pugl/detail/mac_cairo.m'])
else:
- lib_source += ['pugl/detail/x11.c']
- libs = ['X11']
+ platform = 'x11'
+ build_platform('x11',
+ lib=['X11'],
+ source=lib_source + ['pugl/detail/x11.c'])
+
if bld.is_defined('HAVE_GL'):
- lib_source += ['pugl/detail/x11_gl.c']
- libs += ['GL']
+ build_backend('x11', 'gl',
+ lib=['X11', 'GL'],
+ source=['pugl/detail/x11_gl.c'])
+
if bld.is_defined('HAVE_CAIRO'):
- lib_source += ['pugl/detail/x11_cairo.c']
-
- common = {
- 'framework': framework,
- 'includes': ['.'],
- }
-
- lib_common = common.copy()
- lib_common.update({
- 'export_includes': ['.'],
- 'install_path': '${LIBDIR}',
- 'lib': libs,
- 'uselib': ['CAIRO'],
- 'source': lib_source,
- 'target': 'pugl-%s' % PUGL_MAJOR_VERSION,
- 'vnum': PUGL_VERSION,
- })
-
- # Shared Library
- if bld.env.BUILD_SHARED:
- bld(features = 'c cshlib',
- name = 'libpugl',
- cflags = libflags + ['-DPUGL_SHARED', '-DPUGL_INTERNAL'],
- **lib_common)
-
- # Static library
- if bld.env.BUILD_STATIC:
- bld(features = 'c cstlib',
- name = 'libpugl_static',
- cflags = ['-DPUGL_INTERNAL'],
- **lib_common)
+ build_backend('x11', 'cairo',
+ lib=['X11'],
+ uselib=['CAIRO'],
+ source=['pugl/detail/x11_cairo.c'])
+
+ def build_test(prog, platform, backend, **kwargs):
+ use = ['pugl_%s_static' % platform,
+ 'pugl_%s_%s_static' % (platform, backend)]
+
+ target = prog
+ if bld.env.TARGET_PLATFORM == 'darwin':
+ target = '{0}.app/Contents/MacOS/{0}'.format(prog)
+
+ bld(features = 'subst',
+ source = 'resources/Info.plist.in',
+ target = '{}.app/Contents/Info.plist'.format(prog),
+ install_path = '',
+ NAME = prog)
+
+ backend_lib = platform + '_' + backend
+ for k in ('lib', 'framework', 'uselib'):
+ kwargs.update({k: (kwargs.get(k, []) +
+ deps.get(platform, {}).get(k, []) +
+ deps.get(backend_lib, {}).get(k, []))})
+
+ bld(features = 'c cprogram',
+ source = 'test/%s.c' % prog,
+ target = target,
+ use = use,
+ install_path = '',
+ **kwargs)
if bld.env.BUILD_TESTS:
- test_libs = libs
- test_cflags = ['']
-
- # Test programs
- progs = []
if bld.is_defined('HAVE_GL'):
- progs += ['pugl_test']
+ build_test('pugl_test', platform, 'gl', uselib=['M'])
+
if bld.is_defined('HAVE_CAIRO'):
- progs += ['pugl_cairo_test']
-
- for prog in progs:
- if bld.env.TARGET_PLATFORM == 'darwin':
- target = '{0}.app/Contents/MacOS/{0}'.format(prog)
-
- bld(features = 'subst',
- source = 'resources/Info.plist.in',
- target = '{}.app/Contents/Info.plist'.format(prog),
- install_path = '',
- NAME = prog)
- else:
- target = prog
-
- bld(features = 'c cprogram',
- source = 'test/%s.c' % prog,
- use = 'libpugl_static',
- lib = test_libs,
- uselib = ['CAIRO', 'M'],
- target = target,
- install_path = '',
- cflags = test_cflags,
- **common)
+ build_test('pugl_cairo_test', platform, 'cairo', uselib=['CAIRO'])
if bld.env.DOCS:
bld(features = 'subst',