Browse Source

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 <ikey@solus-project.com>
Ikey Doherty 7 years ago
parent
commit
1328e07f86
8 changed files with 151 additions and 55 deletions
  1. 1 1
      bootstrap.sh
  2. 47 0
      daemon/meson.build
  3. 2 2
      data/cpugovctl_perms.sh
  4. 8 0
      data/meson.build
  5. 11 0
      example/meson.build
  6. 34 0
      lib/meson.build
  7. 47 52
      meson.build
  8. 1 0
      meson_options.txt

+ 1 - 1
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
 

+ 47 - 0
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,
+)

+ 2 - 2
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

+ 8 - 0
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,
+)

+ 11 - 0
example/meson.build

@@ -0,0 +1,11 @@
+# An example game
+executable(
+    'example',
+    sources: [
+        'main.c',
+    ],
+    include_directories: libgamemode_includes,
+    dependencies: [
+        libdl,
+    ],
+)

+ 34 - 0
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)

+ 47 - 52
meson.build

@@ -1,54 +1,49 @@
-project('gamemode', 'c',
-	default_options : ['c_std=c11'],
-	version : '0.2',
-	license : 'BSD' )
-cc = meson.get_compiler('c')
+project(
+    'gamemode',
+    'c',
+    default_options : ['c_std=c11'],
+    version: '0.2',
+    license: 'BSD',
+)
 
-libsystemd = cc.find_library('systemd')
-libdl = cc.find_library('dl')
-
-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 )
-
-# Main client library to message the daemon
-shared_library( 'gamemode',
-	'lib/client_impl.c',
-	dependencies: libsystemd,
-	install : true )
-
-# install the service file
-install_data( 'data/gamemoded.service', install_dir: '/etc/systemd/user' )
-
-# Small target util to get and set cpu governors
-executable( 'cpugovctl',
-	'daemon/cpugovctl.c',
-	'daemon/logging.c',
-	install : true )
-
-# 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 )
+cc = meson.get_compiler('c')
 
+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'))
+
+# Find systemd via pkgconfig
+dep_systemd = dependency('libsystemd')
+
+# On non glibc systems this might be a stub, i.e. for musl
+libdl = cc.find_library('dl', required: false)
+
+# 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
+
+subdir('lib')
+subdir('daemon')
+subdir('example')
+subdir('data')
+
+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')

+ 1 - 0
meson_options.txt

@@ -0,0 +1 @@
+option('with-systemd-user-unit-dir', type: 'string', description: 'Explicitly set the systemd user unit directory')