File Coverage

blib/lib/Alien/Base/Wrapper.pm
Criterion Covered Total %
statement 77 78 98.7
branch 20 26 76.9
condition 4 6 66.6
subroutine 13 13 100.0
pod 4 4 100.0
total 118 127 92.9


line stmt bran cond sub pod time code
1             package Alien::Base::Wrapper;
2              
3 2     2   151155 use strict;
  2         3  
  2         50  
4 2     2   6 use warnings;
  2         1  
  2         42  
5 2     2   50 use 5.008001;
  2         4  
6 2     2   7 use Config;
  2         2  
  2         69  
7 2     2   863 use Text::ParseWords qw( shellwords );
  2         2162  
  2         1396  
8              
9             # ABSTRACT: Compiler and linker wrapper for Alien
10             our $VERSION = '0.04'; # VERSION
11              
12              
13             my @cflags_I;
14             my @cflags_other;
15             my @ldflags_L;
16             my @ldflags_l;
17             my @ldflags_other;
18             my @mm;
19             my @mb;
20              
21             sub _reset
22             {
23 4     4   11587 @cflags_I = ();
24 4         5 @cflags_other = ();
25 4         4 @ldflags_L = ();
26 4         7 @ldflags_l = ();
27 4         2 @ldflags_other = ();
28 4         8 @mm = ();
29 4         10 @mb = ();
30             }
31              
32              
33             sub cc
34             {
35             my @command = (
36             $Config{cc},
37 4     4 1 283 @cflags_I,
38             @cflags_other,
39             @ARGV,
40             );
41 4 50       13 print "@command\n" unless $ENV{ALIEN_BASE_WRAPPER_QUIET};
42 4         10 exec @command;
43             }
44              
45              
46             sub ld
47             {
48             my @command = (
49             $Config{ld},
50 4     4 1 3045 @ldflags_L,
51             @ldflags_other,
52             @ARGV,
53             @ldflags_l,
54             );
55 4 50       12 print "@command\n" unless $ENV{ALIEN_BASE_WRAPPER_QUIET};
56 4         10 exec @command;
57             }
58              
59              
60             sub mm_args
61             {
62 1     1 1 1010 @mm;
63             }
64              
65              
66             sub mb_args
67             {
68 1     1 1 1916 @mb;
69             }
70              
71             sub _join
72             {
73 36     36   31 join ' ', map { s/(\s)/\\$1/g; $_ } @_;
  54         47  
  54         218  
74             }
75              
76             sub import
77             {
78 6     6   144 my(undef, @aliens) = @_;
79              
80 6         5 my $export = 1;
81              
82 6         10 foreach my $alien (@aliens)
83             {
84 7 50       99 if($alien eq '!export')
85             {
86 0         0 $export = 0;
87             }
88 7 100       24 $alien = "Alien::$alien" unless $alien =~ /::/;
89 7         14 my $alien_pm = $alien . '.pm';
90 7         25 $alien_pm =~ s/::/\//g;
91 7 50 33     9 require $alien_pm unless eval { $alien->can('cflags') } && eval { $alien->can('libs') };
  7         74  
  7         38  
92 7         9 my $cflags;
93             my $libs;
94 7 100 100     16 if($alien->install_type eq 'share' && $alien->can('cflags_static'))
95             {
96 1         10 $cflags = $alien->cflags_static;
97 1         5 $libs = $alien->libs_static;
98             }
99             else
100             {
101 6         43 $cflags = $alien->cflags;
102 6         18 $libs = $alien->libs;
103             }
104            
105 7         22 push @cflags_I, grep /^-I/, shellwords $cflags;
106 7         412 push @cflags_other, grep !/^-I/, shellwords $cflags;
107            
108 7         239 push @ldflags_L, grep /^-L/, shellwords $libs;
109 7         256 push @ldflags_l, grep /^-l/, shellwords $libs;
110 7         264 push @ldflags_other, grep !/^-[Ll]/, shellwords $libs;
111             }
112            
113 6         211 my @cflags_define = grep /^-D/, @cflags_other;
114 6         12 my @cflags_other2 = grep !/^-D/, @cflags_other;
115            
116 6         5 @mm = ();
117              
118 6 100       20 push @mm, INC => _join @cflags_I if @cflags_I;
119 6 50       13 push @mm, CCFLAGS => _join(@cflags_other2) . " $Config{ccflags}" if @cflags_other2;
120 6 100       15 push @mm, DEFINE => _join(@cflags_define) if @cflags_define;
121              
122 6         12 push @mm, LIBS => [@ldflags_l];
123 6         7 my @ldflags = (@ldflags_L, @ldflags_other);
124 6 100       14 push @mm, LDDLFLAGS => _join(@ldflags) . " $Config{lddlflags}" if @ldflags;
125 6 100       16 push @mm, LDFLAGS => _join(@ldflags) . " $Config{ldflags}" if @ldflags;
126              
127 6         10 @mb = ();
128            
129 6         10 push @mb, extra_compiler_flags => _join(@cflags_I, @cflags_other);
130 6         289 push @mb, extra_linker_flags => _join(@ldflags_l);
131            
132 6 100       12 if(@ldflags)
133             {
134 4         7 push @mb, config => {
135             lddlflags => _join(@ldflags) . " $Config{lddlflags}",
136             ldflags => _join(@ldflags) . " $Config{ldflags}",
137             },
138             }
139            
140 6 50       14 if($export)
141             {
142 6         9 my $caller = caller;
143 2     2   17 no strict 'refs';
  2         3  
  2         265  
144 6         8 *{"${caller}::cc"} = \&cc;
  6         21  
145 6         9 *{"${caller}::ld"} = \&ld;
  6         2421  
146             }
147             }
148              
149             1;
150              
151             __END__