diff --git a/common/wscript b/common/wscript index 4302b1e2..10ed9c25 100644 --- a/common/wscript +++ b/common/wscript @@ -6,13 +6,8 @@ import re import os def configure(conf): - conf.check_cc(header_name='samplerate.h', define_name="HAVE_SAMPLERATE") - - if conf.is_defined('HAVE_SAMPLERATE'): - conf.env['LIB_SAMPLERATE'] = ['samplerate'] - - conf.env['BUILD_NETLIB'] = conf.is_defined('HAVE_SAMPLERATE') - conf.env['BUILD_ADAPTER'] = conf.is_defined('HAVE_SAMPLERATE') + conf.env['BUILD_NETLIB'] = conf.env['SAMPLERATE'] + conf.env['BUILD_ADAPTER'] = conf.env['SAMPLERATE'] if conf.env['IS_WINDOWS']: try: diff --git a/example-clients/wscript b/example-clients/wscript index ae706e43..cee04cc2 100644 --- a/example-clients/wscript +++ b/example-clients/wscript @@ -36,24 +36,11 @@ example_libs = { } def configure(conf): - e = conf.check_cc(header_name='sndfile.h', define_name="HAVE_SNDFILE") - - if conf.is_defined('HAVE_SNDFILE'): - conf.env['LIB_SNDFILE'] = ['sndfile'] + conf.env['BUILD_EXAMPLE_CLIENT_TRANSPORT'] = conf.env['READLINE'] - conf.check_cfg(package='celt', atleast_version='0.5.0', args='--cflags --libs', mandatory=False) + conf.env['BUILD_EXAMPLE_CLIENT_REC'] = conf.env['SNDFILE'] - e = conf.check_cc(lib='readline', define_name="HAVE_READLINE", mandatory=False) - - # define_name="HAVE_READLINE" has no effect, LIB_READLINE is defined if readline is available - #if conf.is_defined('HAVE_READLINE'): - # conf.env['LIB_READLINE'] = ['readline'] - - conf.env['BUILD_EXAMPLE_CLIENT_TRANSPORT'] = bool(conf.env['LIB_READLINE']) - - conf.env['BUILD_EXAMPLE_CLIENT_REC'] = conf.is_defined('HAVE_SNDFILE') - - conf.env['BUILD_EXAMPLE_ALSA_IO'] = conf.is_defined('HAVE_SAMPLERATE') and conf.env['BUILD_DRIVER_ALSA'] + conf.env['BUILD_EXAMPLE_ALSA_IO'] = conf.env['SAMPLERATE'] and conf.env['BUILD_DRIVER_ALSA'] def build(bld): if bld.env['IS_LINUX']: diff --git a/linux/wscript b/linux/wscript index df2debec..cb4b9d3f 100644 --- a/linux/wscript +++ b/linux/wscript @@ -4,22 +4,8 @@ from waflib import Context def configure(conf): - conf.check_cfg(package='alsa', atleast_version='1.0.18', args='--cflags --libs', mandatory=False) - conf.env['BUILD_DRIVER_ALSA'] = conf.is_defined('HAVE_ALSA') - - conf. check_cfg(package='libfreebob', atleast_version='1.0.0', args='--cflags --libs', mandatory=False) - conf.env['BUILD_DRIVER_FREEBOB'] = conf.is_defined('HAVE_LIBFREEBOB') - - conf. check_cfg(package='libffado', atleast_version='1.999.17', args='--cflags --libs', mandatory=False) - conf.env['BUILD_DRIVER_FFADO'] = conf.is_defined('HAVE_LIBFFADO') - conf.define('HAVE_PPOLL', 1 ) - conf.check_cfg(package='gtkIOStream', atleast_version='1.4.0', args='--cflags --libs', mandatory=False) - conf.env['BUILD_DRIVER_IIO'] = conf.is_defined('HAVE_GTKIOSTREAM') - conf.check_cfg(package='eigen3', atleast_version='3.1.2', args='--cflags --libs', mandatory=False) - conf.env['BUILD_DRIVER_IIO'] += conf.is_defined('HAVE_EIGEN3') - def create_jack_driver_obj(bld, target, sources, uselib = None): driver = bld(features = ['c', 'cxx', 'cxxshlib', 'cshlib']) driver.env['cxxshlib_PATTERN'] = 'jack_%s.so' diff --git a/windows/wscript b/windows/wscript index ea4dd3d9..ec17887f 100644 --- a/windows/wscript +++ b/windows/wscript @@ -1,10 +1,6 @@ #! /usr/bin/env python # encoding: utf-8 -def configure(conf): - conf.check_cfg(package='portaudio-2.0', uselib_store='PORTAUDIO', atleast_version='19', args='--cflags --libs') - conf.env['BUILD_DRIVER_PORTAUDIO'] = conf.is_defined('HAVE_PORTAUDIO') - def create_jack_driver_obj(bld, target, sources, uselib = None): driver = bld(features = ['c', 'cxx', 'cxxshlib', 'cshlib']) driver.env['cxxshlib_PATTERN'] = 'jack_%s.dll' diff --git a/wscript b/wscript index 5d6de660..ac98fe9b 100644 --- a/wscript +++ b/wscript @@ -27,6 +27,8 @@ out = 'build' # lib32 variant name used when building in mixed mode lib32 = 'lib32' +auto_options = [] + def display_msg(msg, status = None, color = None): sr = msg global g_maxlen @@ -43,6 +45,13 @@ def display_feature(msg, build): else: display_msg(msg, "no", 'YELLOW') +def print_error(msg): + """ + This function prints an error without stopping waf. The reason waf should + not be stopped is to be able to list all missing dependencies in one chunk. + """ + print(Logs.colors.RED + msg + Logs.colors.NORMAL) + def create_svnversion_task(bld, header='svnversion.h', define=None): cmd = '../svnversion_regenerate.sh ${TGT}' if define: @@ -63,6 +72,334 @@ def create_svnversion_task(bld, header='svnversion.h', define=None): target = [bld.path.find_or_declare(header)] ) +class AutoOption: + """ + This class is the foundation for the auto options. It adds an option + --foo=no|yes to the list of options and deals with all logic and checks for + these options. + + Each option can have different dependencies that will be checked. If all + dependencies are available and the user has not done any request the option + will be enabled. If the user has requested to enable the option the class + ensures that all dependencies are available and prints an error message + otherwise. If the user disables the option, i.e. --foo=no, no checks are + made. + + For each option it is possible to add packages that are required for the + option using the add_package function. For dependency programs add_program + should be used. For libraries (without pkg-config support) the add_library + function should be used. For headers the add_header function exists. If + there is another type of requirement or dependency the check hook (an + external function called when configuring) can be used. + + When all checks have been made and the class has made a decision the result + is saved in conf.env['NAME'] where 'NAME' by default is the uppercase of the + name argument to __init__, but it can be changed with the conf_dest argument + to __init__. + + The class will define a preprocessor symbol with the result. The default + name is HAVE_NAME, but it can be changed using the define argument to + __init__. + """ + + def __init__(self, opt, name, help, conf_dest=None, define=None): + # check hook to call upon configuration + self.check_hook = None + self.check_hook_error = None + self.check_hook_found = True + + # required libraries + self.libs = [] # elements on the form [lib,uselib_store] + self.libs_not_found = [] # elements on the form lib + + # required headers + self.headers = [] + self.headers_not_found = [] + + # required packages (checked with pkg-config) + self.packages = [] # elements on the form [package,uselib_store,atleast_version] + self.packages_not_found = [] # elements on the form [package,atleast_version] + + # required programs + self.programs = [] # elements on the form [program,var] + self.programs_not_found = [] # elements on the form program + + # the result of the configuration (should the option be enabled or not?) + self.result = False + + self.help = help + self.option = '--' + name + self.dest = 'auto_option_' + name + if conf_dest: + self.conf_dest = conf_dest + else: + self.conf_dest = name.upper() + if not define: + self.define = 'HAVE_' + name.upper() + else: + self.define = define + opt.add_option(self.option, type='string', default='auto', dest=self.dest, help=self.help+' (enabled by default if possible)', metavar='no|yes') + + def add_library(self, library, uselib_store=None): + """ + Add a required library that should be checked during configuration. The + library will be checked using the conf.check_cc function. If the + uselib_store arugment is not given it defaults to LIBRARY (the uppercase + of the library argument). The uselib_store argument will be passed to + check_cc which means LIB_LIBRARY, CFLAGS_LIBRARY and DEFINES_LIBRARY, + etc. will be defined if the option is enabled. + """ + if not uselib_store: + uselib_store = library.upper().replace('-', '_') + self.libs.append([library, uselib_store]) + + def add_header(self, header): + """ + Add a required header that should be checked during configuration. The + header will be checked using the conf.check_cc function which means + HAVE_HEADER_H will be defined if found. + """ + self.headers.append(header) + + def add_package(self, package, uselib_store=None, atleast_version=None): + """ + Add a required package that should be checked using pkg-config during + configuration. The package will be checked using the conf.check_cfg + function and the uselib_store and atleast_version will be passed to + check_cfg. If uselib_store is None it defaults to PACKAGE (uppercase of + the package argument) with hyphens and dots replaced with underscores. + If atleast_version is None it defaults to '0'. + """ + if not uselib_store: + uselib_store = package.upper().replace('-', '_').replace('.', '_') + if not atleast_version: + atleast_version = '0' + self.packages.append([package, uselib_store, atleast_version]) + + def add_program(self, program, var=None): + """ + Add a required program that should be checked during configuration. If + var is not given it defaults to PROGRAM (the uppercase of the program + argument). If the option is enabled the program is saved in + conf.env.PROGRAM. + """ + if not var: + var = program.upper().replace('-', '_') + self.programs.append([program, var]) + + def set_check_hook(self, check_hook, check_hook_error): + """ + Set the check hook and the corresponding error printing function to the + configure step. The check_hook argument is a function that should return + True if the extra prerequisites were found and False if not. The + check_hook_error argument is an error printing function that should + print an error message telling the user that --foo was explicitly + requested but cannot be built since the extra prerequisites were not + found. Both function should take a single argument that is the waf + configuration context. + """ + self.check_hook = check_hook + self.check_hook_error = check_hook_error + + def _check(self, conf): + """ + This is an internal function that runs all necessary configure checks. + It checks all dependencies (even if some dependency was not found) so + that the user can install all missing dependencies in one go, instead + of playing the infamous hit-configure-hit-configure game. + + This function returns True if all dependencies were found and False if + not. + """ + all_found = True + + # check for libraries + for lib,uselib_store in self.libs: + try: + conf.check_cc(lib=lib, uselib_store=uselib_store) + except conf.errors.ConfigurationError: + all_found = False + self.libs_not_found.append(lib) + + # check for headers + for header in self.headers: + try: + conf.check_cc(header_name=header) + except conf.errors.ConfigurationError: + all_found = False + self.headers_not_found.append(header) + + # check for packages + for package,uselib_store,atleast_version in self.packages: + try: + conf.check_cfg(package=package, uselib_store=uselib_store, atleast_version=atleast_version, args='--cflags --libs') + except conf.errors.ConfigurationError: + all_found = False + self.packages_not_found.append([package,atleast_version]) + + # check for programs + for program,var in self.programs: + try: + conf.find_program(program, var=var) + except conf.errors.ConfigurationError: + all_found = False + self.programs_not_found.append(program) + + # call hook (if specified) + if self.check_hook: + self.check_hook_found = self.check_hook(conf) + if not self.check_hook_found: + all_found = False + + return all_found + + def _configure_error(self, conf): + """ + This is an internal function that prints errors for each missing + dependency. The error messages tell the user that this option required + some dependency, but it cannot be found. + """ + + for lib in self.libs_not_found: + print_error('%s requires the %s library, but it cannot be found.' % (self.option, lib)) + + for header in self.headers_not_found: + print_error('%s requires the %s header, but it cannot be found.' % (self.option, header)) + + for package,atleast_version in self.packages_not_found: + string = package + if atleast_version: + string += ' >= ' + atleast_version + print_error('%s requires the package %s, but it cannot be found.' % (self.option, string)) + + for program in self.programs_not_found: + print_error('%s requires the %s program, but it cannot be found.' % (self.option, program)) + + if not self.check_hook_found: + self.check_hook_error(conf) + + def configure(self, conf): + """ + This function configures the option examining the argument given too + --foo (where foo is this option). This function sets self.result to the + result of the configuration; True if the option should be enabled or + False if not. If not all dependencies were found self.result will shall + be False. conf.env['NAME'] will be set to the same value aswell as a + preprocessor symbol will be defined according to the result. + + If --foo[=yes] was given, but some dependency was not found an error + message is printed (foreach missing dependency). + + This function returns True on success and False on error. + """ + argument = getattr(Options.options, self.dest) + if argument == 'no': + self.result = False + retvalue = True + elif argument == 'yes': + if self._check(conf): + self.result = True + retvalue = True + else: + self.result = False + retvalue = False + self._configure_error(conf) + elif argument == 'auto': + self.result = self._check(conf) + retvalue = True + else: + print_error('Invalid argument "' + argument + '" to ' + self.option) + self.result = False + retvalue = False + + conf.env[self.conf_dest] = self.result + if self.result: + conf.define(self.define, 1) + else: + conf.define(self.define, 0) + return retvalue + + def display_message(self): + """ + This function displays a result message with the help text and the + result of the configuration. + """ + display_feature(self.help, self.result) + +def add_auto_option(opt, name, help, conf_dest=None, define=None): + """ + Adds an option to the list of auto options and returns the newly created + option. + """ + option = AutoOption(opt, name, help, conf_dest=conf_dest, define=define) + auto_options.append(option) + return option + +def auto_options_argv_hack(): + """ + This function applies a hack that for each auto option --foo=no|yes replaces + any occurence --foo in argv with --foo=yes, in effect interpreting --foo as + --foo=yes. The function has to be called before waf issues the option + parser, i.e. before the configure phase. + """ + for option in auto_options: + for x in range(1, len(sys.argv)): + if sys.argv[x] == option.option: + sys.argv[x] += '=yes' + +def configure_auto_options(conf): + """ + This function configures all auto options. It stops waf and prints an error + message if there were unsatisfied requirements. + """ + ok = True + for option in auto_options: + if not option.configure(conf): + ok = False + if not ok: + conf.fatal('There were unsatisfied requirements.') + +def display_auto_options_messages(): + """This function displays all options and the configuration result.""" + for option in auto_options: + option.display_message() + +def check_for_celt(conf): + found = False + for version in ['11', '8', '7', '5']: + define = 'HAVE_CELT_API_0_' + version + if not found: + try: + conf.check_cfg(package='celt', atleast_version='0.' + version + '.0', args='--cflags --libs') + found = True + conf.define(define, 1) + continue + except conf.errors.ConfigurationError: + pass + conf.define(define, 0) + return found + +def check_for_celt_error(conf): + print_error('--celt requires the package celt, but it could not be found.') + +# The readline/readline.h header does not work if stdio.h is not included +# before. Thus a fragment with both stdio.h and readline/readline.h need to be +# test-compiled to find out whether readline is available. +def check_for_readline(conf): + try: + conf.check_cc(fragment=''' + #include + #include + int main(void) { return 0; }''', + execute=False, + msg='Checking for header readline/readline.h') + return True + except conf.errors.ConfigurationError: + return False + +def check_for_readline_error(conf): + print_error('--readline requires the readline/readline.h header, but it cannot be found.') + def options(opt): # options provided by the modules opt.tool_options('compiler_cxx') @@ -87,17 +424,43 @@ def options(opt): opt.add_option('--ports-per-application', default=768, type="int", dest="application_ports", help='Maximum number of ports per application') # options with third party dependencies - opt.add_option('--doxygen', action='store_true', default=False, help='Enable build of doxygen documentation') - opt.add_option('--alsa', action='store_true', default=False, help='Enable ALSA driver') - opt.add_option('--firewire', action='store_true', default=False, help='Enable FireWire driver (FFADO)') - opt.add_option('--freebob', action='store_true', default=False, help='Enable FreeBob driver') - opt.add_option('--iio', action='store_true', default=False, help='Enable IIO driver') - opt.add_option('--portaudio', action='store_true', default=False, help='Enable Portaudio driver') - opt.add_option('--winmme', action='store_true', default=False, help='Enable WinMME driver') + doxygen = add_auto_option(opt, 'doxygen', help='Build doxygen documentation', conf_dest='BUILD_DOXYGEN_DOCS') + doxygen.add_program('doxygen') + alsa = add_auto_option(opt, 'alsa', help='Enable ALSA driver', conf_dest='BUILD_DRIVER_ALSA') + alsa.add_package('alsa', atleast_version='1.0.18') + firewire = add_auto_option(opt, 'firewire', help='Enable FireWire driver (FFADO)', conf_dest='BUILD_DRIVER_FFADO') + firewire.add_package('libffado', atleast_version='1.999.17') + freebob = add_auto_option(opt, 'freebob', help='Enable FreeBob driver') + freebob.add_package('libfreebob', atleast_version='1.0.0') + iio = add_auto_option(opt, 'iio', help='Enable IIO driver', conf_dest='BUILD_DRIVER_IIO') + iio.add_package('gtkIOStream', atleast_version='1.4.0') + iio.add_package('eigen3', atleast_version='3.1.2') + portaudio = add_auto_option(opt, 'portaudio', help='Enable Portaudio driver', conf_dest='BUILD_DRIVER_PORTAUDIO') + portaudio.add_header('windows.h') # only build portaudio on windows + portaudio.add_package('portaudio-2.0', uselib_store='PORTAUDIO', atleast_version='19') + winmme = add_auto_option(opt, 'winmme', help='Enable WinMME driver', conf_dest='BUILD_DRIVER_WINMME') + winmme.add_header('mmsystem.h') + winmme.add_header('windows.h') + + celt = add_auto_option(opt, 'celt', help='Build with CELT') + celt.set_check_hook(check_for_celt, check_for_celt_error) + opus = add_auto_option(opt, 'opus', help='Build Opus netjack2') + opus.add_header('opus/opus_custom.h') + opus.add_package('opus', atleast_version='0.9.0') + samplerate = add_auto_option(opt, 'samplerate', help='Build with libsamplerate') + samplerate.add_package('samplerate') + sndfile = add_auto_option(opt, 'sndfile', help='Build with libsndfile') + sndfile.add_package('sndfile') + readline = add_auto_option(opt, 'readline', help='Build with readline') + readline.add_library('readline') + readline.set_check_hook(check_for_readline, check_for_readline_error) # dbus options opt.sub_options('dbus') + # this must be called before the configure phase + auto_options_argv_hack() + def configure(conf): conf.load('compiler_cxx') conf.load('compiler_cc') @@ -150,78 +513,19 @@ def configure(conf): conf.env.append_unique('CXXFLAGS', '-Wall') conf.env.append_unique('CFLAGS', '-Wall') + # configure all auto options + configure_auto_options(conf) + conf.sub_config('common') if conf.env['IS_LINUX']: conf.sub_config('linux') - if Options.options.alsa and not conf.env['BUILD_DRIVER_ALSA']: - conf.fatal('ALSA driver was explicitly requested but cannot be built') - if Options.options.freebob and not conf.env['BUILD_DRIVER_FREEBOB']: - conf.fatal('FreeBob driver was explicitly requested but cannot be built') - if Options.options.firewire and not conf.env['BUILD_DRIVER_FFADO']: - conf.fatal('FFADO driver was explicitly requested but cannot be built') - if Options.options.iio and not conf.env['BUILD_DRIVER_IIO']: - conf.fatal('IIO driver was explicitly requested but cannot be built') - conf.env['BUILD_DRIVER_ALSA'] = Options.options.alsa - conf.env['BUILD_DRIVER_FFADO'] = Options.options.firewire - conf.env['BUILD_DRIVER_FREEBOB'] = Options.options.freebob - conf.env['BUILD_DRIVER_IIO'] = Options.options.iio - if conf.env['IS_WINDOWS']: - conf.sub_config('windows') - if Options.options.portaudio and not conf.env['BUILD_DRIVER_PORTAUDIO']: - conf.fatal('Portaudio driver was explicitly requested but cannot be built') - conf.env['BUILD_DRIVER_WINMME'] = Options.options.winmme if Options.options.dbus: conf.sub_config('dbus') if conf.env['BUILD_JACKDBUS'] != True: conf.fatal('jackdbus was explicitly requested but cannot be built') - conf.check_cc(header_name='samplerate.h', define_name="HAVE_SAMPLERATE") - - if conf.is_defined('HAVE_SAMPLERATE'): - conf.env['LIB_SAMPLERATE'] = ['samplerate'] - conf.sub_config('example-clients') - if conf.check_cfg(package='celt', atleast_version='0.11.0', args='--cflags --libs', mandatory=False): - conf.define('HAVE_CELT', 1) - conf.define('HAVE_CELT_API_0_11', 1) - conf.define('HAVE_CELT_API_0_8', 0) - conf.define('HAVE_CELT_API_0_7', 0) - conf.define('HAVE_CELT_API_0_5', 0) - elif conf.check_cfg(package='celt', atleast_version='0.8.0', args='--cflags --libs', mandatory=False): - conf.define('HAVE_CELT', 1) - conf.define('HAVE_CELT_API_0_11', 0) - conf.define('HAVE_CELT_API_0_8', 1) - conf.define('HAVE_CELT_API_0_7', 0) - conf.define('HAVE_CELT_API_0_5', 0) - elif conf.check_cfg(package='celt', atleast_version='0.7.0', args='--cflags --libs', mandatory=False): - conf.define('HAVE_CELT', 1) - conf.define('HAVE_CELT_API_0_11', 0) - conf.define('HAVE_CELT_API_0_8', 0) - conf.define('HAVE_CELT_API_0_7', 1) - conf.define('HAVE_CELT_API_0_5', 0) - elif conf.check_cfg(package='celt', atleast_version='0.5.0', args='--cflags --libs', mandatory=False): - conf.define('HAVE_CELT', 1) - conf.define('HAVE_CELT_API_0_11', 0) - conf.define('HAVE_CELT_API_0_8', 0) - conf.define('HAVE_CELT_API_0_7', 0) - conf.define('HAVE_CELT_API_0_5', 1) - else: - conf.define('HAVE_CELT', 0) - conf.define('HAVE_CELT_API_0_11', 0) - conf.define('HAVE_CELT_API_0_8', 0) - conf.define('HAVE_CELT_API_0_7', 0) - conf.define('HAVE_CELT_API_0_5', 0) - - conf.env['WITH_OPUS'] = False - if conf.check_cfg(package='opus', atleast_version='0.9.0' , args='--cflags --libs', mandatory=False): - if conf.check_cc(header_name='opus/opus_custom.h', mandatory=False): - conf.define('HAVE_OPUS', 1) - conf.env['WITH_OPUS'] = True - else: - conf.define('HAVE_OPUS', 0) - - conf.env['LIB_PTHREAD'] = ['pthread'] conf.env['LIB_DL'] = ['dl'] conf.env['LIB_RT'] = ['rt'] @@ -230,7 +534,6 @@ def configure(conf): conf.env['JACK_API_VERSION'] = JACK_API_VERSION conf.env['JACK_VERSION'] = VERSION - conf.env['BUILD_DOXYGEN_DOCS'] = Options.options.doxygen conf.env['BUILD_WITH_PROFILE'] = Options.options.profile conf.env['BUILD_WITH_32_64'] = Options.options.mixed conf.env['BUILD_CLASSIC'] = Options.options.classic @@ -346,8 +649,6 @@ def configure(conf): display_msg('32-bit C compiler flags', repr(conf.all_envs[lib32]['CFLAGS'])) display_msg('32-bit C++ compiler flags', repr(conf.all_envs[lib32]['CXXFLAGS'])) display_msg('32-bit linker flags', repr(conf.all_envs[lib32]['LINKFLAGS'])) - display_feature('Build doxygen documentation', conf.env['BUILD_DOXYGEN_DOCS']) - display_feature('Build Opus netjack2', conf.env['WITH_OPUS']) display_feature('Build with engine profiling', conf.env['BUILD_WITH_PROFILE']) display_feature('Build with 32/64 bits mixed mode', conf.env['BUILD_WITH_32_64']) @@ -359,15 +660,8 @@ def configure(conf): print(Logs.colors.RED + 'WARNING !! mixing both jackd and jackdbus may cause issues:' + Logs.colors.NORMAL) print(Logs.colors.RED + 'WARNING !! jackdbus does not use .jackdrc nor qjackctl settings' + Logs.colors.NORMAL) - if conf.env['IS_LINUX']: - display_feature('Build with ALSA support', conf.env['BUILD_DRIVER_ALSA'] == True) - display_feature('Build with FireWire (FreeBob) support', conf.env['BUILD_DRIVER_FREEBOB'] == True) - display_feature('Build with FireWire (FFADO) support', conf.env['BUILD_DRIVER_FFADO'] == True) - display_feature('Build with IIO support', conf.env['BUILD_DRIVER_IIO'] == True) - - if conf.env['IS_WINDOWS']: - display_feature('Build with WinMME support', conf.env['BUILD_DRIVER_WINMME'] == True) - display_feature('Build with Portaudio support', conf.env['BUILD_DRIVER_PORTAUDIO'] == True) + # display configuration result messages for auto options + display_auto_options_messages() if conf.env['BUILD_JACKDBUS'] == True: display_msg('D-Bus service install directory', conf.env['DBUS_SERVICES_DIR'], 'CYAN') @@ -465,7 +759,7 @@ def build(bld): Logs.pprint('CYAN', "Removing doxygen generated documentation done.") elif bld.cmd =='build': if not os.access(html_docs_source_dir, os.R_OK): - os.popen("doxygen").read() + os.popen(bld.env.DOXYGEN).read() else: Logs.pprint('CYAN', "doxygen documentation already built.")