[perl #122287] probe in Configure whether dtrace builds an object
authorTony Cook <tony@develop-help.com>
Wed, 9 Mar 2016 00:54:13 +0000 (11:54 +1100)
committerTony Cook <tony@develop-help.com>
Wed, 9 Mar 2016 00:54:13 +0000 (11:54 +1100)
When building the object file, newer versions of dtrace (on Illumos
based systems at least) require an input object file that uses
at least one of the probes defined in the .d file.

The test in Makefile.SH didn't provide that definition so the test
would fail, and not build an object file, and fail to link later on,
on systems that *do* need the object file.

Moved the probe to Configure (where it probably belongs) and supplied
an object file that uses a probe.

Tested successfully on OmniOS (with the new dtrace), Solaris 11,
and darwin.

Configure
Makefile.SH
Porting/Glossary

index 7226ac9..2546582 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -1317,6 +1317,7 @@ use64bitall=''
 use64bitint=''
 usecbacktrace=''
 dtrace=''
+dtraceobject=''
 usedtrace=''
 usefaststdio=''
 usekernprocpathname=''
@@ -8171,6 +8172,33 @@ EOM
        esac
 done
 
+case "$usedtrace" in
+$define)
+       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) {
+    PERL_LOADED_FILE("dummy");
+    return 0;
+}
+EOM
+               dtraceobject=$undef
+               if $cc -c -o try.o $optimize $ccflags try.c \
+                    && $dtrace -G -s ../perldtrace.d try.o ; then
+                       dtraceobject=$define
+                       echo "Your dtrace builds an object file"
+               fi
+               $rm -f try.c try.o perldtrace.o
+               ;;
+       *) dtraceobject=$undef ;;
+       esac
+esac
+
 : See if we want extra modules installed
 echo " "
 case "$extras" in
@@ -24720,6 +24748,7 @@ doublesize='$doublesize'
 drand01='$drand01'
 drand48_r_proto='$drand48_r_proto'
 dtrace='$dtrace'
+dtraceobject='$dtraceobject'
 dynamic_ext='$dynamic_ext'
 eagain='$eagain'
 ebcdic='$ebcdic'
index a9ece4f..43701ad 100755 (executable)
@@ -234,10 +234,13 @@ dtrace_o=''
 minidtrace_o=''
 case "$usedtrace" in
 define|true)
-       dtrace_h='perldtrace.h' 
-       $dtrace -G -s perldtrace.d -o perldtrace.tmp >/dev/null 2>&1 \
-               && rm -f perldtrace.tmp && dtrace_o='perldtrace$(OBJ_EXT)' \
-               && minidtrace_o='miniperldtrace$(OBJ_EXT)'
+       dtrace_h='perldtrace.h'
+       case "$dtraceobject" in
+       define)
+               dtrace_o='perldtrace$(OBJ_EXT)'
+               minidtrace_o='miniperldtrace$(OBJ_EXT)'
+               ;;
+       esac
        ;;
 esac
 
index bc879f7..40e9b40 100644 (file)
@@ -2850,6 +2850,9 @@ drand48_r_proto (d_drand48_r.U):
 dtrace (usedtrace.U):
        This variable holds the location of the dtrace executable.
 
+dtraceobject (usedtrace.U):
+       Whether we need to build an object file with the dtrace tool.
+
 dynamic_ext (Extensions.U):
        This variable holds a list of XS extension files we want to
        link dynamically into the package.  It is used by Makefile.