-
Notifications
You must be signed in to change notification settings - Fork 6
/
Makefile.PL
218 lines (187 loc) · 6.93 KB
/
Makefile.PL
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
use ExtUtils::MakeMaker;
use Config;
use strict;
# use 5.006000;
# We're using bareword file handles and two arg open for backward
# compatibility in Makefile.PL. Here we disable those tests in Perl::Critic.
## no critic (bareword file handle)
## no critic (two-argument open)
my $CPP_Config_path = 'lib/Inline/CPP/Config.pm';
my %PREREQ_PM = (
'Inline' => '0.50',
'Inline::C' => '0.50',
'Parse::RecDescent' => '0',
'Carp' => '0',
);
#============================================================================
# Makefile.PL will later create this as ilcpptest.cpp to verify that
# the target system uses <iostream> versus <iostream.h> style headers.
#============================================================================
my $test_cpp_filename = 'ilcpptest'; # '.cpp' appended via open.
my $test_cpp = <<'END_TEST_CPP';
#include <iostream>
int main(){
return 0;
}
END_TEST_CPP
#============================================================================
# We'll do our own prerequisite checking, since MakeMaker does it
# in a way that always fails: 'use Inline::C 0.33' will never work.
#============================================================================
for ( sort keys %PREREQ_PM ) {
## no critic (eval)
eval "require $_";
# We eval version numbers to normalize _xxx dev numbering.
my $have = eval 'no strict q/refs/; ${"${_}::VERSION"}';
use strict q/refs/;
my $want = eval $PREREQ_PM{$_};
warn "Warning: prerequisite $_ version $PREREQ_PM{$_} not found."
if $@
or $have < $want;
}
#============================================================================
# Make an intelligent guess about what compiler to use
#============================================================================
my $cc_guess;
my $libs_guess;
if ( $Config{osname} eq 'darwin' ) {
my $stdlib_query
= 'find /usr/lib/gcc -name "libstdc++*" | grep $( uname -p )';
my $stdcpp = `$stdlib_query`;
+$stdcpp =~ s/^(.*)\/[^\/]+$/$1/;
$cc_guess = 'g++';
$libs_guess = "-L$stdcpp -lstdc++";
}
elsif ( $Config{osname} ne 'darwin'
and $Config{gccversion}
and $Config{cc} =~ m#\bgcc\b[^/]*$# )
{
( $cc_guess = $Config{cc} ) =~ s[\bgcc\b([^/]*)$(?:)][g\+\+$1];
$libs_guess = '-lstdc++';
}
elsif ( $Config{osname} =~ m/^MSWin/ ) {
$cc_guess = 'cl -TP -EHsc';
$libs_guess = 'MSVCIRT.LIB';
}
elsif ( $Config{osname} eq 'linux' ) {
$cc_guess = 'g++';
$libs_guess = '-lstdc++';
}
# Dragonfly patch is just a hunch... (still doesn't work)
elsif ( $Config{osname} eq 'netbsd' || $Config{osname} eq 'dragonfly' ) {
$cc_guess = 'g++';
$libs_guess = '-lstdc++ -lgcc_s';
}
elsif ( $Config{osname} eq 'cygwin' ) {
$cc_guess = 'g++';
$libs_guess = '-lstdc++';
}
elsif ( $Config{osname} eq 'solaris' or $Config{osname} eq 'SunOS' ) {
if ( $Config{cc} eq 'gcc'
|| ( exists( $Config{gccversion} ) && $Config{gccversion} > 0 ) )
{
$cc_guess = 'g++';
$libs_guess = '-lstdc++';
}
else {
$cc_guess = 'CC';
$libs_guess = '-lCrun';
}
}
# MirBSD: Still problematic.
elsif ( $Config{osname} eq 'mirbsd' ) {
my $stdlib_query
= 'find /usr/lib/gcc -name "libstdc++*" | grep $( uname -p ) | head -1';
my $stdcpp = `$stdlib_query`;
+$stdcpp =~ s/^(.*)\/[^\/]+$/$1/;
$cc_guess = 'g++';
$libs_guess = "-L$stdcpp -lstdc++ -lc -lgcc_s";
}
# Sane defaults for other (probably unix-like) operating systems
else {
$cc_guess = 'g++';
$libs_guess = '-lstdc++';
}
print "This will configure and build Inline::C++.\n";
my $cpp_compiler
= prompt( "What default C++ compiler would you like to use?", $cc_guess );
my $libs = prompt( "What default libraries would you like to include?",
$libs_guess );
#============================================================================
# Test whether the compiler prefers <iostream> or <iostream.h>.
#============================================================================
open TESTCPP, ">$test_cpp_filename.cpp"
or die "Makefile.PL: Couldn't open $test_cpp_filename for output:\n$!\n";
print TESTCPP $test_cpp;
close TESTCPP
or die "Makefile.PL: Couldn't close $test_cpp_filename:\n$!\n";
# Compile our test C++ program that includes the <iostream> header.
my $result;
if ( $cpp_compiler =~ m/^cl/ ) {
# MS compilers don't support -o (or -o is deprecated for them).
$result = system( qq{$cpp_compiler -Fe:$test_cpp_filename.exe }
. qq{$test_cpp_filename.cpp} );
}
else {
$result = system( qq{$cpp_compiler -o $test_cpp_filename.exe }
. qq{$test_cpp_filename.cpp} );
}
my $iostream_fname = 'iostream';
my $comment = '';
if ( $result != 0 ) {
# Compiling with <iostream> failed, so we'll assume .h headers.
print "Detected <iostream.h> style headers. ('.h' needed.)\n";
$iostream_fname = 'iostream.h';
$comment = '//'; # Prepend a comment to a #define.
}
else {
# Compiling with <iostream> passed, so we'll assume Standard headers.
print "Detected <iostream> style headers. ('.h' not needed.)\n";
unlink "$test_cpp_filename.exe" or warn $!; # Unlink the executable.
}
unlink "$test_cpp_filename.cpp" or warn $!; # Unlink the test source.
# Apply the defaults:
open CPP_Config, $CPP_Config_path
or die "Can't read from $CPP_Config_path for configuration!\n$!";
my @lines = <CPP_Config>;
close CPP_Config;
for (@lines) {
s{ ( our \s* \$compiler \s* = \s* ['"] ) [^'"]+ } {$1$cpp_compiler}x;
s{ ( our \s* \$libs \s* = \s* ['"] ) [^'"]+ } {$1$libs}x;
s{ ( our \s* \$iostream_fn \s* = \s* ['"] ) [^'"]+ } {$1$iostream_fname}x;
s{ ^ [^#]* ( \#define \s+ __INLINE_CPP_NAMESPACE_STD ) } {$comment$1}x;
s{ ^ [^#]* ( \#define \s+ __INLINE_CPP_STANDARD_HEADERS ) } {$comment$1}x;
}
open CPP_Config, ">$CPP_Config_path"
or die "Can't write to $CPP_Config_path for configuration!\n$!";
print CPP_Config @lines
or die "Can't write to $CPP_Config_path for configuration!\n$!";
close CPP_Config
or die "Can't close $CPP_Config_path after config output!\n$!";
WriteMakefile(
NAME => 'Inline::CPP',
AUTHOR => 'David Oswald <davido@cpan.org>',
VERSION_FROM => 'CPP.pm',
ABSTRACT_FROM => 'lib/Inline/CPP.pod',
LICENSE => 'artistic',
PREREQ_PM => \%PREREQ_PM,
BUILD_REQUIRES => {
'Test::More' => '0.98', # Core. Minimum version.
'Config' => '0', # Core.
'English' => '0', # Core.
},
CONFIGURE_REQUIRES => {
'ExtUtils::MakeMaker' => '6.56', # Minimum version.
'Config' => '0', # Core.
},
META_MERGE => {
provides => {
'Inline::CPP' => {
file => 'CPP.pm',
version => '0.40_001'
},
},
},
MIN_PERL_VERSION => '5.006001',
clean => { FILES => '_Inline/ grammar/_Inline' },
);