1use ExtUtils::MakeMaker;
2use ExtUtils::Constant 0.11 'WriteConstants';
3WriteMakefile(
4    NAME => 'GDBM_File',
5    LIBS => ["-lgdbm", "-ldbm"],
6    XSPROTOARG => '-noprototypes', 		# XXX remove later?
7    VERSION_FROM => 'GDBM_File.pm',
8    realclean => {FILES=> 'const-c.inc const-xs.inc'},
9    XS_VERSION => eval MM->parse_version('GDBM_File.pm'), #silence warnings if we are a dev release
10);
11
12my @names = qw(GDBM_CACHESIZE GDBM_CENTFREE GDBM_COALESCEBLKS
13	       GDBM_FAST GDBM_FASTMODE GDBM_INSERT GDBM_NEWDB GDBM_NOLOCK
14	       GDBM_OPENMASK GDBM_READER GDBM_REPLACE GDBM_SYNC GDBM_SYNCMODE
15	       GDBM_WRCREAT GDBM_WRITER GDBM_NOMMAP GDBM_CLOEXEC GDBM_BSEXACT
16               GDBM_XVERIFY GDBM_PREREAD GDBM_NUMSYNC);
17
18push @names, {
19    name  => $_,
20    type  => "IV",
21    macro => [ "#if  GDBM_VERSION_MAJOR > 1 || GDBM_VERSION_MINOR >= 21\n",
22               "#endif\n" ],
23    value => "$_",
24} foreach qw(GDBM_SNAPSHOT_OK GDBM_SNAPSHOT_BAD GDBM_SNAPSHOT_ERR
25             GDBM_SNAPSHOT_SAME GDBM_SNAPSHOT_SUSPICIOUS);
26
27# Basic error codes - these are supported by all versions of gdbm
28push @names, {
29    name  => $_,
30    value => "$_",
31    type  => "IV",
32    macro => 1
33} foreach qw(
34    GDBM_NO_ERROR
35    GDBM_MALLOC_ERROR
36    GDBM_BLOCK_SIZE_ERROR
37    GDBM_FILE_OPEN_ERROR
38    GDBM_FILE_WRITE_ERROR
39    GDBM_FILE_SEEK_ERROR
40    GDBM_FILE_READ_ERROR
41    GDBM_BAD_MAGIC_NUMBER
42    GDBM_EMPTY_DATABASE
43    GDBM_CANT_BE_READER
44    GDBM_CANT_BE_WRITER
45    GDBM_READER_CANT_DELETE
46    GDBM_READER_CANT_STORE
47    GDBM_READER_CANT_REORGANIZE
48    GDBM_UNKNOWN_UPDATE
49    GDBM_ITEM_NOT_FOUND
50    GDBM_REORGANIZE_FAILED
51    GDBM_CANNOT_REPLACE
52    GDBM_ILLEGAL_DATA
53    GDBM_OPT_ALREADY_SET
54    GDBM_OPT_ILLEGAL);
55
56# Error codes added in various versions of gdbm
57push @names, {
58    name  => $_->[0],
59    value => "$_->[0]",
60    type  => "IV",
61    macro => [ "#if GDBM_VERSION_MAJOR > 1 || $_->[1]\n",
62               "#endif\n" ],
63} foreach map {
64    my @vref = @{$_}[1..$#{$_}];
65    my $cond;
66    if ($_->[2]) {
67        $cond = "GDBM_VERSION_MINOR > $_->[1] || ( GDBM_VERSION_MINOR == $_->[1] && GDBM_VERSION_PATCH >= $_->[2] )";
68    } else {
69        $cond = "GDBM_VERSION_MINOR >= $_->[1]";
70    }
71    map { [$_, $cond ] } @{$_->[0]}
72} ( # [ [ ERROR_CODE_NAMES ], MAJ [, MIN [, PAT]] ]
73    # where MAJ,MIN,PAT are major, minor and patchlevel numbers of the gdbm
74    # version which introduced ERROR_CODE_NAMES.
75    [[qw(GDBM_BYTE_SWAPPED GDBM_BAD_FILE_OFFSET GDBM_BAD_OPEN_FLAGS)], 9],
76    [[qw(GDBM_FILE_STAT_ERROR GDBM_FILE_EOF)], 10],
77    [[qw(GDBM_NO_DBNAME GDBM_ERR_FILE_OWNER GDBM_ERR_FILE_MODE)], 11],
78    [[qw(GDBM_UNKNOWN_ERROR GDBM_NEED_RECOVERY GDBM_BACKUP_FAILED
79         GDBM_DIR_OVERFLOW)], 13],
80    [[qw(GDBM_BAD_BUCKET GDBM_BAD_HEADER GDBM_BAD_AVAIL GDBM_BAD_HASH_TABLE
81         GDBM_BAD_DIR_ENTRY)], 15],
82    [[qw(GDBM_FILE_CLOSE_ERROR GDBM_FILE_SYNC_ERROR)], 17],
83    [[qw(GDBM_FILE_TRUNCATE_ERROR)], 18, 1],
84    [[qw(GDBM_BUCKET_CACHE_CORRUPTED GDBM_BAD_HASH_ENTRY)], 20],
85    [[qw(GDBM_MALFORMED_DATA GDBM_OPT_BADVAL GDBM_ERR_SNAPSHOT_CLONE
86         GDBM_ERR_REALPATH GDBM_ERR_USAGE)], 21]
87   );
88
89
90WriteConstants(
91    NAME => 'GDBM_File',
92    DEFAULT_TYPE => 'IV',
93    BREAKOUT_AT => 8,
94    PROXYSUBS => {autoload => 1},
95    NAMES => \@names
96);
97