From patchwork Sun Sep 6 09:37:13 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Markus Volk X-Patchwork-Id: 97401 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id BED14C79F85 for ; Sun, 6 Sep 2026 09:37:30 +0000 (UTC) Received: from mailout11.t-online.de (mailout11.t-online.de [194.25.134.85]) by mx.groups.io with SMTP id smtpd.msgproc02-g2.11207.1788687445630927399 for ; Sun, 06 Sep 2026 02:37:26 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="dkim: body hash did not verify" header.i=f_l_k@t-online.de header.s=20260216 header.b=Iv8It3Kb; spf=pass (domain: t-online.de, ip: 194.25.134.85, mailfrom: f_l_k@t-online.de) Received: from fwd94.aul.t-online.de (fwd94.aul.t-online.de [10.223.144.120]) by mailout11.t-online.de (Postfix) with SMTP id AA7481C456 for ; Sun, 6 Sep 2026 11:37:21 +0200 (CEST) Received: from intel-corei7-64.fritz.box ([84.163.35.20]) by fwd94.t-online.de with (TLSv1.3:TLS_AES_256_GCM_SHA384 encrypted) esmtp id 1x39JP-22AhJu0; Sun, 6 Sep 2026 11:37:19 +0200 From: Markus Volk To: openembedded-devel@lists.openembedded.org Subject: [meta-gnome][PATCH 15/15] localsearch: replace the reproducibility patch with a meson option Date: Sun, 6 Sep 2026 11:37:13 +0200 Message-ID: <20260906093713.797648-15-f_l_k@t-online.de> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260906093713.797648-1-f_l_k@t-online.de> References: <20260906093713.797648-1-f_l_k@t-online.de> MIME-Version: 1.0 X-TOI-EXPURGATEID: 150726::1788687439-EAFFA956-04FAE96D/0/0 CLEAN NORMAL X-TOI-MSGID: 63c2f895-0469-4bd1-89c8-13dd1faba973 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=t-online.de; s=20260216; t=1788687441; i=f_l_k@t-online.de; bh=OttArXxZoJzsi6X7ERqwR7WET9IGR9wLO36FZCGF7hM=; h=From:To:Subject:Date:In-Reply-To:References; b=Iv8It3KbBNcLmyZH0oPkYJCiS3Uet7eJIq/5Ol3g4epqQB46CAmQg9JgnRb6vy/84 v4e01b5z73MvM3pxpzh2vYmwLHAoZaHjYgg6Bm4odP0qqMxTGhoAsMnWkZ3F3g1wxb MmVlVEMzw/+B4IR+47f1zkKzd008IvRmz0zCfXp8MvuiVLILH+zzEVuRkyyUoTUImu mrxBQImTVf3Kxo/pvLzvvfdgr1mWMYjgbQTFFOp2z3b1F1Uv9FyexJrbSg0YOir4nV MZoZbMlYtq3cDifHMPQ/xBrZ+Y5LeTaH6kQq1vXCcw5a9CjVEIGzH0DPrRaJQAa/hu 1In227XuszdwQ== List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Sun, 06 Sep 2026 09:37:30 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-devel/message/129793 The old patch pointed the compiled-in build tree paths at made-up locations and disabled the landlock in-tree rules with #if 0, which left the real BUILDROOT definition in libtracker-miners-common in place. It also touched test-only values that never reach the installed files. The new patch adds an "uninstalled_helpers" meson option that leaves out the build tree defines and compiles the in-tree code paths away. It keeps the developer workflow intact by default and can be sent upstream. Build tested on corei7-64, the packaged binaries contain no build paths. AI-Generated: Uses Claude Code (Claude Fable 5.1) Signed-off-by: Markus Volk --- ...on-to-disable-the-uninstalled-helper.patch | 279 ++++++++++++++++++ .../0001-fix-reproducibility.patch | 98 ------ .../tracker/localsearch_3.11.1.bb | 4 +- 3 files changed, 281 insertions(+), 100 deletions(-) create mode 100644 meta-gnome/recipes-gnome/tracker/localsearch/0001-build-add-an-option-to-disable-the-uninstalled-helper.patch delete mode 100644 meta-gnome/recipes-gnome/tracker/localsearch/0001-fix-reproducibility.patch diff --git a/meta-gnome/recipes-gnome/tracker/localsearch/0001-build-add-an-option-to-disable-the-uninstalled-helper.patch b/meta-gnome/recipes-gnome/tracker/localsearch/0001-build-add-an-option-to-disable-the-uninstalled-helper.patch new file mode 100644 index 0000000000..994a6ef167 --- /dev/null +++ b/meta-gnome/recipes-gnome/tracker/localsearch/0001-build-add-an-option-to-disable-the-uninstalled-helper.patch @@ -0,0 +1,279 @@ +From 673ee0734c5aec9afbe24dc50a7436f67e42b7aa Mon Sep 17 00:00:00 2001 +From: Markus Volk +Date: Sun, 6 Sep 2026 11:18:10 +0200 +Subject: [PATCH] build: add an option to disable the uninstalled helper paths + +The daemons and the command line tool compare their working directory +with the compiled-in build root and, when they match, run the helpers +from the build tree instead of libexecdir. That is convenient for +development, but distribution builds have no use for it and the build +directory ends up as a string in every installed binary, which breaks +reproducible builds. + +Add a meson option "uninstalled_helpers" (default: true) that controls +whether BUILDROOT, SRCROOT, BUILDDIR and BUILD_EXTRACTDIR are defined, +and guard the in-tree code paths with #ifdef BUILDROOT so they compile +away when it is disabled. + +Upstream-Status: Pending + +AI-Generated: Uses Claude Code (Claude Fable 5.1) +--- + meson.build | 12 ++++++++++++ + meson_options.txt | 2 ++ + src/cli/meson.build | 3 +-- + src/cli/tracker-cli-utils.c | 4 ++++ + src/cli/tracker-extract.c | 5 ++++- + src/cli/tracker-info.c | 5 ++++- + src/common/meson.build | 4 +--- + src/common/tracker-landlock.c | 4 +++- + src/indexer/meson.build | 14 +++++++++++--- + src/indexer/tracker-application.c | 4 +++- + src/indexer/tracker-extract-watchdog.c | 4 +++- + 11 files changed, 48 insertions(+), 13 deletions(-) + +diff --git a/meson.build b/meson.build +index 7a311d4..fd29c73 100644 +--- a/meson.build ++++ b/meson.build +@@ -355,6 +355,18 @@ srcinc = include_directories('src/') + + build_root = meson.current_build_dir() + ++# Compiled-in build tree paths that let the daemons and tools run uninstalled. ++# Distribution builds disable this so the build directory does not end up in ++# the binaries. ++if get_option('uninstalled_helpers') ++ build_tree_c_args = [ ++ '-DBUILDROOT="@0@"'.format(meson.global_build_root()), ++ '-DSRCROOT="@0@"'.format(meson.global_source_root()), ++ ] ++else ++ build_tree_c_args = [] ++endif ++ + # We use tracker-miners-3.0 rather than tracker3-miners inside the lib64 + # directory, following the existing convention in that directory. + tracker_api_versioned_name = 'localsearch-@0@'.format(tracker_api_version) +diff --git a/meson_options.txt b/meson_options.txt +index 70e764a..621d7ce 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -99,3 +99,5 @@ option('tests_tap_protocol', type: 'boolean', value: false, + description: 'Whether to enable TAP protocol on tests') + option('test_utils_dir', type: 'string', value: '', + description: 'Directory to install trackertestutils Python package (or empty to use the default)') ++option('uninstalled_helpers', type: 'boolean', value: true, ++ description: 'Let the daemons and tools find their helpers in the build tree when run uninstalled') +diff --git a/src/cli/meson.build b/src/cli/meson.build +index dd6177d..851ce05 100644 +--- a/src/cli/meson.build ++++ b/src/cli/meson.build +@@ -44,11 +44,10 @@ executable(main_command_name, + sparql_gresource, + indexer_dbus_proxy, + control_dbus_proxy, +- c_args: tracker_c_args + [ ++ c_args: tracker_c_args + build_tree_c_args + [ + '-DMAIN_COMMAND_NAME="@0@"'.format(main_command_name), + '-DLIBEXECDIR="@0@"'.format(join_paths(get_option('prefix'), get_option('libexecdir'))), + '-DPYTHON_UTILS_DIR="@0@"'.format(testutils_dir / 'trackertestutils'), +- '-DBUILDROOT="@0@"'.format(build_root), + '-DMANDIR="@0@"'.format(join_paths(get_option('prefix'), get_option('datadir'), 'man')), + '-DBINDIR="@0@"'.format(join_paths(get_option('prefix'), get_option('bindir'))), + ], +diff --git a/src/cli/tracker-cli-utils.c b/src/cli/tracker-cli-utils.c +index 735bb4b..a941921 100644 +--- a/src/cli/tracker-cli-utils.c ++++ b/src/cli/tracker-cli-utils.c +@@ -199,6 +199,7 @@ tracker_cli_print_errors (GList *keyfiles, + gboolean + tracker_cli_check_inside_build_tree (const gchar* argv0) + { ++#ifdef BUILDROOT + g_autoptr (GFile) build_root = NULL; + g_autoptr (GFile) path = NULL; + +@@ -206,4 +207,7 @@ tracker_cli_check_inside_build_tree (const gchar* argv0) + path = g_file_new_for_path (argv0); + + return g_file_has_prefix (path, build_root); ++#else ++ return FALSE; ++#endif + } +diff --git a/src/cli/tracker-extract.c b/src/cli/tracker-extract.c +index 7342b24..cb74e9b 100644 +--- a/src/cli/tracker-extract.c ++++ b/src/cli/tracker-extract.c +@@ -72,10 +72,13 @@ extract_files (char *output_format) + + tracker_term_pipe_to_pager (); + ++#ifdef BUILDROOT + if (inside_build_tree) { + /* Developer convenience - use uninstalled version if running from build tree */ + tracker_extract_path = g_build_filename(BUILDROOT, "src", "extractor", EXTRACTOR_NAME, NULL); +- } else { ++ } else ++#endif ++ { + tracker_extract_path = g_build_filename(LIBEXECDIR, EXTRACTOR_NAME, NULL); + } + +diff --git a/src/cli/tracker-info.c b/src/cli/tracker-info.c +index 6b46f1f..18fadbd 100644 +--- a/src/cli/tracker-info.c ++++ b/src/cli/tracker-info.c +@@ -311,10 +311,13 @@ output_eligible_status_for_file (gchar *path, + { + g_autofree char *tracker_miner_fs_path = NULL; + ++#ifdef BUILDROOT + if (inside_build_tree) { + /* Developer convenience - use uninstalled version if running from build tree */ + tracker_miner_fs_path = g_build_filename (BUILDROOT, "src", "indexer", "localsearch-3", NULL); +- } else { ++ } else ++#endif ++ { + tracker_miner_fs_path = g_build_filename (LIBEXECDIR, "localsearch-3", NULL); + } + +diff --git a/src/common/meson.build b/src/common/meson.build +index 93da66e..73b7388 100644 +--- a/src/common/meson.build ++++ b/src/common/meson.build +@@ -52,13 +52,11 @@ endif + libtracker_miners_common = static_library('tracker-miners-common', + tracker_miners_common_sources, + dependencies: tracker_miners_common_dependencies + tracker_miners_common_private_dependencies, +- c_args: tracker_c_args + [ ++ c_args: tracker_c_args + build_tree_c_args + [ + '-DTRACKERSHAREDIR="@0@"'.format(tracker_versioned_name), + '-DLIBDIR="@0@"'.format(get_option ('libdir')), + '-DDATADIR="@0@"'.format(get_option ('datadir')), + '-DPREFIX="@0@"'.format(get_option ('prefix')), +- '-DBUILDROOT="@0@"'.format(meson.global_build_root()), +- '-DSRCROOT="@0@"'.format(meson.global_source_root()), + '-DLIBEXECDIR="@0@"'.format(join_paths(get_option('prefix'), get_option('libexecdir'))), + '-DTRACKER_EXTRACTOR_RULES_DIR="@0@"'.format(tracker_extract_rules_dir), + '-DTRACKER_EXTRACTORS_DIR="@0@"'.format(tracker_extract_modules_dir) +diff --git a/src/common/tracker-landlock.c b/src/common/tracker-landlock.c +index a3f3905..3f136a3 100644 +--- a/src/common/tracker-landlock.c ++++ b/src/common/tracker-landlock.c +@@ -234,7 +234,7 @@ tracker_landlock_init (const gchar *executable_name, + { ".pki", LANDLOCK_ACCESS_FS_READ_DIR }, + { ".gnupg", LANDLOCK_ACCESS_FS_READ_DIR }, + }; +- g_autofree gchar *current_dir = NULL, *cache_dir = NULL, *executable_path = NULL; ++ g_autofree gchar *current_dir G_GNUC_UNUSED = NULL, *cache_dir = NULL, *executable_path = NULL; + g_auto (GStrv) library_paths = NULL; + const gchar *ld_library_path = NULL; + int i, landlock_fd; +@@ -300,6 +300,7 @@ tracker_landlock_init (const gchar *executable_name, + } + } + ++#ifdef BUILDROOT + current_dir = g_get_current_dir (); + + /* Detect running in-tree */ +@@ -319,6 +320,7 @@ tracker_landlock_init (const gchar *executable_name, + in_tree_rules[i].flags); + } + } ++#endif + + /* Add user cache for readonly databases */ + #ifdef MINER_FS_CACHE_LOCATION +diff --git a/src/indexer/meson.build b/src/indexer/meson.build +index 55ff6ab..0879e41 100644 +--- a/src/indexer/meson.build ++++ b/src/indexer/meson.build +@@ -84,6 +84,15 @@ executable('localsearch-endpoint-@0@'.format(tracker_api_major), + install_rpath: tracker_internal_libs_dir, + ) + ++if get_option('uninstalled_helpers') ++ indexer_build_tree_c_args = [ ++ '-DBUILDDIR="@0@"'.format(meson.current_build_dir()), ++ '-DBUILD_EXTRACTDIR="@0@"'.format(meson.project_build_root() / 'src' / 'extractor'), ++ ] ++else ++ indexer_build_tree_c_args = [] ++endif ++ + executable('localsearch-@0@'.format(tracker_api_major), + sources, + miner_fs_resources[0], miner_fs_resources[1], +@@ -91,9 +100,8 @@ executable('localsearch-@0@'.format(tracker_api_major), + dependencies: tracker_miner_fs_deps, + c_args: [ + tracker_c_args, +- '-DBUILDROOT="@0@"'.format(meson.global_build_root()), +- '-DBUILDDIR="@0@"'.format(meson.current_build_dir()), +- '-DBUILD_EXTRACTDIR="@0@"'.format(meson.project_build_root() / 'src' / 'extractor'), ++ build_tree_c_args, ++ indexer_build_tree_c_args, + '-DLIBEXECDIR="@0@"'.format(get_option('prefix') / get_option('libexecdir')), + ], + install: true, +diff --git a/src/indexer/tracker-application.c b/src/indexer/tracker-application.c +index d3caf3d..c00ffaa 100644 +--- a/src/indexer/tracker-application.c ++++ b/src/indexer/tracker-application.c +@@ -270,7 +270,7 @@ open_connection (TrackerApplication *app, + g_autoptr (GSocket) socket = NULL; + g_autoptr (GIOStream) stream = NULL; + g_autoptr (GFile) location = NULL; +- g_autofree char *guid = NULL, *current_dir = NULL; ++ g_autofree char *guid = NULL, *current_dir G_GNUC_UNUSED = NULL; + const char *helper_path; + + g_assert (instance->root); +@@ -298,11 +298,13 @@ open_connection (TrackerApplication *app, + + guid = g_dbus_generate_guid (); + ++#ifdef BUILDROOT + current_dir = g_get_current_dir (); + + if (g_strcmp0 (current_dir, BUILDROOT) == 0) + helper_path = BUILDDIR "/localsearch-endpoint-3"; + else ++#endif + helper_path = LIBEXECDIR "/localsearch-endpoint-3"; + + location = g_file_get_child (instance->root, ".localsearch3"); +diff --git a/src/indexer/tracker-extract-watchdog.c b/src/indexer/tracker-extract-watchdog.c +index 27f6b49..37da365 100644 +--- a/src/indexer/tracker-extract-watchdog.c ++++ b/src/indexer/tracker-extract-watchdog.c +@@ -488,7 +488,7 @@ void + tracker_extract_watchdog_ensure_started (TrackerExtractWatchdog *watchdog) + { + g_autoptr (GError) error = NULL; +- g_autofree gchar *current_dir = NULL; ++ g_autofree gchar *current_dir G_GNUC_UNUSED = NULL; + g_autoptr (GStrvBuilder) strv_builder = NULL; + g_auto (GStrv) arguments = NULL; + const gchar *extract_path; +@@ -516,11 +516,13 @@ tracker_extract_watchdog_ensure_started (TrackerExtractWatchdog *watchdog) + return; + } + ++#ifdef BUILDROOT + current_dir = g_get_current_dir (); + + if (g_strcmp0 (current_dir, BUILDROOT) == 0) + extract_path = BUILD_EXTRACTDIR "/" EXECUTABLE_NAME; + else ++#endif + extract_path = LIBEXECDIR "/" EXECUTABLE_NAME; + + strv_builder = g_strv_builder_new (); +-- +2.55.0 + diff --git a/meta-gnome/recipes-gnome/tracker/localsearch/0001-fix-reproducibility.patch b/meta-gnome/recipes-gnome/tracker/localsearch/0001-fix-reproducibility.patch deleted file mode 100644 index f90dafea82..0000000000 --- a/meta-gnome/recipes-gnome/tracker/localsearch/0001-fix-reproducibility.patch +++ /dev/null @@ -1,98 +0,0 @@ -From 7affd66ff09747ad95b2e6de0b86ab06c97ca8f1 Mon Sep 17 00:00:00 2001 -From: Markus Volk -Date: Tue, 12 Sep 2023 17:00:41 +0200 -Subject: [PATCH] meson: fix reproducibility - -Tracker's design seems to be strictly for non-cross builds and leaks buildpaths into the -binaries at various places. Avoid this to improve binary reproducibility. - -todo: Some of these paths may need to be adjusted to make the test environment work - -Upstream-Status: Inappropriate [oe-specific] - -Signed-off-by: Markus Volk ---- - meson.build | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/meson.build b/meson.build -index fe65280b6..6af5abec9 100644 ---- a/meson.build -+++ b/meson.build -@@ -323,7 +323,7 @@ conf.set('PACKAGE_VERSION', '"@0@"'.format(meson.project_version())) - conf.set('TRACKER_VERSION', '"@0@"'.format(meson.project_version())) - - # Config that goes in some other generated files (.desktop, .pc, etc) --conf.set('abs_top_builddir', meson.current_build_dir()) -+conf.set('abs_top_builddir', '') - conf.set('exec_prefix', get_option('prefix')) - conf.set('bindir', join_paths(get_option('prefix'), get_option('bindir'))) - conf.set('datadir', datadir) -@@ -353,7 +353,7 @@ tracker_c_args = [ - configinc = include_directories('./') - srcinc = include_directories('src/') - --build_root = meson.current_build_dir() -+build_root = '' - - # We use tracker-miners-3.0 rather than tracker3-miners inside the lib64 - # directory, following the existing convention in that directory. -@@ -378,8 +378,8 @@ subdir('src') - subdir('docs') - - test_c_args = tracker_c_args + [ -- '-DTOP_BUILDDIR="@0@/"'.format(meson.project_build_root()), -- '-DTOP_SRCDIR="@0@/"'.format(meson.project_source_root()), -+ '-DTOP_BUILDDIR="@0@/"'.format(''), -+ '-DTOP_SRCDIR="@0@/"'.format('/usr/src/debug/tracker'), - ] - - if get_option('tests_tap_protocol') -diff --git a/src/common/tracker-landlock.c b/src/common/tracker-landlock.c -index a3f390585..778ae62d9 100644 ---- a/src/common/tracker-landlock.c 2026-03-15 01:40:56.000000000 +0100 -+++ b/src/common/tracker-landlock.c 2026-03-26 16:49:16.948259117 +0100 -@@ -299,7 +299,7 @@ - LANDLOCK_ACCESS_FS_READ_DIR); - } - } -- -+#if 0 - current_dir = g_get_current_dir (); - - /* Detect running in-tree */ -@@ -319,7 +319,7 @@ - in_tree_rules[i].flags); - } - } -- -+#endif - /* Add user cache for readonly databases */ - #ifdef MINER_FS_CACHE_LOCATION - add_rule (landlock_fd, MINER_FS_CACHE_LOCATION, ---- a/src/indexer/meson.build 2026-03-15 01:40:56.000000000 +0100 -+++ b/src/indexer/meson.build 2026-03-26 16:55:09.020362168 +0100 -@@ -91,9 +91,9 @@ executable('localsearch-@0@'.format(tracker_api_major), - dependencies: tracker_miner_fs_deps, - c_args: [ - tracker_c_args, -- '-DBUILDROOT="@0@"'.format(meson.global_build_root()), -- '-DBUILDDIR="@0@"'.format(meson.current_build_dir()), -- '-DBUILD_EXTRACTDIR="@0@"'.format(meson.project_build_root() / 'src' / 'extractor'), -+ '-DBUILDROOT="@0@"'.format(get_option('prefix') / 'src'), -+ '-DBUILDDIR="@0@"'.format(''), -+ '-DBUILD_EXTRACTDIR="@0@"'.format(get_option('prefix') / 'src' / 'extractor'), - '-DLIBEXECDIR="@0@"'.format(get_option('prefix') / get_option('libexecdir')), - ], - install: true, ---- a/tests/indexer/meson.build 2026-03-15 01:40:56.000000000 +0100 -+++ b/tests/indexer/meson.build 2026-03-26 17:01:29.686224071 +0100 -@@ -18,7 +18,7 @@ - ] - - libtracker_miner_test_environment = environment() --libtracker_miner_test_environment.set('GSETTINGS_SCHEMA_DIR', join_paths(meson.project_build_root(), 'data')) -+libtracker_miner_test_environment.set('GSETTINGS_SCHEMA_DIR', '/usr/src/debug/tracker-miners/data') - - libtracker_miner_test_deps = [tracker_miners_common_dep, tracker_miner_dep, tracker_sparql] - diff --git a/meta-gnome/recipes-gnome/tracker/localsearch_3.11.1.bb b/meta-gnome/recipes-gnome/tracker/localsearch_3.11.1.bb index 4353ff1373..c5c463a54b 100644 --- a/meta-gnome/recipes-gnome/tracker/localsearch_3.11.1.bb +++ b/meta-gnome/recipes-gnome/tracker/localsearch_3.11.1.bb @@ -15,7 +15,7 @@ DEPENDS = " \ inherit gnomebase gsettings gobject-introspection vala bash-completion features_check SRC_URI:append = " \ - file://0001-fix-reproducibility.patch \ + file://0001-build-add-an-option-to-disable-the-uninstalled-helper.patch \ file://0001-Set-header-file-to-a-fixed-path-instead-of-a-host-pa.patch \ " SRC_URI[archive.sha256sum] = "7b39a6c28a8acf2b172f15b2fb5ee7c7a3764c447c2f4a14caa239b7ebe61942" @@ -71,7 +71,7 @@ PACKAGECONFIG[landlock] = "-Dlandlock=enabled,-Dlandlock=disabled" PACKAGECONFIG[seccomp] = "-Dseccomp=true,-Dseccomp=false,libseccomp" EXTRA_OEMESON += " \ - -Dman=false -Dfunctional_tests=false \ + -Dman=false -Dfunctional_tests=false -Duninstalled_helpers=false \ -Dsystemd_user_services=${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)} \ -Dsystemd_user_services_dir=${systemd_user_unitdir} \ "