Commit | Line | Data |
---|---|---|
2d7ad1b1 SH |
1 | #!perl -w |
2 | use strict; | |
8e232993 | 3 | use FindExt; |
2d7ad1b1 | 4 | |
80252599 GS |
5 | # take a semicolon separated path list and turn it into a quoted |
6 | # list of paths that Text::Parsewords will grok | |
7 | sub mungepath { | |
8 | my $p = shift; | |
9 | # remove leading/trailing semis/spaces | |
10 | $p =~ s/^[ ;]+//; | |
11 | $p =~ s/[ ;]+$//; | |
12 | $p =~ s/'/"/g; | |
13 | my @p = map { $_ = "\"$_\"" if /\s/ and !/^".*"$/; $_ } split /;/, $p; | |
14 | return join(' ', @p); | |
15 | } | |
16 | ||
7a958ec3 BS |
17 | # generate an array of option strings from command-line args |
18 | # or an option file | |
19 | # -- added by BKS, 10-17-1999 to fix command-line overflow problems | |
20 | sub loadopts { | |
21 | if ($ARGV[0] =~ /--cfgsh-option-file/) { | |
22 | shift @ARGV; | |
23 | my $optfile = shift @ARGV; | |
2d7ad1b1 | 24 | local (*OPTF); |
7a958ec3 BS |
25 | open OPTF, $optfile or die "Can't open $optfile: $!\n"; |
26 | my @opts; | |
27 | chomp(my $line = <OPTF>); | |
28 | my @vars = split(/\t+~\t+/, $line); | |
29 | for (@vars) { | |
30 | push(@opts, $_) unless (/^\s*$/); | |
31 | } | |
32 | close OPTF; | |
33 | return \@opts; | |
34 | } | |
35 | else { | |
36 | return \@ARGV; | |
37 | } | |
38 | } | |
39 | ||
137443ea | 40 | my %opt; |
8e232993 | 41 | |
7a958ec3 BS |
42 | my $optref = loadopts(); |
43 | while (@{$optref} && $optref->[0] =~ /^([\w_]+)=(.*)$/) { | |
44 | $opt{$1}=$2; | |
45 | shift(@{$optref}); | |
46 | } | |
7bac28a0 | 47 | |
338584c0 | 48 | FindExt::scan_ext("../cpan"); |
d284e2f9 | 49 | FindExt::scan_ext("../dist"); |
ca58f2ae | 50 | FindExt::scan_ext("../ext"); |
6f062036 | 51 | FindExt::set_static_extensions(split ' ', $opt{static_ext}); |
1076f1fd | 52 | |
6f062036 SH |
53 | $opt{nonxs_ext} = join(' ',FindExt::nonxs_ext()) || ' '; |
54 | $opt{static_ext} = join(' ',FindExt::static_ext()) || ' '; | |
55 | $opt{dynamic_ext} = join(' ',FindExt::dynamic_ext()) || ' '; | |
56 | $opt{extensions} = join(' ',FindExt::extensions()) || ' '; | |
57 | $opt{known_extensions} = join(' ',FindExt::known_extensions()) || ' '; | |
8e232993 | 58 | |
52b0428e GS |
59 | my $pl_h = '../patchlevel.h'; |
60 | ||
52b0428e GS |
61 | if (-e $pl_h) { |
62 | open PL, "<$pl_h" or die "Can't open $pl_h: $!"; | |
63 | while (<PL>) { | |
64 | if (/^#\s*define\s+(PERL_\w+)\s+([\d.]+)/) { | |
65 | $opt{$1} = $2; | |
66 | } | |
67 | } | |
68 | close PL; | |
69 | } | |
e1f15930 | 70 | else { |
273cf8d1 | 71 | die "Can't find $pl_h: $!"; |
c90c0ff4 | 72 | } |
a9277f44 SH |
73 | |
74 | my $patch_file = '../.patch'; | |
75 | ||
76 | if (-e $patch_file) { | |
77 | open my $fh, "<", $patch_file or die "Can't open $patch_file: $!"; | |
78 | chomp($opt{PERL_PATCHLEVEL} = <$fh>); | |
79 | close $fh; | |
80 | } | |
81 | ||
6f062036 SH |
82 | $opt{version} = "$opt{PERL_REVISION}.$opt{PERL_VERSION}.$opt{PERL_SUBVERSION}"; |
83 | $opt{version_patchlevel_string} = "version $opt{PERL_VERSION} subversion $opt{PERL_SUBVERSION}"; | |
84 | $opt{version_patchlevel_string} .= " patch $opt{PERL_PATCHLEVEL}" if exists $opt{PERL_PATCHLEVEL}; | |
52b0428e | 85 | |
d51fa99c SH |
86 | my $ver = `ver 2>nul`; |
87 | if ($ver =~ /Version (\d+\.\d+)/) { | |
6f062036 | 88 | $opt{osvers} = $1; |
d51fa99c SH |
89 | } |
90 | else { | |
6f062036 | 91 | $opt{osvers} = '4.0'; |
d51fa99c | 92 | } |
dbd14d13 | 93 | |
2018b347 | 94 | if (exists $opt{cc}) { |
378eeda7 | 95 | # cl version detection borrowed from Test::Smoke's configsmoke.pl |
a48cc4c4 | 96 | if ($opt{cc} =~ /\b(?:cl|icl)/) { #MSVC can come as clarm.exe, icl=Intel C |
58ff4bd0 | 97 | my $output = `$opt{cc} --version 2>&1`; |
2018b347 SH |
98 | $opt{ccversion} = $output =~ /^.*Version\s+([\d.]+)/ ? $1 : '?'; |
99 | } | |
e08b586c S |
100 | elsif ($opt{cc} =~ /\bgcc\b/) { |
101 | chomp($opt{gccversion} = `$opt{cc} -dumpversion`); | |
2018b347 SH |
102 | } |
103 | } | |
104 | ||
6f062036 | 105 | $opt{cf_by} = $ENV{USERNAME} unless $opt{cf_by}; |
19253ae6 DD |
106 | if (!$opt{cf_email}) { |
107 | my $computername = eval{(gethostbyname('localhost'))[0]}; | |
108 | # gethostbyname might not be implemented in miniperl | |
109 | $computername = $ENV{COMPUTERNAME} if $@; | |
110 | $opt{cf_email} = $opt{cf_by} . '@' . $computername; | |
111 | } | |
6f062036 | 112 | $opt{usemymalloc} = 'y' if $opt{d_mymalloc} eq 'define'; |
d484a829 | 113 | |
80252599 GS |
114 | $opt{libpth} = mungepath($opt{libpth}) if exists $opt{libpth}; |
115 | $opt{incpath} = mungepath($opt{incpath}) if exists $opt{incpath}; | |
116 | ||
1f64ae15 | 117 | my($int64, $int64f); |
a48cc4c4 | 118 | if ($opt{cc} =~ /\b(?:cl|icl)/) { |
1f64ae15 SH |
119 | $int64 = '__int64'; |
120 | $int64f = 'I64'; | |
121 | } | |
122 | elsif ($opt{cc} =~ /\bgcc\b/) { | |
123 | $int64 = 'long long'; | |
124 | $int64f = 'll'; | |
125 | } | |
126 | ||
127 | # set large files options | |
378eeda7 | 128 | if ($opt{uselargefiles} eq 'define') { |
f7e8b52a | 129 | $opt{lseeksize} = 8; |
1f64ae15 SH |
130 | $opt{lseektype} = $int64; |
131 | } | |
132 | else { | |
133 | $opt{lseeksize} = 4; | |
134 | $opt{lseektype} = 'long'; | |
135 | } | |
136 | ||
137 | # set 64-bit options | |
138 | if ($opt{WIN64} eq 'define') { | |
139 | $opt{d_atoll} = 'define'; | |
140 | $opt{d_strtoll} = 'define'; | |
141 | $opt{d_strtoull} = 'define'; | |
142 | $opt{ptrsize} = 8; | |
143 | $opt{sizesize} = 8; | |
144 | $opt{ssizetype} = $int64; | |
145 | $opt{st_ino_size} = 8; | |
146 | } | |
147 | else { | |
148 | $opt{d_atoll} = 'undef'; | |
149 | $opt{d_strtoll} = 'undef'; | |
150 | $opt{d_strtoull} = 'undef'; | |
151 | $opt{ptrsize} = 4; | |
152 | $opt{sizesize} = 4; | |
153 | $opt{ssizetype} = 'int'; | |
154 | $opt{st_ino_size} = 4; | |
155 | } | |
156 | if ($opt{use64bitint} eq 'define') { | |
157 | $opt{d_nv_preserves_uv} = 'undef'; | |
158 | $opt{ivdformat} = qq{"${int64f}d"}; | |
159 | $opt{ivsize} = 8; | |
160 | $opt{ivtype} = $int64; | |
161 | $opt{nv_preserves_uv_bits} = 53; | |
162 | $opt{sPRIXU64} = qq{"${int64f}X"}; | |
163 | $opt{sPRId64} = qq{"${int64f}d"}; | |
164 | $opt{sPRIi64} = qq{"${int64f}i"}; | |
165 | $opt{sPRIo64} = qq{"${int64f}o"}; | |
166 | $opt{sPRIu64} = qq{"${int64f}u"}; | |
167 | $opt{sPRIx64} = qq{"${int64f}x"}; | |
168 | $opt{uvXUformat} = qq{"${int64f}X"}; | |
169 | $opt{uvoformat} = qq{"${int64f}o"}; | |
170 | $opt{uvsize} = 8; | |
171 | $opt{uvtype} = qq{unsigned $int64}; | |
172 | $opt{uvuformat} = qq{"${int64f}u"}; | |
173 | $opt{uvxformat} = qq{"${int64f}x"}; | |
174 | } | |
175 | else { | |
176 | $opt{d_nv_preserves_uv} = 'define'; | |
177 | $opt{ivdformat} = '"ld"'; | |
178 | $opt{ivsize} = 4; | |
179 | $opt{ivtype} = 'long'; | |
180 | $opt{nv_preserves_uv_bits} = 32; | |
181 | $opt{sPRIXU64} = '"lX"'; | |
182 | $opt{sPRId64} = '"ld"'; | |
183 | $opt{sPRIi64} = '"li"'; | |
184 | $opt{sPRIo64} = '"lo"'; | |
185 | $opt{sPRIu64} = '"lu"'; | |
186 | $opt{sPRIx64} = '"lx"'; | |
187 | $opt{uvXUformat} = '"lX"'; | |
188 | $opt{uvoformat} = '"lo"'; | |
189 | $opt{uvsize} = 4; | |
190 | $opt{uvtype} = 'unsigned long'; | |
191 | $opt{uvuformat} = '"lu"'; | |
192 | $opt{uvxformat} = '"lx"'; | |
4a9d6100 GS |
193 | } |
194 | ||
049aaf37 | 195 | # change the s{GM|LOCAL}TIME_{min|max} for VS2005 (aka VC 8) and |
4b7e285e JD |
196 | # VS2008 (aka VC 9) or higher (presuming that later versions will have |
197 | # at least the range of that). | |
58ff4bd0 | 198 | if ($opt{cc} =~ /\bcl/ and $opt{ccversion} =~ /^(\d+)/) { |
4b7e285e | 199 | my $ccversion = $1; |
92e71c91 | 200 | if ($ccversion >= 14) { |
4b7e285e | 201 | $opt{sGMTIME_max} = 32535291599; |
049aaf37 | 202 | $opt{sLOCALTIME_max} = 32535244799; |
4b7e285e | 203 | } |
a9e3f359 DD |
204 | if($ccversion < 13) { #VC6 |
205 | $opt{ar} ='lib'; | |
206 | } | |
4b7e285e | 207 | } |
a48cc4c4 DD |
208 | #find out which MSVC this ICC is using |
209 | elsif ($opt{cc} =~ /\bicl/) { | |
210 | my $output = `cl --version 2>&1`; | |
211 | my $num_ver = $output =~ /^.*Version\s+([\d.]+)/ ? $1 : '?'; | |
212 | if($num_ver =~ /^(\d+)/ && $1 >= 14) { | |
213 | $opt{sGMTIME_max} = 32535291599; | |
214 | $opt{sLOCALTIME_max} = 32535244799; | |
215 | } | |
216 | $opt{ar} ='xilib'; | |
217 | } | |
4b7e285e | 218 | |
1fd1213a | 219 | if ($opt{useithreads} eq 'define' && $opt{ccflags} =~ /-DPERL_IMPLICIT_SYS\b/) { |
27bdbd07 SH |
220 | $opt{d_pseudofork} = 'define'; |
221 | } | |
222 | ||
a9e3f359 DD |
223 | #if the fields above are defined, they override the defaults in the premade |
224 | #config file | |
7a958ec3 | 225 | while (<>) { |
2d7ad1b1 | 226 | s/~([\w_]+)~/exists $opt{$1} ? $opt{$1} : ''/eg; |
7a958ec3 BS |
227 | if (/^([\w_]+)=(.*)$/) { |
228 | my($k,$v) = ($1,$2); | |
229 | # this depends on cf_time being empty in the template (or we'll | |
230 | # get a loop) | |
231 | if ($k eq 'cf_time') { | |
232 | $_ = "$k='" . localtime(time) . "'\n" if $v =~ /^\s*'\s*'/; | |
233 | } | |
234 | elsif (exists $opt{$k}) { | |
235 | $_ = "$k='$opt{$k}'\n"; | |
236 | } | |
dc050285 | 237 | } |
7a958ec3 BS |
238 | print; |
239 | } |