File: MyBuilder.pm

package info (click to toggle)
libtext-xslate-perl 3.5.9-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 2,108 kB
  • sloc: perl: 19,756; ansic: 214; pascal: 182; makefile: 9; cs: 8
file content (104 lines) | stat: -rw-r--r-- 2,888 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package builder::MyBuilder;
use strict;
use warnings;
use base 'Module::Build::XSUtil';

sub new {
    my ($class, %args) = @_;

    my $self = $class->SUPER::new(
        %args,
        c_source => ['src'],
        cc_warnings => 1,
        generate_ppport_h => 'src/ppport.h',
        generate_xshelper_h => 'src/xshelper.h',
        xs_files => { 'src/Text-Xslate.xs' => 'lib/Text/Xslate.xs' },
    );

    # src/xslate_ops.h uses special operators name in C++,
    # such as "and", "or", "not";
    # so remove "-Wc++-compat" flags
    my $flags = $self->extra_compiler_flags;
    $self->extra_compiler_flags(grep { $_ ne "-Wc++-compat" } @$flags);
    $self;
}

sub _write_xs_version {
    my ($self, $file) = @_;
    open my $fh, ">", $file or die "$file: $!";
    print  {$fh} "#ifndef XS_VERSION\n";
    printf {$fh} "#  define XS_VERSION \"%s\"\n", $self->dist_version;
    print  {$fh} "#endif\n";
}

sub _derive_opcode {
    my ($self, $script, $source, $derived) = @_;
    my @cmd = ($self->{properties}{perl}, $script, $source);
    $self->log_info("@cmd > $derived\n");
    open my $fh, ">", $derived or die "$derived: $!";
    print {$fh} $self->_backticks(@cmd);
}

sub ACTION_code {
    my ($self, @args) = @_;

    if (!$self->pureperl_only) {
        $self->_write_xs_version("src/xs_version.h");
    }

    my @derive = (
        {
            xs => 0,
            source => "src/xslate_opcode.inc",
            derived => "lib/Text/Xslate/PP/Const.pm",
            code => sub {
                my ($self, $source, $derived) = @_;
                $self->_derive_opcode("tool/opcode_for_pp.PL", $source, $derived);
            },
        },
        {
            xs => 1,
            source => "src/xslate_opcode.inc",
            derived => "src/xslate_ops.h",
            code => sub {
                my ($self, $source, $derived) = @_;
                $self->_derive_opcode("tool/opcode.PL", $source, $derived);
            },
        },
        {
            xs => 1,
            source => "src/xslate_methods.xs",
            derived => "src/xslate_methods.c",
            code => sub {
                my ($self, $source, $derived) = @_;
                $self->compile_xs($source, outfile => $derived);
            },
        }

    );
    for my $derive (@derive) {
        next if $self->pureperl_only and $derive->{xs};
        next if $self->up_to_date($derive->{source}, $derive->{derived});
        $derive->{code}->($self, $derive->{source}, $derive->{derived});
    }

    $self->SUPER::ACTION_code(@args);
}

sub ACTION_test {
    my ($self, @args) = @_;

    if (!$self->pureperl_only) {
        local $ENV{XSLATE} = 'xs';
        $self->log_info("xs tests\n");
        $self->SUPER::ACTION_test(@args);
    }

    {
        local $ENV{PERL_ONLY} = 1;
        $self->log_info("pureperl tests\n");
        $self->SUPER::ACTION_test(@args);
    }
}

1;