[DTrace-devel] [PATCH v2 8/9] build: make dtrace and dtprobed relocatable

Nick Alcock nick.alcock at oracle.com
Thu Aug 1 13:21:55 UTC 2024


The majority of the complexity here involves figuring out what to
do about the systemd service file.  We presume that if the user
is installing such that the service file lands inone of the two fixed
locations systemd knows how to find persistent service files in, or
if the user has explicitly passed --systemd-unit-dir to configure,
it makes sense to install the systemd service file (because systemd
will find it): otherwise, we avoid installing it and print a
warning that the user must do so if dtprobed is to be properly
started.

Provide a new installation target, install-dtprobed-autostart, to do
so.

(Regardless, the service file is changed to substitute in the real
installed path of dtprobed.)

Signed-off-by: Nick Alcock <nick.alcock at oracle.com>
---
 Maketargets                                   |  3 ++
 cmd/Build                                     |  4 +--
 dtprobed/Build                                | 36 ++++++++++++++-----
 .../{dtprobed.service => dtprobed.service.in} |  2 +-
 4 files changed, 34 insertions(+), 11 deletions(-)
 rename dtprobed/{dtprobed.service => dtprobed.service.in} (95%)

diff --git a/Maketargets b/Maketargets
index 11ad9fed4dcf..5b4906a86d26 100644
--- a/Maketargets
+++ b/Maketargets
@@ -14,6 +14,9 @@ help::
 	@printf "dlibs                          Build translator files\n" >&2
 	@printf "install                        Install (DESTDIR supported)\n" >&2
 	@printf "install-test                   Install testsuite (DESTDIR supported)\n" >&2
+	@printf "install-dtprobed-autostart     Install udev / systemd rules to start dtprobed" >&2
+	@printf "                               (done by make install unless prefix or sbindir" >&2
+	@printf "                                are changed)" >&2
 	@printf "clean / realclean              Clean up build tree\n" >&2
 	@printf "TAGS / tags / gtags            Make tags files\n" >&2
 	@printf "\n" >&2
diff --git a/cmd/Build b/cmd/Build
index 55c622c19dc0..68800fbeb5fc 100644
--- a/cmd/Build
+++ b/cmd/Build
@@ -1,5 +1,5 @@
 # Oracle Linux DTrace.
-# Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved.
 # Licensed under the Universal Permissive License v 1.0 as shown at
 # http://oss.oracle.com/licenses/upl.
 
@@ -36,7 +36,7 @@ if [[ -z \$$_DTRACE_CHECK_INSTALLED ]]; then\n\
     export LD_LIBRARY_PATH=$(objdir)\n\
     dtrace_cmd=$(objdir)/dtrace\n\
 else\n\
-    dtrace_cmd=/usr/sbin/dtrace\n\
+    dtrace_cmd=$(SBINDIR)/dtrace\n\
 fi\n\
 \n\
 if [[ -n \$$DTRACE_GDB ]]; then\n\
diff --git a/dtprobed/Build b/dtprobed/Build
index 0f5d1c08aee8..9132c3e31c8a 100644
--- a/dtprobed/Build
+++ b/dtprobed/Build
@@ -42,17 +42,13 @@ dtprobed.c_CFLAGS := -Wno-pedantic
 seccomp-assistance.c_CFLAGS := -fno-lto
 endif
 
-install::
-	mkdir -p $(INSTSBINDIR)
-	$(call describe-install-target,$(INSTSBINDIR),dtprobed)
-	install -m 755 $(objdir)/dtprobed $(INSTSBINDIR)
-	mkdir -p $(INSTUDEVDIR)
-	$(call describe-install-target,$(INSTUDEVDIR),60-dtprobed.rules)
-	install -m 644 $(dtprobed_DIR)60-dtprobed.rules $(INSTUDEVDIR)
+install-dtprobed-autostart::
 ifdef HAVE_LIBSYSTEMD
 	mkdir -p $(INSTSYSTEMDUNITDIR) $(INSTSYSTEMDPRESETDIR)
 	$(call describe-install-target,$(INSTSYSTEMDUNITDIR),dtprobed.service)
-	install -m 644 $(dtprobed_DIR)dtprobed.service $(INSTSYSTEMDUNITDIR)
+	sed 's, at SBINDIR@,$(SBINDIR),' < $(dtprobed_DIR)dtprobed.service.in > $(INSTSYSTEMDUNITDIR)/dtprobed.service
+        chown root:root $(INSTSYSTEMDUNITDIR)/dtprobed.service
+	chmod 0644 $(INSTSYSTEMDUNITDIR)/dtprobed.service
 	$(call describe-install-target,$(INSTSYSTEMDUNITDIR),dtrace-usdt.target)
 	install -m 644 $(dtprobed_DIR)dtrace-usdt.target $(INSTSYSTEMDUNITDIR)
 	$(call describe-install-target,$(INSTSYSTEMDPRESETDIR),50-dtprobed.preset)
@@ -61,3 +57,27 @@ ifdef HAVE_LIBSYSTEMD
 		systemctl enable dtprobed.service dtrace-usdt.target; \
 	fi
 endif
+
+install::
+	mkdir -p $(INSTSBINDIR)
+	$(call describe-install-target,$(INSTSBINDIR),dtprobed)
+	install -m 755 $(objdir)/dtprobed $(INSTSBINDIR)
+	mkdir -p $(INSTUDEVDIR)
+	$(call describe-install-target,$(INSTUDEVDIR),60-dtprobed.rules)
+	install -m 644 $(dtprobed_DIR)60-dtprobed.rules $(INSTUDEVDIR)
+	if [[ "$(SYSTEMDUNITDIR)" = /usr/lib/systemd/system ]] || \
+	   [[ "$(SYSTEMDUNITDIR)" = /usr/local/lib/systemd/system ]] || \
+	   [[ -n "$(filter SYSTEMDUNITDIR,$(CONFIGURED_VARS))" ]] ; then \
+		$(MAKE) install-dtprobed-autostart; \
+	else \
+		echo " === WARNING WARNING WARNING === " >&2; \
+		echo "systemd service files for dtprobed not installed." >&2; \
+		echo "USDT probes (and the testsuite) will not work unless this is" >&2; \
+		echo "done.  Try make install-dtprobed-autostart, but this may not" >&2; \
+		echo "be enough: you may need to manually move the systemd service" >&2; \
+		echo "files somewhere udev and systemd will find them." >&2; \
+		echo "If there is already a running dtprobed, it may or may not work" >&2; \
+		echo "in conjunction with this DTrace." >&2; \
+		echo "Configure with --systemd-unit-dir to override this decision." >&2; \
+		echo " === WARNING WARNING WARNING === " >&2; \
+	fi
diff --git a/dtprobed/dtprobed.service b/dtprobed/dtprobed.service.in
similarity index 95%
rename from dtprobed/dtprobed.service
rename to dtprobed/dtprobed.service.in
index 8e491fe28ad1..2e590701d03e 100644
--- a/dtprobed/dtprobed.service
+++ b/dtprobed/dtprobed.service.in
@@ -12,7 +12,7 @@ Before=basic.target
 
 [Service]
 Type=notify
-ExecStart=/usr/sbin/dtprobed -F
+ExecStart=@SBINDIR@/dtprobed -F
 Restart=on-failure
 RestartPreventExitStatus=1
 ProtectSystem=strict
-- 
2.46.0.277.ge12b8151ed




More information about the DTrace-devel mailing list