1 | =head1 NAME
|
---|
2 |
|
---|
3 | README.hints
|
---|
4 |
|
---|
5 | =head1 DESCRIPTION
|
---|
6 |
|
---|
7 | These files are used by Configure to set things which Configure either
|
---|
8 | can't or doesn't guess properly. Most of these hint files have been
|
---|
9 | tested with at least some version of perl5, but some are still left
|
---|
10 | over from perl4.
|
---|
11 |
|
---|
12 | Please send any problems or suggested changes to perlbug@perl.org.
|
---|
13 |
|
---|
14 | =head1 Hint file naming convention.
|
---|
15 |
|
---|
16 | Each hint file name should have only
|
---|
17 | one '.'. (This is for portability to non-unix file systems.) Names
|
---|
18 | should also fit in <= 14 characters, for portability to older SVR3
|
---|
19 | systems. File names are of the form $osname_$osvers.sh, with all '.'
|
---|
20 | changed to '_', and all characters (such as '/') that don't belong in
|
---|
21 | Unix filenames omitted.
|
---|
22 |
|
---|
23 | For example, consider Sun OS 4.1.3. Configure determines $osname=sunos
|
---|
24 | (all names are converted to lower case) and $osvers=4.1.3. Configure
|
---|
25 | will search for an appropriate hint file in the following order:
|
---|
26 |
|
---|
27 | sunos_4_1_3.sh
|
---|
28 | sunos_4_1.sh
|
---|
29 | sunos_4.sh
|
---|
30 | sunos.sh
|
---|
31 |
|
---|
32 | If you need to create a hint file, please try to use as general a name
|
---|
33 | as possible and include minor version differences inside case or test
|
---|
34 | statements. For example, for IRIX 6.X, we have the following hints
|
---|
35 | files:
|
---|
36 |
|
---|
37 | irix_6_0.sh
|
---|
38 | irix_6_1.sh
|
---|
39 | irix_6.sh
|
---|
40 |
|
---|
41 | That is, 6.0 and 6.1 have their own special hints, but 6.2, 6.3, and
|
---|
42 | up are all handled by the same irix_6.sh. That way, we don't have to
|
---|
43 | make a new hint file every time the IRIX O/S is upgraded.
|
---|
44 |
|
---|
45 | If you need to test for specific minor version differences in your
|
---|
46 | hints file, be sure to include a default choice. (See aix.sh for one
|
---|
47 | example.) That way, if you write a hint file for foonix 3.2, it might
|
---|
48 | still work without any changes when foonix 3.3 is released.
|
---|
49 |
|
---|
50 | Please also comment carefully on why the different hints are needed.
|
---|
51 | That way, a future version of Configure may be able to automatically
|
---|
52 | detect what is needed.
|
---|
53 |
|
---|
54 | A glossary of config.sh variables is in the file Porting/Glossary.
|
---|
55 |
|
---|
56 | =head1 Setting variables
|
---|
57 |
|
---|
58 | =head2 Optimizer
|
---|
59 |
|
---|
60 | If you want to set a variable, try to allow for Configure command-line
|
---|
61 | overrides. For example, suppose you think the default optimizer
|
---|
62 | setting to be -O2 for a particular platform. You should allow for
|
---|
63 | command line overrides with something like
|
---|
64 |
|
---|
65 | case "$optimize" in
|
---|
66 | '') optimize='-O2' ;;
|
---|
67 | esac
|
---|
68 |
|
---|
69 | or, if your system has a decent test(1) command,
|
---|
70 |
|
---|
71 | test -z "$optimize" && optimize='-O2'
|
---|
72 |
|
---|
73 | This allows the user to select a different optimization level, e.g.
|
---|
74 | -O6 or -g.
|
---|
75 |
|
---|
76 | =head2 Compiler and Linker flags
|
---|
77 |
|
---|
78 | If you want to set $ccflags or $ldflags, you should append to the existing
|
---|
79 | value to allow Configure command-line settings, e.g. use
|
---|
80 |
|
---|
81 | ccflags="$ccflags -DANOTHER_OPTION_I_NEED"
|
---|
82 |
|
---|
83 | so that the user can do something like
|
---|
84 |
|
---|
85 | sh Configure -Dccflags='FIX_NEGATIVE_ZERO'
|
---|
86 |
|
---|
87 | and have the FIX_NEGATIVE_ZERO value preserved by the hints file.
|
---|
88 |
|
---|
89 | =head2 Libraries
|
---|
90 |
|
---|
91 | Configure will attempt to use the libraries listed in the variable
|
---|
92 | $libswanted. If necessary, you should remove broken libraries from
|
---|
93 | that list, or add additional libraries to that list. You should
|
---|
94 | *not* simply set $libs -- that ignores the possibilities of local
|
---|
95 | variations. For example, a setting of libs='-lgdbm -lm -lc' would
|
---|
96 | fail if another user were to try to compile Perl on a system without
|
---|
97 | GDBM but with Berkeley DB. See hints/dec_osf.sh and hints/solaris_2.sh
|
---|
98 | for examples.
|
---|
99 |
|
---|
100 | =head2 Other
|
---|
101 |
|
---|
102 | In general, try to avoid hard-wiring something that Configure will
|
---|
103 | figure out anyway. Also try to allow for Configure command-line
|
---|
104 | overrides.
|
---|
105 |
|
---|
106 | =head1 Working around compiler bugs
|
---|
107 |
|
---|
108 | Occasionally, the root cause of a bug in perl turns out to be due to a bug
|
---|
109 | in the compiler. Often, changing the compilation options (particularly the
|
---|
110 | optimization level) can work around the bug. However, if you try to do
|
---|
111 | this on the command line, you will be changing the compilation options for
|
---|
112 | every component of perl, which can really hurt perl's performance.
|
---|
113 | Instead, consider placing a test case into the hints directory to detect
|
---|
114 | whether the compiler bug is present, and add logic to the hints file to
|
---|
115 | take a specific and appropriate action
|
---|
116 |
|
---|
117 | =head2 Test-case conventions
|
---|
118 |
|
---|
119 | Test cases should be named "tNNN.c", where NNN is the next unused sequence
|
---|
120 | number. The test case must be executable and should display a message
|
---|
121 | containing the word "fails" when the compiler bug is present. It should
|
---|
122 | display the word "works" with the compiler bug is not present. The test
|
---|
123 | cases should be liberally commented and may be used by any hints file that
|
---|
124 | needs them. See the first hints file (t001.c) for an example.
|
---|
125 |
|
---|
126 | =head2 Hint file processing
|
---|
127 |
|
---|
128 | The hint file must define a call-back unit (see below) that will compile,
|
---|
129 | link, and run the test case, and then check for the presence of the string
|
---|
130 | "fails" in the output. If it finds this string, it sets a special variable
|
---|
131 | to specify the compilation option(s) for the specific perl source file that
|
---|
132 | is affected by the bug.
|
---|
133 |
|
---|
134 | The special variable is named "XXX_cflags" where "XXX" is the name of
|
---|
135 | the source file (without the ".c" suffix). The value of this variable
|
---|
136 | is the string "optimize=YYY", where "YYY" is the compilation option
|
---|
137 | necessary to work around the bug. The default value of this variable
|
---|
138 | is "-O" (letter O), which specifies that the C compiler should compile
|
---|
139 | the source program at the default optimization level. If you can
|
---|
140 | avoid the compiler bug by disabling optimization, just reset the
|
---|
141 | "optimize" variable to the null string. Sometimes a bug is present at
|
---|
142 | a higher optimization level (say, O3) and not present at a lower
|
---|
143 | optimization level (say, O1). In this case, you should specify the
|
---|
144 | highest optimization level at which the bug is not present, so that
|
---|
145 | you will retain as many of the benefits of code optimization as
|
---|
146 | possible.
|
---|
147 |
|
---|
148 | For example, if the pp_pack.c source file must be compiled at
|
---|
149 | optimization level 0 to work around a problem on a particular
|
---|
150 | platform, one of the statements
|
---|
151 |
|
---|
152 | pp_pack_cflags="optimize=-O0" or
|
---|
153 | pp_pack_cflags="optimize="
|
---|
154 |
|
---|
155 | will do the trick, since level 0 is equivalent to no optimization.
|
---|
156 | (In case your printer or display device does not distinguish the
|
---|
157 | letter O from the digit 0, that is the letter O followed by the digit
|
---|
158 | 0). You can specify any compiler option or set of options here, not
|
---|
159 | just optimizer options. These options are appended to the list of all
|
---|
160 | other compiler options, so you should be able to override almost any
|
---|
161 | compiler option prepared by Configure. (Obviously this depends on how
|
---|
162 | the compiler treats conflicting options, but most seem to go with the
|
---|
163 | last value specified on the command line).
|
---|
164 |
|
---|
165 | You should also allow for the XXX_cflags variable to be overridden on the
|
---|
166 | command line.
|
---|
167 |
|
---|
168 | See the vos.sh hints file for an extended example of these techniques.
|
---|
169 |
|
---|
170 | =head1 Hint file tricks
|
---|
171 |
|
---|
172 | =head2 Printing critical messages
|
---|
173 |
|
---|
174 | [This is still experimental]
|
---|
175 |
|
---|
176 | If you have a *REALLY* important message that the user ought to see at
|
---|
177 | the end of the Configure run, you can store it in the file
|
---|
178 | 'config.msg'. At the end of the Configure run, Configure will display
|
---|
179 | the contents of this file. Currently, the only place this is used is
|
---|
180 | in Configure itself to warn about the need to set LD_LIBRARY_PATH if
|
---|
181 | you are building a shared libperl.so.
|
---|
182 |
|
---|
183 | To use this feature, just do something like the following
|
---|
184 |
|
---|
185 | $cat <<EOM | $tee -a ../config.msg >&4
|
---|
186 |
|
---|
187 | This is a really important message. Be sure to read it
|
---|
188 | before you type 'make'.
|
---|
189 | EOM
|
---|
190 |
|
---|
191 | This message will appear on the screen as the hint file is being
|
---|
192 | processed and again at the end of Configure.
|
---|
193 |
|
---|
194 | Please use this sparingly.
|
---|
195 |
|
---|
196 | =head2 Propagating variables to config.sh
|
---|
197 |
|
---|
198 | Sometimes, you want an extra variable to appear in config.sh. For
|
---|
199 | example, if your system can't compile toke.c with the optimizer on,
|
---|
200 | you can put
|
---|
201 |
|
---|
202 | toke_cflags='optimize=""'
|
---|
203 |
|
---|
204 | at the beginning of a line in your hints file. Configure will then
|
---|
205 | extract that variable and place it in your config.sh file. Later,
|
---|
206 | while compiling toke.c, the cflags shell script will eval $toke_cflags
|
---|
207 | and hence compile toke.c without optimization.
|
---|
208 |
|
---|
209 | Note that for this to work, the variable you want to propagate must
|
---|
210 | appear in the first column of the hint file. It is extracted by
|
---|
211 | Configure with a simple sed script, so beware that surrounding case
|
---|
212 | statements aren't any help.
|
---|
213 |
|
---|
214 | By contrast, if you don't want Configure to propagate your temporary
|
---|
215 | variable, simply indent it by a leading tab in your hint file.
|
---|
216 |
|
---|
217 | For example, prior to 5.002, a bug in scope.c led to perl crashing
|
---|
218 | when compiled with -O in AIX 4.1.1. The following "obvious"
|
---|
219 | workaround in hints/aix.sh wouldn't work as expected:
|
---|
220 |
|
---|
221 | case "$osvers" in
|
---|
222 | 4.1.1)
|
---|
223 | scope_cflags='optimize=""'
|
---|
224 | ;;
|
---|
225 | esac
|
---|
226 |
|
---|
227 | because Configure doesn't parse the surrounding 'case' statement, it
|
---|
228 | just blindly propagates any variable that starts in the first column.
|
---|
229 | For this particular case, that's probably harmless anyway.
|
---|
230 |
|
---|
231 | Three possible fixes are:
|
---|
232 |
|
---|
233 | =over
|
---|
234 |
|
---|
235 | =item 1
|
---|
236 |
|
---|
237 | Create an aix_4_1_1.sh hint file that contains the scope_cflags
|
---|
238 | line and then sources the regular aix hints file for the rest of
|
---|
239 | the information.
|
---|
240 |
|
---|
241 | =item 2
|
---|
242 |
|
---|
243 | Do the following trick:
|
---|
244 |
|
---|
245 | scope_cflags='case "$osvers" in 4.1*) optimize=" ";; esac'
|
---|
246 |
|
---|
247 | Now when $scope_cflags is eval'd by the cflags shell script, the
|
---|
248 | case statement is executed. Of course writing scripts to be eval'd is
|
---|
249 | tricky, especially if there is complex quoting. Or,
|
---|
250 |
|
---|
251 | =item 3
|
---|
252 |
|
---|
253 | Write directly to Configure's temporary file UU/config.sh.
|
---|
254 | You can do this with
|
---|
255 |
|
---|
256 | case "$osvers" in
|
---|
257 | 4.1.1)
|
---|
258 | echo "scope_cflags='optimize=\"\"'" >> UU/config.sh
|
---|
259 | scope_cflags='optimize=""'
|
---|
260 | ;;
|
---|
261 | esac
|
---|
262 |
|
---|
263 | Note you have to both write the definition to the temporary
|
---|
264 | UU/config.sh file and set the variable to the appropriate value.
|
---|
265 |
|
---|
266 | This is sneaky, but it works. Still, if you need anything this
|
---|
267 | complex, perhaps you should create the separate hint file for
|
---|
268 | aix 4.1.1.
|
---|
269 |
|
---|
270 | =back
|
---|
271 |
|
---|
272 | =head2 Call-backs
|
---|
273 |
|
---|
274 | =over 4
|
---|
275 |
|
---|
276 | =item Compiler-related flags
|
---|
277 |
|
---|
278 | The settings of some things, such as optimization flags, may depend on
|
---|
279 | the particular compiler used. For example, consider the following:
|
---|
280 |
|
---|
281 | case "$cc" in
|
---|
282 | *gcc*) ccflags="$ccflags -posix"
|
---|
283 | ldflags="$ldflags -posix"
|
---|
284 | ;;
|
---|
285 | *) ccflags="$ccflags -Xp -D_POSIX_SOURCE"
|
---|
286 | ldflags="$ldflags -Xp"
|
---|
287 | ;;
|
---|
288 | esac
|
---|
289 |
|
---|
290 | However, the hints file is processed before the user is asked which
|
---|
291 | compiler should be used. Thus in order for these hints to be useful,
|
---|
292 | the user must specify sh Configure -Dcc=gcc on the command line, as
|
---|
293 | advised by the INSTALL file.
|
---|
294 |
|
---|
295 | For versions of perl later than 5.004_61, this problem can
|
---|
296 | be circumvented by the use of "call-back units". That is, the hints
|
---|
297 | file can tuck this information away into a file UU/cc.cbu. Then,
|
---|
298 | after Configure prompts the user for the C compiler, it will load in
|
---|
299 | and run the UU/cc.cbu "call-back" unit. See hints/solaris_2.sh for an
|
---|
300 | example. Some callbacks exist for other variables than cc, such as for
|
---|
301 | uselongdouble. At the present time, these callbacks are only called if the
|
---|
302 | variable in question is defined; however, this may change, so the scheme in
|
---|
303 | hints/solaris_2.sh of checking to see if uselongdouble is defined is a good
|
---|
304 | idea.
|
---|
305 |
|
---|
306 | =item Call status
|
---|
307 |
|
---|
308 | Call-backs are only called always, even if the value for the call-back is
|
---|
309 | uset: UU/usethreads.cbu is called when Configure is about to deal with
|
---|
310 | threads. All created call-backs from hints should thus check the status
|
---|
311 | of the variable, and act upon it.
|
---|
312 |
|
---|
313 | =item Future status
|
---|
314 |
|
---|
315 | I hope this "call-back" scheme is simple enough to use but powerful
|
---|
316 | enough to deal with most situations. Still, there are certainly cases
|
---|
317 | where it's not enough. For example, for aix we actually change
|
---|
318 | compilers if we are using threads.
|
---|
319 |
|
---|
320 | I'd appreciate feedback on whether this is sufficiently general to be
|
---|
321 | helpful, or whether we ought to simply continue to require folks to
|
---|
322 | say things like "sh Configure -Dcc=gcc -Dusethreads" on the command line.
|
---|
323 |
|
---|
324 | =back
|
---|
325 |
|
---|
326 | Have the appropriate amount of fun :-)
|
---|
327 |
|
---|
328 | Andy Dougherty doughera@lafayette.edu (author)
|
---|
329 | Paul Green paul.green@stratus.com (compiler bugs)
|
---|