diff --git a/decorations/meson.build b/decorations/meson.build index c6a4eac..e563ecb 100644 --- a/decorations/meson.build +++ b/decorations/meson.build @@ -2,9 +2,17 @@ deco_sdk = declare_dependency(dependencies: [cairo, cairo_ft]) decorations = [] foreach deco : ['background', 'stack', 'underline'] - lib = static_library( - 'decoration_@0@'.format(deco), '@0@.c'.format(deco), dependencies: deco_sdk) - decorations += [declare_dependency( - link_with: lib, - compile_args: '-DHAVE_PLUGIN_@0@'.format(deco.underscorify()))] + if get_option('core-plugins-as-shared-libraries') + shared_module('@0@'.format(deco), '@0@.c'.format(deco), + dependencies: deco_sdk, + name_prefix: 'decoration_') + else + lib = static_library( + 'decoration_@0@'.format(deco), '@0@.c'.format(deco), dependencies: deco_sdk, + target_type: target_type) + + decorations += [declare_dependency( + link_with: lib, + compile_args: '-DHAVE_PLUGIN_@0@'.format(deco.underscorify()))] + endif endforeach diff --git a/meson.build b/meson.build index 42b9081..13cdd73 100644 --- a/meson.build +++ b/meson.build @@ -3,9 +3,8 @@ project('f00bar', 'c', default_options: ['c_std=c11', 'warning_level=1', 'werror=true']) add_project_arguments( - ['-D_GNU_SOURCE', - #'-Wno-unused-result'], - ], + ['-D_GNU_SOURCE'] + + (get_option('core-plugins-as-shared-libraries') ? ['-DCORE_PLUGINS_AS_SHARED_LIBRARIES'] : []), language: 'c', ) @@ -18,24 +17,19 @@ cairo_ft = dependency('cairo-ft') yaml = dependency('yaml-0.1') # TODO: X11 -xcb_aux = dependency('xcb-aux', required: get_option('x11')) -xcb_cursor = dependency('xcb-cursor', required: get_option('x11')) -xcb_event = dependency('xcb-event', required: get_option('x11')) -xcb_ewmh = dependency('xcb-ewmh', required: get_option('x11')) -xcb_randr = dependency('xcb-randr', required: get_option('x11')) -xcb_render = dependency('xcb-render', required: get_option('x11')) -cairo_xcb = dependency('cairo-xcb', required: get_option('x11')) +xcb_aux = dependency('xcb-aux', required: get_option('backend-x11')) +xcb_cursor = dependency('xcb-cursor', required: get_option('backend-x11')) +xcb_event = dependency('xcb-event', required: get_option('backend-x11')) +xcb_ewmh = dependency('xcb-ewmh', required: get_option('backend-x11')) +xcb_randr = dependency('xcb-randr', required: get_option('backend-x11')) +xcb_render = dependency('xcb-render', required: get_option('backend-x11')) +cairo_xcb = dependency('cairo-xcb', required: get_option('backend-x11')) xcb_errors = dependency('xcb-errors', required: false) -xcb_stuff = declare_dependency( - sources: ['xcb.c', 'xcb.h'], - dependencies: [xcb_aux, xcb_cursor, xcb_event, xcb_ewmh, xcb_randr, - xcb_render, cairo_xcb, xcb_errors], - compile_args: xcb_errors.found() ? '-DHAVE_XCB_ERRORS' : []) - if xcb_aux.found() and xcb_cursor.found() and xcb_event.found() and \ xcb_ewmh.found() and xcb_randr.found() and xcb_render.found() and \ cairo_xcb.found() + enable_x11 = true add_project_arguments('-DENABLE_X11', language: 'c') else @@ -43,9 +37,9 @@ else endif # TODO: conditional on Wayland -wayland_client = dependency('wayland-client', required: get_option('wayland')) -wayland_cursor = dependency('wayland-cursor', required: get_option('wayland')) -wlroots = dependency('wlroots', required: get_option('wayland')) +wayland_client = dependency('wayland-client', required: get_option('backend-wayland')) +wayland_cursor = dependency('wayland-cursor', required: get_option('backend-wayland')) +wlroots = dependency('wlroots', required: get_option('backend-wayland')) if wayland_client.found() and wayland_cursor.found() and wlroots.found() enable_wayland = true @@ -54,6 +48,16 @@ else enable_wayland = false endif +if enable_x11 + xcb_stuff_lib = static_library( + 'xcb-stuff', 'xcb.c', 'xcb.h', + dependencies: [xcb_aux, xcb_cursor, xcb_event, xcb_ewmh, xcb_randr, + xcb_render, cairo_xcb, xcb_errors], + c_args: xcb_errors.found() ? '-DHAVE_XCB_ERRORS' : [], + pic: get_option('core-plugins-as-shared-libraries')) + xcb_stuff = declare_dependency(link_with: xcb_stuff_lib) +endif + subdir('bar') subdir('decorations') subdir('particles') @@ -76,4 +80,5 @@ executable( 'yml.c', 'yml.h', dependencies: [bar, cairo, cairo_ft, fontconfig, yaml, threads, dl] + decorations + particles + modules, - link_args: '-rdynamic') + build_rpath: '$ORIGIN/modules:$ORIGIN/decorations:$ORIGIN/particles', + export_dynamic: true) diff --git a/meson_options.txt b/meson_options.txt index eaaa5e2..f293c6f 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,2 +1,7 @@ -option('x11', type: 'feature', value: 'enabled', description: 'XCB (X11) backend') -option('wayland', type: 'feature', value: 'enabled', description: 'Wayland backend') +option( + 'backend-x11', type: 'feature', value: 'enabled', description: 'XCB (X11) backend') +option( + 'backend-wayland', type: 'feature', value: 'enabled', description: 'Wayland backend') +option( + 'core-plugins-as-shared-libraries', type: 'boolean', value: false, + description: 'Compiles modules, particles and decorations as shared libraries, which are loaded on-demand') diff --git a/modules/meson.build b/modules/meson.build index 80f531c..70bd808 100644 --- a/modules/meson.build +++ b/modules/meson.build @@ -1,64 +1,124 @@ module_sdk = declare_dependency(dependencies: [cairo, cairo_ft, threads]) modules = [] -alsa_mod = static_library( - 'module_alsa', 'alsa.c', dependencies: [module_sdk, dependency('alsa')]) -modules += [declare_dependency( - link_with: alsa_mod, compile_args: '-DHAVE_PLUGIN_alsa')] + +alsa = dependency('alsa') +if get_option('core-plugins-as-shared-libraries') + shared_module( + 'alsa', 'alsa.c', dependencies: [module_sdk, alsa], name_prefix: 'module_') +else + alsa_mod = static_library( + 'module_alsa', 'alsa.c', dependencies: [module_sdk, alsa]) + modules += [declare_dependency( + link_with: alsa_mod, compile_args: '-DHAVE_PLUGIN_alsa')] +endif udev = dependency('libudev') -backlight_mod = static_library( - 'module_backlight', 'backlight.c', dependencies: [module_sdk, udev]) -modules += [declare_dependency( - link_with: backlight_mod, compile_args: '-DHAVE_PLUGIN_backlight')] +if get_option('core-plugins-as-shared-libraries') + shared_module( + 'backlight', 'backlight.c', dependencies: [module_sdk, udev], name_prefix: 'module_') +else + backlight_mod = static_library( + 'module_backlight', 'backlight.c', dependencies: [module_sdk, udev]) + modules += [declare_dependency( + link_with: backlight_mod, compile_args: '-DHAVE_PLUGIN_backlight')] +endif -battery_mod = static_library( - 'module_battery', 'battery.c', dependencies: [module_sdk, udev]) -modules += [declare_dependency( - link_with: battery_mod, compile_args: '-DHAVE_PLUGIN_battery')] +if get_option('core-plugins-as-shared-libraries') + shared_module( + 'battery', 'battery.c', dependencies: [module_sdk, udev], name_prefix: 'module_') +else + battery_mod = static_library( + 'module_battery', 'battery.c', dependencies: [module_sdk, udev]) + modules += [declare_dependency( + link_with: battery_mod, compile_args: '-DHAVE_PLUGIN_battery')] +endif -clock_mod = static_library( - 'module_clock', 'clock.c', dependencies: [module_sdk]) -modules += [declare_dependency( - link_with: clock_mod, compile_args: '-DHAVE_PLUGIN_clock')] +if get_option('core-plugins-as-shared-libraries') + shared_module( + 'clock', 'clock.c', dependencies: [module_sdk], name_prefix: 'module_') +else + clock_mod = static_library( + 'module_clock', 'clock.c', dependencies: [module_sdk]) + modules += [declare_dependency( + link_with: clock_mod, compile_args: '-DHAVE_PLUGIN_clock')] +endif json = dependency('json-c') -i3_mod = static_library( - 'module_i3', 'i3.c', 'i3-common.c', 'i3-common.h', - dependencies: [module_sdk, json, dynlist]) -modules += [declare_dependency( - link_with: i3_mod, compile_args: '-DHAVE_PLUGIN_i3')] +if get_option('core-plugins-as-shared-libraries') + shared_module('module_i3', 'i3.c', 'i3-common.c', 'i3-common.h', + dependencies: [module_sdk, json, dynlist], + name_prefix: '') +else + i3_mod = static_library( + 'module_i3', 'i3.c', 'i3-common.c', 'i3-common.h', + dependencies: [module_sdk, json, dynlist]) + modules += [declare_dependency( + link_with: i3_mod, compile_args: '-DHAVE_PLUGIN_i3')] +endif -label_mod = static_library( - 'module_label', 'label.c', dependencies: [module_sdk]) -modules += [declare_dependency( - link_with: label_mod, compile_args: '-DHAVE_PLUGIN_label')] +if get_option('core-plugins-as-shared-libraries') + shared_module( + 'label', 'label.c', dependencies: [module_sdk], name_prefix: 'module_') +else + label_mod = static_library( + 'module_label', 'label.c', dependencies: [module_sdk]) + modules += [declare_dependency( + link_with: label_mod, compile_args: '-DHAVE_PLUGIN_label')] +endif mpd = dependency('libmpdclient') -mpd_mod = static_library( - 'module_mpd', 'mpd.c', dependencies: [module_sdk, mpd]) -modules += [declare_dependency( - link_with: mpd_mod, compile_args: '-DHAVE_PLUGIN_mpd')] +if get_option('core-plugins-as-shared-libraries') + shared_module( + 'mpd', 'mpd.c', dependencies: [module_sdk, mpd], name_prefix: 'module_') +else + mpd_mod = static_library( + 'module_mpd', 'mpd.c', dependencies: [module_sdk, mpd]) + modules += [declare_dependency( + link_with: mpd_mod, compile_args: '-DHAVE_PLUGIN_mpd')] +endif -network_mod = static_library( - 'module_network', 'network.c', dependencies: [module_sdk]) -modules += [declare_dependency( - link_with: network_mod, compile_args: '-DHAVE_PLUGIN_network')] +if get_option('core-plugins-as-shared-libraries') + shared_module( + 'network', 'network.c', dependencies: [module_sdk], name_prefix: 'module_') +else + network_mod = static_library( + 'module_network', 'network.c', dependencies: [module_sdk]) + modules += [declare_dependency( + link_with: network_mod, compile_args: '-DHAVE_PLUGIN_network')] +endif -removables_mod = static_library( - 'module_removables', 'removables.c', dependencies: [module_sdk, udev, dynlist]) -modules += [declare_dependency( - link_with: removables_mod, compile_args: '-DHAVE_PLUGIN_removables')] +if get_option('core-plugins-as-shared-libraries') + shared_module( + 'removables', 'removables.c', dependencies: [module_sdk, udev, dynlist], + name_prefix: 'module_') +else + removables_mod = static_library( + 'module_removables', 'removables.c', dependencies: [module_sdk, udev, dynlist]) + modules += [declare_dependency( + link_with: removables_mod, compile_args: '-DHAVE_PLUGIN_removables')] +endif if enable_x11 xcb_xkb = dependency('xcb-xkb') - xkb_mod = static_library( - 'module_xkb', 'xkb.c', dependencies: [module_sdk, xcb_stuff, xcb_xkb]) - modules += [declare_dependency( - link_with: xkb_mod, compile_args: '-DHAVE_PLUGIN_xkb')] + if get_option('core-plugins-as-shared-libraries') + shared_module( + 'xkb', 'xkb.c', dependencies: [module_sdk, xcb_stuff, xcb_xkb], name_prefix: 'module_') + else + xkb_mod = static_library( + 'module_xkb', 'xkb.c', dependencies: [module_sdk, xcb_stuff, xcb_xkb]) + modules += [declare_dependency( + link_with: xkb_mod, compile_args: '-DHAVE_PLUGIN_xkb')] + endif - xwindow_mod = static_library( - 'module_xwindow', 'xwindow.c', dependencies: [module_sdk, xcb_stuff]) - modules += [declare_dependency( - link_with: xwindow_mod, compile_args: '-DHAVE_MODULE_xwindow')] + if get_option('core-plugins-as-shared-libraries') + shared_module( + 'xwindow', 'xwindow.c', dependencies: [module_sdk, xcb_stuff], + name_prefix: 'module_') + else + xwindow_mod = static_library( + 'module_xwindow', 'xwindow.c', dependencies: [module_sdk, xcb_stuff]) + modules += [declare_dependency( + link_with: xwindow_mod, compile_args: '-DHAVE_MODULE_xwindow')] + endif endif diff --git a/particles/meson.build b/particles/meson.build index 95d067b..e3faa0c 100644 --- a/particles/meson.build +++ b/particles/meson.build @@ -2,14 +2,25 @@ particle_sdk = declare_dependency(dependencies: [cairo, cairo_ft]) particles = [] foreach particle : ['empty', 'list', 'map', 'progress-bar', 'ramp', 'string'] - lib = static_library( - 'particle_@0@'.format(particle), '@0@.c'.format(particle), - dependencies: particle_sdk) - particles += [declare_dependency( - link_with: lib, - compile_args: '-DHAVE_PLUGIN_@0@'.format(particle.underscorify()))] + if get_option('core-plugins-as-shared-libraries') + shared_module('@0@'.format(particle), '@0@.c'.format(particle), + dependencies: particle_sdk, + name_prefix: 'particle_') + else + lib = static_library( + 'particle_@0@'.format(particle), '@0@.c'.format(particle), + dependencies: particle_sdk) + + particles += [declare_dependency( + link_with: lib, + compile_args: '-DHAVE_PLUGIN_@0@'.format(particle.underscorify()))] + endif endforeach -dynlist_lib = static_library( - 'dynlist', 'dynlist.c', 'dynlist.h', dependencies: particle_sdk) +dynlist_lib = build_target( + 'dynlist', 'dynlist.c', 'dynlist.h', dependencies: particle_sdk, + target_type: (get_option('core-plugins-as-shared-libraries') + ? 'shared_library' : 'static_library'), + override_options : ['b_lundef=false']) + dynlist = declare_dependency(link_with: dynlist_lib)