1#! /bin/sh 2# hints/os2.sh 3# This file reflects the tireless work of 4# Ilya Zakharevich <ilya@math.ohio-state.edu> 5# 6# Trimmed and comments added by 7# Andy Dougherty <doughera@lafcol.lafayette.edu> 8# Exactly what is required beyond a standard OS/2 installation? 9# (see in README.os2) 10 11# Note that symbol extraction code gives wrong answers (sometimes?) on 12# gethostent and setsid. 13 14# Optimization (GNU make 3.74 cannot be loaded :-(): 15emxload -m 30 sh.exe ls.exe tr.exe id.exe sed.exe # make.exe 16emxload -m 30 grep.exe egrep.exe fgrep.exe cat.exe rm.exe mv.exe cp.exe 17emxload -m 30 uniq.exe basename.exe sort.exe awk.exe echo.exe 18 19path_sep=\; 20 21if test -f $sh.exe; then sh=$sh.exe; fi 22 23startsh="#!$sh" 24cc='gcc' 25 26# Make denser object files and DLL 27case "X$optimize" in 28 X) 29 optimize="-O2 -fomit-frame-pointer -malign-loops=2 -malign-jumps=2 -malign-functions=2 -s" 30 ld_dll_optimize="-s" 31 ;; 32esac 33 34# Get some standard things (indented to avoid putting in config.sh): 35 oifs="$IFS" 36 IFS=" ;" 37 set $MANPATH 38 tryman="$@" 39 set $LIBRARY_PATH 40 libemx="$@" 41 set $C_INCLUDE_PATH 42 usrinc="$@" 43 IFS="$oifs" 44 tryman="`./UU/loc . /man $tryman`" 45 tryman="`echo $tryman | tr '\\\' '/'`" 46 47 # indented to avoid having it *two* times at start 48 libemx="`./UU/loc os2.a /emx/lib $libemx`" 49 50usrinc="`./UU/loc stdlib.h /emx/include $usrinc`" 51usrinc="`dirname $usrinc | tr '\\\' '/'`" 52libemx="`dirname $libemx | tr '\\\' '/'`" 53 54if test -d $tryman/man1; then 55 sysman="$tryman/man1" 56else 57 sysman="`./UU/loc . /man/man1 c:/man/man1 c:/usr/man/man1 d:/man/man1 d:/usr/man/man1 e:/man/man1 e:/usr/man/man1 f:/man/man1 f:/usr/man/man1 g:/man/man1 g:/usr/man/man1 /usr/man/man1`" 58fi 59 60emxpath="`dirname $libemx`" 61if test ! -d "$emxpath"; then 62 emxpath="`./UU/loc . /emx c:/emx d:/emx e:/emx f:/emx g:/emx h:/emx /emx`" 63fi 64 65if test ! -d "$libemx"; then 66 libemx="$emxpath/lib" 67fi 68if test ! -d "$libemx"; then 69 if test -d "$LIBRARY_PATH"; then 70 libemx="$LIBRARY_PATH" 71 else 72 libemx="`./UU/loc . X c:/emx/lib d:/emx/lib e:/emx/lib f:/emx/lib g:/emx/lib h:/emx/lib /emx/lib`" 73 fi 74fi 75 76if test ! -d "$usrinc"; then 77 if test -d "$emxpath/include"; then 78 usrinc="$emxpath/include" 79 else 80 if test -d "$C_INCLUDE_PATH"; then 81 usrinc="$C_INCLUDE_PATH" 82 else 83 usrinc="`./UU/loc . X c:/emx/include d:/emx/include e:/emx/include f:/emx/include g:/emx/include h:/emx/include /emx/include`" 84 fi 85 fi 86fi 87 88rsx="`./UU/loc rsx.exe undef $pth`" 89 90if test "$libemx" = "X"; then echo "Cannot find C library!" >&2; fi 91 92# Acute backslashitis: 93libpth="`echo \"$LIBRARY_PATH\" | tr ';\\\' ' /'`" 94libpth="$libpth $libemx/mt $libemx" 95 96set `cmd /c emxrev -f emxlibcm` 97emxcrtrev=$5 98# indented to not put it into config.sh 99 _defemxcrtrev=-D_EMX_CRT_REV_=$emxcrtrev 100 101so='dll' 102 103# Additional definitions: 104 105firstmakefile='GNUmakefile' 106exe_ext='.exe' 107 108# We provide it 109i_dlfcn='define' 110 111# The default one uses exponential notation between 0.0001 and 0.1 112d_Gconvert='gcvt_os2((x),(n),(b))' 113 114cat > UU/uselongdouble.cbu <<'EOCBU' 115# This script UU/uselongdouble.cbu will get 'called-back' by Configure 116# after it has prompted the user for whether to use long doubles. 117# If we will use them, let Configure choose us a Gconvert. 118case "$uselongdouble:$d_longdbl:$d_sqrtl:$d_modfl" in 119"$define:$define:$define:$define") d_Gconvert='' ;; 120esac 121EOCBU 122 123# -Zomf build has a problem with _exit() *flushing*, so the test 124# gets confused: 125fflushNULL="define" 126 127aout_d_shrplib='undef' 128aout_useshrplib='false' 129aout_obj_ext='.o' 130aout_lib_ext='.a' 131aout_ar='ar' 132aout_plibext='.a' 133aout_lddlflags="-Zdll $ld_dll_optimize" 134# Cannot have 32000K stack: get SYS0170 ?! 135if [ $emxcrtrev -ge 50 ]; then 136 aout_ldflags='-Zexe -Zsmall-conv -Zstack 16000' 137else 138 aout_ldflags='-Zexe -Zstack 16000' 139fi 140 141# To get into config.sh: 142aout_ldflags="$aout_ldflags" 143 144aout_d_fork='define' 145aout_ccflags="-DDOSISH -DPERL_IS_AOUT -DOS2=2 -DEMBED -I. $_defemxcrtrev" 146aout_cppflags="-DDOSISH -DPERL_IS_AOUT -DOS2=2 -DEMBED -I. $_defemxcrtrev" 147aout_use_clib='c' 148aout_usedl='undef' 149aout_archobjs="os2.o dl_os2.o" 150# Not listed in dynamic_ext, but needed for AOUT static_ext nevertheless 151aout_extra_static_ext="OS2::DLL" 152 153# variable which have different values for aout compile 154used_aout='d_shrplib useshrplib plibext lib_ext obj_ext ar plibext d_fork lddlflags ldflags ccflags use_clib usedl archobjs cppflags' 155 156if [ "$emxaout" != "" ]; then 157 d_shrplib="$aout_d_shrplib" 158 useshrplib="$aout_useshrplib" 159 obj_ext="$aout_obj_ext" 160 lib_ext="$aout_lib_ext" 161 ar="$aout_ar" 162 plibext="$aout_plibext" 163 if [ $emxcrtrev -lt 50 ]; then 164 d_fork="$aout_d_fork" 165 fi 166 lddlflags="$aout_lddlflags" 167 ldflags="$aout_ldflags" 168 ccflags="$aout_ccflags" 169 cppflags="$aout_cppflags" 170 use_clib="$aout_use_clib" 171 usedl="$aout_usedl" 172else 173 d_shrplib='define' 174 useshrplib='true' 175 obj_ext='.obj' 176 lib_ext='.lib' 177 ar='emxomfar' 178 plibext='.lib' 179 if [ $emxcrtrev -ge 50 ]; then 180 d_fork='define' 181 else 182 d_fork='undef' 183 fi 184 lddlflags="-Zdll -Zomf -Zmt -Zcrtdll -Zlinker /e:2" 185 # Recursive regmatch may eat 2.5M of stack alone. 186 ldflags='-Zexe -Zomf -Zmt -Zcrtdll -Zstack 32000 -Zlinker /e:2' 187 if [ $emxcrtrev -ge 50 ]; then 188 ccflags="-Zomf -Zmt -DDOSISH -DOS2=2 -DEMBED -I. $_defemxcrtrev" 189 else 190 ccflags="-Zomf -Zmt -DDOSISH -DOS2=2 -DEMBED -I. -DEMX_BAD_SBRK $_defemxcrtrev" 191 fi 192 use_clib='c_import' 193 usedl='define' 194fi 195 196# indented to miss config.sh 197 _ar="$ar" 198 199# To get into config.sh (should start at the beginning of line) 200# or you can put it into config.over. 201plibext="$plibext" 202# plibext is not needed anymore. Just directly set $libperl. 203libperl="libperl${plibext}" 204 205#libc="/emx/lib/st/c_import$lib_ext" 206libc="$libemx/mt/$use_clib$lib_ext" 207 208if test -r "$libemx/c_alias$lib_ext"; then 209 libnames="$libemx/c_alias$lib_ext" 210fi 211# otherwise puts -lc ??? 212 213# [Maybe we should just remove c from $libswanted ?] 214 215# Test would pick up wrong rand, so we hardwire the value for random() 216libs='-lsocket -lm -lbsd' 217randbits=31 218archobjs="os2$obj_ext dl_os2$obj_ext" 219 220# Run files without extension with sh: 221EXECSHELL=sh 222 223cccdlflags='-Zdll' 224dlsrc='dl_dlopen.xs' 225ld='gcc' 226 227#cppflags='-DDOSISH -DOS2=2 -DEMBED -I.' 228 229# for speedup: (some patches to ungetc are also needed): 230# Note that without this guy tests 8 and 10 of io/tell.t fail, with it 11 fails 231 232stdstdunder=`echo "#include <stdio.h>" | cpp | egrep -c "char +\* +_ptr"` 233d_stdstdio='define' 234d_stdiobase='define' 235d_stdio_ptr_lval='define' 236d_stdio_cnt_lval='define' 237 238if test "$stdstdunder" = 0; then 239 stdio_ptr='((fp)->ptr)' 240 stdio_cnt='((fp)->rcount)' 241 stdio_base='((fp)->buffer)' 242 stdio_bufsiz='((fp)->rcount + (fp)->ptr - (fp)->buffer)' 243 ccflags="$ccflags -DMYTTYNAME" 244 myttyname='define' 245else 246 stdio_ptr='((fp)->_ptr)' 247 stdio_cnt='((fp)->_rcount)' 248 stdio_base='((fp)->_buffer)' 249 stdio_bufsiz='((fp)->_rcount + (fp)->_ptr - (fp)->_buffer)' 250fi 251 252# to put into config.sh 253myttyname="$myttyname" 254 255# To have manpages installed 256nroff='nroff.cmd' 257# above will be overwritten otherwise, indented to avoid config.sh 258 _nroff='nroff.cmd' 259 260# should be handled automatically by Configure now. 261ln='cp' 262# Will be rewritten otherwise, indented to not put in config.sh 263 _ln='cp' 264lns='cp' 265 266nm_opt='-p' 267 268####### We define these functions ourselves 269 270d_strtoll='define' 271d_strtoull='define' 272d_getprior='define' 273d_setprior='define' 274 275# The next two are commented. pdksh handles #!, extproc gives no path part. 276# sharpbang='extproc ' 277# shsharp='false' 278 279# Commented: 280#startsh='extproc ksh\\n#! sh' 281 282# Find patch: 283gnupatch='patch' 284if (gnupatch -v || gnupatch --version) 2>&1 >/dev/null; then 285 gnupatch=gnupatch 286else 287 if (gpatch -v || gpatch --version) 2>&1 >/dev/null; then 288 gnupatch=gpatch 289 else 290 # They may have a special PATH during configuring 291 if (patch -v || patch --version) 2>&1 >/dev/null; then 292 gnupatch="`./UU/loc patch.exe undef $pth`" 293 fi 294 fi 295fi 296 297for f in less.exe less.sh less.ksh less.cmd more.exe more.sh more.ksh more.cmd ; do 298 if test -z "$pager"; then 299 pager="`./UU/loc $f '' $pth`" 300 fi 301done 302if test -z "$pager"; then 303 pager='cmd /c more' 304fi 305 306# Apply patches if needed 307case "$0$running_c_cmd" in 308 *[/\\]Configure|*[/\\]Configure.|Configure|Configure.) # Skip Configure.cmd 309 if test "Xyes" = "X$configure_cmd_loop"; then 310 cat <<EOC >&2 311!!! 312!!! PANIC: Loop of self-invocations detected, aborting! 313!!! 314EOC 315 exit 20 316 fi 317 configure_cmd_loop=yes 318 export configure_cmd_loop 319 320 configure_needs_patch='' 321 if test -s ./os2/diff.configure; then 322 if ! grep "^#OS2-PATCH-APPLIED" ./Configure > /dev/null; then 323 configure_needs_patch=yes 324 fi 325 fi 326 if test -n "$configure_needs_patch"; then 327 # Not patched! 328 # Restore the initial command line arguments 329 if test -f ./Configure.cmd ; then 330 cat <<EOC >&2 331!!! 332!!! I see that what is running is ./Configure. 333!!! ./Configure is not patched, but ./Configure.cmd exists. 334!!! 335!!! You are supposed to run Configure.cmd, not Configure 336!!! after an automagic patching. 337!!! 338!!! If you insist on running Configure, you may 339!!! patch it manually from ./os2/diff.configure. 340!!! 341!!! However, I went through incredible hoolahoops, and I expect I can 342!!! auto-restart Configure.cmd myself. I will start it with arguments: 343!!! 344!!! Configure.cmd $args_exp 345!!! 346EOC 347 rp='Do you want to auto-restart Configure.cmd?' 348 dflt='y' 349 . UU/myread 350 case "$ans" in 351 [yY]) echo >&4 "Okay, continuing." ;; 352 *) echo >&4 "Okay, bye." 353 exit 2 354 ;; 355 esac 356 eval "set X $args_exp"; 357 shift; 358 # Restore the output 359 exec Configure.cmd "$@" 1>&2 360 exit 2 361 fi 362 cat <<EOC >&2 363!!! 364!!! You did not patch ./Configure! 365!!! I can create Configure.cmd and patch it from ./os2/diff.configure with the command 366!!! 367!!! $gnupatch -b -p1 --output=Configure.cmd <./os2/diff.configure 2>&1 | tee 00_auto_patch 368EOC 369 rp='Do you want to auto-patch Configure to Configure.cmd?' 370 dflt='y' 371 . UU/myread 372 case "$ans" in 373 [yY]) echo >&4 "Okay, continuing." ;; 374 *) echo >&4 "Okay, bye." 375 exit 2 376 ;; 377 esac 378 ($gnupatch -b -p1 --output=Configure.cmd <./os2/diff.configure 2>&1 | tee 00_auto_patch) >&2 379 cat <<EOC >&2 380!!! 381!!! The report of patching is copied to 00_auto_patch. 382!!! Now we need to restart Configure.cmd with all the options. 383!!! 384EOC 385 echo "extproc sh" > Configure.ctm 386 ( cat Configure.cmd >> Configure.ctm && mv -f Configure.ctm Configure.cmd ) || (echo "!!! Failure to add extproc-line to Configure.cmd." >&2 ; exit 21) 387 cat <<EOC >&2 388!!! I went through incredible hoolahoops, and I expect I can 389!!! auto-restart Configure.cmd myself. I will start it with arguments: 390!!! 391!!! Configure.cmd $args_exp 392!!! 393EOC 394 rp='Do you want to auto-restart Configure.cmd?' 395 dflt='y' 396 . UU/myread 397 case "$ans" in 398 [yY]) echo >&4 "Okay, continuing." ;; 399 *) echo >&4 "Okay, bye." 400 exit 2 401 ;; 402 esac 403 eval "set X $args_exp"; 404 shift; 405 exec Configure.cmd "$@" 1>&2 406 exit 2 407 else 408 if test -s ./os2/diff.configure; then 409 echo "!!! Apparently we are running a patched Configure." >&2 410 else 411 echo "!!! Apparently there is no need to patch Configure." >&2 412 fi 413 fi 414 ;; 415 *) echo "!!! Apparently we are running a renamed Configure: '$0'." >&2 416esac 417 418# This script UU/usethreads.cbu will get 'called-back' by Configure 419# after it has prompted the user for whether to use threads. 420cat > UU/usethreads.cbu <<'EOCBU' 421case "$usethreads" in 422$define|true|[yY]*) 423 ccflags="-Zmt $ccflags" 424 cppflags="-Zmt $cppflags" # Do we really need to set this? 425 aout_ccflags="-DUSE_THREADS $aout_ccflags" 426 aout_cppflags="-DUSE_THREADS $aout_cppflags" 427 aout_lddlflags="-Zmt $aout_lddlflags" 428 aout_ldflags="-Zmt $aout_ldflags" 429 ;; 430esac 431EOCBU 432 433if test -z "$cryptlib"; then 434 cryptlib=`UU/loc crypt$lib_ext "" $libpth` 435 if $test -n "$cryptlib"; then 436 cryptlib=-lcrypt 437 else 438 cryptlib=`UU/loc ufc$lib_ext "" $libpth` 439 if $test -n "$cryptlib"; then 440 cryptlib=-lufc 441 fi 442 fi 443fi 444if test -n "$cryptlib"; then 445 libs="$libs $cryptlib" 446 # d_crypt=define 447fi 448 449# Now install the external modules. We are in the ./hints directory. 450 451cd ./os2/OS2 452 453if ! test -d ../../ext/OS2 ; then 454 mkdir ../../ext/OS2 455fi 456 457cp -rfu * ../../ext/OS2/ 458 459# Install tests: 460 461cp -uf ../*.t ../../t/lib 462for xxx in * ; do 463 if $test -d $xxx/t; then 464 cp -uf $xxx/t/*.t ../../t/lib 465 else 466 if $test -d $xxx; then 467 cd $xxx 468 for yyy in * ; do 469 if $test -d $yyy/t; then 470 cp -uf $yyy/t/*.t ../../t/lib 471 fi 472 done 473 cd .. 474 fi 475 fi 476done 477 478case "$ldlibpthname" in 479'') ldlibpthname=none ;; 480esac 481 482# Now go back 483cd ../.. 484cp os2/*.t t/lib 485