1use strict;
2use Config;
3use ExtUtils::MakeMaker;
4eval 'use ExtUtils::MakeMaker::Coverage';
5use File::Copy;
6use File::Path;
7use File::Spec;
8require 5.005;
9
10
11# create a typemap for Perl 5.6
12if ($] < 5.008) {
13    open(TYPEMAP, ">typemap") or die "fatal: can't write typemap: $!";
14    print TYPEMAP "const char *\t\tT_PV\n";
15    close(TYPEMAP);
16}
17
18# create a lib/ dir in order to avoid warnings in Test::Distribution
19mkdir "lib", 0755;
20
21# virtual paths given to EU::MM
22my %virtual_path = ( 'Syslog.pm' => '$(INST_LIBDIR)/Syslog.pm' );
23
24# detect when to use Win32::EvenLog
25my (@extra_params, @extra_prereqs);
26my $use_eventlog = eval "use Win32::EventLog; 1";
27
28if ($use_eventlog) {
29    print " * Win32::EventLog detected.\n";
30    my $name = "PerlLog";
31
32    push @extra_prereqs,
33        Win32 => 0,  "Win32::TieRegistry" => 0,  "Win32::EventLog" => 0;
34
35    $virtual_path{'win32/Win32.pm'   } = '$(INST_LIBDIR)/Syslog/Win32.pm';
36    $virtual_path{'win32/PerlLog.dll'} = '$(INST_ARCHAUTODIR)/PerlLog.dll';
37
38    push @extra_params, CCFLAGS => "-Ifallback";
39
40    # recreate the DLL from its uuencoded form if it's not here
41    if (! -f File::Spec->catfile("win32", "$name.dll")) {
42        # read the uuencoded data
43        open(UU, '<' . File::Spec->catfile("win32", "$name\_dll.uu"))
44            or die "fatal: Can't read file '$name\_dll.uu': $!";
45        my $uudata = do { local $/; <UU> };
46        close(UU);
47
48        # write the DLL
49        open(DLL, '>' . File::Spec->catfile("win32", "$name.dll"))
50            or die "fatal: Can't write DLL '$name.dll': $!";
51        binmode(DLL);
52        print DLL unpack "u", $uudata;
53        close(DLL);
54    }
55}
56elsif ($^O =~ /Win32/) {
57    print <<"NOTICE"
58 *** You're running on a Win32 system,  but you lack the Win32::EventLog\a
59 *** module, part of the libwin32 distribution. Although Sys::Syslog can
60 *** be used without Win32::EventLog, it won't be very useful except for
61 *** sending remote syslog messages.  If you want to log messages on the
62 *** local host as well, please install libwin32 then Sys::Syslog again.
63NOTICE
64}
65
66# detect when being built in Perl core
67if (grep { $_ eq 'PERL_CORE=1' } @ARGV) {
68    push @extra_params,
69        MAN3PODS    => {};      # Pods will be built by installman.
70}
71else {
72    push @extra_params,
73        DEFINE      => '-DUSE_PPPORT_H';
74}
75
76# on pre-5.6 Perls, add warnings::compat to the prereq modules
77push @extra_prereqs, "warnings::compat" => "0.06"  if $] < 5.006;
78
79WriteMakefile(
80    NAME            => 'Sys::Syslog',
81    LICENSE         => 'perl',
82    AUTHOR          => 'Sebastien Aperghis-Tramoni <sebastien@aperghis.net>',
83    VERSION_FROM    => 'Syslog.pm',
84    ABSTRACT_FROM   => 'Syslog.pm',
85    INSTALLDIRS     => 'perl',
86    XSPROTOARG      => '-noprototypes',
87    PM              => \%virtual_path,
88    PREREQ_PM       => {
89        # run prereqs
90        'Carp'              => 0,
91        'Fcntl'             => 0,
92        'File::Basename'    => 0,
93        'File::Spec'        => 0,
94        'POSIX'             => 0,
95        'Socket'            => 0,
96        'XSLoader'          => 0,
97        @extra_prereqs,
98
99        # build/test prereqs
100        'Test::More'        => 0,
101    },
102    PL_FILES        => {},
103    dist            => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', },
104    clean           => { FILES => 'Sys-Syslog-*' },
105    realclean       => { FILES => 'lib const-c.inc const-xs.inc macros.all '
106        .'PerlLog.h typemap *.bak *.bin *.rc win32/PerlLog_dll' },
107    @extra_params
108);
109
110
111# find a default value for _PATH_LOG
112my $_PATH_LOG;
113
114if (-c "/dev/conslog" and -w _) {
115    # SunOS 5.8 has a worldwritable /dev/conslog STREAMS log driver.
116    # The /dev/log STREAMS log driver on this platform has permissions
117    # and ownership `crw-r----- root sys'.  /dev/conslog has more liberal
118    # permissions.
119    $_PATH_LOG = "/dev/conslog";
120}
121elsif (-S "/var/run/syslog" and -w _) {
122    # Mac OS X puts it at a different path.
123    $_PATH_LOG = "/var/run/syslog";
124}
125elsif (-p "/dev/log" and -w _) {
126    # On HP-UX, /dev/log isn't a unix domain socket but a named pipe.
127    $_PATH_LOG = "/dev/log";
128}
129elsif ((-S "/dev/log" or -c _) and -w _) {
130    # Most unixes have a unix domain socket /dev/log.
131    $_PATH_LOG = "/dev/log";
132}
133else {
134    $_PATH_LOG = "";
135}
136
137
138# if possible, generate the code that handles the constants with
139# ExtUtils::Constant, otherwise use cached copy in fallback/
140if(eval {require ExtUtils::Constant; 1}) {
141    my @levels = qw(
142        LOG_ALERT LOG_CRIT LOG_DEBUG LOG_EMERG LOG_ERR
143        LOG_INFO LOG_NOTICE LOG_WARNING
144    );
145
146    my @facilities = (
147        # standard facilities
148        qw(
149            LOG_AUTH LOG_AUTHPRIV LOG_CRON LOG_DAEMON LOG_FTP LOG_KERN
150            LOG_LOCAL0 LOG_LOCAL1 LOG_LOCAL2 LOG_LOCAL3 LOG_LOCAL4
151            LOG_LOCAL5 LOG_LOCAL6 LOG_LOCAL7 LOG_LPR LOG_MAIL LOG_NEWS
152            LOG_SYSLOG LOG_USER LOG_UUCP
153        ),
154        # Mac OS X specific facilities
155        { name => "LOG_INSTALL",    type => "IV", default => [ "IV", "LOG_USER"  ] },
156        { name => "LOG_LAUNCHD",    type => "IV", default => [ "IV", "LOG_DAEMON"] },
157        { name => "LOG_NETINFO",    type => "IV", default => [ "IV", "LOG_DAEMON"] },
158        { name => "LOG_RAS",        type => "IV", default => [ "IV", "LOG_AUTH"  ] },
159        { name => "LOG_REMOTEAUTH", type => "IV", default => [ "IV", "LOG_AUTH"  ] },
160        # modern BSD specific facilities
161        { name => "LOG_CONSOLE",    type => "IV", default => [ "IV", "LOG_USER"  ] },
162        { name => "LOG_NTP",        type => "IV", default => [ "IV", "LOG_DAEMON"] },
163        { name => "LOG_SECURITY",   type => "IV", default => [ "IV", "LOG_AUTH"  ] },
164        # IRIX specific facilities
165        { name => "LOG_AUDIT",      type => "IV", default => [ "IV", "LOG_AUTH"  ] },
166        { name => "LOG_LFMT",       type => "IV", default => [ "IV", "LOG_USER"  ] },
167    );
168
169    my @options = qw(
170        LOG_CONS LOG_PID LOG_NDELAY LOG_NOWAIT LOG_ODELAY LOG_PERROR
171    );
172
173    my @others_macros = (
174        qw(LOG_FACMASK),
175        { name => "_PATH_LOG", type => "PV", default => [ "PV", qq("$_PATH_LOG") ] },
176        { name => "LOG_PRIMASK",     type => "IV", default => [ "IV", 7] },
177        { name => "LOG_NFACILITIES", type => "IV", default => [ "IV", scalar @facilities] },
178    );
179
180    ExtUtils::Constant::WriteConstants(
181        NAME => 'Sys::Syslog',
182        NAMES => [ @levels, @facilities, @options, @others_macros ],
183        ($] > 5.009002 ? (PROXYSUBS => 1) : ()),
184    );
185
186    my @names = map { ref $_ ? $_->{name} : $_ } @levels, @facilities, @options;
187    open(MACROS, '>macros.all') or warn "warning: Can't write 'macros.all': $!\n";
188    print MACROS join $/, @names;
189    close(MACROS);
190}
191else {
192    foreach my $file ('const-c.inc', 'const-xs.inc') {
193        my $fallback = File::Spec->catfile('fallback', $file);
194        copy($fallback, $file) or die "fatal: Can't copy $fallback to $file: $!";
195    }
196}
197