(perl #130108) check if dtrace accepts -xnolibs and use it if available
authorH.Merijn Brand - Tux <h.m.brand@xs4all.nl>
Fri, 12 May 2017 14:40:48 +0000 (16:40 +0200)
committerH.Merijn Brand - Tux <h.m.brand@xs4all.nl>
Fri, 12 May 2017 14:40:48 +0000 (16:40 +0200)
Backport of f2a60c1f79f4336895ffcbe81f18e49b0228ea44

dtrace without -xnolibs fails in a FreeBSD jail, so we need to supply
it on FreeBSD.

Unfortunately systemtap's dtrace emulation doesn't support -xnolibs so
we need to test if it's available.

And fixed a serious typo in the make-rules

U/perl/dtraceobject.U

index e9f07dc..8bbbb36 100644 (file)
@@ -3,21 +3,54 @@
 ?RCS: You may distribute under the terms of either the GNU General Public
 ?RCS: License or the Artistic License, as specified in the README file.
 ?RCS:
-?MAKE:dtraceobject: usedtrace dtrace cc ccflags rm optimize Compile cat
-?MAKE: -pick add $@ $@
+?MAKE:dtraceobject dtracexnolibs: usedtrace dtrace cc ccflags optimize \
+               Compile cat rm_try
+?MAKE: -pick add $@ %<
 ?S:dtraceobject:
 ?S:    Whether we need to build an object file with the dtrace tool.
 ?S:.
+?S:dtracexnolibs:
+?S:    Whether dtrace accepts -xnolibs.  If available we call dtrace -h
+?S:    and dtrace -G with -xnolibs to allow dtrace to run in a jail on
+?S:    FreeBSD.
+?S:.
+?T:xnolibs
 : Probe whether dtrace builds an object, as newer Illumos requires an input
 : object file that uses at least one of the probes defined in the .d file
 case "$usedtrace" in
 $define)
+    case "$dtracexnolibs" in
+    $define|true|[yY]*)
+        dtracexnolibs=$define
+       $dtrace -h -xnolibs -s ../perldtrace.d -o perldtrace.h
+       ;;
+    ' '|'')
+        if $dtrace -h -xnolibs -s ../perldtrace.d -o perldtrace.h 2>&1 ; then
+            dtracexnolibs=$define
+            echo "Your dtrace accepts -xnolibs"
+       elif $dtrace -h -s ../perldtrace.d -o perldtrace.h 2>&1 ; then
+            dtracexnolibs=$undef
+            echo "Your dtrace doesn't accept -xnolibs"
+       else
+             echo "Your dtrace doesn't work at all, try building without dtrace support" >&4
+            exit 1
+       fi
+       ;;
+    *)
+        dtracexnolibs=$undef
+       $dtrace -h -s ../perldtrace.d -o perldtrace.h
+       ;;
+    esac
+    case $dtracexnolibs in
+    $define) xnolibs=-xnolibs ;;
+    *) xnolibs= ;;
+    esac
+
     case "$dtraceobject" in
     $define|true|[yY]*)
         dtraceobject=$define
         ;;
     ' '|'')
-        $dtrace -h -s ../perldtrace.d -o perldtrace.h
         $cat >try.c <<EOM
 #include "perldtrace.h"
 int main(void) {
@@ -27,13 +60,13 @@ int main(void) {
 EOM
         dtraceobject=$undef
         if $cc -c -o try.o $optimize $ccflags try.c \
-                    && $dtrace -G -s ../perldtrace.d try.o >/dev/null 2>&1; then
+                    && $dtrace -G $xnolibs -s ../perldtrace.d try.o >/dev/null 2>&1; then
                 dtraceobject=$define
             echo "Your dtrace builds an object file"
         fi
-        $rm -f try.c try.o perldtrace.o
         ;;
     *) dtraceobject=$undef ;;
     esac
+    $rm_try perldtrace.o perldtrace.h
 esac