1
Fork 0

build with waf

This commit is contained in:
Nedko Arnaudov 2023-06-17 20:37:15 +03:00
parent a32d9e2132
commit 7429ecb0b3
5 changed files with 420 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
/.waf*
/.lock-waf*
/build

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "autooptions"]
path = autooptions
url = https://github.com/LADI/waf-autooptions

1
autooptions Submodule

@ -0,0 +1 @@
Subproject commit 87a720d8ad158153c72681b7b900ad90f09c2a1c

173
waf vendored Executable file

File diff suppressed because one or more lines are too long

240
wscript Normal file
View File

@ -0,0 +1,240 @@
#! /usr/bin/env python
#
# SPDX-FileCopyrightText: 2023 Nedko Arnaudov
# SPDX-License-Identifier: GPL-2.0-or-later
import os
import shutil
from waflib import Logs, Options
from waflib import Context
VERSION = "1.0.1"
APPNAME = 'epichord'
# these variables are mandatory ('/' are converted automatically)
top = '.'
out = 'build'
def options(opt):
# options provided by the modules
opt.load('compiler_cxx')
opt.load('autooptions')
opt.add_option('--libdir', type='string', help='Library directory [Default: <prefix>/lib64]')
opt.add_option('--pkgconfigdir', type='string', help='pkg-config file directory [Default: <libdir>/pkgconfig]')
class WafToolchainFlags:
"""
Waf helper class for handling set of CFLAGS
and related. The flush() method will
prepend so to allow supplied by (downstream/distro/builder) waf caller flags
to override the upstream flags in wscript.
TODO: upstream this or find alternative easy way of doing the same
"""
def __init__(self, conf):
"""
:param conf: Waf configuration object
"""
self.conf = conf
self.flags = {}
for x in ('CPPFLAGS', 'CFLAGS', 'CXXFLAGS', 'LINKFLAGS'):
self.flags[x] = []
def flush(self):
"""
Flush flags to the configuration object
Prepend is used so to allow supplied by
(downstream/distro/builder) waf caller flags
to override the upstream flags in wscript.
"""
for key, val in self.flags.items():
self.conf.env.prepend_value(key, val)
def add(self, key, val):
"""
:param key: Set to add flags to. 'CPPFLAGS', 'CFLAGS', 'CXXFLAGS' or 'LINKFLAGS'
:param val: string or list of strings
"""
flags = self.flags[key]
if isinstance(val, list):
#flags.extend(val)
for x in val:
if not isinstance(x, str):
raise Exception("value must be string or list of strings. ", type(x))
flags.append(x)
elif isinstance(val, str):
flags.append(val)
else:
raise Exception("value must be string or list of strings")
def add_cpp(self, value):
"""
Add flag or list of flags to CPPFLAGS
:param value: string or list of strings
"""
self.add('CPPFLAGS', value)
def add_c(self, value):
"""
Add flag or list of flags to CFLAGS
:param value: string or list of strings
"""
self.add('CFLAGS', value)
def add_cxx(self, value):
"""
Add flag or list of flags to CXXFLAGS
:param value: string or list of strings
"""
self.add('CXXFLAGS', value)
def add_candcxx(self, value):
"""
Add flag or list of flags to CFLAGS and CXXFLAGS
:param value: string or list of strings
"""
self.add_c(value)
self.add_cxx(value)
def add_link(self, value):
"""
Add flag or list of flags to LINKFLAGS
:param value: string or list of strings
"""
self.add('LINKFLAGS', value)
def configure(conf):
conf.load('compiler_cxx')
conf.check_cfg(
package = 'fltk-2.0',
mandatory = True,
args = '--cflags --libs')
conf.check_cfg(
package = 'jack',
mandatory = True,
args = '--cflags --libs')
conf.check_cfg(
package = 'lash-1.0',
mandatory = True,
args = '--cflags --libs')
flags = WafToolchainFlags(conf)
#flags.add_c(['-Wall', '-Wextra'])
flags.add_cxx(['--std=gnu++03'])
conf.load('autooptions')
#conf.env['LIB_PTHREAD'] = ['pthread']
#conf.env['LIB_DL'] = ['dl']
#conf.env['LIB_RT'] = ['rt']
#conf.env['LIB_M'] = ['m']
#conf.env['LIB_STDC++'] = ['stdc++']
conf.env['EPICHORD_VERSION'] = VERSION
conf.env['BINDIR'] = conf.env['PREFIX'] + '/bin'
if Options.options.libdir:
conf.env['LIBDIR'] = Options.options.libdir
else:
conf.env['LIBDIR'] = conf.env['PREFIX'] + '/lib64'
if Options.options.pkgconfigdir:
conf.env['PKGCONFDIR'] = Options.options.pkgconfigdir
else:
conf.env['PKGCONFDIR'] = conf.env['LIBDIR'] + '/pkgconfig'
conf.define('EPICHORD_VERSION', conf.env['EPICHORD_VERSION'])
conf.define('ROOT_DATA_DIR', os.path.normpath(os.path.join(conf.env['PREFIX'], 'share', APPNAME)))
conf.write_config_header('config.h', remove=False)
flags.flush()
print()
version_msg = APPNAME + "-" + VERSION
if os.access('version.h', os.R_OK):
data = open('version.h').read()
m = re.match(r'^#define GIT_VERSION "([^"]*)"$', data)
if m != None:
version_msg += " exported from " + m.group(1)
elif os.access('.git', os.R_OK):
version_msg += " git revision will be checked and eventually updated during build"
print(version_msg)
conf.msg('Install prefix', conf.env['PREFIX'], color='CYAN')
conf.msg('Library directory', conf.all_envs['']['LIBDIR'], color='CYAN')
tool_flags = [
('C++ compiler flags', ['CXXFLAGS', 'CPPFLAGS']),
('Linker flags', ['LINKFLAGS', 'LDFLAGS'])
]
for name, vars in tool_flags:
flags = []
for var in vars:
flags += conf.all_envs[''][var]
conf.msg(name, repr(flags), color='NORMAL')
#conf.summarize_auto_options()
def git_ver(self):
bld = self.generator.bld
header = self.outputs[0].abspath()
if os.access('./version.h', os.R_OK):
header = os.path.join(os.getcwd(), out, "version.h")
shutil.copy('./version.h', header)
data = open(header).read()
m = re.match(r'^#define GIT_VERSION "([^"]*)"$', data)
if m != None:
self.ver = m.group(1)
Logs.pprint('BLUE', "tarball from git revision " + self.ver)
else:
self.ver = "tarball"
return
if bld.srcnode.find_node('.git'):
self.ver = bld.cmd_and_log("LANG= git rev-parse HEAD", quiet=Context.BOTH).splitlines()[0]
if bld.cmd_and_log("LANG= git diff-index --name-only HEAD", quiet=Context.BOTH).splitlines():
self.ver += "-dirty"
Logs.pprint('BLUE', "git revision " + self.ver)
else:
self.ver = "unknown"
fi = open(header, 'w')
fi.write('#define GIT_VERSION "%s"\n' % self.ver)
fi.close()
def build(bld):
bld(rule=git_ver, target='version.h', update_outputs=True, always=True, ext_out=['.h'])
prog = bld(features=['cxx', 'cxxprogram'], includes = [bld.path.get_bld(), "./src"])
prog.uselib = 'JACK FLTK-2.0 LASH-1.0'
prog.target = 'epichord'
for source in [
'main.cpp',
'seq.cpp',
'jack.cpp',
'ui.cpp',
'pianoroll.cpp',
'trackselect.cpp',
'eventedit.cpp',
'timeline.cpp',
'sampleview.cpp',
'trackinfo.cpp',
'arranger.cpp',
'keyboard.cpp',
'trackmodule.cpp',
'util.cpp',
'midi.cpp',
'uihelper.cpp',
'saveload.cpp',
'metronome.cpp',
'eventmenu.cpp',
'theme.cpp',
'dragbar.cpp',
]:
prog.source.append(os.path.join("src", source))