Make g++ happy when compiling NDBM_File on a system that
Steve Peters [Mon, 9 Oct 2006 20:17:07 +0000 (20:17 +0000)]
is likely using the GDBM compatibility headers that
g++ (and other C++ implementations) cannot handle.

p4raw-id: //depot/perl@28976

ext/NDBM_File/Makefile.PL
ext/NDBM_File/NDBM_File.xs

index 7b58601..dc5cc44 100644 (file)
@@ -1,7 +1,16 @@
+use Config;
 use ExtUtils::MakeMaker;
+
+my $define = "";
+
+if($Config{i_gdbm} && $Config{i_gdbm} eq 'define') {
+    $define .= " -DHAS_GDBM";
+}
+
 WriteMakefile(
     NAME       => 'NDBM_File',
     LIBS => ["-L/usr/local/lib -lndbm", "-ldbm -lucb"],
+    DEFINE => $define,
     MAN3PODS   => {},  # Pods will be built by installman.
     XSPROTOARG => '-noprototypes',             # XXX remove later?
     VERSION_FROM => 'NDBM_File.pm',
index 5e02af7..0c726cf 100644 (file)
@@ -16,6 +16,20 @@ typedef NDBM_File_type * NDBM_File ;
 typedef datum datum_key ;
 typedef datum datum_value ;
 
+
+#if defined(_cplusplus) && defined(HAS_GDBM)
+/* gdbm's header file used for compatibility with gdbm */
+/* isn't compatible to C++ syntax, so we need these */
+/* declarations to make everyone happy. */
+EXTERN_C DBM *dbm_open(const char *, int, mode_t);
+EXTERN_C void dbm_close(DBM *);
+EXTERN_C datum dbm_fetch(DBM *, datum);
+EXTERN_C int dbm_store(DBM *, datum, datum, int);
+EXTERN_C int dbm_delete(DBM *, datum);
+EXTERN_C datum dbm_firstkey(DBM *);
+EXTERN_C datum dbm_nextkey(DBM *);
+#endif
+
 MODULE = NDBM_File     PACKAGE = NDBM_File     PREFIX = ndbm_
 
 NDBM_File