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