2021-10-22 16:38:46 +00:00
project ( 'gstreamer-full' , 'c' ,
2022-02-04 11:15:47 +00:00
version : '1.21.0.1' ,
2021-10-14 17:38:26 +00:00
meson_version : '>= 0.59' ,
2021-10-13 08:05:51 +00:00
default_options : [ 'buildtype=debugoptimized' ,
# Needed due to https://github.com/mesonbuild/meson/issues/1889,
# but this can cause problems in the future. Remove it
# when it's no longer necessary.
'cpp_std=c++14' ] )
2016-08-24 15:10:21 +00:00
2016-09-05 14:54:46 +00:00
gst_version = '>= @0@' . format ( meson . project_version ( ) )
2016-08-24 15:10:21 +00:00
2018-05-17 08:25:43 +00:00
build_system = build_machine . system ( )
2016-11-19 13:16:03 +00:00
cc = meson . get_compiler ( 'c' )
2018-04-13 09:26:33 +00:00
2021-02-21 15:20:15 +00:00
fs = import ( 'fs' )
2021-09-13 21:20:11 +00:00
gnome = import ( 'gnome' )
2019-09-17 15:52:10 +00:00
pkgconfig = import ( 'pkgconfig' )
2019-06-25 15:25:36 +00:00
python3 = import ( 'python' ) . find_installation ( )
2022-02-21 09:49:15 +00:00
# Ensure that we're not being run from inside the development environment
2019-06-25 15:25:36 +00:00
# because that will confuse meson, and it might find the already-built
# gstreamer. It's fine if people run `ninja` as long as it doesn't run
# reconfigure because ninja doesn't care about the env.
2022-02-21 09:49:15 +00:00
ensure_not_devenv = '' '
2019-06-25 15:25:36 +00:00
import os
assert ( 'GST_ENV' not in os . environ )
'' '
2022-02-21 09:49:15 +00:00
cmdres = run_command ( python3 , '-c' , ensure_not_devenv , check : false )
2019-06-25 15:25:36 +00:00
if cmdres . returncode ( ) != 0
2022-02-21 09:58:28 +00:00
error ( 'Do not run `ninja reconfigure` or `meson` for gst-build inside the development environment, you will run into problems' )
2019-06-25 15:25:36 +00:00
endif
2021-09-24 18:11:13 +00:00
# Install gst-indent pre-commit hook
2022-01-04 20:37:59 +00:00
run_command ( python3 , '-c' , 'import shutil; shutil.copy("scripts/git-hooks/multi-pre-commit.hook", ".git/hooks/pre-commit")' , check : false )
2021-09-24 18:11:13 +00:00
2020-10-01 17:35:34 +00:00
# Ensure that the user does not have Strawberry Perl in PATH, since it ships
# with a pkg-config.bat and broken pkgconfig files for libffi and zlib. Will
# cause a build error, such as in
# https://gitlab.freedesktop.org/gstreamer/gst-build/-/issues/41
ensure_no_strawberry_perl = '' '
import os
assert ( r 'Strawberry\perl\bin' not in os . environ [ 'PATH' ] )
'' '
2021-10-28 14:09:21 +00:00
if build_system == 'windows' and meson . version ( ) . version_compare ( '<0.60.0' )
2022-01-04 20:37:59 +00:00
cmdres = run_command ( python3 , '-c' , ensure_no_strawberry_perl , check : false )
2020-10-01 17:35:34 +00:00
if cmdres . returncode ( ) != 0
2021-10-28 14:09:21 +00:00
error ( 'You have Strawberry Perl in PATH which is known to cause build issues with Meson < 0.60.0. Please remove it from PATH, uninstall it, or upgrade Meson.' )
2020-10-01 17:35:34 +00:00
endif
endif
2018-10-28 14:06:35 +00:00
documented_projects = ''
2018-04-13 09:26:33 +00:00
# Make it possible to use msys2 built zlib which fails
# when not using the mingw toolchain as it uses unistd.h
2016-11-19 13:16:03 +00:00
if not meson . is_subproject ( ) and cc . get_id ( ) == 'msvc'
2018-04-22 00:50:06 +00:00
uname = find_program ( 'uname' , required : false )
if uname . found ( )
2022-01-04 20:37:59 +00:00
ret = run_command ( uname , '-o' , check : false )
2018-04-22 00:50:06 +00:00
if ret . returncode ( ) == 0 and ret . stdout ( ) . to_lower ( ) == 'msys'
2022-01-04 20:37:59 +00:00
ret = run_command ( uname , '-r' , check : false )
2018-04-22 00:50:06 +00:00
# The kernel version returned by uname is actually the msys version
if ret . returncode ( ) == 0 and ret . stdout ( ) . startswith ( '2' )
# If a system zlib is found, disable UNIX features in zlib.h and zconf.h
if cc . find_library ( 'z' ) . found ( )
add_global_arguments ( '-DZ_SOLO' , language : 'c' )
endif
2018-04-13 09:26:33 +00:00
endif
endif
endif
2020-11-04 10:30:14 +00:00
endif
2019-10-23 07:51:24 +00:00
2021-08-30 11:53:05 +00:00
# Ensure that MSVC interprets all source code as UTF-8. Only do this when we're
# not a subproject, because subprojects are not allowed to call
# add_global_arguments().
if not meson . is_subproject ( ) and cc . get_id ( ) == 'msvc'
2021-08-30 11:51:44 +00:00
add_global_arguments (
cc . get_supported_arguments ( [ '/utf-8' ] ) , # set the input encoding to utf-8
language : [ 'c' , 'cpp' ] )
endif
2019-02-18 16:13:07 +00:00
# Ordered list of subprojects (dict has no ordering guarantees)
subprojects = [
2020-07-07 14:36:04 +00:00
[ 'gstreamer' , { 'build-hotdoc' : true } ] ,
2020-07-15 13:01:37 +00:00
[ 'gst-plugins-base' , { 'option' : get_option ( 'base' ) , 'build-hotdoc' : true } ] ,
[ 'gst-plugins-good' , { 'option' : get_option ( 'good' ) , 'build-hotdoc' : true } ] ,
2019-04-05 13:27:37 +00:00
[ 'libnice' , { 'option' : get_option ( 'libnice' ) , 'match_gst_version' : false } ] ,
2020-07-07 14:36:04 +00:00
[ 'gst-plugins-bad' , { 'option' : get_option ( 'bad' ) , 'build-hotdoc' : true } ] ,
[ 'gst-plugins-ugly' , { 'option' : get_option ( 'ugly' ) , 'build-hotdoc' : true } ] ,
[ 'gst-libav' , { 'option' : get_option ( 'libav' ) , 'build-hotdoc' : true } ] ,
[ 'gst-rtsp-server' , { 'option' : get_option ( 'rtsp_server' ) , 'build-hotdoc' : true } ] ,
2018-10-28 14:06:35 +00:00
[ 'gst-devtools' , { 'option' : get_option ( 'devtools' ) , 'build-hotdoc' : true } ] ,
2019-03-13 22:08:59 +00:00
[ 'gst-integration-testsuites' , { 'option' : get_option ( 'devtools' ) } ] ,
2020-07-07 14:36:04 +00:00
[ 'gst-editing-services' , { 'option' : get_option ( 'ges' ) , 'build-hotdoc' : true } ] ,
[ 'gstreamer-vaapi' , { 'option' : get_option ( 'vaapi' ) , 'build-hotdoc' : true } ] ,
[ 'gst-omx' , { 'option' : get_option ( 'omx' ) , 'build-hotdoc' : true } ] ,
2019-02-18 16:13:07 +00:00
[ 'gstreamer-sharp' , { 'option' : get_option ( 'sharp' ) } ] ,
2021-10-18 20:19:13 +00:00
[ 'pygobject' , { 'option' : get_option ( 'python' ) , 'match_gst_version' : false , 'sysdep' : 'pygobject-3.0' , 'sysdep_version' : '>= 3.8' } ] ,
2020-07-07 14:36:04 +00:00
[ 'gst-python' , { 'option' : get_option ( 'python' ) } ] ,
2019-11-02 16:18:27 +00:00
[ 'gst-examples' , { 'option' : get_option ( 'gst-examples' ) , 'match_gst_versions' : false } ] ,
2020-07-07 14:36:04 +00:00
[ 'gst-plugins-rs' , { 'option' : get_option ( 'rs' ) , 'match_gst_version' : false } ] ,
2019-02-18 16:13:07 +00:00
]
2017-08-22 19:29:58 +00:00
2016-10-20 21:12:53 +00:00
symlink = '' '
import os
os . symlink ( os . path . join ( '@1@' , 'subprojects' , '@0@' ) ,
2018-07-12 14:14:33 +00:00
os . path . join ( '@1@' , '@0@' ) )
2016-10-20 21:12:53 +00:00
'' '
2017-03-07 23:31:26 +00:00
2019-01-24 16:11:59 +00:00
if build_system == 'windows'
2018-05-17 08:25:43 +00:00
subproject ( 'win-flex-bison-binaries' )
2019-02-05 17:13:30 +00:00
subproject ( 'win-nasm' )
2021-08-23 13:23:54 +00:00
elif build_system == 'darwin'
subproject ( 'macos-bison-binary' )
2018-05-17 08:25:43 +00:00
endif
2020-07-04 14:00:35 +00:00
orc_subproject = subproject ( 'orc' , required : get_option ( 'orc' ) )
2019-01-29 01:58:21 +00:00
2021-12-12 13:20:55 +00:00
foreach custom_subproj : get_option ( 'custom_subprojects' ) . split ( ',' )
if custom_subproj != ''
message ( 'Adding custom subproject ' + custom_subproj )
subprojects + = [ [ custom_subproj , { 'match_gst_version' : false } ] ]
endif
endforeach
2018-07-12 14:14:33 +00:00
subprojects_names = [ ]
2019-05-16 13:26:47 +00:00
plugins_doc_caches = [ ]
2020-07-04 14:00:35 +00:00
orc_update_targets = [ ]
2019-09-17 19:53:40 +00:00
all_plugins = [ ]
2021-10-16 01:07:39 +00:00
# Using a list and not a dict to keep the ordering to build the chain of `gir`
# dependencies
2021-09-13 21:20:11 +00:00
all_libraries = [ ]
2019-02-18 16:13:07 +00:00
foreach sp : subprojects
project_name = sp [ 0 ]
build_infos = sp [ 1 ]
2018-10-20 22:04:25 +00:00
is_required = build_infos . get ( 'option' , true )
2021-10-13 10:38:35 +00:00
sysdep = build_infos . get ( 'sysdep' , '' )
sysdep_version = build_infos . get ( 'sysdep_version' , '' )
2019-04-05 13:27:37 +00:00
match_gst_version = build_infos . get ( 'match_gst_version' , true )
if match_gst_version
subproj = subproject ( project_name , version : gst_version , required : is_required )
2021-10-13 10:38:35 +00:00
elif sysdep != ''
sysdep_dep = dependency ( sysdep , version : sysdep_version , required : false )
if not sysdep_dep . found ( )
subproj = subproject ( project_name , required : is_required )
endif
2019-04-05 13:27:37 +00:00
else
subproj = subproject ( project_name , required : is_required )
endif
2019-05-26 13:49:21 +00:00
if subproj . found ( )
2020-07-07 14:36:04 +00:00
plugins = subproj . get_variable ( 'plugins' , [ ] )
2019-09-17 19:53:40 +00:00
all_plugins + = plugins
2021-09-13 21:20:11 +00:00
all_libraries + = subproj . get_variable ( 'libraries' , [ ] )
2018-10-28 14:06:35 +00:00
2020-07-04 14:00:35 +00:00
orc_update_targets + = subproj . get_variable ( 'orc_update_targets' , [ ] )
2018-10-20 22:04:25 +00:00
subprojects_names + = [ project_name ]
2019-05-26 13:49:21 +00:00
2020-03-12 18:40:58 +00:00
if not meson . is_cross_build ( ) and build_infos . get ( 'build-hotdoc' , false )
2019-05-26 13:49:21 +00:00
if plugins . length ( ) > 0
2021-10-12 18:52:48 +00:00
plugins_doc_caches + = [ subproj . get_variable ( 'plugins_doc_dep' , [ ] ) ]
2019-05-26 13:49:21 +00:00
endif
if documented_projects != ''
documented_projects + = ','
endif
documented_projects + = project_name
endif
2018-10-20 22:04:25 +00:00
endif
2016-08-24 15:10:21 +00:00
endforeach
2020-07-23 11:01:07 +00:00
# Check if we need to also build glib-networking for TLS modules
glib_dep = dependency ( 'glib-2.0' )
if glib_dep . type_name ( ) == 'internal'
subproject ( 'glib-networking' , required : get_option ( 'tls' ) ,
default_options : [ 'gnutls=auto' , 'openssl=auto' ] )
endif
2019-05-16 13:26:47 +00:00
plugins_doc_dep = custom_target ( 'plugins-doc-cache' ,
command : [ python3 , '-c' , 'print("Built all doc caches")' ] ,
input : plugins_doc_caches ,
output : 'plugins_doc_caches' ,
capture : true ,
)
2018-11-12 23:23:14 +00:00
if meson . is_cross_build ( ) or build_machine . system ( ) == 'windows'
if get_option ( 'doc' ) . enabled ( )
error ( 'Documentation enabled but building the doc while cross building or building on windows is not supported yet.' )
endif
2020-04-23 03:48:22 +00:00
documented_projects = ''
2019-05-14 22:21:54 +00:00
message ( 'Documentation not built as building the documentation while cross building or building on windows is not supported yet.' )
2018-10-28 14:06:35 +00:00
else
hotdoc_p = find_program ( 'hotdoc' , required : get_option ( 'doc' ) )
2020-04-23 03:48:22 +00:00
if not hotdoc_p . found ( )
documented_projects = ''
2018-10-28 14:06:35 +00:00
message ( 'Not building documentation as hotdoc was not found' )
endif
endif
2018-07-12 14:14:33 +00:00
2020-04-23 03:48:22 +00:00
write_file_contents = '' '
import os
import sys
assert len ( sys . argv ) > = 3
fname = sys . argv [ 1 ]
contents = sys . argv [ 2 ]
with open ( fname , 'w' ) as f :
f . write ( contents )
'' '
configure_file (
output : 'GstDocumentedSubprojects' ,
command : [ python3 ,
'-c' , write_file_contents ,
'@OUTPUT@' ,
documented_projects ]
)
if documented_projects != ''
2020-06-24 12:37:28 +00:00
subproject ( 'gst-docs' , required : get_option ( 'doc' ) . enabled ( ) )
2020-04-23 03:48:22 +00:00
message ( 'Gst docs subprojects: ' + documented_projects )
endif
2019-09-17 19:53:40 +00:00
all_plugins_paths = [ ]
2021-02-21 15:20:15 +00:00
all_plugins_dirs = [ ]
2019-09-17 19:53:40 +00:00
foreach plugin : all_plugins
all_plugins_paths + = plugin . full_path ( )
2021-02-21 15:20:15 +00:00
all_plugins_dirs + = fs . parent ( plugin . full_path ( ) )
2019-09-17 19:53:40 +00:00
endforeach
2020-03-11 17:49:11 +00:00
# Work around meson bug: https://github.com/mesonbuild/meson/pull/6770
pathsep = host_machine . system ( ) == 'windows' ? ';' : ':'
all_plugins_paths = pathsep . join ( all_plugins_paths )
2019-09-17 19:53:40 +00:00
2021-02-21 15:20:15 +00:00
devenv = environment ( )
2022-02-21 16:35:41 +00:00
devenv . prepend ( 'GST_PLUGIN_PATH' , all_plugins_dirs )
2021-02-21 15:20:15 +00:00
devenv . set ( 'CURRENT_GST' , meson . current_source_dir ( ) )
devenv . set ( 'GST_VERSION' , meson . project_version ( ) )
devenv . set ( 'GST_ENV' , 'gst-' + meson . project_version ( ) )
devenv . set ( 'GST_REGISTRY' , meson . current_build_dir ( ) / 'registry.dat' )
devenv . set ( 'GST_PLUGIN_SYSTEM_PATH' , '' )
meson . add_devenv ( devenv )
2019-09-17 19:53:40 +00:00
generate_plugins_paths = find_program ( 'scripts/generate_plugins_path.py' )
configure_file (
output : 'GstPluginsPath.json' ,
command : [ generate_plugins_paths ,
'@OUTPUT@' ,
all_plugins_paths ]
)
2018-11-11 23:06:04 +00:00
2019-09-17 15:52:10 +00:00
if get_option ( 'default_library' ) == 'static'
# Generate a .c file which declare and register all built plugins
2020-07-16 11:18:38 +00:00
plugins_names = [ ]
foreach plugin : all_plugins
plugins_names + = plugin . full_path ( )
endforeach
all_plugin_names = ';' . join ( plugins_names )
static_plugins = get_option ( 'gst-full-plugins' )
if static_plugins == '*'
static_plugins = all_plugin_names
endif
2019-09-17 15:52:10 +00:00
generate_init_static_plugins = find_program ( 'scripts/generate_init_static_plugins.py' )
init_static_plugins_c = configure_file (
output : 'gstinitstaticplugins.c' ,
command : [ generate_init_static_plugins ,
2020-07-16 11:18:38 +00:00
'-o ' + '@OUTPUT@' ,
'-p ' + static_plugins ,
'-e ' + get_option ( 'gst-full-elements' ) ,
'-t ' + get_option ( 'gst-full-typefind-functions' ) ,
'-d ' + get_option ( 'gst-full-device-providers' ) ,
'-T ' + get_option ( 'gst-full-dynamic-types' )
]
2019-09-17 15:52:10 +00:00
)
2020-10-13 14:31:57 +00:00
gstfull_link_args = cc . get_supported_link_arguments ( [ '-Wl,-Bsymbolic-functions' ] )
2019-09-17 15:52:10 +00:00
# Get a list of libraries that needs to be exposed in the ABI.
exposed_libs = [ ]
2021-09-13 21:20:11 +00:00
exposed_girs = [ ]
2020-07-24 15:15:44 +00:00
incdir_deps = [ ]
2021-09-13 21:20:11 +00:00
wanted_libs = [ 'gstreamer-1.0' ] + get_option ( 'gst-full-libraries' )
all_libs = '*' in wanted_libs
foreach pkgname_library : all_libraries
pkg_name = pkgname_library [ 0 ]
lib_def = pkgname_library [ 1 ]
if pkg_name in wanted_libs or all_libs
if lib_def . has_key ( 'lib' )
incdir_deps + = dependency ( pkg_name ) . partial_dependency ( includes : true , sources : true )
exposed_libs + = [ lib_def [ 'lib' ] ]
endif
if lib_def . has_key ( 'gir' )
exposed_girs + = lib_def [ 'gir' ]
endif
endif
2019-09-17 15:52:10 +00:00
endforeach
# glib and gobject are part of our public API. If we are using glib from the
# system then our pkg-config file must require it. If we built it as
# subproject then we need to link_whole it.
2020-07-24 15:15:44 +00:00
glib_deps = [ ]
glib_dep = dependency ( 'glib-2.0' )
gobject_dep = dependency ( 'gobject-2.0' )
2019-09-17 15:52:10 +00:00
if gobject_dep . type_name ( ) == 'internal'
2020-07-24 15:15:44 +00:00
glib_subproject = subproject ( 'glib' )
exposed_libs + = glib_subproject . get_variable ( 'libglib' )
exposed_libs + = glib_subproject . get_variable ( 'libgobject' )
incdir_deps + = [
glib_dep . partial_dependency ( includes : true ) ,
gobject_dep . partial_dependency ( includes : true ) ,
]
2019-09-17 15:52:10 +00:00
else
2020-07-24 15:15:44 +00:00
glib_deps = [ glib_dep , gobject_dep ]
2019-09-17 15:52:10 +00:00
endif
2020-08-11 13:49:53 +00:00
link_deps = [ ]
if get_option ( 'gst-full-version-script' ) != ''
symbol_map = meson . current_source_dir ( ) / get_option ( 'gst-full-version-script' )
link_arg = '-Wl,--version-script=' + symbol_map
if cc . has_link_argument ( link_arg )
gstfull_link_args + = link_arg
2020-11-18 09:44:34 +00:00
link_deps + = symbol_map
elif cc . get_id ( ) == 'msvc'
warning ( 'FIXME: Provide a def file to publish the public symbols' )
2020-08-11 13:49:53 +00:00
else
2021-10-19 10:32:32 +00:00
warning ( 'FIXME: Linker does not support the supplied version script (' + symbol_map + '), please disable the "gst-full-version-script" option' )
2020-08-11 13:49:53 +00:00
endif
endif
2019-09-17 15:52:10 +00:00
# Build both shared and static library
gstfull = both_libraries ( 'gstreamer-full-1.0' ,
init_static_plugins_c ,
link_with : all_plugins ,
2020-07-07 09:13:49 +00:00
link_args : gstfull_link_args ,
2019-09-17 15:52:10 +00:00
link_whole : exposed_libs ,
2020-07-24 15:15:44 +00:00
dependencies : incdir_deps + glib_deps ,
2020-08-11 13:49:53 +00:00
link_depends : link_deps ,
2019-09-17 15:52:10 +00:00
install : true ,
)
2020-07-15 14:57:47 +00:00
gst_full_dep = declare_dependency ( link_with : gstfull . get_shared_lib ( ) ,
2020-07-24 15:15:44 +00:00
dependencies : incdir_deps + glib_deps ,
2020-07-15 14:57:47 +00:00
include_directories : include_directories ( '.' )
)
2021-09-13 21:20:11 +00:00
2020-10-22 09:55:43 +00:00
gst_full_libs_private = cc . get_supported_link_arguments ( [ '-Wl,--undefined=gst_init_static_plugins' ] )
if gst_full_libs_private == [ ]
warning ( 'The compiler does not support `-Wl,--undefined` linker flag. The method `gst_init_static_plugins` might be dropped during the link stage of an application using libgstreamer-full-1.0.a, preventing plugins registration.' )
endif
2021-09-13 21:20:11 +00:00
if not get_option ( 'introspection' ) . disabled ( )
built_girs = { }
foreach gir : exposed_girs
includes = [ ]
foreach include : gir . get ( 'includes' , [ ] )
includes + = [ built_girs . get ( include , include ) ]
endforeach
gir + = {
'includes' : includes ,
'extra_args' : gir . get ( 'extra_args' , [ ] ) + [ '--add-include-path=' + meson . current_build_dir ( ) ] ,
'install' : true ,
}
built_girs + = { gir . get ( 'namespace' ) + '-' + gir . get ( 'nsversion' ) : gnome . generate_gir ( gstfull , kwargs : gir ) [ 0 ] }
endforeach
endif
2019-09-17 15:52:10 +00:00
pkgconfig . generate ( gstfull ,
2020-07-24 15:15:44 +00:00
requires : glib_deps ,
2020-10-22 09:55:43 +00:00
libraries_private : gst_full_libs_private ,
2019-09-17 15:52:10 +00:00
subdirs : 'gstreamer-1.0' )
2020-07-15 14:57:47 +00:00
meson . override_dependency ( 'gstreamer-full-1.0' , gst_full_dep )
2019-09-17 15:52:10 +00:00
endif
2018-10-28 14:06:35 +00:00
message ( 'Building subprojects: ' + ', ' . join ( subprojects_names ) )
2020-07-16 16:13:50 +00:00
2019-08-03 02:19:04 +00:00
setenv = find_program ( 'gst-env.py' )
2022-02-17 20:41:40 +00:00
devenv_cmd = [ setenv , '--builddir=@0@' . format ( meson . build_root ( ) ) ,
'--srcdir=@0@' . format ( meson . source_root ( ) ) ]
2019-08-03 02:19:04 +00:00
2021-10-14 20:01:01 +00:00
subdir ( 'tests' )
2021-10-18 15:51:37 +00:00
if meson . can_run_host_binaries ( ) and build_machine . system ( ) == 'linux' and host_machine . system ( ) == 'windows'
2019-08-03 02:22:16 +00:00
# FIXME: Ideally we could get the wrapper directly from meson
devenv_cmd + = [ '--wine' , host_machine . cpu_family ( ) == 'x86_64' ? 'wine64' : 'wine32' ]
sysroot = meson . get_cross_property ( 'sys_root' )
if sysroot != ''
# Logic from meson
devenv_cmd + = [ '--winepath' , 'Z:' + join_paths ( sysroot , 'bin' ) ]
endif
endif
2019-08-03 02:19:04 +00:00
run_target ( 'devenv' , command : devenv_cmd )
2016-11-07 21:17:39 +00:00
2020-07-08 10:28:19 +00:00
if orc_subproject . found ( ) and orc_update_targets . length ( ) > 0
2020-07-04 14:00:35 +00:00
alias_target ( 'update-orc-dist' , orc_update_targets )
endif
2021-10-13 00:29:00 +00:00
summary ( {
'gstreamer-full' : get_option ( 'default_library' ) == 'static' ,
} , section : 'Build options' , bool_yn : true , list_sep : ' ' )