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

Nick Alcock nick.alcock at oracle.com
Fri May 31 18:59:27 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 11ad9fed4dcf0..5b4906a86d26e 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 55c622c19dc0a..68800fbeb5fcb 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 0f5d1c08aee86..cc65c3452981f 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 8e491fe28ad13..2e590701d03e7 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.45.1.275.g567cb0950c




More information about the DTrace-devel mailing list