website/index.html: Extend Feedback section (codeberg.org)
[a2jmidid.git] / wscript
blob62b9d1aff1f95ba6f4a98c09e39c52dafb6de299
1 #! /usr/bin/env python
2 # encoding: utf-8
4 from __future__ import print_function
6 import os
7 import subprocess
8 import shutil
9 import re
11 from waflib import Logs, Options, TaskGen, Context, Utils, Scripting
12 from waflib.Build import BuildContext, CleanContext, InstallContext, UninstallContext
13 from waftoolchainflags import WafToolchainFlags
15 APPNAME='a2jmidid'
16 VERSION='12'
18 # these variables are mandatory ('/' are converted automatically)
19 srcdir = '.'
20 blddir = 'build'
22 def display_feature(conf, msg, build):
23 if build:
24 conf.msg(msg, 'yes', color='GREEN')
25 else:
26 conf.msg(msg, 'no', color='YELLOW')
28 def git_ver(self):
29 if type(self) == Scripting.Dist:
30 header = "./gitversion.h"
31 bld = self
32 else:
33 bld = self.generator.bld
34 header = self.outputs[0].abspath()
35 if os.access('./gitversion.h', os.R_OK):
36 #header = os.path.join(os.getcwd(), out, "version.h")
37 shutil.copy('./gitversion.h', header)
38 data = open(header).read()
39 m = re.match(r'^#define GIT_VERSION "([^"]*)"$', data)
40 if m != None:
41 self.ver = m.group(1)
42 Logs.pprint('BLUE', "tarball from git revision " + self.ver)
43 else:
44 self.ver = "tarball"
45 return
47 if os.access('./.git', os.R_OK):
48 self.ver = bld.cmd_and_log("LANG= git rev-parse HEAD", quiet=Context.BOTH).splitlines()[0]
49 if bld.cmd_and_log("LANG= git diff-index --name-only HEAD", quiet=Context.BOTH).splitlines():
50 self.ver += "-dirty"
52 Logs.pprint('BLUE', "git revision " + self.ver)
53 else:
54 self.ver = "unknown"
56 fi = open(header, 'w')
57 fi.write('#define GIT_VERSION "%s"\n' % self.ver)
58 fi.close()
60 def display_msg(conf, msg="", status = None, color = None):
61 if status:
62 #Logs.pprint(msg, status, color)
63 conf.msg(msg, status, color=color)
64 else:
65 Logs.pprint('NORMAL', msg)
67 def display_raw_text(conf, text, color = 'NORMAL'):
68 Logs.pprint(color, text, sep = '')
70 def display_line(conf, text, color = 'NORMAL'):
71 Logs.pprint(color, text, sep = os.linesep)
73 def options(opt):
74 # options provided by the modules
75 opt.load('compiler_c')
76 opt.load('autooptions')
78 opt.add_auto_option(
79 'devmode',
80 help='Enable devmode', # enable warnings and treat them as errors
81 conf_dest='BUILD_DEVMODE',
82 default=False,
84 opt.add_option('--debug', action='store_true', default=False, help='Build debuggable binaries')
86 opt.add_option('--enable-pkg-config-dbus-service-dir', action='store_true', default=False, help='force D-Bus service install dir to be one returned by pkg-config')
87 opt.add_option('--disable-dbus', action='store_true', default=False, help="Don't enable D-Bus support even if required dependencies are present")
88 opt.add_option('--mandir', type='string', help="Manpage directory [Default: <prefix>/share/man]")
90 def configure(conf):
91 conf.load('compiler_c')
92 conf.load('autooptions')
94 conf.check_cfg(package='alsa', mandatory=True, args='--cflags --libs')
95 conf.check_cfg(package='jack', vnum="0.109.0", mandatory=True, args='--cflags --libs')
97 if not Options.options.disable_dbus:
98 conf.check_cfg(package='dbus-1', mandatory=False, args='--cflags --libs')
99 conf.env['DBUS_ENABLED'] = 'LIB_DBUS-1' in conf.env
100 else:
101 conf.env['DBUS_ENABLED'] = False
103 if conf.env['DBUS_ENABLED']:
104 dbus_dir = conf.check_cfg(package='dbus-1', args='--variable=session_bus_services_dir', msg="Retrieving D-Bus services dir")
105 if not dbus_dir:
106 return
108 dbus_dir = dbus_dir.strip()
109 conf.env['DBUS_SERVICES_DIR_REAL'] = dbus_dir
111 if Options.options.enable_pkg_config_dbus_service_dir:
112 conf.env['DBUS_SERVICES_DIR'] = dbus_dir
113 else:
114 conf.env['DBUS_SERVICES_DIR'] = os.path.join(os.path.normpath(conf.env['PREFIX']), 'share', 'dbus-1', 'services')
116 conf.env['LIB_DL'] = ['dl']
117 conf.env['LIB_PTHREAD'] = ['pthread']
119 # conf.c is the only user of expat and its build is disabled
120 #conf.check_header('expat.h', mandatory=True)
121 #conf.env['LIB_EXPAT'] = ['expat']
123 conf.check(header_name='getopt.h', mandatory=True)
125 if Options.options.mandir:
126 conf.env['MANDIR'] = Options.options.mandir
127 else:
128 conf.env['MANDIR'] = conf.env['PREFIX'] + '/share/man'
130 conf.define('A2J_VERSION', VERSION)
131 conf.write_config_header('config.h')
133 gitrev = None
134 if os.access('gitversion.h', os.R_OK):
135 data = open('gitversion.h', 'r').read()
136 m = re.match(r'^#define GIT_VERSION "([^"]*)"$', data)
137 if m != None:
138 gitrev = m.group(1)
140 flags = WafToolchainFlags(conf)
141 flags.add_c('-std=gnu99')
142 if conf.env['BUILD_DEVMODE']:
143 flags.add_c(['-Wall', '-Wextra'])
144 #flags.add_c('-Wpedantic')
145 flags.add_c('-Werror')
146 flags.add_c(['-Wno-variadic-macros', '-Wno-gnu-zero-variadic-macro-arguments'])
148 # https://wiki.gentoo.org/wiki/Modern_C_porting
149 if conf.env['CC'] == 'clang':
150 flags.add_c('-Wno-unknown-argumemt')
151 flags.add_c('-Werror=implicit-function-declaration')
152 flags.add_c('-Werror=incompatible-function-pointer-types')
153 flags.add_c('-Werror=deprecated-non-prototype')
154 flags.add_c('-Werror=strict-prototypes')
155 if int(conf.env['CC_VERSION'][0]) < 16:
156 flags.add_c('-Werror=implicit-int')
157 else:
158 flags.add_c('-Wno-unknown-warning-option')
159 flags.add_c('-Werror=implicit-function-declaration')
160 flags.add_c('-Werror=implicit-int')
161 flags.add_c('-Werror=incompatible-pointer-types')
162 flags.add_c('-Werror=strict-prototypes')
163 if Options.options.debug:
164 flags.add_c(['-O0', '-g', '-fno-omit-frame-pointer'])
165 flags.add_link('-g')
167 flags.flush()
169 print()
170 display_msg(conf, "==================")
171 version_msg = "a2jmidid-" + VERSION
172 if gitrev:
173 version_msg += " exported from " + gitrev
174 else:
175 version_msg += " git revision will checked and eventually updated during build"
176 print(version_msg)
177 print()
179 display_msg(conf, "Install prefix", conf.env['PREFIX'], 'CYAN')
180 display_feature(conf, 'Build debuggable binaries', Options.options.debug)
182 tool_flags = [
183 ('C compiler flags', ['CFLAGS', 'CPPFLAGS']),
184 ('Linker flags', ['LINKFLAGS', 'LDFLAGS'])
186 for name, vars in tool_flags:
187 flags = []
188 for var in vars:
189 flags += conf.all_envs[''][var]
190 conf.msg(name, repr(flags), color='NORMAL')
192 if conf.env['DBUS_ENABLED']:
193 have_dbus_status = "yes"
194 else:
195 have_dbus_status = "no"
196 display_msg(conf, "D-Bus support", have_dbus_status)
197 if conf.env['DBUS_ENABLED']:
198 display_msg(conf, 'D-Bus service install directory', conf.env['DBUS_SERVICES_DIR'], 'CYAN')
199 if conf.env['DBUS_SERVICES_DIR'] != dbus_dir:
200 display_msg(conf)
201 display_line(conf, "WARNING: D-Bus session services directory as reported by pkg-config is", 'RED')
202 display_raw_text(conf, "WARNING:", 'RED')
203 display_line(conf, conf.env['DBUS_SERVICES_DIR_REAL'], 'CYAN')
204 display_line(conf, 'WARNING: but service file will be installed in', 'RED')
205 display_raw_text(conf, "WARNING:", 'RED')
206 display_line(conf, conf.env['DBUS_SERVICES_DIR'], 'CYAN')
207 display_line(conf, 'WARNING: You may need to adjust your D-Bus configuration after installing ladish', 'RED')
208 display_line(conf, 'WARNING: You can override dbus service install directory', 'RED')
209 display_line(conf, 'WARNING: with --enable-pkg-config-dbus-service-dir option to this script', 'RED')
210 print()
212 def build(bld):
213 bld(rule=git_ver,
214 target='gitversion.h',
215 update_outputs=True,
216 always=True,
217 ext_out=['.h'])
219 prog = bld(features=['c', 'cprogram'])
220 prog.source = [
221 'a2jmidid.c',
222 'log.c',
223 'port.c',
224 'port_thread.c',
225 'port_hash.c',
226 'paths.c',
227 #'conf.c',
228 'jack.c',
229 'list.c',
230 'sigsegv.c',
233 if bld.env['DBUS_ENABLED']:
234 prog.source.append('dbus.c')
235 prog.source.append('dbus_iface_introspectable.c')
236 prog.source.append('dbus_iface_control.c')
238 prog.includes = '.' # make waf dependency tracking work
239 prog.target = 'a2jmidid'
240 prog.use = ['ALSA', 'JACK', 'DL', 'PTHREAD']
241 if bld.env['DBUS_ENABLED']:
242 prog.use.append('DBUS-1')
243 prog.defines = ["HAVE_GITVERSION_H"]
245 prog = bld(features=['c', 'cprogram'])
246 prog.source = 'a2jmidi_bridge.c'
247 prog.target = 'a2jmidi_bridge'
248 prog.use = ['ALSA', 'JACK']
250 prog = bld(features=['c', 'cprogram'])
251 prog.source = 'j2amidi_bridge.c'
252 prog.target = 'j2amidi_bridge'
253 prog.use = ['ALSA', 'JACK']
255 if bld.env['DBUS_ENABLED']:
256 # process org.gna.home.a2jmidid.service.in -> org.gna.home.a2jmidid.service
257 obj = bld(features='subst')
258 obj.source = 'org.gna.home.a2jmidid.service.in'
259 obj.target = 'org.gna.home.a2jmidid.service'
260 obj.install_path = '${DBUS_SERVICES_DIR}/'
261 obj.bindir = bld.env['PREFIX'] + '/bin'
263 bld.install_as(
264 os.path.join(bld.env['PREFIX'], 'bin', 'a2j_control'),
265 'a2j_control',
266 chmod=Utils.O755)
267 bld.install_as(
268 os.path.join(bld.env['PREFIX'], 'bin', 'a2j'),
269 'a2j',
270 chmod=Utils.O755)
272 # install man pages
273 man_pages = [
274 "a2jmidi_bridge.1",
275 "a2jmidid.1",
276 "j2amidi_bridge.1",
279 if bld.env['DBUS_ENABLED']:
280 man_pages.append("a2j.1")
281 man_pages.append("a2j_control.1")
283 for i in range(len(man_pages)):
284 man_pages[i] = "man/" + man_pages[i]
286 bld.install_files(os.path.join(bld.env['MANDIR'], 'man1'), man_pages)
288 def dist(ctx):
289 git_ver(ctx)