If PERL_NO_INLINE_FUNCTIONS is defined, don't include "inline.h"
authorNicholas Clark <nick@ccl4.org>
Fri, 26 Apr 2013 10:18:41 +0000 (12:18 +0200)
committerNicholas Clark <nick@ccl4.org>
Fri, 3 May 2013 11:35:15 +0000 (13:35 +0200)
This permits test code to include the perl headers for definitions without
creating a link dependency on the perl library (which may not exist yet).

Some of the static inline functions in inline.h reference functions in the
perl object files, and some compilers aren't smart enough to eliminate
unused static inline functions, hence including the inline.h in probe code
can cause link errors even though the probe code uses none of the functions
it declares. When probing, a failed link is taken as meaning that the
probed-for function is not present, as the assumption is that the link fails
because of it. Hence other causes of link failures cause the probing code to
generate incorrect results, and action (and bugs) at a distance.

cflags.SH
cpan/Time-HiRes/Makefile.PL
perl.h

index 899c465..5363f99 100755 (executable)
--- a/cflags.SH
+++ b/cflags.SH
@@ -142,7 +142,7 @@ Intel*) ;; # # Is that you, Intel C++?
        case " $ccflags " in
        *" $opt "*) ;; # Skip if already there.
        *) rm -f _cflags$_exe
-          case "`$cc $cflags $warn $stdflags $opt _cflags.c -o _cflags$_exe 2>&1`" in
+          case "`$cc -DPERL_NO_INLINE_FUNCTIONS $cflags $warn $stdflags $opt _cflags.c -o _cflags$_exe 2>&1`" in
           *"unrecognized"*) ;;
           *"implicit declaration"*) ;; # Was something useful hidden?
           *"Invalid"*) ;;
index 6f6a790..f27439e 100644 (file)
@@ -115,7 +115,8 @@ __EOD__
             }
         }
 
-       my $ccflags = $Config{'ccflags'} . ' ' . "-I$COREincdir";
+       my $ccflags = $Config{'ccflags'} . ' ' . "-I$COREincdir"
+        . ' -DPERL_NO_INLINE_FUNCTIONS';
 
        if ($^O eq 'VMS') {
             $cccmd = "$Config{'cc'} /include=($COREincdir) $tmp.c";
diff --git a/perl.h b/perl.h
index 5639f1c..89f4c98 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -5239,8 +5239,21 @@ EXTCONST bool PL_valid_types_NV_set[];
 
 #endif
 
-/* Static inline funcs that depend on includes and declarations above */
-#include "inline.h"
+#ifndef PERL_NO_INLINE_FUNCTIONS
+/* Static inline funcs that depend on includes and declarations above.
+   Some of these reference functions in the perl object files, and some
+   compilers aren't smart enough to eliminate unused static inline
+   functions, so including this file in source code can cause link errors
+   even if the source code uses none of the functions. Hence including these
+   can be be suppressed by setting PERL_NO_INLINE_FUNCTIONS. Doing this will
+   (obviously) result in unworkable XS code, but allows simple probing code
+   to continue to work, because it permits tests to include the perl headers
+   for definitions without creating a link dependency on the perl library
+   (which may not exist yet).
+*/
+
+#  include "inline.h"
+#endif
 
 #include "overload.h"