1 | # This is a perl script, invoked from a shell |
---|
2 | |
---|
3 | # use warnings; # this doesn't work on older versions of perl |
---|
4 | |
---|
5 | |
---|
6 | %MakeFlag = ( |
---|
7 | |
---|
8 | 'WIZARD' => 'on', |
---|
9 | 'SHARED' => 'off', |
---|
10 | |
---|
11 | ); |
---|
12 | |
---|
13 | %MakeVal = ( |
---|
14 | |
---|
15 | 'CC' => 'gcc', |
---|
16 | 'CXX' => 'g++', |
---|
17 | 'CFLAGS' => '-O2', |
---|
18 | 'CXXFLAGS' => '$(CFLAGS)', |
---|
19 | 'AR' => 'ar', |
---|
20 | 'ARFLAGS' => 'ruv', |
---|
21 | 'RANLIB' => 'ranlib', |
---|
22 | 'LIBTOOL' => 'libtool', |
---|
23 | |
---|
24 | 'LDFLAGS' => '', |
---|
25 | 'LDFLAGS_CXX' => '$(LDFLAGS)', |
---|
26 | 'LDLIBS' => '-lm', |
---|
27 | 'LDLIBS_CXX' => '$(LDLIBS)', |
---|
28 | 'CPPFLAGS' => '', |
---|
29 | |
---|
30 | 'DEF_PREFIX' => '/usr/local', |
---|
31 | |
---|
32 | 'PREFIX' => '$(DEF_PREFIX)', |
---|
33 | 'LIBDIR' => '$(PREFIX)/lib', |
---|
34 | 'INCLUDEDIR' => '$(PREFIX)/include', |
---|
35 | 'DOCDIR' => '$(PREFIX)/share/doc', |
---|
36 | |
---|
37 | 'GMP_PREFIX' => '$(DEF_PREFIX)', |
---|
38 | 'GMP_INCDIR' => '$(GMP_PREFIX)/include', |
---|
39 | 'GMP_LIBDIR' => '$(GMP_PREFIX)/lib', |
---|
40 | |
---|
41 | 'GF2X_PREFIX' => '$(DEF_PREFIX)', |
---|
42 | 'GF2X_INCDIR' => '$(GF2X_PREFIX)/include', |
---|
43 | 'GF2X_LIBDIR' => '$(GF2X_PREFIX)/lib', |
---|
44 | |
---|
45 | ); |
---|
46 | |
---|
47 | |
---|
48 | |
---|
49 | |
---|
50 | %ConfigFlag = ( |
---|
51 | |
---|
52 | 'NTL_STD_CXX' => 'on', |
---|
53 | 'NTL_PSTD_NNS' => 'off', |
---|
54 | 'NTL_PSTD_NHF' => 'off', |
---|
55 | 'NTL_PSTD_NTN' => 'off', |
---|
56 | 'NTL_GMP_LIP' => 'off', |
---|
57 | 'NTL_GMP_HACK' => 'off', |
---|
58 | 'NTL_GF2X_LIB' => 'off', |
---|
59 | 'NTL_CXX_ONLY' => 'off', |
---|
60 | 'NTL_X86_FIX' => 'off', |
---|
61 | 'NTL_NO_X86_FIX' => 'off', |
---|
62 | 'NTL_AVOID_FLOAT' => 'off', |
---|
63 | 'NTL_LONG_LONG' => 'off', |
---|
64 | 'NTL_SPMM_ULL' => 'off', |
---|
65 | 'NTL_SPMM_UL' => 'off', |
---|
66 | 'NTL_SPMM_ASM' => 'off', |
---|
67 | 'NTL_AVOID_BRANCHING' => 'off', |
---|
68 | 'NTL_TBL_REM' => 'off', |
---|
69 | 'NTL_GF2X_NOINLINE' => 'off', |
---|
70 | 'NTL_GF2X_ALTCODE' => 'off', |
---|
71 | 'NTL_GF2X_ALTCODE1' => 'off', |
---|
72 | 'NTL_NO_INIT_TRANS' => 'off', |
---|
73 | 'NTL_CLEAN_INT' => 'off', |
---|
74 | 'NTL_CLEAN_PTR' => 'off', |
---|
75 | 'NTL_RANGE_CHECK' => 'off', |
---|
76 | |
---|
77 | ); |
---|
78 | |
---|
79 | |
---|
80 | %ConfigVal = ( |
---|
81 | |
---|
82 | 'NTL_LONG_LONG_TYPE' => undef, |
---|
83 | 'NTL_UNSIGNED_LONG_LONG_TYPE' => undef, |
---|
84 | |
---|
85 | ); |
---|
86 | |
---|
87 | |
---|
88 | foreach $arg (@ARGV) { |
---|
89 | |
---|
90 | if ($arg =~ '-h|help|-help|--help') { |
---|
91 | system("more ../doc/config.txt"); |
---|
92 | exit; |
---|
93 | } |
---|
94 | |
---|
95 | if (($name, $val) = ($arg =~ /(.*?)=(.*)/)) { |
---|
96 | |
---|
97 | if (exists($MakeFlag{$name}) && ($val =~ 'on|off')) { |
---|
98 | $MakeFlag{$name} = $val; |
---|
99 | next; |
---|
100 | } |
---|
101 | elsif (exists($MakeVal{$name})) { |
---|
102 | $MakeVal{$name} = $val; |
---|
103 | next; |
---|
104 | } |
---|
105 | elsif (exists($ConfigFlag{$name}) && ($val =~ 'on|off')) { |
---|
106 | $ConfigFlag{$name} = $val; |
---|
107 | next; |
---|
108 | } |
---|
109 | elsif (exists($ConfigVal{$name})) { |
---|
110 | $ConfigVal{$name} = $val; |
---|
111 | next; |
---|
112 | } |
---|
113 | } |
---|
114 | |
---|
115 | die "Error: unrecognized option: $arg\ntype \"./configure -h\" for help\n"; |
---|
116 | |
---|
117 | } |
---|
118 | |
---|
119 | # some special MakeVal values that are determined by SHARED |
---|
120 | |
---|
121 | if ($MakeFlag{'SHARED'} eq 'off') { |
---|
122 | |
---|
123 | $MakeVal{'LSTAT'} = ''; |
---|
124 | $MakeVal{'LSHAR'} = '# '; |
---|
125 | |
---|
126 | } else { |
---|
127 | |
---|
128 | # sanity check for libtool |
---|
129 | |
---|
130 | print("***** checking for libtool *****\n"); |
---|
131 | if (system("$MakeVal{'LIBTOOL'} --version")) { |
---|
132 | die "Error: bad libtool ($MakeVal{'LIBTOOL'}) -- try glibtool?"; |
---|
133 | } |
---|
134 | print("***** libtool OK *****\n\n"); |
---|
135 | |
---|
136 | $MakeVal{'LSTAT'} = '# '; |
---|
137 | $MakeVal{'LSHAR'} = ''; |
---|
138 | |
---|
139 | } |
---|
140 | |
---|
141 | # a special MakeVal value that is determined by NTL_GMP_LIP |
---|
142 | # and NTL_GMP_HACK |
---|
143 | |
---|
144 | |
---|
145 | if ($ConfigFlag{'NTL_GMP_LIP'} eq 'on' || $ConfigFlag{'NTL_GMP_HACK'} eq 'on') { |
---|
146 | $MakeVal{'GMP'} = ''; |
---|
147 | } |
---|
148 | else { |
---|
149 | $MakeVal{'GMP'} = '# '; |
---|
150 | } |
---|
151 | |
---|
152 | # a special MakeVal value that is determined by NTL_GF2X_LIB |
---|
153 | |
---|
154 | |
---|
155 | if ($ConfigFlag{'NTL_GF2X_LIB'} eq 'on') { |
---|
156 | $MakeVal{'GF2X'} = ''; |
---|
157 | } |
---|
158 | else { |
---|
159 | $MakeVal{'GF2X'} = '# '; |
---|
160 | } |
---|
161 | |
---|
162 | |
---|
163 | # copy %MakeVal and %MakeFlag as is into %MakeSub |
---|
164 | |
---|
165 | %MakeSub = (%MakeVal, %MakeFlag); |
---|
166 | |
---|
167 | |
---|
168 | # copy %ConfigFlag into %ConfigSub, substituting 0 for off and 1 of on |
---|
169 | |
---|
170 | |
---|
171 | %ConfigSub = ( ); |
---|
172 | |
---|
173 | foreach $name (keys %ConfigFlag) { |
---|
174 | |
---|
175 | if ($ConfigFlag{$name} eq 'on') { |
---|
176 | $ConfigSub{$name} = 1; |
---|
177 | } |
---|
178 | else { |
---|
179 | $ConfigSub{$name} = 0; |
---|
180 | } |
---|
181 | |
---|
182 | } |
---|
183 | |
---|
184 | # special logic for NTL_LONG_LONG_TYPE |
---|
185 | |
---|
186 | if (defined($ConfigVal{'NTL_LONG_LONG_TYPE'})) { |
---|
187 | |
---|
188 | $ConfigSub{'NTL_LONG_LONG_TYPE'} = $ConfigVal{'NTL_LONG_LONG_TYPE'}; |
---|
189 | $ConfigSub{'FLAG_LONG_LONG_TYPE'} = 1; |
---|
190 | |
---|
191 | } |
---|
192 | else { |
---|
193 | |
---|
194 | $ConfigSub{'NTL_LONG_LONG_TYPE'} = 'long long'; |
---|
195 | $ConfigSub{'FLAG_LONG_LONG_TYPE'} = 0; |
---|
196 | |
---|
197 | } |
---|
198 | |
---|
199 | |
---|
200 | # special logic for NTL_UNSIGNED_LONG_LONG_TYPE |
---|
201 | |
---|
202 | if (defined($ConfigVal{'NTL_UNSIGNED_LONG_LONG_TYPE'})) { |
---|
203 | |
---|
204 | $ConfigSub{'NTL_UNSIGNED_LONG_LONG_TYPE'} = $ConfigVal{'NTL_UNSIGNED_LONG_LONG_TYPE'}; |
---|
205 | $ConfigSub{'FLAG_UNSIGNED_LONG_LONG_TYPE'} = 1; |
---|
206 | |
---|
207 | } |
---|
208 | else { |
---|
209 | |
---|
210 | $ConfigSub{'NTL_UNSIGNED_LONG_LONG_TYPE'} = 'unsigned long long'; |
---|
211 | $ConfigSub{'FLAG_UNSIGNED_LONG_LONG_TYPE'} = 0; |
---|
212 | |
---|
213 | } |
---|
214 | |
---|
215 | # special logic for WIZARD_HACK |
---|
216 | |
---|
217 | $ConfigSub{'WIZARD_HACK'} = ''; |
---|
218 | |
---|
219 | |
---|
220 | # some extra logic consistency checks |
---|
221 | |
---|
222 | if ($ConfigSub{'NTL_X86_FIX'} + $ConfigSub{'NTL_NO_X86_FIX'} > 1) { |
---|
223 | |
---|
224 | die "Error: at most one of NTL_X86_FIX and NTL_NO_X86_FIX may be on\n"; |
---|
225 | |
---|
226 | } |
---|
227 | |
---|
228 | if ($ConfigSub{'NTL_GMP_HACK'} + $ConfigSub{'NTL_GMP_LIP'} > 1) { |
---|
229 | |
---|
230 | die "Error: at most one of NTL_GMP_HACK and NTL_GMP_LIP may be on\n"; |
---|
231 | |
---|
232 | } |
---|
233 | |
---|
234 | if ($ConfigSub{'NTL_AVOID_FLOAT'} + $ConfigSub{'NTL_LONG_LONG'} > 1) { |
---|
235 | |
---|
236 | die "Error: at most one of NTL_AVOID_FLOAT and NTL_LONG_LONG may be on\n"; |
---|
237 | |
---|
238 | } |
---|
239 | |
---|
240 | |
---|
241 | if ($ConfigSub{'NTL_SPMM_UL'} + $ConfigSub{'NTL_SPMM_ULL'} + |
---|
242 | $ConfigSub{'NTL_SPMM_ASM'} > 1) { |
---|
243 | |
---|
244 | die "Error: at most one of NTL_SPMM_UL, NTL_SPMM_ULL and NTL_SPMM_ASM may be on\n"; |
---|
245 | |
---|
246 | } |
---|
247 | |
---|
248 | |
---|
249 | if ($ConfigSub{'NTL_GF2X_ALTCODE'} + $ConfigSub{'NTL_GF2X_ALTCODE1'} > 1) { |
---|
250 | |
---|
251 | die "Error: at most one of NTL_GF2X_ALTCODE and NTL_GF2X_ALTCODE1 may be on\n"; |
---|
252 | |
---|
253 | } |
---|
254 | |
---|
255 | |
---|
256 | |
---|
257 | ###################################### |
---|
258 | |
---|
259 | # all tests pass -- generate files |
---|
260 | |
---|
261 | ###################################### |
---|
262 | |
---|
263 | # generate makefile |
---|
264 | |
---|
265 | open(MFILE, "< mfile"); |
---|
266 | open(MFILEOUT, "> mfileout"); |
---|
267 | |
---|
268 | while ($line = <MFILE>) { |
---|
269 | |
---|
270 | $line =~ s/@\{(.*?)\}/$MakeSub{$1}/ge; |
---|
271 | |
---|
272 | print MFILEOUT $line; |
---|
273 | |
---|
274 | } |
---|
275 | |
---|
276 | close(MFILE); |
---|
277 | close(MFILEOUT); |
---|
278 | |
---|
279 | |
---|
280 | # generate config.h |
---|
281 | |
---|
282 | open(CFILE, "< cfile"); |
---|
283 | open(CFILEOUT, "> cfileout"); |
---|
284 | |
---|
285 | while ($line = <CFILE>) { |
---|
286 | |
---|
287 | $line =~ s/@\{(.*?)\}/$ConfigSub{$1}/ge; |
---|
288 | |
---|
289 | print CFILEOUT $line; |
---|
290 | |
---|
291 | } |
---|
292 | |
---|
293 | close(CFILE); |
---|
294 | close(CFILEOUT); |
---|
295 | |
---|
296 | print("writing makefile\n"); |
---|
297 | system("cp mfileout makefile"); |
---|
298 | |
---|
299 | print("writing ../include/NTL/config.h\n"); |
---|
300 | system("cp cfileout ../include/NTL/config.h"); |
---|
301 | |
---|