/usr/local/CPAN/JSON-DWIW/Makefile.PL


#!/usr/bin/env perl

# Creation date: 2007-02-19 16:49:01
# Authors: don

use strict;

use 5.006_00;
    
use ExtUtils::MakeMaker;
use File::Spec;
use Config;

my $src_dir = 'libjsonevt';

my $on_windows;
# for stuff to skip/change on Windows
if ($^O =~ /MSWin/) {
    $on_windows = 1;
    # $use_jsonevt = 0;
}

my @utf_files = qw/utf8 utf16 utf32/;
my @utf_headers = map { "$_.h" } @utf_files;

# my $obj_str = join(' ', map { "$_\$(OBJ_EXT)" } @utf_files, 'evt', 'jsonevt', 'json_writer',
#                    'print', 'old_parse', 'old_common');
my $obj_str = join(' ', map { "$_\$(OBJ_EXT)" } @utf_files, 'evt', 'jsonevt', 'json_writer',
                   'print', 'old_common', 'convenience');

sub MY::postamble {
    my ($self) = @_;

    my $stuff = '';

    my $exec_output_name = sub { my ($name) = @_;
                                 if ($on_windows and $self->{CC}
                                     and $self->{CC} =~ /\Acl(?:\.exe)?\Z/) {
                                     return "/Fe$name";
                                 }
                                 else {
                                     return "-o $name";
                                 }
                             };
    
    my $cc = '$(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) ';
    my $cc_main = '$(CC) $(PASTHRU_INC) $(INC) $(CCFLAGS) $(OPTIMIZE) $(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ';
    my $config_h = File::Spec->catfile($src_dir, 'jsonevt_config.h');

    $stuff .= "\$(INST_DYNAMIC): $obj_str $config_h\n\n";
    
    $stuff .= "evt\$(OBJ_EXT): evt.c\n\n";
    # $stuff .= "old_parse\$(OBJ_EXT): old_parse.c old_parse.h old_common.h\n\n";
    $stuff .= "old_common\$(OBJ_EXT): old_common.c old_common.h\n\n";
    # $stuff .= "DWIW\$(OBJ_EXT): DWIW.h old_parse.h old_common.h $config_h\n\n";
    $stuff .= "DWIW\$(OBJ_EXT): DWIW.h old_common.h $config_h\n\n";

#     my $make_conf = File::Spec->catfile($src_dir, 'make_config');
#     my $exec_make_conf = File::Spec->rel2abs($make_conf);
#     $exec_make_conf .= " $config_h ./check_config " . $cc_main . ' ' . $exec_output_name->('check_config');
    
    my $add_evt_obj = sub {
        my ($name, @extra_headers) = @_;
        my $rv = '';
        
        $rv .= "$name\$(OBJ_EXT): ";
        $rv .= join(' ', map { File::Spec->catfile($src_dir, $_) }
                    ('jsonevt.h', 'jsonevt_private.h', @utf_headers, 'uni.h',
                     "$name.c", @extra_headers));
        $rv .= "\n";
        $rv .= "\t$cc " . File::Spec->catfile($src_dir, "$name.c") . "\n";
        $rv .= "\n";
        
        return $rv;
    };

    $stuff .= "$obj_str: $config_h\n\n";

#     $stuff .= "$config_h: $make_conf\n\t$exec_make_conf\n\n";
#     $stuff .= "$make_conf: $make_conf.c\n\t$cc_main " . $exec_output_name->($make_conf)
#         . " $make_conf.c\n\n";

#     use Data::Dumper;
#     $Data::Dumper::Sortkeys = 1;
#     print STDERR Data::Dumper->Dump([ $self ], [ 'self' ]) . "\n\n";
    
#     my $perl_exec;
#     for my $v (qw(FULLPERLRUN ABSPERLRUN FULLPERL ABSPERL)) {
#         if (defined($self->{$v})) {
#             $perl_exec = "\$($v)";
#             last;
#         }
#     }

    # my $perl_exec = $^X;
    my $perl_exec = $Config::Config{perlpath};
        
    $stuff .= "$config_h:\n\tcd $src_dir; ./configure && ./fixup_config '$perl_exec'\n\n";
    
    $stuff .= $add_evt_obj->('jsonevt');
    $stuff .= $add_evt_obj->('json_writer');
    $stuff .= $add_evt_obj->('print', 'print.h');
    $stuff .= $add_evt_obj->('convenience');

    foreach my $file (@utf_files) {
        $stuff .= "$file\$(OBJ_EXT): ";
        $stuff .= join(' ', map { File::Spec->catfile($src_dir, $_) }
                       ("$file.c", "$file.h", 'uni.h'));
        $stuff .= "\n";
        
        $stuff .= "\t" . '$(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) ';
        $stuff .= File::Spec->catfile($src_dir, "$file.c") . "\n";
        $stuff .= "\n";
    }
    
    return $stuff;
}

sub MY::post_constants {
    my ($self) = @_;

    my @updates;

    my $optimize = $self->{OPTIMIZE};
    $optimize = '' unless $optimize;
    
    if ($ENV{DEVEL_JSON_DWIW}) {
        $optimize .= ' -Wall' unless $optimize =~ /-Wall/;
        $optimize .= ' -Werror' unless $optimize =~ /-Werror/;
    }

    if ($ENV{DEBUG_JSON_DWIW}) {
        $optimize .= ' -DDO_DEBUG';
        $optimize .= ' -g' unless $optimize =~ /-g/;
    }

    # $optimize .= ' -ansi -pedantic';
    
    push @updates, "OPTIMIZE = $optimize";

    return join("\n", @updates);
}

my $clean_str = join(' ', map { File::Spec->catfile('libjsonevt', $_) }
                     ('*.a', '*.so', '*$(OBJ_EXT)', 'jsonevt_config.h', 'make_config'));

my $args = {
            NAME => 'JSON::DWIW',
            DISTNAME => 'JSON-DWIW',
            VERSION_FROM => 'lib/JSON/DWIW.pm',
            ABSTRACT => 'JSON converter that does what I want',
            AUTHOR => 'DON OWENS <don@regexguy.com>',
            PM => { 'lib/JSON/DWIW.pm' => '$(INST_LIBDIR)/DWIW.pm',
                    'lib/JSON/DWIW/Boolean.pm' => '$(INST_LIBDIR)/DWIW/Boolean.pm',
                    'lib/JSON/DWIW/Changes.pm' => '$(INST_LIBDIR)/DWIW/Changes.pm',
                  },
            dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz' },
            DIR => [],
            EXE_FILES => [],
            PREREQ_PM => { 'Test::More' => 0,
                         },
            clean => { FILES => $clean_str },
            # OPTIMIZE => '-Wall -O3 -fno-non-lvalue-assign -g',
            # OPTIMIZE => '-O2 -g -Wall',
            # OPTIMIZE => '-Wall -O3 -Werror',
           };

$args->{DEFINE} = "-DHAVE_JSONEVT -DNO_VERSION_IN_ERROR";
$args->{LDFROM} = "\$(OBJECT) $obj_str";
$args->{INC} = "-I$src_dir";

WriteMakefile(%$args);