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')