From 1328e07f866de953f9b15bff91f803da2a8fb8e8 Mon Sep 17 00:00:00 2001 From: Ikey Doherty Date: Mon, 15 Jan 2018 12:11:46 +0000 Subject: [PATCH] Split meson up to be more modular This also explicitly constructs reusable library components to make it easier to extend the project over time. Notably we make less assumptions about the host system and use pkgconfig where appropriate to give us system details, such as the systemd system unit directory for packaging. This can be overriden with the meson option. Signed-off-by: Ikey Doherty --- bootstrap.sh | 2 +- daemon/meson.build | 47 ++++++++++++++++++++++ data/cpugovctl_perms.sh | 4 +- data/meson.build | 8 ++++ example/meson.build | 11 ++++++ lib/meson.build | 34 ++++++++++++++++ meson.build | 87 +++++++++++++++++++---------------------- meson_options.txt | 1 + 8 files changed, 145 insertions(+), 49 deletions(-) create mode 100644 daemon/meson.build create mode 100644 data/meson.build create mode 100644 example/meson.build create mode 100644 lib/meson.build create mode 100644 meson_options.txt diff --git a/bootstrap.sh b/bootstrap.sh index b337e08..d56a3b6 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -4,7 +4,7 @@ set -e # Echo the rest so it's obvious set -x -meson --prefix=/usr build +meson --prefix=/usr build -Dwith-systemd-user-unit-dir=/etc/systemd/user cd build ninja diff --git a/daemon/meson.build b/daemon/meson.build new file mode 100644 index 0000000..4e27902 --- /dev/null +++ b/daemon/meson.build @@ -0,0 +1,47 @@ +# Convenience library for the duplicated logging functionality +common_sources = [ + 'logging.c', +] + +daemon_common = static_library( + 'daemon-common', + sources: common_sources, + install: false, +) + +link_daemon_common = declare_dependency( + link_with: daemon_common, +) + +# Main daemon +daemon_sources = [ + 'main.c', + 'gamemode.c', + 'daemonize.c', + 'dbus_messaging.c', + 'governors.c', +] + +executable( + 'gamemoded', + sources: daemon_sources, + dependencies: [ + link_daemon_common, + dep_systemd, + ], + install: true, +) + +# Small target util to get and set cpu governors +cpugovctl_sources = [ + 'cpugovctl.c', +] + +cpugovctl = executable( + 'cpugovctl', + sources: cpugovctl_sources, + dependencies: [ + link_daemon_common, + ], + install: true, +) diff --git a/data/cpugovctl_perms.sh b/data/cpugovctl_perms.sh index 5795ffc..60b640e 100644 --- a/data/cpugovctl_perms.sh +++ b/data/cpugovctl_perms.sh @@ -1,5 +1,5 @@ #!/bin/bash # Allow cpugovctl to control the governors -chmod +4555 ${MESON_INSTALL_PREFIX}/bin/cpugovctl - +PREFIX=${MESON_INSTALL_PREFIX:-/usr} +chmod +4555 ${DESTDIR}${PREFIX}/bin/cpugovctl diff --git a/data/meson.build b/data/meson.build new file mode 100644 index 0000000..a75cee4 --- /dev/null +++ b/data/meson.build @@ -0,0 +1,8 @@ +# Install the service file +install_data('gamemoded.service', install_dir: path_systemd_unit_dir) + +# Give cpugovctl the permissions it needs +meson.add_install_script( + 'cpugovctl_perms.sh', + dependencies: cpugovctl, +) diff --git a/example/meson.build b/example/meson.build new file mode 100644 index 0000000..6a77974 --- /dev/null +++ b/example/meson.build @@ -0,0 +1,11 @@ +# An example game +executable( + 'example', + sources: [ + 'main.c', + ], + include_directories: libgamemode_includes, + dependencies: [ + libdl, + ], +) diff --git a/lib/meson.build b/lib/meson.build new file mode 100644 index 0000000..d00cc12 --- /dev/null +++ b/lib/meson.build @@ -0,0 +1,34 @@ +# Main client library to message the daemon +shared_library( + 'gamemode', + sources: [ + 'client_impl.c', + ], + dependencies: [ + dep_systemd, + ], + install: true, +) + +libgamemode_includes = [ + include_directories('.'), +] + +# Small library to automatically use gamemode +shared_library( + 'gamemodeauto', + sources: [ + 'client_loader.c', + ], + dependencies: [ + libdl, + ], + install: true, +) + +# Install the gamemode_client header +gamemode_headers = [ + 'gamemode_client.h', +] + +install_headers(gamemode_headers) diff --git a/meson.build b/meson.build index 9862211..68d29ae 100644 --- a/meson.build +++ b/meson.build @@ -1,54 +1,49 @@ -project('gamemode', 'c', - default_options : ['c_std=c11'], - version : '0.2', - license : 'BSD' ) +project( + 'gamemode', + 'c', + default_options : ['c_std=c11'], + version: '0.2', + license: 'BSD', +) + cc = meson.get_compiler('c') -libsystemd = cc.find_library('systemd') -libdl = cc.find_library('dl') +path_prefix = get_option('prefix') +path_bindir = join_paths(path_prefix, get_option('bindir')) +path_datadir = join_paths(path_prefix, get_option('datadir')) +path_includedir = join_paths(path_prefix, get_option('includedir')) +path_libdir = join_paths(path_prefix, get_option('libdir')) -executable( 'gamemoded', - 'daemon/main.c', - 'daemon/gamemode.c', - 'daemon/logging.c', - 'daemon/daemonize.c', - 'daemon/dbus_messaging.c', - 'daemon/governors.c', - dependencies: libsystemd, - install: true ) +# Find systemd via pkgconfig +dep_systemd = dependency('libsystemd') -# Main client library to message the daemon -shared_library( 'gamemode', - 'lib/client_impl.c', - dependencies: libsystemd, - install : true ) +# On non glibc systems this might be a stub, i.e. for musl +libdl = cc.find_library('dl', required: false) -# install the service file -install_data( 'data/gamemoded.service', install_dir: '/etc/systemd/user' ) +# If the path isn't explicitly set, ask systemd for the systemd user unit directory +path_systemd_unit_dir = get_option('with-systemd-user-unit-dir') +if path_systemd_unit_dir == '' + message('Asking pkg-config for systemd\'s directories') + pkgconfig_systemd = dependency('systemd') + path_systemd_unit_dir = pkgconfig_systemd.get_pkgconfig_variable('systemduserunitdir') +endif -# Small target util to get and set cpu governors -executable( 'cpugovctl', - 'daemon/cpugovctl.c', - 'daemon/logging.c', - install : true ) +subdir('lib') +subdir('daemon') +subdir('example') +subdir('data') -# Give cpugovctl the permissions it needs -meson.add_install_script( 'data/cpugovctl_perms.sh', - dependencies : 'cpugovctl' ) - -# Small library to automatically use gamemode -shared_library( 'gamemodeauto', - 'lib/client_loader.c', - dependencies : libdl, - install : true ) - -# Install the gamemode_client header -install_headers( 'lib/gamemode_client.h' ) - -# An example game -libdir = include_directories('lib') -executable( 'example', - 'example/main.c', - dependencies : libdl, - include_directories : libdir ) +report = [ + ' Build configuration:', + ' ====================', + '', + ' prefix: @0@'.format(path_prefix), + ' bindir: @0@'.format(path_bindir), + ' datadir: @0@'.format(path_datadir), + ' libdir: @0@'.format(path_libdir), + ' includedir: @0@'.format(path_includedir), + ' systemd user unit directory: @0@'.format(path_systemd_unit_dir), +] +# Output some stuff to validate the build config +message('\n\n\n' + '\n'.join(report) + '\n\n') diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000..f6b79b5 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1 @@ +option('with-systemd-user-unit-dir', type: 'string', description: 'Explicitly set the systemd user unit directory')