Build System

Build System is designed to build distributions of different operating systems for a set of target devices.

324 Commits   6 Branches   25 Tags   |
Index: build-system-1.8.1/constants.mk
===================================================================
--- build-system-1.8.1/constants.mk	(nonexistent)
+++ build-system-1.8.1/constants.mk	(revision 323)
@@ -0,0 +1,1319 @@
+# include once
+ifndef CONSTANTS_MK
+
+#######
+####### Constants:
+#######
+
+SYSTEM_VERSION       = 1.8.1
+
+#
+# Distribution:
+#
+DISTRO_NAME          = radix
+
+DISTRO_CAPTION       = Radix
+
+DISTRO_SPEC          = Radix cross Linux
+
+DISTRO_VERSION       = 1.8
+
+BUG_URL              = https://radix.pro
+
+
+#
+# Download Sources:
+#
+DOWNLOAD_SERVER      = https://ftp.radix.pro
+
+WGET_OPTIONS         = -q -N
+
+TOOLCHAINS_FTP_BASE  = toolchains/x86_64
+TARBALL_SUFFIX       = tar.gz
+
+
+CACHED_CC_OUTPUT     = /opt/extra/ccache
+
+TOOLCHAINS_BASE_PATH = /opt/toolchains
+
+
+#
+# GnuPG options for make-package:
+# ==============================
+#
+# Usage:
+# -----
+#   GNUPG_OPTIONS  = -g ~/.gnupg
+#   GNUPG_OPTIONS += -p ~/.gnupg/.pkgtool-passphrase
+#   GNUPG_OPTIONS += -k 0xA5ED710298807270
+#
+#   where:
+#     -g,--gnupghome=<DIR>       Set the name of the GnuPG home directory
+#                                to <DIR>. If this option is not used it
+#                                defaults to '~/.gnupg'. This also overrides
+#                                the environment variable 'GNUPGHOME'.
+#     -p,--passphrase=<FILE>     File with passphrase of private certificate
+#                                for signing package. For example:
+#                                   ~/.gnupg/.passphrase
+#                                Passphrase should be placed in the first
+#                                line of the file (the new-line symbol at
+#                                end of passphrase is allowed). File must
+#                                have access mode 600.
+#     -k,--key-id=<USER-ID>      Use USER-ID to sign package, for example,
+#                                --key-id=0xA5ED710298807270
+#
+#     [see OpenPGP options of make-package utility].
+#
+GNUPG_OPTIONS =
+
+
+################################################################
+#######
+####### Target Package suffixes & functions:
+#######
+
+# pkgtool/make-package script creates three files:
+#  - package tarball,
+#  - package signature,
+#  - package description.
+# extensions of these files are depend on pkgtool.
+
+pkg_arch_suffix = txz
+pkg_cert_suffix = asc
+pkg_sign_suffix = sha
+pkg_desc_suffix = txt
+
+#
+# functions:
+#
+cert-name = $(if $(GNUPG_OPTIONS),$(subst .$(pkg_arch_suffix),.$(pkg_cert_suffix),$1),)
+sign-name = $(subst .$(pkg_arch_suffix),.$(pkg_sign_suffix),$1)
+desc-name = $(subst .$(pkg_arch_suffix),.$(pkg_desc_suffix),$1)
+pkg-files = $1 $(call cert-name,$1) $(call sign-name,$1) $(call desc-name,$1)
+
+#
+# usage:
+#
+#   pkg_archive     = $(TARGET_BUILD_DIR)/$(PKG_GROUP)/$(pkg_basename).$(pkg_arch_suffix)
+#   pkg_signature   = $(call sign-name,$(pkg_archive))
+#   pkg_description = $(call desc-name,$(pkg_archive))
+#   products        = $(call pkg-files,$(pkg_archive))
+#
+#   PRODUCT_TARGETS = $(products)
+#   ROOTFS_TARGETS  = $(pkg_archive)
+#
+#   $(pkg_signature)   : $(pkg_archive) ;
+#   $(pkg_description) : $(pkg_archive) ;
+#
+#   $(pkg_archive): '''dependencies'''
+#   	```package creation procedure'''
+
+#######
+####### End of Target Package suffixes & functions.
+#######
+################################################################
+
+
+#
+# NOTE:
+# ====
+#   Hardware names defined by 'HARDWARE_...' variables.
+#   Hardware IDs variable names such as ..._ID_STD should have prefix
+#   which is equal to $(HARDWARE_...) in upper case letters and symbol '-' should be replaced with '_'.
+#   In other words the PREFIX is equal to PREFIX = $(shell echo $(HARDWARE_...) | tr '[a-z-]' '[A-Z_]').
+#
+
+#######
+####### Hardware names and specific attributes:
+#######
+
+####### noarch:
+HARDWARE_NOARCH     = none
+####### Host Build:
+HARDWARE_BUILD      = build
+
+#
+# NOTE:
+# ====
+#   $(HARDWARE)_USE_BUILT_GCC_LIBS - defines that the system is based on GCC Runtime Libraries
+#                                    which built in the platform instead of Libraries which
+#                                    are taken from TOOLCHAIN.
+#
+#   These variables give their values to the global variable named as __USE_BUILT_GCC_LIBS__
+#   and defined in the target-setup.mk file. Variable __USE_BUILT_GCC_LIBS__ can be used in
+#   user's Makefile to deside do we need to wait gcc built or we can to set dependencies from
+#   GNU Libc which based on GCC Runtime Libs taken from toolchain.
+#
+#   [see: app/inputattach/1.4.7/Makefile, for example].
+#
+
+####### x86 Personal Computer:
+HARDWARE_INTEL_PC32              = intel-pc32
+###                               |---HW-spec-handy-ruler-----------------------|
+INTEL_PC32_SPEC                  = Intel x86_32 generic Linux machine
+INTEL_PC32_USE_BUILT_GCC_LIBS    = yes
+INTEL_PC32_ENABLE_STATIC         = no
+
+####### {x86|x86_64} Personal Computer:
+HARDWARE_INTEL_PC64              = intel-pc64
+###                               |---HW-spec-handy-ruler-----------------------|
+INTEL_PC64_SPEC                  = Intel x86_64 generic Linux machine
+INTEL_PC64_USE_BUILT_GCC_LIBS    = yes
+INTEL_PC64_ENABLE_STATIC         = no
+
+####### x86 micro Linux:
+HARDWARE_INTEL_PC32M             = intel-pc32m
+###                               |---HW-spec-handy-ruler-----------------------|
+INTEL_PC32M_SPEC                 = x86_32 micro Linux
+INTEL_PC32M_USE_BUILT_GCC_LIBS   = no
+INTEL_PC32M_ENABLE_STATIC        = no
+
+####### x86_64 micro Linux:
+HARDWARE_INTEL_PC64M             = intel-pc64m
+###                               |---HW-spec-handy-ruler-----------------------|
+INTEL_PC64M_SPEC                 = x86_64 micro Linux
+INTEL_PC64M_USE_BUILT_GCC_LIBS   = no
+INTEL_PC64M_ENABLE_STATIC        = no
+
+
+####### i586 devices:
+####### ------------
+
+####### DMP Electronics Inc. EBOX-3350DX2-AP [https://www.compactpc.com.tw]:
+HARDWARE_EBOX_3350DX2            = ebox-3350dx2
+###                               |---HW-spec-handy-ruler-----------------------|
+EBOX_3350DX2_SPEC                = EBOX 3350DX2 \(Linux, GNU Libc based\)
+EBOX_3350DX2_USE_BUILT_GCC_LIBS  = yes
+EBOX_3350DX2_ENABLE_STATIC       = no
+
+HARDWARE_EBOX_3350DX2M           = ebox-3350dx2m
+###                               |---HW-spec-handy-ruler-----------------------|
+EBOX_3350DX2M_SPEC               = EBOX 3350DX2M \(micro Linux, GNU Libc based\)
+EBOX_3350DX2M_USE_BUILT_GCC_LIBS = no
+EBOX_3350DX2M_ENABLE_STATIC      = no
+
+
+####### Allwinner devices:
+####### -----------------
+
+####### A1N newlib devices (cubieboard 1):
+HARDWARE_CB1N                    = cb1n
+###                               |---HW-spec-handy-ruler-----------------------|
+CB1N_SPEC                        = Cubieboard A10 \(Newlib based\)
+CB1N_USE_BUILT_GCC_LIBS          = no
+CB1N_ENABLE_STATIC               = yes
+
+####### A1X devices (cubieboard 1 glibc):
+HARDWARE_CB1X                    = cb1x
+###                               |---HW-spec-handy-ruler-----------------------|
+CB1X_SPEC                        = Cubieboard A10 \(Linux, GNU Libc based\)
+CB1X_USE_BUILT_GCC_LIBS          = yes
+CB1X_ENABLE_STATIC               = no
+
+####### A2N newlib devices (cubieboard 2):
+HARDWARE_CB2N                    = cb2n
+###                               |---HW-spec-handy-ruler-----------------------|
+CB2N_SPEC                        = Cubieboard A20 \(Newlib based\)
+CB2N_USE_BUILT_GCC_LIBS          = no
+CB2N_ENABLE_STATIC               = yes
+
+####### A2X devices (cubieboard 2 glibc):
+HARDWARE_CB2X                    = cb2x
+###                               |---HW-spec-handy-ruler-----------------------|
+CB2X_SPEC                        = Cubieboard A20 \(Linux, GNU Libc based\)
+CB2X_USE_BUILT_GCC_LIBS          = yes
+CB2X_ENABLE_STATIC               = no
+
+####### A3N newlib devices (cubieboard 3):
+HARDWARE_CB3N                    = cb3n
+###                               |---HW-spec-handy-ruler-----------------------|
+CB3N_SPEC                        = Cubietrack A20 \(Newlib based\)
+CB3N_USE_BUILT_GCC_LIBS          = no
+CB3N_ENABLE_STATIC               = yes
+
+####### A3X devices (cubieboard 3 glibc):
+HARDWARE_CB3X                    = cb3x
+###                               |---HW-spec-handy-ruler-----------------------|
+CB3X_SPEC                        = Cubietrack A20 \(Linux, GNU Libc based\)
+CB3X_USE_BUILT_GCC_LIBS          = yes
+CB3X_ENABLE_STATIC               = no
+
+
+####### H3 devices:
+####### ----------
+
+####### Orange Pi Plus 2E [http://www.orangepi.org/orangepiplus2e]:
+HARDWARE_ORANGE_PP2E             = orange-pp2e
+###                               |---HW-spec-handy-ruler-----------------------|
+ORANGE_PP2E_SPEC                 = Orange Pi Plus 2E \(Linux, GNU Libc based\)
+ORANGE_PP2E_USE_BUILT_GCC_LIBS   = yes
+ORANGE_PP2E_ENABLE_STATIC        = no
+
+####### NanoPi NEO Air [http://wiki.friendlyarm.com/wiki/index.php/NanoPi_NEO_Air]:
+HARDWARE_NANOPI_NEO              = nanopi-neo
+###                               |---HW-spec-handy-ruler-----------------------|
+NANOPI_NEO_SPEC                  = NanoPi NEO Air \(Linux, GNU Libc based\)
+NANOPI_NEO_USE_BUILT_GCC_LIBS    = yes
+NANOPI_NEO_ENABLE_STATIC         = no
+
+####### H5 devices:
+####### ----------
+
+####### Orange Pi Prime [http://www.orangepi.org/OrangePiPrime]:
+HARDWARE_ORANGE_PP               = orange-pp
+###                               |---HW-spec-handy-ruler-----------------------|
+ORANGE_PP_SPEC                   = Orange Pi Prime \(Linux, GNU Libc based\)
+ORANGE_PP_USE_BUILT_GCC_LIBS     = yes
+ORANGE_PP_ENABLE_STATIC          = no
+
+####### Orange Pi Lite 2 [http://www.orangepi.org/Orange Pi Lite 2/]:
+HARDWARE_ORANGE_PL2              = orange-pl2
+###                               |---HW-spec-handy-ruler-----------------------|
+ORANGE_PL2_SPEC                  = Orange Pi Lite 2 \(Linux, GNU Libc based\)
+ORANGE_PL2_USE_BUILT_GCC_LIBS    = yes
+ORANGE_PL2_ENABLE_STATIC         = no
+
+####### Wechip TX6 [https://aliexpress.com]:
+HARDWARE_WECHIP_TX6              = wechip-tx6
+###                               |---HW-spec-handy-ruler-----------------------|
+WECHIP_TX6_SPEC                  = WeChip TX6 OTT Box \(Linux, GNU Libc based\)
+WECHIP_TX6_USE_BUILT_GCC_LIBS    = yes
+WECHIP_TX6_ENABLE_STATIC         = no
+
+
+
+####### Microcontrollers:
+####### ----------------
+
+####### AT91SAM7S devices:
+HARDWARE_AT91S                   = at91s
+###                               |---HW-spec-handy-ruler-----------------------|
+AT91S_SPEC                       = Atmel at91sam7s \(Newlib based\)
+AT91S_USE_BUILT_GCC_LIBS         = no
+AT91S_ENABLE_STATIC              = yes
+
+
+
+####### i.MX6 devices:
+####### -------------
+
+####### Nitrogen6X [https://boundarydevices.com/product/nitrogen6x]:
+HARDWARE_NIT6Q                   = nit6q
+###                               |---HW-spec-handy-ruler-----------------------|
+NIT6Q_SPEC                       = Nitrogen6X Nit6Q \(Linux, GNU Libc based\)
+NIT6Q_USE_BUILT_GCC_LIBS         = yes
+NIT6Q_ENABLE_STATIC              = no
+
+####### OKMX6DL-C [http://www.forlinx.net/products_detail/productId=69.html]:
+HARDWARE_OKMX6DL_C               = okmx6dl-c
+###                               |---HW-spec-handy-ruler-----------------------|
+OKMX6DL_C_SPEC                   = Forlinx OKMX6DL-C \(Linux, GNU Libc based\)
+OKMX6DL_C_USE_BUILT_GCC_LIBS     = yes
+OKMX6DL_C_ENABLE_STATIC          = no
+
+####### OKMX6Q-C [http://www.forlinx.net/products_detail/productId=69.html]:
+HARDWARE_OKMX6Q_C                = okmx6q-c
+###                               |---HW-spec-handy-ruler-----------------------|
+OKMX6Q_C_SPEC                    = Forlinx OKMX6Q-C \(Linux, GNU Libc based\)
+OKMX6Q_C_USE_BUILT_GCC_LIBS      = yes
+OKMX6Q_C_ENABLE_STATIC           = no
+
+####### SK6ULL [http://starterkit.ru/html/index.php?name=shop&op=view&id=154]:
+HARDWARE_SK6ULL                  = sk6ull
+###                               |---HW-spec-handy-ruler-----------------------|
+SK6ULL_SPEC                      = SK-iMX6ULL-NANO  \(Linux, GNU Libc based\)
+SK6ULL_USE_BUILT_GCC_LIBS        = yes
+SK6ULL_ENABLE_STATIC             = no
+
+
+####### AM335X devices:
+####### --------------
+
+HARDWARE_BONE_BLACK              = bone-black
+###                               |---HW-spec-handy-ruler-----------------------|
+BONE_BLACK_SPEC                  = BeagleBone Black \(Linux, GNU Libc based\)
+BONE_BLACK_USE_BUILT_GCC_LIBS    = yes
+BONE_BLACK_ENABLE_STATIC         = no
+
+
+####### OMAP543X devices:
+####### ----------------
+
+HARDWARE_OMAP5UEVM               = omap5uevm
+###                               |---HW-spec-handy-ruler-----------------------|
+OMAP5UEVM_SPEC                   = Texas OMAP5 uEVM \(Linux, GNU Libc based\)
+OMAP5UEVM_USE_BUILT_GCC_LIBS     = yes
+OMAP5UEVM_ENABLE_STATIC          = no
+
+HARDWARE_DRA7XXEVM               = dra7xxevm
+###                               |---HW-spec-handy-ruler-----------------------|
+DRA7XXEVM_SPEC                   = Texas DRA7xx EVM \(Linux, GNU Libc based\)
+DRA7XXEVM_USE_BUILT_GCC_LIBS     = yes
+DRA7XXEVM_ENABLE_STATIC          = no
+
+
+####### JZ47XX devices:
+####### --------------
+
+####### MIPS Creator CI20 [http://www.elinux.org/MIPS_Creator_CI20]:
+HARDWARE_CI20                    = ci20
+###                               |---HW-spec-handy-ruler-----------------------|
+CI20_SPEC                        = MIPS Creator CI20 \(Linux, GNU Libc based\)
+CI20_USE_BUILT_GCC_LIBS          = yes
+CI20_ENABLE_STATIC               = no
+
+
+####### MIPS Warrior P-class P5600 devices:
+####### ----------------------------------
+
+####### Baikal T1 based boards [https://baikalelectronics.com/products/168]:
+HARDWARE_BAIKAL_T1               = baikal-t1
+###                               |---HW-spec-handy-ruler-----------------------|
+BAIKAL_T1_SPEC                   = MIPS Baikal T1 \(Linux, GNU Libc based\)
+BAIKAL_T1_USE_BUILT_GCC_LIBS     = yes
+BAIKAL_T1_ENABLE_STATIC          = no
+
+####### BE-M1000 devices:
+####### ----------------
+
+####### Baikal M1 based boards [https://baikalelectronics.com/products/238]:
+HARDWARE_BAIKAL_M1               = baikal-m1
+###                               |---HW-spec-handy-ruler-----------------------|
+BAIKAL_M1_SPEC                   = ARM64 Baikal M1 \(Linux, GNU Libc based\)
+BAIKAL_M1_USE_BUILT_GCC_LIBS     = yes
+BAIKAL_M1_ENABLE_STATIC          = no
+
+
+####### RK328X devices:
+####### --------------
+
+####### Firefly-RK3288 [http://en.t-firefly.com/en/firenow/firefly_rk3288]:
+HARDWARE_FFRK3288                = ffrk3288
+###                               |---HW-spec-handy-ruler-----------------------|
+FFRK3288_SPEC                    = Firefly RK3288 \(Linux, GNU Libc based\)
+FFRK3288_USE_BUILT_GCC_LIBS      = yes
+FFRK3288_ENABLE_STATIC           = no
+
+####### Poin2 RK3288 Chromebook [https://poin2.com/chromebook11]:
+HARDWARE_POIN2                   = poin2
+###                               |---HW-spec-handy-ruler-----------------------|
+POIN2_SPEC                       = Poin2 RK3288 \(Linux, GNU Libc based\)
+POIN2_USE_BUILT_GCC_LIBS         = yes
+POIN2_ENABLE_STATIC              = no
+
+
+####### RK33XX devices:
+####### --------------
+
+####### ROC-RK3328-CC [http://en.t-firefly.com/doc/product/index/id/34.html]:
+HARDWARE_RK3328_CC               = rk3328-cc
+###                               |---HW-spec-handy-ruler-----------------------|
+RK3328_CC_SPEC                   = ROC RK3328 CC \(Linux, GNU Libc based\)
+RK3328_CC_USE_BUILT_GCC_LIBS     = yes
+RK3328_CC_ENABLE_STATIC          = no
+
+
+####### RK339X devices:
+####### --------------
+
+####### KHADAS EDGE [https://www.khadas.com/edge]:
+HARDWARE_KHADAS_EDGE             = khadas-edge
+###                               |---HW-spec-handy-ruler-----------------------|
+KHADAS_EDGE_SPEC                 = Khadas Edge RK3399 \(Linux, GNU Libc based\)
+KHADAS_EDGE_USE_BUILT_GCC_LIBS   = yes
+KHADAS_EDGE_ENABLE_STATIC        = no
+
+####### LENOVO Leez SBC P710/PR710 [https://github.com/leezsbc/resources/wiki]:
+HARDWARE_LEEZ_P710               = leez-p710
+###                               |---HW-spec-handy-ruler-----------------------|
+LEEZ_P710_SPEC                   = Lenovo Leez P710 \(Linux, GNU Libc based\)
+LEEZ_P710_USE_BUILT_GCC_LIBS     = yes
+LEEZ_P710_ENABLE_STATIC          = no
+
+
+
+####### S8XX devices:
+####### ------------
+
+####### Amlogic S805 meson8b m201:
+HARDWARE_M201                    = m201
+###                               |---HW-spec-handy-ruler-----------------------|
+M201_SPEC                        = Amlogic M201 S805 \(Linux, GNU Libc based\)
+M201_USE_BUILT_GCC_LIBS          = yes
+M201_ENABLE_STATIC               = no
+
+HARDWARE_MXV                     = mxv
+###                               |---HW-spec-handy-ruler-----------------------|
+MXV_SPEC                         = MXV OTT Box S805 \(Linux, GNU Libc based\)
+MXV_USE_BUILT_GCC_LIBS           = yes
+MXV_ENABLE_STATIC                = no
+
+
+####### S9XX devices:
+####### ------------
+
+####### Amlogic S905 meson-gxbb p201:
+HARDWARE_P201                    = p201
+###                               |---HW-spec-handy-ruler-----------------------|
+P201_SPEC                        = Amlogic P201 S905 \(Linux, GNU Libc based\)
+P201_USE_BUILT_GCC_LIBS          = yes
+P201_ENABLE_STATIC               = no
+
+HARDWARE_NEXBOX_A95X             = nexbox-a95x
+###                               |---HW-spec-handy-ruler-----------------------|
+NEXBOX_A95X_SPEC                 = NEXBOX A95X S905 \(Linux, GNU Libc based\)
+NEXBOX_A95X_USE_BUILT_GCC_LIBS   = yes
+NEXBOX_A95X_ENABLE_STATIC        = no
+
+HARDWARE_ODROID_C2               = odroid-c2
+###                               |---HW-spec-handy-ruler-----------------------|
+ODROID_C2_SPEC                   = ODROID C2 S905 \(Linux, GNU Libc based\)
+ODROID_C2_USE_BUILT_GCC_LIBS     = yes
+ODROID_C2_ENABLE_STATIC          = no
+
+####### Amlogic S905X meson-gxl p212:
+HARDWARE_P212                    = p212
+###                               |---HW-spec-handy-ruler-----------------------|
+P212_SPEC                        = Amlogic P212 S905X \(Linux, GNU Libc based\)
+P212_USE_BUILT_GCC_LIBS          = yes
+P212_ENABLE_STATIC               = no
+
+HARDWARE_KHADAS_VIM              = khadas-vim
+###                               |---HW-spec-handy-ruler-----------------------|
+KHADAS_VIM_SPEC                  = Khadas Vim S905X \(Linux, GNU Libc based\)
+KHADAS_VIM_USE_BUILT_GCC_LIBS    = yes
+KHADAS_VIM_ENABLE_STATIC         = no
+
+####### Amlogic S912 meson-gxm q201:
+HARDWARE_Q201                    = q201
+###                               |---HW-spec-handy-ruler-----------------------|
+Q201_SPEC                        = Amlogic Q201 S912 \(Linux, GNU Libc based\)
+Q201_USE_BUILT_GCC_LIBS          = yes
+Q201_ENABLE_STATIC               = no
+
+HARDWARE_ENYBOX_X2               = enybox-x2
+###                               |---HW-spec-handy-ruler-----------------------|
+ENYBOX_X2_SPEC                   = Enybox X2 S912 \(Linux, GNU Libc based\)
+ENYBOX_X2_USE_BUILT_GCC_LIBS     = yes
+ENYBOX_X2_ENABLE_STATIC          = no
+
+HARDWARE_KHADAS_VIM2             = khadas-vim2
+###                               |---HW-spec-handy-ruler-----------------------|
+KHADAS_VIM2_SPEC                 = Khadas Vim2 S912 \(Linux, GNU Libc based\)
+KHADAS_VIM2_USE_BUILT_GCC_LIBS   = yes
+KHADAS_VIM2_ENABLE_STATIC        = no
+
+####### Amlogic A311D:
+HARDWARE_KHADAS_VIM3             = khadas-vim3
+###                               |---HW-spec-handy-ruler-----------------------|
+KHADAS_VIM3_SPEC                 = Khadas Vim3 A311D \(Linux, GNU Libc based\)
+KHADAS_VIM3_USE_BUILT_GCC_LIBS   = yes
+KHADAS_VIM3_ENABLE_STATIC        = no
+
+
+####### OpenPOWER (POWER8) devices:
+####### --------------------------
+
+####### IBM Power S824L Server (Most Significant Bit/Byte) [https://www-03.ibm.com/systems/power/hardware/s824l]:
+HARDWARE_S824L                   = s824l
+###                               |---HW-spec-handy-ruler-----------------------|
+S824L_SPEC                       = IBM Power S824L \(Linux, GNU Libc based\)
+S824L_USE_BUILT_GCC_LIBS         = yes
+S824L_ENABLE_STATIC              = no
+
+####### IBM Power S824L Server (Least Significant Bit/Byte):
+HARDWARE_S824L_LSB               = s824l-lsb
+###                               |---HW-spec-handy-ruler-----------------------|
+S824L_LSB_SPEC                   = IBM Power S824L LSB \(Linux, GNU Libc based\)
+S824L_LSB_USE_BUILT_GCC_LIBS     = yes
+S824L_LSB_ENABLE_STATIC          = no
+
+####### VESNIN Server (Most Significant Bit/Byte) [http://yadro.com/products/vesnin]:
+HARDWARE_VESNIN                  = vesnin
+###                               |---HW-spec-handy-ruler-----------------------|
+VESNIN_SPEC                      = Vesnin Server \(Linux, GNU Libc based\)
+VESNIN_USE_BUILT_GCC_LIBS        = yes
+VESNIN_ENABLE_STATIC             = no
+
+####### VESNIN Server (Least Significant Bit/Byte):
+HARDWARE_VESNIN_LSB              = vesnin-lsb
+###                               |---HW-spec-handy-ruler-----------------------|
+VESNIN_LSB_SPEC                  = Vesnin Server LSB \(Linux, GNU Libc based\)
+VESNIN_LSB_USE_BUILT_GCC_LIBS    = yes
+VESNIN_LSB_ENABLE_STATIC         = no
+
+
+####### RAPTOR devices (POWER9) [https://www.raptorcs.com]:
+####### --------------------------------------------------
+
+####### Talos II Secure Workstation [https://www.raptorcs.com/content/TL2WK2/intro.html]:
+HARDWARE_TL2WK2                  = tl2wk2
+###                               |---HW-spec-handy-ruler-----------------------|
+TL2WK2_SPEC                      = Talos II PC \(Linux, GNU Libc based\)
+TL2WK2_USE_BUILT_GCC_LIBS        = yes
+TL2WK2_ENABLE_STATIC             = no
+
+####### Talos II Secure Workstation (Least Significant Bit/Byte):
+HARDWARE_TL2WK2_LSB              = tl2wk2-lsb
+###                               |---HW-spec-handy-ruler-----------------------|
+TL2WK2_LSB_SPEC                  = Talos II PC LSB \(Linux, GNU Libc based\)
+TL2WK2_LSB_USE_BUILT_GCC_LIBS    = yes
+TL2WK2_LSB_ENABLE_STATIC         = no
+
+####### Talos II Rack Mount Development Platform [https://www.raptorcs.com/content/TL2SV2/intro.html]:
+HARDWARE_TL2SV2                  = tl2sv2
+###                               |---HW-spec-handy-ruler-----------------------|
+TL2SV2_SPEC                      = Talos II Server \(Linux, GNU Libc based\)
+TL2SV2_USE_BUILT_GCC_LIBS        = yes
+TL2SV2_ENABLE_STATIC             = no
+
+####### Talos II Rack Mount Development Platform (Least Significant Bit/Byte):
+HARDWARE_TL2SV2_LSB              = tl2sv2-lsb
+###                               |---HW-spec-handy-ruler-----------------------|
+TL2SV2_LSB_SPEC                  = Talos II Server LSB \(Linux, GNU Libc based\)
+TL2SV2_LSB_USE_BUILT_GCC_LIBS    = yes
+TL2SV2_LSB_ENABLE_STATIC         = no
+
+
+####### RISC-V devices:
+####### --------------------------------------------------
+
+####### SiFive SBC HiFive Unmatched [https://www.sifive.com/boards/hifive-unmatched]:
+HARDWARE_SIFIVE_U740             = sifive-u740
+###                               |---HW-spec-handy-ruler-----------------------|
+SIFIVE_U740_SPEC                 = SiFive U740 SBC \(Linux, GNU Libc based\)
+SIFIVE_U740_USE_BUILT_GCC_LIBS   = yes
+SIFIVE_U740_ENABLE_STATIC        = no
+
+
+
+HW_SPEC                = $(shell echo $($(shell echo $(HARDWARE) | tr '[a-z-]' '[A-Z_]')_SPEC) | sed "s, (.*),,")
+__USE_BUILT_GCC_LIBS__ = $(strip $(shell echo $($(shell echo $(HARDWARE) | tr '[a-z-]' '[A-Z_]')_USE_BUILT_GCC_LIBS)))
+__ENABLE_STATIC__      = $(strip $(shell echo $($(shell echo $(HARDWARE) | tr '[a-z-]' '[A-Z_]')_ENABLE_STATIC)))
+
+
+#######
+####### Hardware IDs:
+#######
+    INTEL_PC32_ID_STD = 0001
+    INTEL_PC64_ID_STD = 0002
+   INTEL_PC32M_ID_STD = 0004
+   INTEL_PC64M_ID_STD = 0008
+
+  EBOX_3350DX2_ID_STD = 0010
+ EBOX_3350DX2M_ID_STD = 0011
+
+          CB1N_ID_STD = 0100
+          CB1X_ID_STD = 0101
+          CB2N_ID_STD = 0200
+          CB2X_ID_STD = 0201
+          CB3N_ID_STD = 0300
+          CB3X_ID_STD = 0301
+
+         AT91S_ID_STD = 0400
+
+         NIT6Q_ID_STD = 0601
+     OKMX6DL_C_ID_STD = 0602
+      OKMX6Q_C_ID_STD = 0603
+        SK6ULL_ID_STD = 0604
+
+    BONE_BLACK_ID_STD = 0700
+
+     OMAP5UEVM_ID_STD = 0801
+     DRA7XXEVM_ID_STD = 0802
+
+          CI20_ID_STD = 0901
+     BAIKAL_T1_ID_STD = 0A01
+
+     BAIKAL_M1_ID_STD = 0B01
+
+      FFRK3288_ID_STD = 0C01
+         POIN2_ID_STD = 0C02
+     RK3328_CC_ID_STD = 0D01
+   KHADAS_EDGE_ID_STD = 0E01
+     LEEZ_P710_ID_STD = 0E02
+   ORANGE_PP2E_ID_STD = 0F01
+    NANOPI_NEO_ID_STD = 0D02
+     ORANGE_PP_ID_STD = 1001
+    ORANGE_PL2_ID_STD = 1002
+    WECHIP_TX6_ID_STD = 1003
+          M201_ID_STD = 1101
+           MXV_ID_STD = 1102
+          P201_ID_STD = 1201
+   NEXBOX_A95X_ID_STD = 1202
+     ODROID_C2_ID_STD = 1204
+          P212_ID_STD = 1401
+    KHADAS_VIM_ID_STD = 1402
+          Q201_ID_STD = 1501
+     ENYBOX_X2_ID_STD = 1502
+   KHADAS_VIM2_ID_STD = 1503
+
+   KHADAS_VIM3_ID_STD = 1600
+
+         S824L_ID_STD = 1700
+     S824L_LSB_ID_STD = 1701
+        VESNIN_ID_STD = 1800
+    VESNIN_LSB_ID_STD = 1801
+        TL2WK2_ID_STD = 1900
+    TL2WK2_LSB_ID_STD = 1901
+        TL2SV2_ID_STD = 1A00
+    TL2SV2_LSB_ID_STD = 1A01
+
+   SIFIVE_U740_ID_STD = 1B01
+
+
+
+#######
+####### Available Toolchains:
+#######
+
+#
+# NOTE:
+# ====
+#   Toolchain names defined by 'TOOLCHAIN_...' variables.
+#   Configuration variable names such as ..._ARCH, ..._DIR, ..._PATH should have prefix
+#   which is equal to $(TOOLCHAIN_...) in upper case letters and symbol '-' should be replaced with '_'.
+#   In other words the PREFIX is equal to PREFIX = $(shell echo $(TOOLCHAIN_...) | tr '[a-z-]' '[A-Z_]').
+#
+
+#   if variable ..._DEST_SYSROOT equal to "yes" then the switch --sysroot=$(TARGET_DEST_DIR)
+#   is used to say that cross compiler have to usre $(TARGET_DEST_DIR) as system root instead
+#   of compiler default sysroot $(TOOLCHAIN_PATH)/$(TARGET)/sys-root
+#   The '...' as usually shoul be equal to suffix of some 'TOOLCHAIN_...' name.
+
+
+
+# NOARCH
+TOOLCHAIN_NOARCH  = noarch
+
+NOARCH_ARCH       = noarch
+NOARCH_VERSION    =
+NOARCH_DIR        =
+NOARCH_PATH       =
+NOARCH_TARBALL    =
+
+NOARCH_HARDWARE_VARIANTS := $(HARDWARE_NOARCH)
+
+
+# BUILD machine
+TOOLCHAIN_BUILD_MACHINE      = build-machine
+
+BUILD_MACHINE_ARCH           = $(shell $(BUILDSYSTEM)/canonical-build)
+BUILD_MACHINE_VERSION        =
+BUILD_MACHINE_DIR            =
+BUILD_MACHINE_PATH           = /usr
+BUILD_MACHINE_TARBALL        =
+
+BUILD_MACHINE_HARDWARE_VARIANTS := $(HARDWARE_BUILD)
+
+
+
+# ======= I686-GLIBC =========================================================
+
+TOOLCHAIN_I686_GLIBC         = i686-glibc
+
+I686_GLIBC_ARCH              = i686-radix-linux-gnu
+I686_GLIBC_VERSION           = 1.7.2
+I686_GLIBC_DIR               = i686-PC-linux-glibc
+I686_GLIBC_PATH              = $(TOOLCHAINS_BASE_PATH)/$(I686_GLIBC_DIR)
+I686_GLIBC_TARBALL           = $(TOOLCHAINS_FTP_BASE)/$(I686_GLIBC_VERSION)/$(I686_GLIBC_DIR)-$(I686_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+I686_GLIBC_ARCH_DEFS         = -D__I686_GLIBC__=1
+I686_GLIBC_ARCH_FLAGS        = -march=i686 -mtune=i686
+
+I686_GLIBC_SYSROOT           = sys-root
+I686_GLIBC_DEST_SYSROOT      = yes
+
+I686_GLIBC_HAS_PATCHELF      = yes
+
+I686_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_INTEL_PC32) $(HARDWARE_INTEL_PC32M)
+
+
+
+# ======= X86_64-GLIBC =======================================================
+
+TOOLCHAIN_X86_64_GLIBC       = x86_64-glibc
+
+X86_64_GLIBC_ARCH            = x86_64-radix-linux-gnu
+X86_64_GLIBC_VERSION         = 1.7.2
+X86_64_GLIBC_DIR             = x86_64-PC-linux-glibc
+X86_64_GLIBC_PATH            = $(TOOLCHAINS_BASE_PATH)/$(X86_64_GLIBC_DIR)
+X86_64_GLIBC_TARBALL         = $(TOOLCHAINS_FTP_BASE)/$(X86_64_GLIBC_VERSION)/$(X86_64_GLIBC_DIR)-$(X86_64_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+X86_64_GLIBC_ARCH_DEFS       = -D__X86_64_GLIBC__=1
+X86_64_GLIBC_ARCH_FLAGS      = -march=x86-64
+
+X86_64_GLIBC_SYSROOT         = sys-root
+X86_64_GLIBC_DEST_SYSROOT    = yes
+
+X86_64_GLIBC_HAS_PATCHELF    = yes
+
+X86_64_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_INTEL_PC64) $(HARDWARE_INTEL_PC64M)
+
+
+
+# ======= I586-GLIBC =========================================================
+
+TOOLCHAIN_I586_GLIBC         = i586-glibc
+
+I586_GLIBC_ARCH              = i586-radix-linux-gnu
+I586_GLIBC_VERSION           = 1.7.2
+I586_GLIBC_DIR               = i586-PC-linux-glibc
+I586_GLIBC_PATH              = $(TOOLCHAINS_BASE_PATH)/$(I586_GLIBC_DIR)
+I586_GLIBC_TARBALL           = $(TOOLCHAINS_FTP_BASE)/$(I586_GLIBC_VERSION)/$(I586_GLIBC_DIR)-$(I586_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+I586_GLIBC_ARCH_DEFS         = -D__I586_GLIBC__=1
+I586_GLIBC_ARCH_FLAGS        = -march=i586 -mtune=i586
+
+I586_GLIBC_SYSROOT           = sys-root
+I586_GLIBC_DEST_SYSROOT      = yes
+
+I586_GLIBC_HAS_PATCHELF      = yes
+
+I586_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_EBOX_3350DX2) $(HARDWARE_EBOX_3350DX2M)
+
+
+
+# ======= A1X-NEWLIB =========================================================
+
+TOOLCHAIN_A1X_NEWLIB         = a1x-newlib
+
+A1X_NEWLIB_ARCH              = arm-none-eabi
+A1X_NEWLIB_VERSION           = 1.7.2
+A1X_NEWLIB_DIR               = arm-NONE-eabi-newlib
+A1X_NEWLIB_PATH              = $(TOOLCHAINS_BASE_PATH)/$(A1X_NEWLIB_DIR)
+A1X_NEWLIB_TARBALL           = $(TOOLCHAINS_FTP_BASE)/$(A1X_NEWLIB_VERSION)/$(A1X_NEWLIB_DIR)-$(A1X_NEWLIB_VERSION).$(TARBALL_SUFFIX)
+
+A1X_NEWLIB_ARCH_DEFS         = -D__ALLWINNER_1N__=1
+A1X_NEWLIB_ARCH_FLAGS        = -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=hard -mlittle-endian -fomit-frame-pointer
+
+A1X_NEWLIB_HARDWARE_VARIANTS := $(HARDWARE_CB1N)
+
+
+
+# ======= A1X-GLIBC ==========================================================
+
+TOOLCHAIN_A1X_GLIBC          = a1x-glibc
+
+A1X_GLIBC_ARCH               = arm-a1x-linux-gnueabihf
+A1X_GLIBC_VERSION            = 1.7.2
+A1X_GLIBC_DIR                = arm-A1X-linux-glibc
+A1X_GLIBC_PATH               = $(TOOLCHAINS_BASE_PATH)/$(A1X_GLIBC_DIR)
+A1X_GLIBC_TARBALL            = $(TOOLCHAINS_FTP_BASE)/$(A1X_GLIBC_VERSION)/$(A1X_GLIBC_DIR)-$(A1X_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+A1X_GLIBC_ARCH_DEFS          = -D__ALLWINNER_1X_GLIBC__=1
+A1X_GLIBC_ARCH_FLAGS         = -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=hard -mabi=aapcs-linux -fomit-frame-pointer
+
+A1X_GLIBC_SYSROOT            = sys-root
+A1X_GLIBC_DEST_SYSROOT       = yes
+
+A1X_GLIBC_HAS_PATCHELF       = yes
+
+A1X_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_CB1X)
+
+
+
+# ======= A2X-NEWLIB =========================================================
+
+TOOLCHAIN_A2X_NEWLIB         = a2x-newlib
+
+A2X_NEWLIB_ARCH              = arm-none-eabi
+A2X_NEWLIB_VERSION           = 1.7.2
+A2X_NEWLIB_DIR               = arm-NONE-eabi-newlib
+A2X_NEWLIB_PATH              = $(TOOLCHAINS_BASE_PATH)/$(A2X_NEWLIB_DIR)
+A2X_NEWLIB_TARBALL           = $(TOOLCHAINS_FTP_BASE)/$(A2X_NEWLIB_VERSION)/$(A2X_NEWLIB_DIR)-$(A2X_NEWLIB_VERSION).$(TARBALL_SUFFIX)
+
+A2X_NEWLIB_ARCH_DEFS         = -D__ALLWINNER_2N__=1
+A2X_NEWLIB_ARCH_FLAGS        = -march=armv7ve -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -mlittle-endian -fomit-frame-pointer
+
+A2X_NEWLIB_HARDWARE_VARIANTS := $(HARDWARE_CB2N) $(HARDWARE_CB3N)
+
+
+
+# ======= A2X-GLIBC =========================================================
+
+TOOLCHAIN_A2X_GLIBC          = a2x-glibc
+
+A2X_GLIBC_ARCH               = arm-a2x-linux-gnueabihf
+A2X_GLIBC_VERSION            = 1.7.2
+A2X_GLIBC_DIR                = arm-A2X-linux-glibc
+A2X_GLIBC_PATH               = $(TOOLCHAINS_BASE_PATH)/$(A2X_GLIBC_DIR)
+A2X_GLIBC_TARBALL            = $(TOOLCHAINS_FTP_BASE)/$(A2X_GLIBC_VERSION)/$(A2X_GLIBC_DIR)-$(A2X_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+A2X_GLIBC_ARCH_DEFS          = -D__ALLWINNER_2X_GLIBC__=1
+A2X_GLIBC_ARCH_FLAGS         = -march=armv7ve -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -mabi=aapcs-linux -fomit-frame-pointer
+
+A2X_GLIBC_SYSROOT            = sys-root
+A2X_GLIBC_DEST_SYSROOT       = yes
+
+A2X_GLIBC_HAS_PATCHELF       = yes
+
+A2X_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_CB2X) $(HARDWARE_CB3X)
+
+
+
+# ======= H3-GLIBC =========================================================
+
+TOOLCHAIN_H3_GLIBC           = h3-glibc
+
+H3_GLIBC_ARCH                = arm-h3-linux-gnueabihf
+H3_GLIBC_VERSION             = 1.7.2
+H3_GLIBC_DIR                 = arm-H3-linux-glibc
+H3_GLIBC_PATH                = $(TOOLCHAINS_BASE_PATH)/$(H3_GLIBC_DIR)
+H3_GLIBC_TARBALL             = $(TOOLCHAINS_FTP_BASE)/$(H3_GLIBC_VERSION)/$(H3_GLIBC_DIR)-$(H3_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+H3_GLIBC_ARCH_DEFS           = -D__ALLWINNER_H3_GLIBC__=1
+H3_GLIBC_ARCH_FLAGS          = -march=armv7ve -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -mabi=aapcs-linux -fomit-frame-pointer
+
+H3_GLIBC_SYSROOT             = sys-root
+H3_GLIBC_DEST_SYSROOT        = yes
+
+H3_GLIBC_HAS_PATCHELF        = yes
+
+H3_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_ORANGE_PP2E) $(HARDWARE_NANOPI_NEO)
+
+
+
+# ======= H5-GLIBC ======================================================
+
+TOOLCHAIN_H5_GLIBC           = h5-glibc
+
+H5_GLIBC_ARCH                = aarch64-h5-linux-gnu
+H5_GLIBC_VERSION             = 1.7.2
+H5_GLIBC_DIR                 = aarch64-H5-linux-glibc
+H5_GLIBC_PATH                = $(TOOLCHAINS_BASE_PATH)/$(H5_GLIBC_DIR)
+H5_GLIBC_TARBALL             = $(TOOLCHAINS_FTP_BASE)/$(H5_GLIBC_VERSION)/$(H5_GLIBC_DIR)-$(H5_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+H5_GLIBC_ARCH_DEFS           = -D__ALLWINNER_H5_GLIBC__=1
+H5_GLIBC_ARCH_FLAGS          = -march=armv8-a -mcpu=cortex-a53 -mabi=lp64 -fomit-frame-pointer
+
+H5_GLIBC_SYSROOT             = sys-root
+H5_GLIBC_DEST_SYSROOT        = yes
+
+H5_GLIBC_HAS_PATCHELF        = yes
+
+H5_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_ORANGE_PP) $(HARDWARE_ORANGE_PL2) $(HARDWARE_WECHIP_TX6)
+
+
+
+# ======= RK328X-GLIBC ======================================================
+
+TOOLCHAIN_RK328X_GLIBC       = rk328x-glibc
+
+RK328X_GLIBC_ARCH            = arm-rk328x-linux-gnueabihf
+RK328X_GLIBC_VERSION         = 1.7.2
+RK328X_GLIBC_DIR             = arm-RK328X-linux-glibc
+RK328X_GLIBC_PATH            = $(TOOLCHAINS_BASE_PATH)/$(RK328X_GLIBC_DIR)
+RK328X_GLIBC_TARBALL         = $(TOOLCHAINS_FTP_BASE)/$(RK328X_GLIBC_VERSION)/$(RK328X_GLIBC_DIR)-$(RK328X_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+RK328X_GLIBC_ARCH_DEFS       = -D__RK328X_GLIBC__=1
+RK328X_GLIBC_ARCH_FLAGS      = -march=armv7ve -mtune=cortex-a17 -mfpu=neon-vfpv4 -mfloat-abi=hard -mabi=aapcs-linux -fomit-frame-pointer
+
+RK328X_GLIBC_SYSROOT         = sys-root
+RK328X_GLIBC_DEST_SYSROOT    = yes
+
+RK328X_GLIBC_HAS_PATCHELF    = yes
+
+RK328X_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_FFRK3288) $(HARDWARE_POIN2)
+
+
+
+# ======= RK33XX-GLIBC ======================================================
+
+TOOLCHAIN_RK33XX_GLIBC       = rk33xx-glibc
+
+RK33XX_GLIBC_ARCH            = aarch64-rk33xx-linux-gnu
+RK33XX_GLIBC_VERSION         = 1.7.2
+RK33XX_GLIBC_DIR             = aarch64-RK33XX-linux-glibc
+RK33XX_GLIBC_PATH            = $(TOOLCHAINS_BASE_PATH)/$(RK33XX_GLIBC_DIR)
+RK33XX_GLIBC_TARBALL         = $(TOOLCHAINS_FTP_BASE)/$(RK33XX_GLIBC_VERSION)/$(RK33XX_GLIBC_DIR)-$(RK33XX_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+RK33XX_GLIBC_ARCH_DEFS       = -D__RK33XX_GLIBC__=1
+RK33XX_GLIBC_ARCH_FLAGS      = -march=armv8-a -mcpu=cortex-a53 -mabi=lp64 -fomit-frame-pointer
+
+RK33XX_GLIBC_SYSROOT         = sys-root
+RK33XX_GLIBC_DEST_SYSROOT    = yes
+
+RK33XX_GLIBC_HAS_PATCHELF    = yes
+
+RK33XX_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_RK3328_CC)
+
+
+
+# ======= RK339X-GLIBC ======================================================
+
+TOOLCHAIN_RK339X_GLIBC       = rk339x-glibc
+
+RK339X_GLIBC_ARCH            = aarch64-rk339x-linux-gnu
+RK339X_GLIBC_VERSION         = 1.7.2
+RK339X_GLIBC_DIR             = aarch64-RK339X-linux-glibc
+RK339X_GLIBC_PATH            = $(TOOLCHAINS_BASE_PATH)/$(RK339X_GLIBC_DIR)
+RK339X_GLIBC_TARBALL         = $(TOOLCHAINS_FTP_BASE)/$(RK339X_GLIBC_VERSION)/$(RK339X_GLIBC_DIR)-$(RK339X_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+RK339X_GLIBC_ARCH_DEFS       = -D__RK339X_GLIBC__=1
+RK339X_GLIBC_ARCH_FLAGS      = -march=armv8-a -mcpu=cortex-a72.cortex-a53 -mabi=lp64 -fomit-frame-pointer
+
+RK339X_GLIBC_SYSROOT         = sys-root
+RK339X_GLIBC_DEST_SYSROOT    = yes
+
+RK339X_GLIBC_HAS_PATCHELF    = yes
+
+RK339X_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_KHADAS_EDGE) $(HARDWARE_LEEZ_P710)
+
+
+
+# ======= S8XX-GLIBC =========================================================
+
+TOOLCHAIN_S8XX_GLIBC         = s8xx-glibc
+
+S8XX_GLIBC_ARCH              = arm-s8xx-linux-gnueabihf
+S8XX_GLIBC_VERSION           = 1.7.2
+S8XX_GLIBC_DIR               = arm-S8XX-linux-glibc
+S8XX_GLIBC_PATH              = $(TOOLCHAINS_BASE_PATH)/$(S8XX_GLIBC_DIR)
+S8XX_GLIBC_TARBALL           = $(TOOLCHAINS_FTP_BASE)/$(S8XX_GLIBC_VERSION)/$(S8XX_GLIBC_DIR)-$(S8XX_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+S8XX_GLIBC_ARCH_DEFS         = -D__AMLOGIC_S8XX_GLIBC__=1
+S8XX_GLIBC_ARCH_FLAGS        = -march=armv7-a -mtune=cortex-a5 -mfpu=neon -mfloat-abi=hard -mfpu=neon -mabi=aapcs-linux -fomit-frame-pointer
+
+S8XX_GLIBC_SYSROOT           = sys-root
+S8XX_GLIBC_DEST_SYSROOT      = yes
+
+S8XX_GLIBC_HAS_PATCHELF      = yes
+
+S8XX_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_M201) $(HARDWARE_MXV)
+
+
+
+# ======= S9XX-GLIBC =========================================================
+
+TOOLCHAIN_S9XX_GLIBC         = s9xx-glibc
+
+S9XX_GLIBC_ARCH              = aarch64-s9xx-linux-gnu
+S9XX_GLIBC_VERSION           = 1.7.2
+S9XX_GLIBC_DIR               = aarch64-S9XX-linux-glibc
+S9XX_GLIBC_PATH              = $(TOOLCHAINS_BASE_PATH)/$(S9XX_GLIBC_DIR)
+S9XX_GLIBC_TARBALL           = $(TOOLCHAINS_FTP_BASE)/$(S9XX_GLIBC_VERSION)/$(S9XX_GLIBC_DIR)-$(S9XX_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+S9XX_GLIBC_ARCH_DEFS         = -D__AMLOGIC_S9XX_GLIBC__=1
+S9XX_GLIBC_ARCH_FLAGS        = -march=armv8-a -mcpu=cortex-a53 -mabi=lp64 -fomit-frame-pointer
+
+S9XX_GLIBC_SYSROOT           = sys-root
+S9XX_GLIBC_DEST_SYSROOT      = yes
+
+S9XX_GLIBC_HAS_PATCHELF      = yes
+
+S9XX_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_P201) $(HARDWARE_NEXBOX_A95X) \
+                                                 $(HARDWARE_ODROID_C2)   \
+                                $(HARDWARE_P212) $(HARDWARE_KHADAS_VIM)  \
+                                $(HARDWARE_Q201) $(HARDWARE_ENYBOX_X2)   \
+                                                 $(HARDWARE_KHADAS_VIM2)
+
+
+# ======= A311X-GLIBC ========================================================
+
+TOOLCHAIN_A311X_GLIBC        = a311x-glibc
+
+A311X_GLIBC_ARCH             = aarch64-a311x-linux-gnu
+A311X_GLIBC_VERSION          = 1.7.2
+A311X_GLIBC_DIR              = aarch64-A311X-linux-glibc
+A311X_GLIBC_PATH             = $(TOOLCHAINS_BASE_PATH)/$(A311X_GLIBC_DIR)
+A311X_GLIBC_TARBALL          = $(TOOLCHAINS_FTP_BASE)/$(A311X_GLIBC_VERSION)/$(A311X_GLIBC_DIR)-$(A311X_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+A311X_GLIBC_ARCH_DEFS        = -D__AMLOGIC_A311X_GLIBC__=1
+A311X_GLIBC_ARCH_FLAGS       = -march=armv8-a -mcpu=cortex-a73.cortex-a53 -mabi=lp64 -fomit-frame-pointer
+
+A311X_GLIBC_SYSROOT          = sys-root
+A311X_GLIBC_DEST_SYSROOT     = yes
+
+A311X_GLIBC_HAS_PATCHELF     = yes
+
+A311X_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_KHADAS_VIM3)
+
+
+# ======= AT91SAM7S-NEWLIB ===================================================
+
+TOOLCHAIN_AT91SAM7S_NEWLIB   = at91sam7s-newlib
+
+AT91SAM7S_NEWLIB_ARCH        = arm-at91sam7s-eabi
+AT91SAM7S_NEWLIB_VERSION     = 1.7.2
+AT91SAM7S_NEWLIB_DIR         = arm-AT91SAM7S-eabi-newlib
+AT91SAM7S_NEWLIB_PATH        = $(TOOLCHAINS_BASE_PATH)/$(AT91SAM7S_NEWLIB_DIR)
+AT91SAM7S_NEWLIB_TARBALL     = $(TOOLCHAINS_FTP_BASE)/$(AT91SAM7S_NEWLIB_VERSION)/$(AT91SAM7S_NEWLIB_DIR)-$(AT91SAM7S_NEWLIB_VERSION).$(TARBALL_SUFFIX)
+
+AT91SAM7S_NEWLIB_ARCH_DEFS   = -D__AT91SAM7S__=1
+AT91SAM7S_NEWLIB_ARCH_FLAGS  = -mcpu=arm7tdmi -mbig-endian -fomit-frame-pointer
+
+AT91SAM7S_NEWLIB_HARDWARE_VARIANTS := $(HARDWARE_AT91S)
+
+
+
+# ======= IMX6-GLIBC ======================================================
+
+TOOLCHAIN_IMX6_GLIBC         = imx6-glibc
+
+IMX6_GLIBC_ARCH              = arm-imx6-linux-gnueabihf
+IMX6_GLIBC_VERSION           = 1.7.2
+IMX6_GLIBC_DIR               = arm-IMX6-linux-glibc
+IMX6_GLIBC_PATH              = $(TOOLCHAINS_BASE_PATH)/$(IMX6_GLIBC_DIR)
+IMX6_GLIBC_TARBALL           = $(TOOLCHAINS_FTP_BASE)/$(IMX6_GLIBC_VERSION)/$(IMX6_GLIBC_DIR)-$(IMX6_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+IMX6_GLIBC_ARCH_DEFS         = -D__IMX6_GLIBC__=1
+IMX6_GLIBC_ARCH_FLAGS        = -march=armv7-a -mtune=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard -mabi=aapcs-linux -fomit-frame-pointer
+
+IMX6_GLIBC_SYSROOT           = sys-root
+IMX6_GLIBC_DEST_SYSROOT      = yes
+
+IMX6_GLIBC_HAS_PATCHELF      = yes
+
+IMX6_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_NIT6Q) $(HARDWARE_OKMX6DL_C) $(HARDWARE_OKMX6Q_C)
+
+
+
+# ======= IMX6ULL-GLIBC ======================================================
+
+TOOLCHAIN_IMX6ULL_GLIBC      = imx6ull-glibc
+
+IMX6ULL_GLIBC_ARCH           = arm-imx6ull-linux-gnueabihf
+IMX6ULL_GLIBC_VERSION        = 1.7.2
+IMX6ULL_GLIBC_DIR            = arm-IMX6ULL-linux-glibc
+IMX6ULL_GLIBC_PATH           = $(TOOLCHAINS_BASE_PATH)/$(IMX6ULL_GLIBC_DIR)
+IMX6ULL_GLIBC_TARBALL        = $(TOOLCHAINS_FTP_BASE)/$(IMX6ULL_GLIBC_VERSION)/$(IMX6ULL_GLIBC_DIR)-$(IMX6ULL_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+IMX6ULL_GLIBC_ARCH_DEFS      = -D__IMX6ULL_GLIBC__=1
+IMX6ULL_GLIBC_ARCH_FLAGS     = -march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -mabi=aapcs-linux -fomit-frame-pointer
+
+IMX6ULL_GLIBC_SYSROOT        = sys-root
+IMX6ULL_GLIBC_DEST_SYSROOT   = yes
+
+IMX6ULL_GLIBC_HAS_PATCHELF   = yes
+
+IMX6ULL_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_SK6ULL)
+
+
+
+# ======= AM335X-GLIBC =======================================================
+
+TOOLCHAIN_AM335X_GLIBC       = am335x-glibc
+
+AM335X_GLIBC_ARCH            = arm-am335x-linux-gnueabihf
+AM335X_GLIBC_VERSION         = 1.7.2
+AM335X_GLIBC_DIR             = arm-AM335X-linux-glibc
+AM335X_GLIBC_PATH            = $(TOOLCHAINS_BASE_PATH)/$(AM335X_GLIBC_DIR)
+AM335X_GLIBC_TARBALL         = $(TOOLCHAINS_FTP_BASE)/$(AM335X_GLIBC_VERSION)/$(AM335X_GLIBC_DIR)-$(AM335X_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+AM335X_GLIBC_ARCH_DEFS       = -D__AM335X_GLIBC__=1
+AM335X_GLIBC_ARCH_FLAGS      = -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=hard -mabi=aapcs-linux -fomit-frame-pointer
+
+AM335X_GLIBC_SYSROOT         = sys-root
+AM335X_GLIBC_DEST_SYSROOT    = yes
+
+AM335X_GLIBC_HAS_PATCHELF    = yes
+
+AM335X_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_BONE_BLACK)
+
+
+
+# ======= OMAP543X-GLIBC =====================================================
+
+TOOLCHAIN_OMAP543X_GLIBC     = omap543x-glibc
+
+OMAP543X_GLIBC_ARCH          = arm-omap543x-linux-gnueabihf
+OMAP543X_GLIBC_VERSION       = 1.7.2
+OMAP543X_GLIBC_DIR           = arm-OMAP543X-linux-glibc
+OMAP543X_GLIBC_PATH          = $(TOOLCHAINS_BASE_PATH)/$(OMAP543X_GLIBC_DIR)
+OMAP543X_GLIBC_TARBALL       = $(TOOLCHAINS_FTP_BASE)/$(OMAP543X_GLIBC_VERSION)/$(OMAP543X_GLIBC_DIR)-$(OMAP543X_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+OMAP543X_GLIBC_ARCH_DEFS     = -D__OMAP543X_GLIBC__=1
+OMAP543X_GLIBC_ARCH_FLAGS    = -march=armv7ve -mtune=cortex-a15 -mfpu=neon-vfpv4 -mfloat-abi=hard -mabi=aapcs-linux -fomit-frame-pointer
+
+OMAP543X_GLIBC_SYSROOT       = sys-root
+OMAP543X_GLIBC_DEST_SYSROOT  = yes
+
+OMAP543X_GLIBC_HAS_PATCHELF  = yes
+
+OMAP543X_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_OMAP5UEVM) $(HARDWARE_DRA7XXEVM)
+
+
+
+# ======= JZ47XX-GLIBC =======================================================
+
+TOOLCHAIN_JZ47XX_GLIBC       = jz47xx-glibc
+
+JZ47XX_GLIBC_ARCH            = mipsel-jz47xx-linux-gnu
+JZ47XX_GLIBC_VERSION         = 1.7.2
+JZ47XX_GLIBC_DIR             = mipsel-JZ47XX-linux-glibc
+JZ47XX_GLIBC_PATH            = $(TOOLCHAINS_BASE_PATH)/$(JZ47XX_GLIBC_DIR)
+JZ47XX_GLIBC_TARBALL         = $(TOOLCHAINS_FTP_BASE)/$(JZ47XX_GLIBC_VERSION)/$(JZ47XX_GLIBC_DIR)-$(JZ47XX_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+JZ47XX_GLIBC_ARCH_DEFS       = -D__JZ47XX_GLIBC__=1
+JZ47XX_GLIBC_ARCH_FLAGS      = -march=mips32r2 -mhard-float
+JZ47XX_GLIBC_OPTIMIZATION    = -O2
+
+JZ47XX_GLIBC_SYSROOT         = sys-root
+JZ47XX_GLIBC_DEST_SYSROOT    = yes
+
+JZ47XX_GLIBC_HAS_PATCHELF    = yes
+
+JZ47XX_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_CI20)
+
+
+
+# ======= P5600-GLIBC =======================================================
+
+TOOLCHAIN_P5600_GLIBC        = p5600-glibc
+
+P5600_GLIBC_ARCH             = mipsel-p5600-linux-gnu
+P5600_GLIBC_VERSION          = 1.7.2
+P5600_GLIBC_DIR              = mipsel-P5600-linux-glibc
+P5600_GLIBC_PATH             = $(TOOLCHAINS_BASE_PATH)/$(P5600_GLIBC_DIR)
+P5600_GLIBC_TARBALL          = $(TOOLCHAINS_FTP_BASE)/$(P5600_GLIBC_VERSION)/$(P5600_GLIBC_DIR)-$(P5600_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+P5600_GLIBC_ARCH_DEFS        = -D__P5600_GLIBC__=1
+P5600_GLIBC_ARCH_FLAGS       = -march=mips32r5 -mtune=p5600 -mhard-float
+P5600_GLIBC_OPTIMIZATION     = -O2
+
+P5600_GLIBC_SYSROOT          = sys-root
+P5600_GLIBC_DEST_SYSROOT     = yes
+
+P5600_GLIBC_HAS_PATCHELF     = yes
+
+P5600_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_BAIKAL_T1)
+
+
+# ======= M1000-GLIBC =======================================================
+
+TOOLCHAIN_M1000_GLIBC        = m1000-glibc
+
+M1000_GLIBC_ARCH             = aarch64-m1000-linux-gnu
+M1000_GLIBC_VERSION          = 1.7.2
+M1000_GLIBC_DIR              = aarch64-M1000-linux-glibc
+M1000_GLIBC_PATH             = $(TOOLCHAINS_BASE_PATH)/$(M1000_GLIBC_DIR)
+M1000_GLIBC_TARBALL          = $(TOOLCHAINS_FTP_BASE)/$(M1000_GLIBC_VERSION)/$(M1000_GLIBC_DIR)-$(M1000_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+M1000_GLIBC_ARCH_DEFS        = -D__M1000_GLIBC__=1
+M1000_GLIBC_ARCH_FLAGS       = -march=armv8-a -mcpu=cortex-a57 -mabi=lp64 -fomit-frame-pointer
+
+M1000_GLIBC_SYSROOT          = sys-root
+M1000_GLIBC_DEST_SYSROOT     = yes
+
+M1000_GLIBC_HAS_PATCHELF     = yes
+
+M1000_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_BAIKAL_M1)
+
+
+
+# ======= POWER8-GLIBC ======================================================
+
+TOOLCHAIN_POWER8_GLIBC       = power8-glibc
+
+POWER8_GLIBC_ARCH            = ppc64-power8-linux-gnu
+POWER8_GLIBC_VERSION         = 1.7.2
+POWER8_GLIBC_DIR             = ppc64-POWER8-linux-glibc
+POWER8_GLIBC_PATH            = $(TOOLCHAINS_BASE_PATH)/$(POWER8_GLIBC_DIR)
+POWER8_GLIBC_TARBALL         = $(TOOLCHAINS_FTP_BASE)/$(POWER8_GLIBC_VERSION)/$(POWER8_GLIBC_DIR)-$(POWER8_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+POWER8_GLIBC_ARCH_DEFS       = -D__POWER8_GLIBC__=1
+POWER8_GLIBC_ARCH_FLAGS      = -mcpu=power8 -mlong-double-128
+POWER8_GLIBC_OPTIMIZATION    = -O3
+
+POWER8_GLIBC_SYSROOT         = sys-root
+POWER8_GLIBC_DEST_SYSROOT    = yes
+
+POWER8_GLIBC_HAS_PATCHELF    = yes
+
+POWER8_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_S824L) $(HARDWARE_VESNIN)
+
+
+# ======= POWER8LE-GLIBC ====================================================
+
+TOOLCHAIN_POWER8LE_GLIBC     = power8le-glibc
+
+POWER8LE_GLIBC_ARCH          = ppc64le-power8-linux-gnu
+POWER8LE_GLIBC_VERSION       = 1.7.2
+POWER8LE_GLIBC_DIR           = ppc64le-POWER8-linux-glibc
+POWER8LE_GLIBC_PATH          = $(TOOLCHAINS_BASE_PATH)/$(POWER8LE_GLIBC_DIR)
+POWER8LE_GLIBC_TARBALL       = $(TOOLCHAINS_FTP_BASE)/$(POWER8LE_GLIBC_VERSION)/$(POWER8LE_GLIBC_DIR)-$(POWER8LE_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+POWER8LE_GLIBC_ARCH_DEFS     = -D__POWER8LE_GLIBC__=1
+POWER8LE_GLIBC_ARCH_FLAGS    = -mcpu=power8 -mlong-double-128
+POWER8LE_GLIBC_OPTIMIZATION  = -O3
+
+POWER8LE_GLIBC_SYSROOT       = sys-root
+POWER8LE_GLIBC_DEST_SYSROOT  = yes
+
+POWER8LE_GLIBC_HAS_PATCHELF  = yes
+
+POWER8LE_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_S824L_LSB) $(HARDWARE_VESNIN_LSB)
+
+
+
+# ======= POWER9-GLIBC ======================================================
+
+TOOLCHAIN_POWER9_GLIBC       = power9-glibc
+
+POWER9_GLIBC_ARCH            = ppc64-power9-linux-gnu
+POWER9_GLIBC_VERSION         = 1.7.2
+POWER9_GLIBC_DIR             = ppc64-POWER9-linux-glibc
+POWER9_GLIBC_PATH            = $(TOOLCHAINS_BASE_PATH)/$(POWER9_GLIBC_DIR)
+POWER9_GLIBC_TARBALL         = $(TOOLCHAINS_FTP_BASE)/$(POWER9_GLIBC_VERSION)/$(POWER9_GLIBC_DIR)-$(POWER9_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+POWER9_GLIBC_ARCH_DEFS       = -D__POWER9_GLIBC__=1
+POWER9_GLIBC_ARCH_FLAGS      = -mcpu=power9 -mlong-double-128
+POWER9_GLIBC_OPTIMIZATION    = -O3
+
+POWER9_GLIBC_SYSROOT         = sys-root
+POWER9_GLIBC_DEST_SYSROOT    = yes
+
+POWER9_GLIBC_HAS_PATCHELF    = yes
+
+POWER9_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_TL2WK2) $(HARDWARE_TL2SV2)
+
+
+# ======= POWER9LE-GLIBC ====================================================
+
+TOOLCHAIN_POWER9LE_GLIBC     = power9le-glibc
+
+POWER9LE_GLIBC_ARCH          = ppc64le-power9-linux-gnu
+POWER9LE_GLIBC_VERSION       = 1.7.2
+POWER9LE_GLIBC_DIR           = ppc64le-POWER9-linux-glibc
+POWER9LE_GLIBC_PATH          = $(TOOLCHAINS_BASE_PATH)/$(POWER9LE_GLIBC_DIR)
+POWER9LE_GLIBC_TARBALL       = $(TOOLCHAINS_FTP_BASE)/$(POWER9LE_GLIBC_VERSION)/$(POWER9LE_GLIBC_DIR)-$(POWER9LE_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+POWER9LE_GLIBC_ARCH_DEFS     = -D__POWER9LE_GLIBC__=1
+POWER9LE_GLIBC_ARCH_FLAGS    = -mcpu=power9 -mlong-double-128
+POWER9LE_GLIBC_OPTIMIZATION  = -O3
+
+POWER9LE_GLIBC_SYSROOT       = sys-root
+POWER9LE_GLIBC_DEST_SYSROOT  = yes
+
+POWER9LE_GLIBC_HAS_PATCHELF  = yes
+
+POWER9LE_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_TL2WK2_LSB) $(HARDWARE_TL2SV2_LSB)
+
+
+
+# ======= RISCV64-GLIBC =====================================================
+
+TOOLCHAIN_RISCV64_GLIBC      = riscv64-glibc
+
+RISCV64_GLIBC_ARCH           = riscv64-rv64gc-linux-gnu
+RISCV64_GLIBC_VERSION        = 1.7.2
+RISCV64_GLIBC_DIR            = riscv64-RV64GC-linux-glibc
+RISCV64_GLIBC_PATH           = $(TOOLCHAINS_BASE_PATH)/$(RISCV64_GLIBC_DIR)
+RISCV64_GLIBC_TARBALL        = $(TOOLCHAINS_FTP_BASE)/$(RISCV64_GLIBC_VERSION)/$(RISCV64_GLIBC_DIR)-$(RISCV64_GLIBC_VERSION).$(TARBALL_SUFFIX)
+
+RISCV64_GLIBC_ARCH_DEFS      = -D__RV64GC_GLIBC__=1
+RISCV64_GLIBC_ARCH_FLAGS     = -march=rv64gc -mcmodel=medany
+RISCV64_GLIBC_OPTIMIZATION   = -O3
+
+RISCV64_GLIBC_SYSROOT        = sys-root
+RISCV64_GLIBC_DEST_SYSROOT   = yes
+
+RISCV64_GLIBC_HAS_PATCHELF   = yes
+
+RISCV64_GLIBC_HARDWARE_VARIANTS := $(HARDWARE_SIFIVE_U740)
+
+
+
+CONSTANTS_MK=1
+endif
Index: build-system-1.8.1/target-setup.mk
===================================================================
--- build-system-1.8.1/target-setup.mk	(nonexistent)
+++ build-system-1.8.1/target-setup.mk	(revision 323)
@@ -0,0 +1,548 @@
+# include once
+ifndef TARGET_SETUP_MK
+
+
+include $(BUILDSYSTEM)/constants.mk
+
+
+
+################################################################
+# Get hw_id & hw_name by HARDWARE functions:
+#
+# hw_id(), hw_name()
+#
+hw_id = $($(strip $(foreach v, $(filter-out HARDWARE_NAMES HARDWARE_ALL,$(filter HARDWARE_%, $(.VARIABLES))),  \
+                    $(if $(filter $1, $($(v))),                      \
+                      $(addsuffix _ID_STD,$(subst HARDWARE_,,$(v))), \
+                     ))))
+
+
+hw_name = $(strip $(foreach v, $(filter-out HARDWARE_NAMES HARDWARE_ALL,$(filter HARDWARE_%, $(.VARIABLES))), \
+                    $(if $(filter $1, $($(v))),$(subst HARDWARE_,,$(v)),)))
+
+# usage:
+#   HW_ID = $(call hw_id,$(HARDWARE))
+#
+# Get hw_id & hw_name by HARDWARE function.
+################################################################
+
+
+HW_DEFS = $(strip                                                                       \
+            $(foreach v,                                                                \
+              $(filter-out  HARDWARE_ALL HARDWARE_NAMES HARDWARE_NOARCH HARDWARE_BUILD, \
+                $(filter HARDWARE_%, $(.VARIABLES))),                                   \
+                  -D$(subst HARDWARE_,,$(v))=$($(strip $(addsuffix _ID_STD,$(subst HARDWARE_,,$(v)))))))
+
+
+################################################################
+# Is the switch --sysroot=$(TARGET_DEST_DIR) should be used.
+#
+sysroot = $($(strip                                          \
+              $(foreach v, $(filter TOOLCHAIN_%,             \
+                             $(filter-out TOOLCHAIN_ALL      \
+                                          TOOLCHAIN_NAMES    \
+                                          TOOLCHAIN_DIR      \
+                                          TOOLCHAIN_PATH     \
+                                          TOOLCHAIN_VERSION  \
+                                          TOOLCHAIN_INCPATH, \
+                                          $(.VARIABLES))),   \
+                $(if $(filter $1, $($(v))),                  \
+                  $(addsuffix _DEST_SYSROOT,$(subst TOOLCHAIN_,,$(v))), \
+                 ))))
+
+# usage:
+#   enable_sysroot = $(call sysroot,$(TOOLCHAIN))
+#
+# Is the switch --sysroot=$(TARGET_DEST_DIR) should be used.
+################################################################
+
+
+################################################################
+# The name of toolchain sysroot directory (default 'sys-root').
+#
+
+# This is a last directory name in the absolute toolchain
+# sysroot path. If this name is 'sys-root' then absolute
+# toolchain system root is placed in
+#
+#   $(TOOLCHAIN_PATH)/$(TARGET)/sys-root
+#
+# directory. If this function returns "", then toolchain
+# has been built without '--with-sysroot=DIR' switch.
+
+toolchain-sysroot = $($(strip                                          \
+                        $(foreach v, $(filter TOOLCHAIN_%,             \
+                                       $(filter-out TOOLCHAIN_ALL      \
+                                                    TOOLCHAIN_NAMES    \
+                                                    TOOLCHAIN_DIR      \
+                                                    TOOLCHAIN_PATH     \
+                                                    TOOLCHAIN_VERSION  \
+                                                    TOOLCHAIN_INCPATH, \
+                                                    $(.VARIABLES))),   \
+                          $(if $(filter $1, $($(v))),                  \
+                            $(addsuffix _SYSROOT,$(subst TOOLCHAIN_,,$(v))), \
+                           ))))
+
+# usage:
+#   toolchain_sysroot = $(call toolchain-sysroot,$(TOOLCHAIN))
+#
+# The name of toolchain sysroot directory.
+################################################################
+
+
+################################################################
+# Is there 'patchelf' utility in the toolchain.
+#
+has-patchelf = $($(strip                                          \
+                   $(foreach v, $(filter TOOLCHAIN_%,             \
+                                  $(filter-out TOOLCHAIN_ALL      \
+                                               TOOLCHAIN_NAMES    \
+                                               TOOLCHAIN_DIR      \
+                                               TOOLCHAIN_PATH     \
+                                               TOOLCHAIN_VERSION  \
+                                               TOOLCHAIN_INCPATH, \
+                                               $(.VARIABLES))),   \
+                     $(if $(filter $1, $($(v))),                  \
+                      $(addsuffix _HAS_PATCHELF,$(subst TOOLCHAIN_,,$(v))), \
+                     ))))
+
+# usage:
+#   enable_patchelf = $(call has-patchelf,$(TOOLCHAIN))
+#
+# Is there 'patchelf' utility in the toolchain.
+################################################################
+
+
+#######
+####### Setup ccache:
+#######
+
+ifeq ($(NO_CCACHE),)
+CCACHE = /usr/bin/ccache$(space)
+
+ifeq ($(wildcard $(CCACHE)),)
+$(info )
+$(info #######)
+$(info ####### Please install 'ccache' package)
+$(info ####### or disable ccache with "NO_CCACHE=1 make ...")
+$(info #######)
+$(info )
+$(error Error: ccache not found)
+endif
+
+ifeq ($(wildcard $(CACHED_CC_OUTPUT)),)
+$(info )
+$(info #######)
+$(info ####### Please create directory $(CACHED_CC_OUTPUT) for cached compiler output)
+$(info ####### or disable ccache with "NO_CCACHE=1 make ...")
+$(info #######)
+$(info )
+$(error Error: cached compiler output directory doesn't exist)
+endif
+
+export CCACHE_BASEDIR = $(TOP_BUILD_DIR_ABS)
+export CCACHE_DIR     = $(CACHED_CC_OUTPUT)
+export CCACHE_UMASK   = 000
+
+unexport CCACHE_PREFIX
+else
+CCACHE =
+endif
+
+
+#######
+####### Setup current toolchain variables:
+#######
+
+ifeq ($(TOOLCHAIN),$(TOOLCHAIN_BUILD_MACHINE))
+TOOLCHAIN_PATH     = $($(shell echo $(TOOLCHAIN) | tr '[a-z-]' '[A-Z_]')_PATH)
+else
+TOOLCHAIN_PATH     = $($(shell echo $(TOOLCHAIN) | tr '[a-z-]' '[A-Z_]')_PATH)/$(TOOLCHAIN_VERSION)
+endif
+
+TOOLCHAIN_TARBALL  = $($(shell echo $(TOOLCHAIN) | tr '[a-z-]' '[A-Z_]')_TARBALL)
+TOOLCHAIN_VERSION  = $($(shell echo $(TOOLCHAIN) | tr '[a-z-]' '[A-Z_]')_VERSION)
+TOOLCHAIN_DIR      = $($(shell echo $(TOOLCHAIN) | tr '[a-z-]' '[A-Z_]')_DIR)
+TARGET             = $($(shell echo $(TOOLCHAIN) | tr '[a-z-]' '[A-Z_]')_ARCH)
+
+ARCH_DEFS         ?= $($(shell echo $(TOOLCHAIN) | tr '[a-z-]' '[A-Z_]')_ARCH_DEFS)
+ARCH_FLAGS        ?= $($(shell echo $(TOOLCHAIN) | tr '[a-z-]' '[A-Z_]')_ARCH_FLAGS)
+ARCH_OPTIMIZATION ?= $($(shell echo $(TOOLCHAIN) | tr '[a-z-]' '[A-Z_]')_OPTIMIZATION)
+
+ifeq ($(filter $(TOOLCHAIN),$(TOOLCHAIN_NOARCH) $(TOOLCHAIN_BUILD_MACHINE)),)
+HW_FLAGS           = -D__HARDWARE__=$(call hw_id,$(HARDWARE)) $(HW_DEFS)
+endif
+
+
+ifeq ($(filter $(TOOLCHAIN), $(TOOLCHAIN_NOARCH) $(TOOLCHAIN_BUILD_MACHINE)),)
+CC                 = $(CCACHE)$(TOOLCHAIN_PATH)/bin/$(TARGET)-gcc
+CXX                = $(CCACHE)$(TOOLCHAIN_PATH)/bin/$(TARGET)-g++
+ADDR2LINE          = $(TOOLCHAIN_PATH)/bin/$(TARGET)-addr2line
+AS                 = $(TOOLCHAIN_PATH)/bin/$(TARGET)-as
+AR                 = $(TOOLCHAIN_PATH)/bin/$(TARGET)-ar
+LD                 = $(TOOLCHAIN_PATH)/bin/$(TARGET)-ld
+RANLIB             = $(TOOLCHAIN_PATH)/bin/$(TARGET)-ranlib
+SIZE               = $(TOOLCHAIN_PATH)/bin/$(TARGET)-size
+STRIP              = $(TOOLCHAIN_PATH)/bin/$(TARGET)-strip
+OBJCOPY            = $(TOOLCHAIN_PATH)/bin/$(TARGET)-objcopy
+OBJDUMP            = $(TOOLCHAIN_PATH)/bin/$(TARGET)-objdump
+READELF            = $(TOOLCHAIN_PATH)/bin/$(TARGET)-readelf
+NM                 = $(TOOLCHAIN_PATH)/bin/$(TARGET)-nm
+CROSS_PREFIX       = $(TOOLCHAIN_PATH)/bin/$(TARGET)-
+PATCHELF           = $(strip                                                 \
+                       $(if $(filter yes,$(call has-patchelf,$(TOOLCHAIN))), \
+                         $(TOOLCHAIN_PATH)/bin/$(TARGET)-patchelf,           \
+                        ))
+else
+ifeq ($(TOOLCHAIN),$(TOOLCHAIN_BUILD_MACHINE))
+CC                 = $(TOOLCHAIN_PATH)/bin/gcc
+CXX                = $(TOOLCHAIN_PATH)/bin/g++
+ADDR2LINE          = $(TOOLCHAIN_PATH)/bin/addr2line
+AS                 = $(TOOLCHAIN_PATH)/bin/as
+AR                 = $(TOOLCHAIN_PATH)/bin/ar
+LD                 = $(TOOLCHAIN_PATH)/bin/ld
+RANLIB             = $(TOOLCHAIN_PATH)/bin/ranlib
+SIZE               = $(TOOLCHAIN_PATH)/bin/size
+STRIP              = $(TOOLCHAIN_PATH)/bin/strip
+OBJCOPY            = $(TOOLCHAIN_PATH)/bin/objcopy
+OBJDUMP            = $(TOOLCHAIN_PATH)/bin/objdump
+READELF            = $(TOOLCHAIN_PATH)/bin/readelf
+NM                 = $(TOOLCHAIN_PATH)/bin/nm
+PATCHELF           = $(strip                                                 \
+                       $(if $(filter yes,$(call has-patchelf,$(TOOLCHAIN))), \
+                         $(TOOLCHAIN_PATH)/bin/patchelf,                     \
+                        ))
+else
+# TOOLCHAIN_NOARCH doesn't need these variables but:
+CC                 = gcc
+CXX                = g++
+ADDR2LINE          = addr2line
+AS                 = as
+AR                 = ar
+LD                 = ld
+RANLIB             = ranlib
+SIZE               = size
+STRIP              = strip
+OBJCOPY            = objcopy
+OBJDUMP            = objdump
+READELF            = readelf
+NM                 = nm
+endif
+endif
+
+#######
+####### Packages ARCH:
+#######
+
+PKGARCH = $(word 1,$(subst -, ,$(TARGET)))
+
+
+#
+# The user may reject the sysroot usage. For this the user have to declare
+# the USE_TARGET_DEST_DIR_SYSROOT variable with value 'no':
+#
+#   USE_TARGET_DEST_DIR_SYSROOT = no
+#
+ifneq ($(USE_TARGET_DEST_DIR_SYSROOT),no)
+USE_TARGET_DEST_DIR_SYSROOT := yes
+endif
+
+
+#######
+####### Build machine triplet:
+#######
+
+ifeq ($(shell echo $(shell ${BUILDSYSTEM}/canonical-build 2> /dev/null)),)
+BUILD = unknown-unknown-unknown-unknown
+$(error Errorr: Unknown BUILD System '${BUILD}')
+else
+BUILD = $(shell echo $(shell ${BUILDSYSTEM}/canonical-build 2> /dev/null))
+endif
+
+
+################################################################
+#######
+####### Include Directories setup Section:
+#######
+
+INCPATH += -I.
+
+TARGET_INCPATH += -I$(TARGET_DEST_DIR)/usr/include
+
+ROOTFS_INCPATH += -I$(ROOTFS_DEST_DIR)/usr/include
+
+#
+# Toolchain include path:
+#
+ifneq ($(call toolchain-sysroot,$(TOOLCHAIN)),)
+TOOLCHAIN_INCPATH += -I$(TOOLCHAIN_PATH)/$(TARGET)/$(call toolchain-sysroot,$(TOOLCHAIN))/usr/include
+endif
+
+#######
+####### End of Include Directories setup Section.
+#######
+################################################################
+
+
+################################################################
+#######
+####### Library directory suffixes for BUILD MACHINE.
+#######
+
+#
+# NOTE: LIBSUFFIX=64 is valid for Slackware64 distro where native libraries are placed in /usr/lib64 directory
+#       for example ubuntu has /usr/lib for x86_64 libraries and /usr/lib32 for x86_32 libraries as well as
+#       our X86_64-glibc toolchain.
+# TODO: Create the canonical-distro script such as $(BULDSYSTEM)/canonical-build we have.
+#
+ifeq ($(TOOLCHAIN),$(TOOLCHAIN_BUILD_MACHINE))
+LIBSUFFIX ?= 64
+endif
+
+#
+# BUILD_CC lib SUFFIX
+#
+BUILD_MULTILIB_X86_32_SUFFIX = $(shell echo $(shell gcc -m32 -print-multi-os-directory) | sed -e 's/\(^.*lib\)\([0-9]*\)/\2/')
+BUILD_MULTILIB_SUFFIX = $(shell echo $(shell gcc -print-multi-os-directory) | sed -e 's/\(^.*lib\)\([0-9]*\)/\2/')
+
+#######
+####### End of Library directory suffixes for BUILD MACHINE.
+#######
+################################################################
+
+
+# NOTE:
+# ====
+#
+#   Default optimization is -O3 and defined by 'OPTIMIZATION_FLAGS' variable
+#   in the target-setup.mk. The 'OPTIMIZATION_FLAGS' variable can be overriden
+#   in user Makefile by following definition.
+#
+#   OPTIMIZATION_FLAGS = -O2
+#
+#   However some HW requires specific optimization which should't be overriden
+#   by user. In this case we define toolchain depended variable *_OPTIMIZATION
+#   within constants.mk file. This variable is used to assign a value to the
+#   ARCH_OPTIMIZATION variable, which, in turn, sets the actual (depending on
+#   the current HW) optimization.
+#
+#   This way allow us prioritize the HW specific optimisation. If user
+#   want  to override HW specific optimization then hi can override the
+#   ARCH_OPTIMISATION variable. In this case user have to be sure that
+#   this redefinition doesn't affect other HW:
+#
+#   ifeq ($(HARDWARE),$(HARDWARE_CI20))
+#   ARCH_OPTIMIZATION = -O2
+#   endif
+#
+#   Resume:
+#   ------
+#    - OPTIMIZATION_FLAGS can be overriden only if ARCH_OPTIMIZATION is not set.
+#    - ARCH_OPTIMIZATION can be overriden always and ARCH_OPTIMIZATION has highest priority.
+#    - default optimization is -O3
+#    - the condition (OPTIMIZATION_FLAGS == ARCH_OPTIMIZATION) is always true.
+#
+ifneq ($(ARCH_OPTIMIZATION),)
+OPTIMIZATION_FLAGS         = $(ARCH_OPTIMIZATION)
+else
+OPTIMIZATION_FLAGS        ?= -O3
+ARCH_OPTIMIZATION          = $(OPTIMIZATION_FLAGS)
+endif
+
+
+################################################################
+#######
+####### Common Compiler & Linker flags:
+#######
+
+ifeq ($(USE_TARGET_DEST_DIR_SYSROOT),yes)
+LDFLAGS += -L$(TARGET_DEST_DIR)/lib$(LIBSUFFIX) -L$(TARGET_DEST_DIR)/usr/lib$(LIBSUFFIX)
+endif
+
+# Common CPP/C/C++ flags
+COMMON_FLAGS  = $(INCPATH)
+ifeq ($(USE_TARGET_DEST_DIR_SYSROOT),yes)
+COMMON_FLAGS += $(TARGET_INCPATH)
+endif
+COMMON_FLAGS += -g $(OPTIMIZATION_FLAGS) $(ARCH_FLAGS) $(ARCH_DEFS) $(HW_FLAGS)
+
+
+CFLAGS    += $(COMMON_FLAGS)
+CXXFLAGS  += $(COMMON_FLAGS)
+
+#######
+####### End of Common Compiler & Linker flags.
+#######
+################################################################
+
+
+################################################################
+#######
+####### Default Linkers:
+#######
+
+ifeq ($(call sysroot,$(TOOLCHAIN))_$(USE_TARGET_DEST_DIR_SYSROOT),yes_yes)
+CC_LINKER  = $(CC) --sysroot=$(TARGET_DEST_DIR)
+CXX_LINKER = $(CXX) --sysroot=$(TARGET_DEST_DIR)
+else
+CC_LINKER  = $(CC)
+CXX_LINKER = $(CXX)
+endif
+
+#######
+####### Default Linkers.
+#######
+################################################################
+
+
+################################################################
+#######
+####### Development environment:
+#######
+
+
+BUILD_ENVIRONMENT  = PATH=$(PATH):$(TOOLCHAIN_PATH)/bin
+
+ifeq ($(call sysroot,$(TOOLCHAIN))_$(USE_TARGET_DEST_DIR_SYSROOT),yes_yes)
+BUILD_ENVIRONMENT += CC="$(CC) --sysroot=$(TARGET_DEST_DIR)"
+BUILD_ENVIRONMENT += CXX="$(CXX) --sysroot=$(TARGET_DEST_DIR)"
+BUILD_ENVIRONMENT += LD="$(LD) --sysroot=$(TARGET_DEST_DIR)"
+else
+BUILD_ENVIRONMENT += CC="$(CC)" CXX="$(CXX)" LD="$(LD)"
+endif
+
+BUILD_ENVIRONMENT += AS="$(AS)" AR="$(AR)" RANLIB="$(RANLIB)" SIZE="$(SIZE)" STRIP="$(STRIP)" OBJCOPY="$(OBJCOPY)" OBJDUMP="$(OBJDUMP)" NM="$(NM)"
+BUILD_ENVIRONMENT += BUILD_CC="$(BUILD_CC)" BUILD_CXX="$(BUILD_CXX)" BUILD_AS="$(BUILD_AS)" BUILD_AR="$(BUILD_AR)" BUILD_LD="$(BUILD_LD)" BUILD_RANLIB="$(BUILD_RANLIB)" BUILD_SIZE="$(BUILD_SIZE)" BUILD_STRIP="$(BUILD_STRIP)" BUILD_OBJCOPY="$(BUILD_OBJCOPY)" BUILD_OBJDUMP="$(BUILD_OBJDUMP)" BUILD_NM="$(BUILD_NM)"
+BUILD_ENVIRONMENT += CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" CPPFLAGS="$(CPPFLAGS)"
+BUILD_ENVIRONMENT += LDFLAGS="$(LDFLAGS)"
+
+#
+#  PKG_CONFIG_PATH - directories to add to pkg-config's search path
+#
+PKG_CONFIG_PATH    = $(TARGET_DEST_DIR)/usr/lib$(LIBSUFFIX)/pkgconfig:$(TARGET_DEST_DIR)/usr/share/pkgconfig
+PKG_CONFIG_LIBDIR  = $(TARGET_DEST_DIR)/usr/lib$(LIBSUFFIX)/pkgconfig:$(TARGET_DEST_DIR)/usr/share/pkgconfig
+
+BUILD_ENVIRONMENT += PKG_CONFIG_PATH="$(PKG_CONFIG_PATH)"
+BUILD_ENVIRONMENT += PKG_CONFIG_LIBDIR="$(PKG_CONFIG_LIBDIR)"
+
+#######
+####### Development environment.
+#######
+################################################################
+
+
+
+################################################################
+#######
+####### Multilib Support:
+#######
+
+
+#######
+####### x86_32:
+#######
+
+####### Multilib directory suffixes for TARGETs:
+
+ifeq ($(TOOLCHAIN),$(TOOLCHAIN_X86_64_GLIBC))
+MULTILIB_X86_32_SUFFIX ?= 32
+endif
+
+ifneq ($(filter $(HARDWARE),$(HARDWARE_INTEL_PC64)),)
+ifeq ($(CREATE_X86_32_PACKAGE),true)
+
+CC               += -m32
+CXX              += -m32
+
+ifeq ($(USE_TARGET_DEST_DIR_SYSROOT),yes)
+LDFLAGS           = -L$(TARGET_DEST_DIR)/lib$(MULTILIB_X86_32_SUFFIX)
+LDFLAGS          += -L$(TARGET_DEST_DIR)/usr/lib$(MULTILIB_X86_32_SUFFIX)
+endif
+
+PKG_CONFIG_PATH   = $(TARGET_DEST_DIR)/usr/lib$(MULTILIB_X86_32_SUFFIX)/pkgconfig:$(TARGET_DEST_DIR)/usr/share/pkgconfig
+PKG_CONFIG_LIBDIR = $(TARGET_DEST_DIR)/usr/lib$(MULTILIB_X86_32_SUFFIX)/pkgconfig:$(TARGET_DEST_DIR)/usr/share/pkgconfig
+
+ARCH_FLAGS        = -m32 -march=i686 -mtune=i686
+
+TARGET32          = $(shell echo $(TARGET) | sed 's/x86_64/i686/')
+
+endif
+endif
+
+
+#######
+####### powerpc32:
+#######
+
+####### Multilib directory suffixes for TARGETs:
+
+ifneq ($(filter $(TOOLCHAIN),$(TOOLCHAIN_POWER8_GLIBC) \
+                             $(TOOLCHAIN_POWER9_GLIBC)),)
+MULTILIB_PPC32_SUFFIX ?= 32
+endif
+
+ifneq ($(filter $(HARDWARE),$(HARDWARE_S824L)  \
+                            $(HARDWARE_VESNIN) \
+                            $(HARDWARE_TL2WK2) \
+                            $(HARDWARE_TL2SV2)),)
+ifeq ($(CREATE_PPC32_PACKAGE),true)
+
+CC               += -m32
+CXX              += -m32
+
+ifeq ($(USE_TARGET_DEST_DIR_SYSROOT),yes)
+LDFLAGS           = -L$(TARGET_DEST_DIR)/lib$(MULTILIB_PPC32_SUFFIX)
+LDFLAGS          += -L$(TARGET_DEST_DIR)/usr/lib$(MULTILIB_PPC32_SUFFIX)
+endif
+
+PKG_CONFIG_PATH   = $(TARGET_DEST_DIR)/usr/lib$(MULTILIB_PPC32_SUFFIX)/pkgconfig:$(TARGET_DEST_DIR)/usr/share/pkgconfig
+PKG_CONFIG_LIBDIR = $(TARGET_DEST_DIR)/usr/lib$(MULTILIB_PPC32_SUFFIX)/pkgconfig:$(TARGET_DEST_DIR)/usr/share/pkgconfig
+
+ifeq ($(TOOLCHAIN),$(TOOLCHAIN_POWER8_GLIBC))
+ARCH_FLAGS        = -m32 -mcpu=power8 -mlong-double-128
+endif
+ifeq ($(TOOLCHAIN),$(TOOLCHAIN_POWER9_GLIBC))
+ARCH_FLAGS        = -m32 -mcpu=power9 -mlong-double-128
+endif
+
+TARGET32          = $(shell echo $(TARGET) | sed 's/ppc64/ppc/')
+
+endif
+endif
+
+
+
+
+#######
+####### End of Multilib Support.
+#######
+################################################################
+
+
+#######
+####### Setup actual Distribution info:
+#######
+
+DISTRO_REPOSITORY_URL = $(shell $(BUILDSYSTEM)/build-version --system --repo)
+DISTRO_BUILD_BRANCH   = $(shell $(BUILDSYSTEM)/build-version --system --branch)
+DISTRO_BUILD_REVISION = $(shell $(BUILDSYSTEM)/build-version --system)
+DISTRO_FULL_VERSION   = $(DISTRO_VERSION).$(DISTRO_BUILD_REVISION)
+
+BUILD_SYSTEM_REPOSITORY_URL = $(shell $(BUILDSYSTEM)/build-version --repo)
+BUILD_SYSTEM_BUILD_BRANCH   = $(shell $(BUILDSYSTEM)/build-version --branch)
+BUILD_SYSTEM_BUILD_REVISION = $(shell $(BUILDSYSTEM)/build-version)
+
+TOOLSHAINS_RELATIVE_URL = $(TOOLCHAINS_FTP_BASE)/$(TOOLCHAIN_VERSION)
+
+SOURCES_RELATIVE_URL    = sources
+
+PACKAGES_BASE_URL       = $(DOWNLOAD_SERVER)/$(DISTRO_NAME)/platform/releases
+PACKAGES_RELATIVE_URL   = $(DISTRO_FULL_VERSION)/$(TOOLCHAIN)/$(HARDWARE)
+
+PACKAGES_REPOSITORY = https://pkg.radix.pro
+
+
+
+
+TARGET_SETUP_MK=1
+endif
Index: build-system-1.8.1/3pp/app/ruby/3.1.0/Makefile
===================================================================
--- build-system-1.8.1/3pp/app/ruby/3.1.0/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/app/ruby/3.1.0/Makefile	(revision 323)
@@ -0,0 +1,60 @@
+
+COMPONENT_TARGETS = $(HARDWARE_BUILD)
+
+include ../../../../../build-system/constants.mk
+
+SOURCE_REQUIRES = build-system/3pp/sources/packages/ruby
+
+# ======= __END_OF_REQUIRES__ =======
+
+version         = 3.1.0
+tar_xz_archive  = $(BUILDSYSTEM)/3pp/sources/packages/ruby/ruby-$(version).tar.xz
+SRC_ARCHIVE     = $(tar_xz_archive)
+SRC_DIR         = $(TARGET_BUILD_DIR)/ruby-$(version)
+src_done        = $(TARGET_BUILD_DIR)/.source-done
+
+PATCHES = PATCHES
+
+build_target    = $(TARGET_BUILD_DIR)/.built
+install_target  = $(TARGET_BUILD_DIR)/.installed
+
+BUILD_TARGETS   = $(build_target)
+BUILD_TARGETS  += $(install_target)
+
+
+include ../../../../../build-system/core.mk
+
+
+LDFLAGS    += -Wl,-rpath,$(BUILDSYSTEM)/usr/lib
+
+extra_configure_switches  = --libdir=$(BUILDSYSTEM)/usr/lib
+extra_configure_switches += --bindir=$(BUILDSYSTEM)/usr/bin
+extra_configure_switches += --docdir=$(BUILDSYSTEM)/usr/share/doc/$(src_dir_name)
+extra_configure_switches += --mandir=$(BUILDSYSTEM)/usr/share/man
+extra_configure_switches += --datadir=$(BUILDSYSTEM)/usr/share
+extra_configure_switches += --enable-shared
+extra_configure_switches += --enable-pthread
+extra_configure_switches += --disable-install-capi
+
+
+$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
+	$(UNPACK_SRC_ARCHIVE)
+	$(APPLY_PATCHES)
+	@touch $@
+
+$(build_target): $(src_done)
+	@cd $(SRC_DIR) && ./configure \
+	  --prefix=$(BUILDSYSTEM)/usr \
+	  --build=$(BUILD) \
+	  --host=$(BUILD)  \
+	  $(extra_configure_switches)
+	@cd $(SRC_DIR) && $(MAKE)
+	@touch $@
+
+$(install_target): $(build_target)
+	@echo -e "\n======= Installing Ruby 3.1.0 binary =======\n"
+	@cd $(SRC_DIR) && $(MAKE) -j1 install
+	@echo -e "\n======= Setup RUBY build-system variable =======\n"
+	@mkdir -p $(BUILDSYSTEM)/sbin && \
+	  echo "RUBY               := $(BUILDSYSTEM)/usr/bin/ruby" >> $(BUILDSYSTEM)/sbin/.config
+	@touch $@
Index: build-system-1.8.1/3pp/app/ruby/3.1.0/PATCHES
===================================================================
Index: build-system-1.8.1/3pp/app/ruby/3.1.0
===================================================================
--- build-system-1.8.1/3pp/app/ruby/3.1.0	(nonexistent)
+++ build-system-1.8.1/3pp/app/ruby/3.1.0	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/ruby/3.1.0
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,51 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# cpan configure targets
+.installed
+CPAN-Config.pm
+CPAN-install
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/perl/5.34.0/Makefile
===================================================================
--- build-system-1.8.1/3pp/app/perl/5.34.0/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/app/perl/5.34.0/Makefile	(revision 323)
@@ -0,0 +1,119 @@
+
+COMPONENT_TARGETS = $(HARDWARE_BUILD)
+
+include ../../../../../build-system/constants.mk
+
+SOURCE_REQUIRES = build-system/3pp/sources/packages/perl
+
+REQUIRES = build-system/cpan
+
+# ======= __END_OF_REQUIRES__ =======
+
+version         = 5.34.0
+tar_xz_archive  = $(BUILDSYSTEM)/3pp/sources/packages/perl/perl-$(version).tar.xz
+SRC_ARCHIVE     = $(tar_xz_archive)
+SRC_DIR         = $(TARGET_BUILD_DIR)/perl-$(version)
+src_done        = $(TARGET_BUILD_DIR)/.source-done
+
+PATCHES = PATCHES
+
+build_target    = $(TARGET_BUILD_DIR)/.built
+install_target  = $(TARGET_BUILD_DIR)/.installed
+
+BUILD_TARGETS   = $(build_target)
+BUILD_TARGETS  += $(install_target)
+
+
+include ../../../../../build-system/core.mk
+
+
+ARCH     = $(shell uname -m)
+ARCHNAME = $(ARCH)-linux
+
+OPTIMIZE = -O2
+
+ifeq ($(ARCH),x86_64)
+  ARCH_OPTS  = -Dcccdlflags='-fPIC' -Duselargefiles -Duse64bitall
+  OPTIMIZE  += -fPIC
+endif
+
+OPTIMIZE += -Wno-cast-function-type -Wno-nonnull -Wno-clobbered
+OPTIMIZE += -Wno-multistatement-macros -Wimplicit-fallthrough=0
+
+#
+# If after all this time you still don't trust threads, comment out the variable below:
+#
+USE_THREADS = -Dusethreads -Duseithreads
+
+
+extra_configure_switches  = -Darchname=$(ARCHNAME)
+
+extra_configure_switches += -Dprefix=$(BUILDSYSTEM)/usr
+extra_configure_switches += -Dbin='$(BUILDSYSTEM)/usr/bin'
+extra_configure_switches += -Dscriptdir='$(BUILDSYSTEM)/usr/bin'
+
+extra_configure_switches += -Darchlib='$(BUILDSYSTEM)/usr/lib/perl5'
+extra_configure_switches += -Dprivlib='$(BUILDSYSTEM)/usr/share/perl5'
+
+extra_configure_switches += -Dsiteprefix=$(BUILDSYSTEM)/usr
+extra_configure_switches += -Dsitebin='$(BUILDSYSTEM)/usr/bin'
+extra_configure_switches += -Dsitescript='$(BUILDSYSTEM)/usr/bin'
+extra_configure_switches += -Dsitearch='$(BUILDSYSTEM)/usr/lib/perl5/site_perl'
+extra_configure_switches += -Dsitelib='$(BUILDSYSTEM)/usr/share/perl5/site_perl'
+
+extra_configure_switches += -Dvendorprefix=$(BUILDSYSTEM)/usr
+extra_configure_switches += -Dvendorbin='$(BUILDSYSTEM)/usr/bin'
+extra_configure_switches += -Dvendorscript='$(BUILDSYSTEM)/usr/bin'
+extra_configure_switches += -Dvendorarch='$(BUILDSYSTEM)/usr/lib/perl5/vendor_perl'
+extra_configure_switches += -Dvendorlib='$(BUILDSYSTEM)/usr/share/perl5/vendor_perl'
+
+extra_configure_switches += -Dinstallprefix=$(BUILDSYSTEM)/usr
+extra_configure_switches += -Dlibpth='$(BUILDSYSTEM)/usr/lib'
+extra_configure_switches += -Dloclibpth='$(BUILDSYSTEM)/usr/lib'
+extra_configure_switches += -Dlocincpth='$(BUILDSYSTEM)/usr/include'
+
+extra_configure_switches += -Doptimize='$(OPTIMIZE)'
+extra_configure_switches += $(USE_THREADS)
+extra_configure_switches += $(ARCH_OPTS)
+extra_configure_switches += -Duseshrplib
+extra_configure_switches += -Ubincompat5005
+extra_configure_switches += -Uversiononly
+
+extra_configure_switches += -Dpager='/usr/bin/less -isr'
+
+extra_configure_switches += -Dhtml1dir='$(BUILDSYSTEM)/usr/share/doc/perl-$(version)/html'
+extra_configure_switches += -Dhtml3dir='$(BUILDSYSTEM)/usr/share/doc/perl-$(version)/html'
+extra_configure_switches += -Dman1dir='$(BUILDSYSTEM)/usr/share/man/man1'
+extra_configure_switches += -Dman3dir='$(BUILDSYSTEM)/usr/share/man/man3'
+
+
+$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
+	$(UNPACK_SRC_ARCHIVE)
+	$(APPLY_PATCHES)
+	@cd $(SRC_DIR) && echo 'installstyle="lib/perl5"' >> hints/linux.sh
+	@touch $@
+
+$(build_target): $(src_done)
+	@cd $(SRC_DIR) && ./Configure -des $(extra_configure_switches)
+	@cd $(SRC_DIR) && $(MAKE)
+	@touch $@
+
+$(install_target): $(build_target)
+	@echo -e "\n======= Installing Perl 5 binary =======\n"
+	@cd $(SRC_DIR) && $(MAKE) -j1 install
+	@echo -e "\n======= Install Perl modules =======\n"
+	@( cd $(BUILDSYSTEM)/usr/bin ; \
+	   ./cpan-install Module::Build              2>/dev/null ; \
+	   ./cpan-install IPC::System::Simple        2>/dev/null ; \
+	   ./cpan-install File::Slurp                2>/dev/null ; \
+	   ./cpan-install File::Which                2>/dev/null ; \
+	   ./cpan-install List::MoreUtils            2>/dev/null ; \
+	   ./cpan-install Data::Dumper               2>/dev/null ; \
+	   ./cpan-install Devel::CheckLib            2>/dev/null ; \
+	   ./cpan-install DBI                        2>/dev/null ; \
+	   ./cpan-install URI                        2>/dev/null ; \
+	 )
+	@echo -e "\n======= Setup PERL build-system variable =======\n"
+	@mkdir -p $(BUILDSYSTEM)/sbin && \
+	  echo "PERL               := $(BUILDSYSTEM)/usr/bin/perl" >> $(BUILDSYSTEM)/sbin/.config
+	@touch $@
Index: build-system-1.8.1/3pp/app/perl/5.34.0/PATCHES
===================================================================
--- build-system-1.8.1/3pp/app/perl/5.34.0/PATCHES	(nonexistent)
+++ build-system-1.8.1/3pp/app/perl/5.34.0/PATCHES	(revision 323)
@@ -0,0 +1,3 @@
+
+../../../sources/packages/perl/patches/perl-5.34.0-multilib.patch -p0
+../../../sources/packages/perl/patches/perl-5.34.0-CPAN.patch     -p0
Index: build-system-1.8.1/3pp/app/perl/5.34.0
===================================================================
--- build-system-1.8.1/3pp/app/perl/5.34.0	(nonexistent)
+++ build-system-1.8.1/3pp/app/perl/5.34.0	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/perl/5.34.0
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/perl
===================================================================
--- build-system-1.8.1/3pp/app/perl	(nonexistent)
+++ build-system-1.8.1/3pp/app/perl	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/perl
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/pkgtools/0.2.1/Makefile
===================================================================
--- build-system-1.8.1/3pp/app/pkgtools/0.2.1/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/app/pkgtools/0.2.1/Makefile	(revision 323)
@@ -0,0 +1,76 @@
+
+COMPONENT_TARGETS = $(HARDWARE_BUILD)
+
+include ../../../../../build-system/constants.mk
+
+SOURCE_REQUIRES = build-system/3pp/sources/packages/pkgtools
+
+REQUIRES = build-system/3pp/app/dialog/1.3-20210621
+
+# ======= __END_OF_REQUIRES__ =======
+
+
+tar_xz_archive  = $(BUILDSYSTEM)/3pp/sources/packages/pkgtools/pkgtools-0.2.1.tar.xz
+src_dir         = pkgtools-0.2.1
+build_dir       = $(TARGET_BUILD_DIR)/built
+
+src_done        = $(TARGET_BUILD_DIR)/.source-done
+SRC_DIR         = $(TARGET_BUILD_DIR)/pkgtools-0.2.1
+SRC_ARCHIVE     = $(tar_xz_archive)
+
+PATCHES = PATCHES
+
+build_target    = $(TARGET_BUILD_DIR)/.built
+install_target  = $(TARGET_BUILD_DIR)/.installed
+
+BUILD_TARGETS   = $(build_target)
+BUILD_TARGETS  += $(install_target)
+
+
+include ../../../../../build-system/core.mk
+
+
+environment     = CPPFLAGS=-I$(BUILDSYSTEM)/usr/include
+environment    += LDFLAGS=-Wl,-rpath=$(BUILDSYSTEM)/usr/lib
+
+extra_configure_switches += --with-dialog=$(BUILDSYSTEM)/usr
+extra_configure_switches += --with-dialog-test=yes
+extra_configure_switches += --with-gpg2=yes
+extra_configure_switches += --with-distro-name=$(DISTRO_NAME)
+extra_configure_switches += --with-distro-version=$(DISTRO_VERSION)
+
+
+$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
+	$(UNPACK_SRC_ARCHIVE)
+	$(APPLY_PATCHES)
+	@touch $@
+
+$(build_target): $(src_done)
+	@cd $(SRC_DIR) && ./bootstrap
+	@mkdir -p $(build_dir)
+	@cd $(build_dir) && $(environment) ../$(src_dir)/configure \
+	  --prefix=$(BUILDSYSTEM)/usr \
+	  --sbindir=$(BUILDSYSTEM)/sbin \
+	  --build=$(BUILD) \
+	  --host=$(BUILD)  \
+	  $(extra_configure_switches)
+	@$(environment) $(MAKE) -C $(build_dir) all
+	@touch $@
+
+$(install_target): $(build_target)
+	@echo -e "\n======= Installing PKGTOOLS binaries =======\n"
+	@$(environment) $(MAKE) -j1 -C $(build_dir) install
+	@mkdir -p $(BUILDSYSTEM)/sbin && \
+	  echo "CHECK_DB_INTEGRITY := $(BUILDSYSTEM)/sbin/check-db-integrity" >> $(BUILDSYSTEM)/sbin/.config && \
+	  echo "CHECK_PACKAGE      := $(BUILDSYSTEM)/sbin/check-package"      >> $(BUILDSYSTEM)/sbin/.config && \
+	  echo "CHECK_REQUIRES     := $(BUILDSYSTEM)/sbin/check-requires"     >> $(BUILDSYSTEM)/sbin/.config && \
+	  echo "CHANGE_REFS        := $(BUILDSYSTEM)/sbin/chrefs"             >> $(BUILDSYSTEM)/sbin/.config && \
+	  echo "INSTALL_PACKAGE    := $(BUILDSYSTEM)/sbin/install-package"    >> $(BUILDSYSTEM)/sbin/.config && \
+	  echo "INSTALL_PKGLIST    := $(BUILDSYSTEM)/sbin/install-pkglist"    >> $(BUILDSYSTEM)/sbin/.config && \
+	  echo "MAKE_PACKAGE       := $(BUILDSYSTEM)/sbin/make-package"       >> $(BUILDSYSTEM)/sbin/.config && \
+	  echo "MAKE_PKGLIST       := $(BUILDSYSTEM)/sbin/make-pkglist"       >> $(BUILDSYSTEM)/sbin/.config && \
+	  echo "PKGINFO            := $(BUILDSYSTEM)/sbin/pkginfo"            >> $(BUILDSYSTEM)/sbin/.config && \
+	  echo "PKGLOG             := $(BUILDSYSTEM)/sbin/pkglog"             >> $(BUILDSYSTEM)/sbin/.config && \
+	  echo "REMOVE_PACKAGE     := $(BUILDSYSTEM)/sbin/remove-package"     >> $(BUILDSYSTEM)/sbin/.config && \
+	  echo "UPDATE_PACKAGE     := $(BUILDSYSTEM)/sbin/update-package"     >> $(BUILDSYSTEM)/sbin/.config
+	@touch $@
Index: build-system-1.8.1/3pp/app/pkgtools/0.2.1/PATCHES
===================================================================
Index: build-system-1.8.1/3pp/app/pkgtools/0.2.1
===================================================================
--- build-system-1.8.1/3pp/app/pkgtools/0.2.1	(nonexistent)
+++ build-system-1.8.1/3pp/app/pkgtools/0.2.1	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/pkgtools/0.2.1
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,51 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# cpan configure targets
+.installed
+CPAN-Config.pm
+CPAN-install
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/pkgtools
===================================================================
--- build-system-1.8.1/3pp/app/pkgtools	(nonexistent)
+++ build-system-1.8.1/3pp/app/pkgtools	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/pkgtools
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/python3-modules/pip/21.3.1/Makefile
===================================================================
--- build-system-1.8.1/3pp/app/python3-modules/pip/21.3.1/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/app/python3-modules/pip/21.3.1/Makefile	(revision 323)
@@ -0,0 +1,58 @@
+
+COMPONENT_TARGETS = $(HARDWARE_BUILD)
+
+include ../../../../../../build-system/constants.mk
+
+SOURCE_REQUIRES = build-system/3pp/sources/packages/python-modules/pip
+
+REQUIRES  = build-system/3pp/app/python3-modules/m2crypto/0.38.0
+
+# ======= __END_OF_REQUIRES__ =======
+
+version         = 21.3.1
+tar_gz_archive  = $(BUILDSYSTEM)/3pp/sources/packages/python-modules/pip/pip-$(version).tar.gz
+SRC_ARCHIVE     = $(tar_gz_archive)
+SRC_DIR         = $(TARGET_BUILD_DIR)/pip-$(version)
+src_done        = $(TARGET_BUILD_DIR)/.source-done
+
+PATCHES = PATCHES
+
+build_target    = $(TARGET_BUILD_DIR)/.built
+install_target  = $(TARGET_BUILD_DIR)/.installed
+
+BUILD_TARGETS   = $(build_target)
+BUILD_TARGETS  += $(install_target)
+
+
+include ../../../../../../build-system/core.mk
+
+
+$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
+	$(UNPACK_SRC_ARCHIVE)
+	$(APPLY_PATCHES)
+	@touch $@
+
+$(build_target): $(src_done)
+	@( cd $(SRC_DIR) ; \
+	   $(BUILDSYSTEM)/usr/bin/python3 setup.py bdist_egg ; \
+	   $(BUILDSYSTEM)/usr/bin/python3 setup.py build ; \
+	 )
+	@touch $@
+
+$(install_target): $(build_target)
+	@echo -e "\n======= Installing setuptools-$(version) =======\n"
+	@( cd $(SRC_DIR) ; \
+	   $(BUILDSYSTEM)/usr/bin/python3 setup.py install --root=/ ; \
+	 )
+	@echo -e "\n======= Install Python3 wheel, PLY, pygments, cryptography packages =======\n"
+	@( cd $(BUILDSYSTEM)/usr/bin ; \
+	   rm -f pip ; ln -sf pip2 pip ; \
+	   ./pip3.10 install --upgrade wheel        2>/dev/null ; \
+	   ./pip3.10 install --upgrade ply          2>/dev/null ; \
+	   ./pip3.10 install --upgrade pygments     2>/dev/null ; \
+	   ./pip3.10 install --upgrade cryptography 2>/dev/null ; \
+	 )
+	@echo -e "\n======= Setup PIP3 build-system variable =======\n"
+	@mkdir -p $(BUILDSYSTEM)/sbin && \
+	  echo "PIP3               := $(BUILDSYSTEM)/usr/bin/pip3"    >> $(BUILDSYSTEM)/sbin/.config
+	@touch $@
Index: build-system-1.8.1/3pp/app/python3-modules/pip/21.3.1/PATCHES
===================================================================
Index: build-system-1.8.1/3pp/app/python3-modules/pip/21.3.1
===================================================================
--- build-system-1.8.1/3pp/app/python3-modules/pip/21.3.1	(nonexistent)
+++ build-system-1.8.1/3pp/app/python3-modules/pip/21.3.1	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/python3-modules/pip/21.3.1
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/python3-modules/pip
===================================================================
--- build-system-1.8.1/3pp/app/python3-modules/pip	(nonexistent)
+++ build-system-1.8.1/3pp/app/python3-modules/pip	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/python3-modules/pip
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/python3-modules/m2crypto/0.38.0/Makefile
===================================================================
--- build-system-1.8.1/3pp/app/python3-modules/m2crypto/0.38.0/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/app/python3-modules/m2crypto/0.38.0/Makefile	(revision 323)
@@ -0,0 +1,47 @@
+
+COMPONENT_TARGETS = $(HARDWARE_BUILD)
+
+include ../../../../../../build-system/constants.mk
+
+SOURCE_REQUIRES = build-system/3pp/sources/packages/python-modules/m2crypto
+
+REQUIRES  = build-system/3pp/app/python3-modules/setuptools/59.2.0
+
+# ======= __END_OF_REQUIRES__ =======
+
+version         = 0.38.0
+tar_gz_archive  = $(BUILDSYSTEM)/3pp/sources/packages/python-modules/m2crypto/m2crypto-$(version).tar.gz
+SRC_ARCHIVE     = $(tar_gz_archive)
+SRC_DIR         = $(TARGET_BUILD_DIR)/m2crypto-$(version)
+src_done        = $(TARGET_BUILD_DIR)/.source-done
+
+PATCHES = PATCHES
+
+build_target    = $(TARGET_BUILD_DIR)/.built
+install_target  = $(TARGET_BUILD_DIR)/.installed
+
+BUILD_TARGETS   = $(build_target)
+BUILD_TARGETS  += $(install_target)
+
+
+include ../../../../../../build-system/core.mk
+
+
+$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
+	$(UNPACK_SRC_ARCHIVE)
+	$(APPLY_PATCHES)
+	@touch $@
+
+$(build_target): $(src_done)
+	@( cd $(SRC_DIR) ; \
+	   $(BUILDSYSTEM)/usr/bin/python3 setup.py bdist_egg ; \
+	   $(BUILDSYSTEM)/usr/bin/python3 setup.py build ; \
+	 )
+	@touch $@
+
+$(install_target): $(build_target)
+	@echo -e "\n======= Installing M2Crypto-$(version) =======\n"
+	@( cd $(SRC_DIR) ; \
+	   $(BUILDSYSTEM)/usr/bin/python3 setup.py install --root=/ ; \
+	 )
+	@touch $@
Index: build-system-1.8.1/3pp/app/python3-modules/m2crypto/0.38.0/PATCHES
===================================================================
Index: build-system-1.8.1/3pp/app/python3-modules/m2crypto/0.38.0
===================================================================
--- build-system-1.8.1/3pp/app/python3-modules/m2crypto/0.38.0	(nonexistent)
+++ build-system-1.8.1/3pp/app/python3-modules/m2crypto/0.38.0	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/python3-modules/m2crypto/0.38.0
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/python3-modules/setuptools/59.2.0/Makefile
===================================================================
--- build-system-1.8.1/3pp/app/python3-modules/setuptools/59.2.0/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/app/python3-modules/setuptools/59.2.0/Makefile	(revision 323)
@@ -0,0 +1,56 @@
+
+COMPONENT_TARGETS = $(HARDWARE_BUILD)
+
+include ../../../../../../build-system/constants.mk
+
+SOURCE_REQUIRES = build-system/3pp/sources/packages/python-modules/setuptools
+
+REQUIRES = build-system/3pp/app/python3/3.10.0
+
+# ======= __END_OF_REQUIRES__ =======
+
+version         = 59.2.0
+tar_gz_archive  = $(BUILDSYSTEM)/3pp/sources/packages/python-modules/setuptools/setuptools-$(version).tar.gz
+SRC_ARCHIVE     = $(tar_gz_archive)
+SRC_DIR         = $(TARGET_BUILD_DIR)/setuptools-$(version)
+src_done        = $(TARGET_BUILD_DIR)/.source-done
+
+PATCHES = PATCHES
+
+build_target    = $(TARGET_BUILD_DIR)/.built
+install_target  = $(TARGET_BUILD_DIR)/.installed
+
+BUILD_TARGETS   = $(build_target)
+BUILD_TARGETS  += $(install_target)
+
+
+include ../../../../../../build-system/core.mk
+
+#
+# NOTE:
+# ====
+#   Command `mkdir -p build/scripts-3.10` and install option --root=/ are needed to avoid
+#   Python errors related to build procedure and deprecated easy_install utility.
+#
+
+$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
+	$(UNPACK_SRC_ARCHIVE)
+	$(APPLY_PATCHES)
+	@touch $@
+
+$(build_target): $(src_done)
+	@( cd $(SRC_DIR) ; \
+	   rm -f setuptools/*.exe ; \
+	   mkdir -p build/scripts-3.10 ; \
+	   sed -i 's,^tag_build.*,tag_build =,' setup.cfg ; \
+	   sed -i 's,^tag_date.*,tag_date = 0,' setup.cfg ; \
+	   /usr/bin/python3 setup.py bdist_egg ; \
+	 )
+	@touch $@
+
+$(install_target): $(build_target)
+	@echo -e "\n======= Installing setuptools-$(version) =======\n"
+	@( cd $(SRC_DIR) ; \
+	   $(BUILDSYSTEM)/usr/bin/python3 setup.py install --root=/ ; \
+	 )
+	@touch $@
Index: build-system-1.8.1/3pp/app/python3-modules/setuptools/59.2.0/PATCHES
===================================================================
Index: build-system-1.8.1/3pp/app/python3-modules/setuptools/59.2.0
===================================================================
--- build-system-1.8.1/3pp/app/python3-modules/setuptools/59.2.0	(nonexistent)
+++ build-system-1.8.1/3pp/app/python3-modules/setuptools/59.2.0	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/python3-modules/setuptools/59.2.0
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/python3-modules/setuptools
===================================================================
--- build-system-1.8.1/3pp/app/python3-modules/setuptools	(nonexistent)
+++ build-system-1.8.1/3pp/app/python3-modules/setuptools	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/python3-modules/setuptools
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/python3-modules
===================================================================
--- build-system-1.8.1/3pp/app/python3-modules	(nonexistent)
+++ build-system-1.8.1/3pp/app/python3-modules	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/python3-modules
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/python3/3.10.0/Makefile
===================================================================
--- build-system-1.8.1/3pp/app/python3/3.10.0/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/app/python3/3.10.0/Makefile	(revision 323)
@@ -0,0 +1,113 @@
+
+COMPONENT_TARGETS = $(HARDWARE_BUILD)
+
+include ../../../../../build-system/constants.mk
+
+SOURCE_REQUIRES = build-system/3pp/sources/packages/python3
+
+REQUIRES = build-system/3pp/app/python2-modules/pip/20.3
+
+# ======= __END_OF_REQUIRES__ =======
+
+version         = 3.10.0
+tar_xz_archive  = $(BUILDSYSTEM)/3pp/sources/packages/python3/Python-$(version).tar.xz
+SRC_ARCHIVE     = $(tar_xz_archive)
+SRC_DIR         = $(TARGET_BUILD_DIR)/Python-$(version)
+src_done        = $(TARGET_BUILD_DIR)/.source-done
+
+PATCHES = PATCHES
+
+build_target    = $(TARGET_BUILD_DIR)/.built
+install_target  = $(TARGET_BUILD_DIR)/.installed
+
+BUILD_TARGETS   = $(build_target)
+BUILD_TARGETS  += $(install_target)
+
+
+include ../../../../../build-system/core.mk
+
+
+LDFLAGS    += -Wl,-rpath,$(BUILDSYSTEM)/usr/lib
+
+extra_configure_switches  = --libdir=$(BUILDSYSTEM)/usr/lib
+extra_configure_switches += --bindir=$(BUILDSYSTEM)/usr/bin
+extra_configure_switches += --docdir=$(BUILDSYSTEM)/usr/share/doc/$(src_dir_name)
+extra_configure_switches += --mandir=$(BUILDSYSTEM)/usr/share/man
+extra_configure_switches += --with-system-expat
+extra_configure_switches += --with-system-ffi
+extra_configure_switches += --with-threads
+extra_configure_switches += --without-ensurepip
+extra_configure_switches += --enable-ipv6
+extra_configure_switches += --enable-shared
+
+python_environment  = RFS=$(BUILDSYSTEM)
+python_environment += PYTHONHOME=$(BUILDSYSTEM)/usr/lib/python3.10
+python_environment += LDFLAGS='$(LDFLAGS)'
+
+
+$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
+	$(UNPACK_SRC_ARCHIVE)
+	$(APPLY_PATCHES)
+	@cd $(SRC_DIR) && sed -i 's|\("install",\)|\1 "--ignore-installed",|' Lib/ensurepip/__init__.py
+	@touch $@
+
+$(build_target): $(src_done)
+	@cd $(SRC_DIR) && $(python_environment) ./configure \
+	  --prefix=$(BUILDSYSTEM)/usr \
+	  --exec-prefix=$(BUILDSYSTEM)/usr \
+	  --build=$(BUILD) \
+	  --host=$(BUILD)  \
+	  $(extra_configure_switches)
+	@cd $(SRC_DIR) && $(python_environment) $(MAKE)
+	@touch $@
+
+$(install_target): $(build_target)
+	@echo -e "\n======= Installing Python 3.10 binary =======\n"
+	@cd $(SRC_DIR) && $(MAKE) -j1 $(python_environment) install
+	@( cd $(BUILDSYSTEM)/usr/bin ; \
+	   ln -sf 2to3-2.7 2to3 ; \
+	 )
+	@echo -e "\n======= tune python3.10-config CFLAGS for target machine =======\n"
+	@( cd $(BUILDSYSTEM)/usr/bin ; \
+	   sed -i 's,includedir=$$(echo "$${prefix},includedir=$$(echo "/usr,g' python3.10-config ; \
+	   sed -i 's,LIBPL=$$(echo "$${prefix},LIBPL=$$(echo "/usr,g' python3.10-config ; \
+	   sed -i "s,$(BUILDSYSTEM),,g" python3.10-config ; \
+	 )
+	@( cd $(BUILDSYSTEM)/usr/include/python3.10 ; \
+	   mv pyconfig.h pyconfig-64.h ; \
+	   echo ''                                                    > pyconfig.h ; \
+	   echo '/******************************'                    >> pyconfig.h ; \
+	   echo '  pyconfig.h - Multilib Header'                     >> pyconfig.h ; \
+	   echo ' ******************************/'                   >> pyconfig.h ; \
+	   echo ''                                                   >> pyconfig.h ; \
+	   echo '#ifndef __MULTILIB__PYCONFIG_H__'                   >> pyconfig.h ; \
+	   echo '#define __MULTILIB__PYCONFIG_H__'                   >> pyconfig.h ; \
+	   echo ''                                                   >> pyconfig.h ; \
+	   echo '#if defined(__x86_64__)    || \'                    >> pyconfig.h ; \
+	   echo '    defined(__aarch64__)   || \'                    >> pyconfig.h ; \
+	   echo '    defined(__powerpc64__) || \'                    >> pyconfig.h ; \
+	   echo '    defined(__sparc__) && defined(__arch64__) || \' >> pyconfig.h ; \
+	   echo '    defined(__riscv_xlen) && __riscv_xlen == 64'    >> pyconfig.h ; \
+	   echo '#include "pyconfig-64.h"'                           >> pyconfig.h ; \
+	   echo '#else'                                              >> pyconfig.h ; \
+	   echo '#include "pyconfig-32.h"'                           >> pyconfig.h ; \
+	   echo '#endif'                                             >> pyconfig.h ; \
+	   echo ''                                                   >> pyconfig.h ; \
+	   echo '#endif /* __MULTILIB__PYCONFIG_H__ */'              >> pyconfig.h ; \
+	   cat pyconfig-64.h | \
+	     sed -e 's,^#define HAVE_GCC_ASM_FOR_X64 1,\/\* #undef HAVE_GCC_ASM_FOR_X64 \*\/,'     \
+	         -e 's,^#define HAVE_GCC_UINT128_T 1,/* #undef HAVE_GCC_UINT128_T */,'             \
+	         -e 's,^\/\* #undef HAVE_LARGEFILE_SUPPORT \*\/,#define HAVE_LARGEFILE_SUPPORT 1,' \
+	         -e 's,^#define SIZEOF_LONG 8,#define SIZEOF_LONG 4,'                              \
+	         -e 's,^#define SIZEOF_LONG_DOUBLE 16,#define SIZEOF_LONG_DOUBLE 12,'              \
+	         -e 's,^#define SIZEOF_PTHREAD_T 8,#define SIZEOF_PTHREAD_T 4,'                    \
+	         -e 's,^#define SIZEOF_SIZE_T 8,#define SIZEOF_SIZE_T 4,'                          \
+	         -e 's,^#define SIZEOF_TIME_T 8,#define SIZEOF_TIME_T 4,'                          \
+	         -e 's,^#define SIZEOF_UINTPTR_T 8,#define SIZEOF_UINTPTR_T 4,'                    \
+	         -e 's,^#define SIZEOF_VOID_P 8,#define SIZEOF_VOID_P 4,'                          \
+	     > pyconfig-32.h ; \
+	 )
+	@echo -e "\n======= Setup PYTHON3 build-system variable =======\n"
+	@mkdir -p $(BUILDSYSTEM)/sbin && \
+	  echo "PYTHON3            := $(BUILDSYSTEM)/usr/bin/python3" >> $(BUILDSYSTEM)/sbin/.config
+	@touch $@
Index: build-system-1.8.1/3pp/app/python3/3.10.0/PATCHES
===================================================================
Index: build-system-1.8.1/3pp/app/python3/3.10.0
===================================================================
--- build-system-1.8.1/3pp/app/python3/3.10.0	(nonexistent)
+++ build-system-1.8.1/3pp/app/python3/3.10.0	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/python3/3.10.0
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,51 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# cpan configure targets
+.installed
+CPAN-Config.pm
+CPAN-install
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/python3
===================================================================
--- build-system-1.8.1/3pp/app/python3	(nonexistent)
+++ build-system-1.8.1/3pp/app/python3	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/python3
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/po4a/0.65/Makefile
===================================================================
--- build-system-1.8.1/3pp/app/po4a/0.65/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/app/po4a/0.65/Makefile	(revision 323)
@@ -0,0 +1,54 @@
+
+COMPONENT_TARGETS = $(HARDWARE_BUILD)
+
+include ../../../../../build-system/constants.mk
+
+SOURCE_REQUIRES = build-system/3pp/sources/packages/po4a
+
+REQUIRES = build-system/3pp/app/perl-SGMLS/1.1
+
+# ======= __END_OF_REQUIRES__ =======
+
+version         = 0.65
+tar_xz_archive  = $(BUILDSYSTEM)/3pp/sources/packages/po4a/po4a-$(version).tar.xz
+SRC_ARCHIVE     = $(tar_xz_archive)
+SRC_DIR         = $(TARGET_BUILD_DIR)/po4a-$(version)
+src_done        = $(TARGET_BUILD_DIR)/.source-done
+
+PATCHES = PATCHES
+
+build_target    = $(TARGET_BUILD_DIR)/.built
+install_target  = $(TARGET_BUILD_DIR)/.installed
+
+BUILD_TARGETS   = $(build_target)
+BUILD_TARGETS  += $(install_target)
+
+
+include ../../../../../build-system/core.mk
+
+
+$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
+	$(UNPACK_SRC_ARCHIVE)
+	$(APPLY_PATCHES)
+	@touch $@
+
+$(build_target): $(src_done)
+	@( cd $(SRC_DIR) ; \
+	   $(BUILDSYSTEM)/usr/bin/perl Build.PL prefix=/usr installdirs=vendor destdir=$(BUILDSYSTEM) ; \
+	   ./Build ; \
+	 )
+	@touch $@
+
+$(install_target): $(build_target)
+	@echo -e "\n======= Installing Perl SGMLS binaries =======\n"
+	@( cd $(SRC_DIR) ; \
+	   ./Build install \
+	            --install_path bindoc=/usr/share/man/man1 \
+	            --install_path libdoc=/usr/share/man/man3 ; \
+	 )
+	@find $(BUILDSYSTEM)/usr/lib/perl5 \
+	      -name perllocal.pod -o -name ".packlist" -o -name "*.bs" | xargs rm -f || true
+	@echo -e "\n======= Setup PO4A build-system variable =======\n"
+	@mkdir -p $(BUILDSYSTEM)/sbin && \
+	  echo "PO4A               := $(BUILDSYSTEM)/usr/bin/po4a" >> $(BUILDSYSTEM)/sbin/.config
+	@touch $@
Index: build-system-1.8.1/3pp/app/po4a/0.65/PATCHES
===================================================================
Index: build-system-1.8.1/3pp/app/po4a/0.65
===================================================================
--- build-system-1.8.1/3pp/app/po4a/0.65	(nonexistent)
+++ build-system-1.8.1/3pp/app/po4a/0.65	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/po4a/0.65
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/fakeroot/1.26/Makefile
===================================================================
--- build-system-1.8.1/3pp/app/fakeroot/1.26/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/app/fakeroot/1.26/Makefile	(revision 323)
@@ -0,0 +1,67 @@
+
+COMPONENT_TARGETS = $(HARDWARE_BUILD)
+
+include ../../../../../build-system/constants.mk
+
+SOURCE_REQUIRES = build-system/3pp/sources/packages/fakeroot
+
+REQUIRES = build-system/3pp/app/po4a/0.65
+
+# ======= __END_OF_REQUIRES__ =======
+
+version         = 1.26
+tar_xz_archive  = $(BUILDSYSTEM)/3pp/sources/packages/fakeroot/fakeroot-$(version).tar.xz
+SRC_ARCHIVE     = $(tar_xz_archive)
+SRC_DIR         = $(TARGET_BUILD_DIR)/fakeroot-$(version)
+
+src_done        = $(TARGET_BUILD_DIR)/.source-done
+src_dir_name    = fakeroot-$(version)
+build_dir       = $(TARGET_BUILD_DIR)/built
+
+PATCHES = PATCHES
+
+build_target    = $(TARGET_BUILD_DIR)/.built
+install_target  = $(TARGET_BUILD_DIR)/.installed
+
+script          = $(CURDIR)/scripts/fakeroot
+
+environment     = CPPFLAGS=-I$(BUILDSYSTEM)/usr/include
+environment    += LDFLAGS=-Wl,-rpath=$(BUILDSYSTEM)/usr/lib
+
+extra_configure_switches  = --libdir=/usr/lib
+extra_configure_switches += --program-suffix=-sysv
+extra_configure_switches += --mandir=/usr/share/man
+extra_configure_switches += --disable-static
+extra_configure_switches += --with-ipc=sysv
+
+
+BUILD_TARGETS = $(install_target)
+
+include ../../../../../build-system/core.mk
+
+$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
+	$(UNPACK_SRC_ARCHIVE)
+	$(APPLY_PATCHES)
+	@( cd $(SRC_DIR) ; ./bootstrap )
+	@( cd $(SRC_DIR)/doc ; \
+	   $(BUILDSYSTEM)/usr/bin/po4a -k 0 --rm-backups --variable 'srcdir=../doc/' po4a/po4a.cfg ; \
+	 )
+	@touch $@
+
+$(build_target): $(src_done)
+	@mkdir -p $(build_dir)
+	@cd $(build_dir) && $(environment) ../$(src_dir_name)/configure \
+	  --prefix=/usr \
+	  $(extra_configure_switches)
+	@$(environment) $(MAKE) -C $(build_dir)
+	@touch $@
+
+$(install_target): $(build_target)
+	@echo -e "\n======= Installing FAKEROOT binary =======\n"
+	@cd $(build_dir) && $(MAKE) install DESTDIR=$(BUILDSYSTEM)
+	@echo -e "\n======= Installing FAKEROOT wrapper =======\n"
+	@mkdir -p $(BUILDSYSTEM)/sbin && \
+	  cp -a $(script) $(BUILDSYSTEM)/sbin/fakeroot && \
+	  chmod a+x $(BUILDSYSTEM)/sbin/fakeroot       && \
+	  echo "PSEUDO             := $(BUILDSYSTEM)/sbin/fakeroot" >> $(BUILDSYSTEM)/sbin/.config
+	@touch $@
Index: build-system-1.8.1/3pp/app/fakeroot/1.26/PATCHES
===================================================================
Index: build-system-1.8.1/3pp/app/fakeroot/1.26/scripts/fakeroot
===================================================================
--- build-system-1.8.1/3pp/app/fakeroot/1.26/scripts/fakeroot	(nonexistent)
+++ build-system-1.8.1/3pp/app/fakeroot/1.26/scripts/fakeroot	(revision 323)
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+program=$0
+fakeroot_prefix=$(cd $(dirname $program)/.. ; pwd -P)/usr
+
+shell=$1 ; shift ; option=$1 ; shift
+
+#
+# remove extra spaces
+#
+args=`echo "${@}" | sed 's/ \{1,\}/ /g'`
+
+${fakeroot_prefix}/bin/fakeroot-sysv --lib ${fakeroot_prefix}/lib/libfakeroot-0.so \
+                                     --faked ${fakeroot_prefix}/bin/faked-sysv -- $shell $option "$args"
+
+
Index: build-system-1.8.1/3pp/app/fakeroot/1.26
===================================================================
--- build-system-1.8.1/3pp/app/fakeroot/1.26	(nonexistent)
+++ build-system-1.8.1/3pp/app/fakeroot/1.26	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/fakeroot/1.26
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/perl-SGMLS/1.1/Makefile
===================================================================
--- build-system-1.8.1/3pp/app/perl-SGMLS/1.1/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/app/perl-SGMLS/1.1/Makefile	(revision 323)
@@ -0,0 +1,61 @@
+
+COMPONENT_TARGETS = $(HARDWARE_BUILD)
+
+include ../../../../../build-system/constants.mk
+
+SOURCE_REQUIRES = build-system/3pp/sources/packages/perl-SGMLS
+
+REQUIRES = build-system/3pp/app/perl/5.34.0
+
+# ======= __END_OF_REQUIRES__ =======
+
+version         = 1.1
+tar_xz_archive  = $(BUILDSYSTEM)/3pp/sources/packages/perl-SGMLS/perl-SGMLS-$(version).tar.xz
+SRC_ARCHIVE     = $(tar_xz_archive)
+SRC_DIR         = $(TARGET_BUILD_DIR)/perl-SGMLS-$(version)
+src_done        = $(TARGET_BUILD_DIR)/.source-done
+
+PATCHES = PATCHES
+
+build_target    = $(TARGET_BUILD_DIR)/.built
+install_target  = $(TARGET_BUILD_DIR)/.installed
+
+BUILD_TARGETS   = $(build_target)
+BUILD_TARGETS  += $(install_target)
+
+
+include ../../../../../build-system/core.mk
+
+
+build_environment  = PERL_MM_USE_DEFAULT=1
+build_environment += PERL_AUTOINSTALL=--skipdeps
+build_environment += PERL_MM_OPT="INSTALLDIRS=vendor"
+build_environment += PERL_MB_OPT="--installdirs vendor"
+build_environment += MODULEBUILDRC=/dev/null
+
+
+$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
+	$(UNPACK_SRC_ARCHIVE)
+	$(APPLY_PATCHES)
+	@touch $@
+
+$(build_target): $(src_done)
+	@cd $(SRC_DIR) && $(build_environment) $(BUILDSYSTEM)/usr/bin/perl Makefile.PL
+	@cd $(SRC_DIR) && $(MAKE)
+	@touch $@
+
+$(install_target): $(build_target)
+	@echo -e "\n======= Install Required modules =======\n"
+	@( cd $(BUILDSYSTEM)/usr/bin ; \
+	   ./cpan-install Locale::gettext             2>/dev/null ; \
+	   ./cpan-install Text::WrapI18N              2>/dev/null ; \
+	   ./cpan-install Term::ReadKey               2>/dev/null ; \
+	   ./cpan-install SGML::Parser::OpenSP::Tools 2>/dev/null ; \
+	   ./cpan-install Docbook::Table              2>/dev/null ; \
+	   ./cpan-install Pod::DocBook                2>/dev/null ; \
+	   ./cpan-install Unicode::GCString           2>/dev/null ; \
+	   ./cpan-install YAML::Tiny                  2>/dev/null ; \
+	 )
+	@echo -e "\n======= Installing Perl SGMLS binaries =======\n"
+	@cd $(SRC_DIR) && $(MAKE) -j1 install
+	@touch $@
Index: build-system-1.8.1/3pp/app/perl-SGMLS/1.1/PATCHES
===================================================================
Index: build-system-1.8.1/3pp/app/perl-SGMLS/1.1
===================================================================
--- build-system-1.8.1/3pp/app/perl-SGMLS/1.1	(nonexistent)
+++ build-system-1.8.1/3pp/app/perl-SGMLS/1.1	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/perl-SGMLS/1.1
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/automake/1.16.5/Makefile
===================================================================
--- build-system-1.8.1/3pp/app/automake/1.16.5/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/app/automake/1.16.5/Makefile	(revision 323)
@@ -0,0 +1,43 @@
+
+COMPONENT_TARGETS = $(HARDWARE_BUILD)
+
+include ../../../../../build-system/constants.mk
+
+SOURCE_REQUIRES = build-system/3pp/sources/packages/automake
+
+
+# ======= __END_OF_REQUIRES__ =======
+
+version         = 1.16.5
+tar_xz_archive  = $(BUILDSYSTEM)/3pp/sources/packages/automake/automake-$(version).tar.xz
+src_dir         = automake-$(version)
+
+src_done        = $(TARGET_BUILD_DIR)/.source-done
+SRC_DIR         = $(TARGET_BUILD_DIR)/automake-$(version)
+SRC_ARCHIVE     = $(tar_xz_archive)
+
+PATCHES = PATCHES
+
+install_target  = $(TARGET_BUILD_DIR)/.installed
+
+BUILD_TARGETS   = $(install_target)
+
+
+include ../../../../../build-system/core.mk
+
+
+$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
+	$(UNPACK_SRC_ARCHIVE)
+	$(APPLY_PATCHES)
+	@touch $@
+
+$(install_target): $(src_done)
+	@echo -e "\n======= Installing Automake scripts =======\n"
+	@mkdir -p $(BUILDSYSTEM)/usr/share/automake-$(version)
+	@cd $(SRC_DIR)/lib ; \
+	  cp -a config.guess config.sub \
+	  $(BUILDSYSTEM)/usr/share/automake-$(version)
+	@mkdir -p $(BUILDSYSTEM)/sbin && \
+	  echo "CONFIG_GUESS       := $(BUILDSYSTEM)/usr/share/automake-$(version)/config.guess" >> $(BUILDSYSTEM)/sbin/.config && \
+	  echo "CONFIG_SUB         := $(BUILDSYSTEM)/usr/share/automake-$(version)/config.sub"   >> $(BUILDSYSTEM)/sbin/.config
+	@touch $@
Index: build-system-1.8.1/3pp/app/automake/1.16.5/PATCHES
===================================================================
Index: build-system-1.8.1/3pp/app/automake/1.16.5
===================================================================
--- build-system-1.8.1/3pp/app/automake/1.16.5	(nonexistent)
+++ build-system-1.8.1/3pp/app/automake/1.16.5	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/automake/1.16.5
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/automake
===================================================================
--- build-system-1.8.1/3pp/app/automake	(nonexistent)
+++ build-system-1.8.1/3pp/app/automake	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/automake
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/dialog/1.3-20210621/Makefile
===================================================================
--- build-system-1.8.1/3pp/app/dialog/1.3-20210621/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/app/dialog/1.3-20210621/Makefile	(revision 323)
@@ -0,0 +1,68 @@
+
+COMPONENT_TARGETS = $(HARDWARE_BUILD)
+
+include ../../../../../build-system/constants.mk
+
+SOURCE_REQUIRES = build-system/3pp/sources/packages/dialog
+
+
+# ======= __END_OF_REQUIRES__ =======
+
+
+tar_gz_archive  = $(BUILDSYSTEM)/3pp/sources/packages/dialog/dialog-1.3-20210621.tgz
+src_dir         = dialog-1.3-20210621
+build_dir       = $(TARGET_BUILD_DIR)/built
+
+src_done        = $(TARGET_BUILD_DIR)/.source-done
+SRC_DIR         = $(TARGET_BUILD_DIR)/dialog-1.3-20210621
+SRC_ARCHIVE     = $(tar_gz_archive)
+
+PATCHES = PATCHES
+
+build_target    = $(TARGET_BUILD_DIR)/.built
+install_target  = $(TARGET_BUILD_DIR)/.installed
+
+BUILD_TARGETS   = $(build_target)
+BUILD_TARGETS  += $(install_target)
+
+
+include ../../../../../build-system/core.mk
+
+
+environment     =
+extra_configure_switches += --mandir=$(BUILDSYSTEM)/usr/share/man
+extra_configure_switches += --with-shared
+extra_configure_switches += --with-libtool
+extra_configure_switches += --with-ncursesw
+extra_configure_switches += --enable-widec
+
+
+$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
+	$(UNPACK_SRC_ARCHIVE)
+	$(APPLY_PATCHES)
+	@touch $@
+
+$(build_target): $(src_done)
+	@mkdir -p $(build_dir)
+	@cd $(build_dir) && $(environment) ../$(src_dir)/configure \
+	  --prefix=$(BUILDSYSTEM)/usr \
+	  --exec-prefix=$(BUILDSYSTEM)/usr \
+	  --build=$(BUILD) \
+	  --host=$(BUILD)  \
+	  $(extra_configure_switches)
+	@$(environment) $(MAKE) -C $(build_dir) all
+	@touch $@
+
+$(install_target): $(build_target)
+	@echo -e "\n======= Installing DIALOG binary =======\n"
+	@$(environment) $(MAKE) -j1 -C $(build_dir) install
+	@sed -i '/^#include <dlg_config.h>/,+1d' $(BUILDSYSTEM)/usr/include/dialog.h
+	@rm -f $(BUILDSYSTEM)/usr/include/dlg_config.h
+	@chmod 755 $(BUILDSYSTEM)/usr/lib/libdialog.{la,so*}
+	@mkdir -p $(BUILDSYSTEM)/usr/share/aclocal
+	@cat $(SRC_DIR)/dialog.m4 > $(BUILDSYSTEM)/usr/share/aclocal/dialog.m4
+	@chmod 644 $(BUILDSYSTEM)/usr/share/aclocal/dialog.m4
+	@mkdir -p $(BUILDSYSTEM)/sbin && \
+	  echo "DIALOG             := $(BUILDSYSTEM)/usr/bin/dialog"        >> $(BUILDSYSTEM)/sbin/.config && \
+	  echo "DIALOG_CONFIG      := $(BUILDSYSTEM)/usr/bin/dialog-config" >> $(BUILDSYSTEM)/sbin/.config
+	@touch $@
Index: build-system-1.8.1/3pp/app/dialog/1.3-20210621/PATCHES
===================================================================
--- build-system-1.8.1/3pp/app/dialog/1.3-20210621/PATCHES	(nonexistent)
+++ build-system-1.8.1/3pp/app/dialog/1.3-20210621/PATCHES	(revision 323)
@@ -0,0 +1,2 @@
+
+../../../sources/packages/dialog/patches/dialog-1.3-20210621.patch -p0
Index: build-system-1.8.1/3pp/app/dialog/1.3-20210621
===================================================================
--- build-system-1.8.1/3pp/app/dialog/1.3-20210621	(nonexistent)
+++ build-system-1.8.1/3pp/app/dialog/1.3-20210621	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/dialog/1.3-20210621
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/dialog
===================================================================
--- build-system-1.8.1/3pp/app/dialog	(nonexistent)
+++ build-system-1.8.1/3pp/app/dialog	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/dialog
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/genext2fs/1.4.1/Makefile
===================================================================
--- build-system-1.8.1/3pp/app/genext2fs/1.4.1/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/app/genext2fs/1.4.1/Makefile	(revision 323)
@@ -0,0 +1,63 @@
+
+COMPONENT_TARGETS = $(HARDWARE_BUILD)
+
+include ../../../../../build-system/constants.mk
+
+SOURCE_REQUIRES = build-system/3pp/sources/packages/genext2fs
+
+
+# ======= __END_OF_REQUIRES__ =======
+
+
+version         = 1.4.1
+tar_gz_archive  = $(BUILDSYSTEM)/3pp/sources/packages/genext2fs/genext2fs-$(version).tar.gz
+src_dir         = genext2fs-$(version)
+build_dir       = $(TARGET_BUILD_DIR)/built
+
+src_done        = $(TARGET_BUILD_DIR)/.source-done
+SRC_DIR         = $(TARGET_BUILD_DIR)/genext2fs-$(version)
+SRC_ARCHIVE     = $(tar_gz_archive)
+
+PATCHES = PATCHES
+
+build_target    = $(TARGET_BUILD_DIR)/.built
+install_target  = $(TARGET_BUILD_DIR)/.installed
+
+BUILD_TARGETS   = $(build_target)
+BUILD_TARGETS  += $(install_target)
+
+
+include ../../../../../build-system/core.mk
+
+
+#
+# Workaround for MAJOR_IN_SYSMACROS definition in the config.h
+# (because of AC_HEADER_MAJOR function doesn't work correctly):
+#
+environment     = ac_cv_header_sys_types_h_makedev=no
+environment    += ac_cv_header_sys_mkdev_h=no
+
+extra_configure_switches = --libdir=/usr/lib$(BUILD_MULTILIB_SUFFIX)
+
+$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
+	$(UNPACK_SRC_ARCHIVE)
+	$(APPLY_PATCHES)
+	@touch $@
+
+$(build_target): $(src_done)
+	@mkdir -p $(build_dir)
+	@( cd $(SRC_DIR) ; \
+	   autoreconf -i ; rm -rf autom4te.cache ; rm -f *~ ; \
+	 )
+	@cd $(build_dir) && $(environment) ../$(src_dir)/configure \
+	  --prefix=/usr \
+	  $(extra_configure_switches)
+	@$(environment) $(MAKE) -C $(build_dir) all
+	@touch $@
+
+$(install_target): $(build_target)
+	@echo -e "\n======= Installing genext2fs binary =======\n"
+	@mkdir -p $(BUILDSYSTEM)/sbin && \
+	  cp -a $(build_dir)/genext2fs $(BUILDSYSTEM)/sbin && \
+	  echo "GENEXT2FS          := $(BUILDSYSTEM)/sbin/genext2fs" >> $(BUILDSYSTEM)/sbin/.config
+	@touch $@
Index: build-system-1.8.1/3pp/app/genext2fs/1.4.1/PATCHES
===================================================================
--- build-system-1.8.1/3pp/app/genext2fs/1.4.1/PATCHES	(nonexistent)
+++ build-system-1.8.1/3pp/app/genext2fs/1.4.1/PATCHES	(revision 323)
@@ -0,0 +1,3 @@
+
+../../../sources/packages/genext2fs/patches/genext2fs-1.4.1-blocksize.patch -p0
+../../../sources/packages/genext2fs/patches/genext2fs-1.4.1-configure.patch -p0
Index: build-system-1.8.1/3pp/app/genext2fs/1.4.1
===================================================================
--- build-system-1.8.1/3pp/app/genext2fs/1.4.1	(nonexistent)
+++ build-system-1.8.1/3pp/app/genext2fs/1.4.1	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/genext2fs/1.4.1
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/genext2fs
===================================================================
--- build-system-1.8.1/3pp/app/genext2fs	(nonexistent)
+++ build-system-1.8.1/3pp/app/genext2fs	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/genext2fs
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/jsmin/0.0.1/Makefile
===================================================================
--- build-system-1.8.1/3pp/app/jsmin/0.0.1/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/app/jsmin/0.0.1/Makefile	(revision 323)
@@ -0,0 +1,53 @@
+
+COMPONENT_TARGETS = $(HARDWARE_BUILD)
+
+include ../../../../../build-system/constants.mk
+
+SOURCE_REQUIRES = build-system/3pp/sources/packages/jsmin
+
+
+# ======= __END_OF_REQUIRES__ =======
+
+
+tar_gz_archive  = $(BUILDSYSTEM)/3pp/sources/packages/jsmin/jsmin-0.0.1.tar.gz
+src_dir         = jsmin-0.0.1
+build_dir       = $(TARGET_BUILD_DIR)/built
+
+src_done        = $(TARGET_BUILD_DIR)/.source-done
+SRC_DIR         = $(TARGET_BUILD_DIR)/jsmin-0.0.1
+SRC_ARCHIVE     = $(tar_gz_archive)
+
+build_target    = $(TARGET_BUILD_DIR)/.built
+install_target  = $(TARGET_BUILD_DIR)/.installed
+
+BUILD_TARGETS   = $(build_target)
+BUILD_TARGETS  += $(install_target)
+
+
+include ../../../../../build-system/core.mk
+
+
+environment     =
+
+extra_configure_switches  = --program-prefix=''
+extra_configure_switches += --program-suffix=''
+
+
+$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
+	$(UNPACK_SRC_ARCHIVE)
+	@touch $@
+
+$(build_target): $(src_done)
+	@mkdir -p $(build_dir)
+	@cd $(build_dir) && $(environment) ../$(src_dir)/configure \
+	  --prefix=/usr \
+	  $(extra_configure_switches)
+	@$(environment) $(MAKE) -C $(build_dir) all
+	@touch $@
+
+$(install_target): $(build_target)
+	@echo -e "\n======= Installing JSMIN binary =======\n"
+	@mkdir -p $(BUILDSYSTEM)/sbin && \
+	  cp -a $(build_dir)/src/jsmin     $(BUILDSYSTEM)/sbin && \
+	  echo "JSMIN              := $(BUILDSYSTEM)/sbin/jsmin" >> $(BUILDSYSTEM)/sbin/.config
+	@touch $@
Index: build-system-1.8.1/3pp/app/jsmin/0.0.1
===================================================================
--- build-system-1.8.1/3pp/app/jsmin/0.0.1	(nonexistent)
+++ build-system-1.8.1/3pp/app/jsmin/0.0.1	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/jsmin/0.0.1
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/jsmin
===================================================================
--- build-system-1.8.1/3pp/app/jsmin	(nonexistent)
+++ build-system-1.8.1/3pp/app/jsmin	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/jsmin
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/python2/2.7.18/Makefile
===================================================================
--- build-system-1.8.1/3pp/app/python2/2.7.18/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/app/python2/2.7.18/Makefile	(revision 323)
@@ -0,0 +1,109 @@
+
+COMPONENT_TARGETS = $(HARDWARE_BUILD)
+
+include ../../../../../build-system/constants.mk
+
+SOURCE_REQUIRES = build-system/3pp/sources/packages/python2
+
+
+# ======= __END_OF_REQUIRES__ =======
+
+version         = 2.7.18
+tar_xz_archive  = $(BUILDSYSTEM)/3pp/sources/packages/python2/Python-$(version).tar.xz
+SRC_ARCHIVE     = $(tar_xz_archive)
+SRC_DIR         = $(TARGET_BUILD_DIR)/Python-$(version)
+src_done        = $(TARGET_BUILD_DIR)/.source-done
+
+PATCHES = PATCHES
+
+build_target    = $(TARGET_BUILD_DIR)/.built
+install_target  = $(TARGET_BUILD_DIR)/.installed
+
+BUILD_TARGETS   = $(build_target)
+BUILD_TARGETS  += $(install_target)
+
+
+include ../../../../../build-system/core.mk
+
+
+LDFLAGS    += -Wl,-rpath,$(BUILDSYSTEM)/usr/lib
+
+extra_configure_switches  = --libdir=$(BUILDSYSTEM)/usr/lib
+extra_configure_switches += --bindir=$(BUILDSYSTEM)/usr/bin
+extra_configure_switches += --docdir=$(BUILDSYSTEM)/usr/share/doc/$(src_dir_name)
+extra_configure_switches += --mandir=$(BUILDSYSTEM)/usr/share/man
+extra_configure_switches += --with-system-expat
+extra_configure_switches += --with-system-ffi
+extra_configure_switches += --with-threads
+extra_configure_switches += --enable-ipv6
+extra_configure_switches += --enable-shared
+
+python_environment  = RFS=$(BUILDSYSTEM)
+python_environment += PYTHONHOME=$(BUILDSYSTEM)/usr/lib/python2.7
+python_environment += LDFLAGS='$(LDFLAGS)'
+
+
+$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
+	$(UNPACK_SRC_ARCHIVE)
+	$(APPLY_PATCHES)
+	@touch $@
+
+$(build_target): $(src_done)
+	@cd $(SRC_DIR) && $(python_environment) ./configure \
+	  --prefix=$(BUILDSYSTEM)/usr \
+	  --exec-prefix=$(BUILDSYSTEM)/usr \
+	  --build=$(BUILD) \
+	  --host=$(BUILD)  \
+	  $(extra_configure_switches)
+	@cd $(SRC_DIR) && $(python_environment) $(MAKE)
+	@cd $(SRC_DIR) && $(python_environment) $(MAKE) Parser/pgen
+	@touch $@
+
+$(install_target): $(build_target)
+	@echo -e "\n======= Installing Python 2.7 binary =======\n"
+	@cd $(SRC_DIR) && $(MAKE) -j1 $(python_environment) install
+	@cp -a $(SRC_DIR)/Parser/pgen $(BUILDSYSTEM)/usr/bin/
+	@( cd $(BUILDSYSTEM)/usr/bin ; \
+	   mv 2to3  2to3-2.7 ; ln -sf 2to3-2.7 2to3   ; \
+	   mv idle  idle2.7  ; ln -sf idle2.7  idle2  ; ln -sf idle2  idle ; \
+	   mv pydoc pydoc2.7 ; ln -sf pydoc2.7 pydoc2 ; ln -sf pydoc2 pydoc; \
+	   mv pgen  pgen2.7  ; ln -sf pgen2.7  pgen2  ; ln -sf pgen2  pgen ; \
+	 )
+	@( cd $(BUILDSYSTEM)/usr/include/python2.7 ; \
+	   mv pyconfig.h pyconfig-64.h ; \
+	   echo ''                                                    > pyconfig.h ; \
+	   echo '/******************************'                    >> pyconfig.h ; \
+	   echo '  pyconfig.h - Multilib Header'                     >> pyconfig.h ; \
+	   echo ' ******************************/'                   >> pyconfig.h ; \
+	   echo ''                                                   >> pyconfig.h ; \
+	   echo '#ifndef __MULTILIB__PYCONFIG_H__'                   >> pyconfig.h ; \
+	   echo '#define __MULTILIB__PYCONFIG_H__'                   >> pyconfig.h ; \
+	   echo ''                                                   >> pyconfig.h ; \
+	   echo '#if defined(__x86_64__)    || \'                    >> pyconfig.h ; \
+	   echo '    defined(__aarch64__)   || \'                    >> pyconfig.h ; \
+	   echo '    defined(__powerpc64__) || \'                    >> pyconfig.h ; \
+	   echo '    defined(__sparc__) && defined(__arch64__) || \' >> pyconfig.h ; \
+	   echo '    defined(__riscv_xlen) && __riscv_xlen == 64'    >> pyconfig.h ; \
+	   echo '#include "pyconfig-64.h"'                           >> pyconfig.h ; \
+	   echo '#else'                                              >> pyconfig.h ; \
+	   echo '#include "pyconfig-32.h"'                           >> pyconfig.h ; \
+	   echo '#endif'                                             >> pyconfig.h ; \
+	   echo ''                                                   >> pyconfig.h ; \
+	   echo '#endif /* __MULTILIB__PYCONFIG_H__ */'              >> pyconfig.h ; \
+	   cat pyconfig-64.h | \
+	     sed -e 's,^\/\* #undef HAVE_LARGEFILE_SUPPORT \*\/,#define HAVE_LARGEFILE_SUPPORT 1,' \
+	         -e 's,^#define SIZEOF_LONG 8,#define SIZEOF_LONG 4,'                              \
+	         -e 's,^#define SIZEOF_LONG_DOUBLE 16,#define SIZEOF_LONG_DOUBLE 12,'              \
+	         -e 's,^#define SIZEOF_PTHREAD_T 8,#define SIZEOF_PTHREAD_T 4,'                    \
+	         -e 's,^#define SIZEOF_SIZE_T 8,#define SIZEOF_SIZE_T 4,'                          \
+	         -e 's,^#define SIZEOF_TIME_T 8,#define SIZEOF_TIME_T 4,'                          \
+	         -e 's,^#define SIZEOF_UINTPTR_T 8,#define SIZEOF_UINTPTR_T 4,'                    \
+	         -e 's,^#define SIZEOF_VOID_P 8,#define SIZEOF_VOID_P 4,'                          \
+	         -e 's,^#define VA_LIST_IS_ARRAY 1,\/\* #undef VA_LIST_IS_ARRAY \*\/,'             \
+	     > pyconfig-32.h ; \
+	 )
+	@echo -e "\n======= Setup PYTHON2 build-system variable =======\n"
+	@mkdir -p $(BUILDSYSTEM)/sbin && \
+	  echo "PYTHON2            := $(BUILDSYSTEM)/usr/bin/python2" >> $(BUILDSYSTEM)/sbin/.config ; \
+	  echo "PGEN2              := $(BUILDSYSTEM)/usr/bin/pgen2"   >> $(BUILDSYSTEM)/sbin/.config
+	@touch $@
Index: build-system-1.8.1/3pp/app/python2/2.7.18/PATCHES
===================================================================
Index: build-system-1.8.1/3pp/app/python2/2.7.18
===================================================================
--- build-system-1.8.1/3pp/app/python2/2.7.18	(nonexistent)
+++ build-system-1.8.1/3pp/app/python2/2.7.18	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/python2/2.7.18
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/python2
===================================================================
--- build-system-1.8.1/3pp/app/python2	(nonexistent)
+++ build-system-1.8.1/3pp/app/python2	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/python2
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/python2-modules/pip/20.3/Makefile
===================================================================
--- build-system-1.8.1/3pp/app/python2-modules/pip/20.3/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/app/python2-modules/pip/20.3/Makefile	(revision 323)
@@ -0,0 +1,56 @@
+
+COMPONENT_TARGETS = $(HARDWARE_BUILD)
+
+include ../../../../../../build-system/constants.mk
+
+SOURCE_REQUIRES = build-system/3pp/sources/packages/python-modules/pip
+
+REQUIRES = build-system/3pp/app/python2-modules/setuptools/44.0.0
+
+# ======= __END_OF_REQUIRES__ =======
+
+version         = 20.3
+tar_gz_archive  = $(BUILDSYSTEM)/3pp/sources/packages/python-modules/pip/pip-$(version).tar.gz
+SRC_ARCHIVE     = $(tar_gz_archive)
+SRC_DIR         = $(TARGET_BUILD_DIR)/pip-$(version)
+src_done        = $(TARGET_BUILD_DIR)/.source-done
+
+PATCHES = PATCHES
+
+build_target    = $(TARGET_BUILD_DIR)/.built
+install_target  = $(TARGET_BUILD_DIR)/.installed
+
+BUILD_TARGETS   = $(build_target)
+BUILD_TARGETS  += $(install_target)
+
+
+include ../../../../../../build-system/core.mk
+
+
+$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
+	$(UNPACK_SRC_ARCHIVE)
+	$(APPLY_PATCHES)
+	@touch $@
+
+$(build_target): $(src_done)
+	@( cd $(SRC_DIR) ; \
+	   $(BUILDSYSTEM)/usr/bin/python2 setup.py build ; \
+	 )
+	@touch $@
+
+$(install_target): $(build_target)
+	@echo -e "\n======= Installing setuptools-$(version) =======\n"
+	@( cd $(SRC_DIR) ; \
+	   $(BUILDSYSTEM)/usr/bin/python2 setup.py install ; \
+	 )
+	@( cd $(BUILDSYSTEM)/usr/bin ; \
+	   rm -f pip ; ln -sf pip2 pip ; \
+	 )
+	@echo -e "\n======= Install Python2 M2Crypto package =======\n"
+	@( cd $(BUILDSYSTEM)/usr/bin ; \
+	   ./pip2.7 install M2Crypto ; \
+	 )
+	@echo -e "\n======= Setup PIP2 build-system variable =======\n"
+	@mkdir -p $(BUILDSYSTEM)/sbin && \
+	  echo "PIP2               := $(BUILDSYSTEM)/usr/bin/pip2"    >> $(BUILDSYSTEM)/sbin/.config
+	@touch $@
Index: build-system-1.8.1/3pp/app/python2-modules/pip/20.3/PATCHES
===================================================================
Index: build-system-1.8.1/3pp/app/python2-modules/pip/20.3
===================================================================
--- build-system-1.8.1/3pp/app/python2-modules/pip/20.3	(nonexistent)
+++ build-system-1.8.1/3pp/app/python2-modules/pip/20.3	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/python2-modules/pip/20.3
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/python2-modules/pip
===================================================================
--- build-system-1.8.1/3pp/app/python2-modules/pip	(nonexistent)
+++ build-system-1.8.1/3pp/app/python2-modules/pip	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/python2-modules/pip
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/python2-modules/setuptools/44.0.0/Makefile
===================================================================
--- build-system-1.8.1/3pp/app/python2-modules/setuptools/44.0.0/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/app/python2-modules/setuptools/44.0.0/Makefile	(revision 323)
@@ -0,0 +1,47 @@
+
+COMPONENT_TARGETS = $(HARDWARE_BUILD)
+
+include ../../../../../../build-system/constants.mk
+
+SOURCE_REQUIRES = build-system/3pp/sources/packages/python-modules/setuptools
+
+REQUIRES = build-system/3pp/app/python2/2.7.18
+
+# ======= __END_OF_REQUIRES__ =======
+
+version         = 44.0.0
+tar_gz_archive  = $(BUILDSYSTEM)/3pp/sources/packages/python-modules/setuptools/setuptools-$(version).tar.gz
+SRC_ARCHIVE     = $(tar_gz_archive)
+SRC_DIR         = $(TARGET_BUILD_DIR)/setuptools-$(version)
+src_done        = $(TARGET_BUILD_DIR)/.source-done
+
+PATCHES = PATCHES
+
+build_target    = $(TARGET_BUILD_DIR)/.built
+install_target  = $(TARGET_BUILD_DIR)/.installed
+
+BUILD_TARGETS   = $(build_target)
+BUILD_TARGETS  += $(install_target)
+
+
+include ../../../../../../build-system/core.mk
+
+
+$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
+	$(UNPACK_SRC_ARCHIVE)
+	$(APPLY_PATCHES)
+	@touch $@
+
+$(build_target): $(src_done)
+	@( cd $(SRC_DIR) ; \
+	   $(BUILDSYSTEM)/usr/bin/python2 bootstrap.py   ; \
+	   $(BUILDSYSTEM)/usr/bin/python2 setup.py build ; \
+	 )
+	@touch $@
+
+$(install_target): $(build_target)
+	@echo -e "\n======= Installing setuptools-$(version) =======\n"
+	@( cd $(SRC_DIR) ; \
+	   $(BUILDSYSTEM)/usr/bin/python2 setup.py install ; \
+	 )
+	@touch $@
Index: build-system-1.8.1/3pp/app/python2-modules/setuptools/44.0.0/PATCHES
===================================================================
--- build-system-1.8.1/3pp/app/python2-modules/setuptools/44.0.0/PATCHES	(nonexistent)
+++ build-system-1.8.1/3pp/app/python2-modules/setuptools/44.0.0/PATCHES	(revision 323)
@@ -0,0 +1,2 @@
+
+#../../../../sources/packages/python-modules/setuptools/patches/setuptools-46.4.0-warn.patch -p0
Index: build-system-1.8.1/3pp/app/python2-modules/setuptools/44.0.0
===================================================================
--- build-system-1.8.1/3pp/app/python2-modules/setuptools/44.0.0	(nonexistent)
+++ build-system-1.8.1/3pp/app/python2-modules/setuptools/44.0.0	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/python2-modules/setuptools/44.0.0
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/python2-modules/setuptools
===================================================================
--- build-system-1.8.1/3pp/app/python2-modules/setuptools	(nonexistent)
+++ build-system-1.8.1/3pp/app/python2-modules/setuptools	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/python2-modules/setuptools
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/python2-modules
===================================================================
--- build-system-1.8.1/3pp/app/python2-modules	(nonexistent)
+++ build-system-1.8.1/3pp/app/python2-modules	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/python2-modules
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/populatefs/1.1/Makefile
===================================================================
--- build-system-1.8.1/3pp/app/populatefs/1.1/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/app/populatefs/1.1/Makefile	(revision 323)
@@ -0,0 +1,56 @@
+
+COMPONENT_TARGETS = $(HARDWARE_BUILD)
+
+include ../../../../../build-system/constants.mk
+
+SOURCE_REQUIRES = build-system/3pp/sources/packages/populatefs
+
+
+# ======= __END_OF_REQUIRES__ =======
+
+
+version         = 1.1
+tar_xz_archive  = $(BUILDSYSTEM)/3pp/sources/packages/populatefs/populatefs-$(version).tar.xz
+src_dir         = populatefs-$(version)
+build_dir       = $(TARGET_BUILD_DIR)/built
+
+src_done        = $(TARGET_BUILD_DIR)/.source-done
+SRC_DIR         = $(TARGET_BUILD_DIR)/populatefs-$(version)
+SRC_ARCHIVE     = $(tar_xz_archive)
+
+PATCHES = PATCHES
+
+build_target    = $(TARGET_BUILD_DIR)/.built
+install_target  = $(TARGET_BUILD_DIR)/.installed
+
+BUILD_TARGETS   = $(build_target)
+BUILD_TARGETS  += $(install_target)
+
+
+include ../../../../../build-system/core.mk
+
+
+environment     = prefix=/usr
+environment    += bindir=/sbin
+environment    += libdir=/usr/lib$(BUILD_MULTILIB_SUFFIX)
+environment    += includedir=/usr/include
+environment    += LDFLAGS=-L/usr/lib$(BUILD_MULTILIB_SUFFIX)
+
+
+$(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
+	$(UNPACK_SRC_ARCHIVE)
+	$(APPLY_PATCHES)
+	@touch $@
+
+$(build_target): $(src_done)
+	@( cd $(SRC_DIR) ; \
+	   $(MAKE) $(environment) ; \
+	 )
+	@touch $@
+
+$(install_target): $(build_target)
+	@echo -e "\n======= Installing POPULATEFS binary =======\n"
+	@mkdir -p $(BUILDSYSTEM)/sbin && \
+	  cp -a $(SRC_DIR)/src/populatefs $(BUILDSYSTEM)/sbin && \
+	  echo "POPULATEFS         := $(BUILDSYSTEM)/sbin/populatefs" >> $(BUILDSYSTEM)/sbin/.config
+	@touch $@
Index: build-system-1.8.1/3pp/app/populatefs/1.1/PATCHES
===================================================================
--- build-system-1.8.1/3pp/app/populatefs/1.1/PATCHES	(nonexistent)
+++ build-system-1.8.1/3pp/app/populatefs/1.1/PATCHES	(revision 323)
@@ -0,0 +1,3 @@
+
+../../../sources/packages/populatefs/patches/populatefs-1.1-sys-macros.patch -p0
+../../../sources/packages/populatefs/patches/populatefs-1.1-version.patch    -p0
Index: build-system-1.8.1/3pp/app/populatefs/1.1
===================================================================
--- build-system-1.8.1/3pp/app/populatefs/1.1	(nonexistent)
+++ build-system-1.8.1/3pp/app/populatefs/1.1	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/populatefs/1.1
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app/populatefs
===================================================================
--- build-system-1.8.1/3pp/app/populatefs	(nonexistent)
+++ build-system-1.8.1/3pp/app/populatefs	(revision 323)

Property changes on: build-system-1.8.1/3pp/app/populatefs
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/app
===================================================================
--- build-system-1.8.1/3pp/app	(nonexistent)
+++ build-system-1.8.1/3pp/app	(revision 323)

Property changes on: build-system-1.8.1/3pp/app
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/sources/packages/ruby/Makefile
===================================================================
--- build-system-1.8.1/3pp/sources/packages/ruby/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/ruby/Makefile	(revision 323)
@@ -0,0 +1,48 @@
+
+COMPONENT_TARGETS = $(HARDWARE_NOARCH)
+
+
+include ../../../../../build-system/constants.mk
+
+
+url         = $(DOWNLOAD_SERVER)/sources/packages/d/ruby
+
+
+versions    = 3.1.0
+pkgname     = ruby
+suffix      = tar.xz
+
+tarballs    = $(addsuffix .$(suffix), $(addprefix $(pkgname)-, $(versions)))
+sha1s       = $(addsuffix .sha1sum, $(tarballs))
+
+
+BUILD_TARGETS = $(tarballs) $(sha1s)
+
+
+include ../../../../../build-system/core.mk
+
+
+.PHONY: download_clean
+
+
+$(tarballs):
+	@echo -e "\n======= Downloading source tarballs =======\n" ; \
+	 for tarball in $(tarballs) ; do \
+	   echo "$(url)/$$tarball" | xargs -n 1 -P 100 wget $(WGET_OPTIONS) - & \
+	 done ; wait
+
+$(sha1s): $(tarballs)
+	@for sha in $@ ; do \
+	   echo -e "\n======= Downloading '$$sha' signature =======\n" ; \
+	   echo "$(url)/$$sha" | xargs -n 1 -P 100 wget $(WGET_OPTIONS) - & wait %1 ; \
+	   touch $$sha ; \
+	   echo -e "\n======= Check the '$$sha' sha1sum =======\n" ; \
+	   sha1sum --check $$sha ; ret="$$?" ; \
+	   if [ "$$ret" == "1" ]; then \
+	     echo -e "\n======= ERROR: Bad '$$sha' sha1sum =======\n" ; \
+	     exit 1 ; \
+	   fi ; \
+	 done
+
+download_clean:
+	@rm -f $(tarballs) $(sha1s)
Index: build-system-1.8.1/3pp/sources/packages/ruby
===================================================================
--- build-system-1.8.1/3pp/sources/packages/ruby	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/ruby	(revision 323)

Property changes on: build-system-1.8.1/3pp/sources/packages/ruby
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,51 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# cpan configure targets
+.installed
+CPAN-Config.pm
+CPAN-install
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/sources/packages/automake/Makefile
===================================================================
--- build-system-1.8.1/3pp/sources/packages/automake/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/automake/Makefile	(revision 323)
@@ -0,0 +1,48 @@
+
+COMPONENT_TARGETS = $(HARDWARE_NOARCH)
+
+
+include ../../../../../build-system/constants.mk
+
+
+url         = $(DOWNLOAD_SERVER)/sources/GNU/automake
+
+
+versions    = 1.16.5
+pkgname     = automake
+suffix      = tar.xz
+
+tarballs    = $(addsuffix .$(suffix), $(addprefix $(pkgname)-, $(versions)))
+sha1s       = $(addsuffix .sha1sum, $(tarballs))
+
+
+BUILD_TARGETS = $(tarballs) $(sha1s)
+
+
+include ../../../../../build-system/core.mk
+
+
+.PHONY: download_clean
+
+
+$(tarballs):
+	@echo -e "\n======= Downloading source tarballs =======\n" ; \
+	 for tarball in $(tarballs) ; do \
+	   echo "$(url)/$$tarball" | xargs -n 1 -P 100 wget $(WGET_OPTIONS) - & \
+	 done ; wait
+
+$(sha1s): $(tarballs)
+	@for sha in $@ ; do \
+	   echo -e "\n======= Downloading '$$sha' signature =======\n" ; \
+	   echo "$(url)/$$sha" | xargs -n 1 -P 100 wget $(WGET_OPTIONS) - & wait %1 ; \
+	   touch $$sha ; \
+	   echo -e "\n======= Check the '$$sha' sha1sum =======\n" ; \
+	   sha1sum --check $$sha ; ret="$$?" ; \
+	   if [ "$$ret" == "1" ]; then \
+	     echo -e "\n======= ERROR: Bad '$$sha' sha1sum =======\n" ; \
+	     exit 1 ; \
+	   fi ; \
+	 done
+
+download_clean:
+	@rm -f $(tarballs) $(sha1s)
Index: build-system-1.8.1/3pp/sources/packages/automake
===================================================================
--- build-system-1.8.1/3pp/sources/packages/automake	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/automake	(revision 323)

Property changes on: build-system-1.8.1/3pp/sources/packages/automake
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/sources/packages/dialog/Makefile
===================================================================
--- build-system-1.8.1/3pp/sources/packages/dialog/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/dialog/Makefile	(revision 323)
@@ -0,0 +1,56 @@
+
+COMPONENT_TARGETS = $(HARDWARE_NOARCH)
+
+
+include ../../../../../build-system/constants.mk
+
+
+url         = $(DOWNLOAD_SERVER)/sources/packages/a/dialog
+
+versions    = 1.3-20210621
+pkgname     = dialog
+suffix      = tgz
+
+tarballs    = $(addsuffix .$(suffix), $(addprefix $(pkgname)-, $(versions)))
+sha1s       = $(addsuffix .sha1sum, $(tarballs))
+
+patches     = $(CURDIR)/patches/dialog-1.3-20210621.patch
+
+.NOTPARALLEL: $(patches)
+
+
+BUILD_TARGETS = $(tarballs) $(sha1s) $(patches)
+
+
+include ../../../../../build-system/core.mk
+
+
+.PHONY: download_clean
+
+
+$(tarballs):
+	@echo -e "\n======= Downloading source tarballs =======" ; \
+	 for tarball in $(tarballs) ; do \
+	   echo "$(url)/$$tarball" | xargs -n 1 -P 100 wget $(WGET_OPTIONS) - & \
+	 done ; wait
+
+$(sha1s): $(tarballs)
+	@for sha in $@ ; do \
+	   echo -e "\n======= Downloading '$$sha' signature =======\n" ; \
+	   echo "$(url)/$$sha" | xargs -n 1 -P 100 wget $(WGET_OPTIONS) - & wait %1 ; \
+	   touch $$sha ; \
+	   echo -e "\n======= Check the '$$sha' sha1sum =======\n" ; \
+	   sha1sum --check $$sha ; ret="$$?" ; \
+	   if [ "$$ret" == "1" ]; then \
+	     echo -e "\n======= ERROR: Bad '$$sha' sha1sum =======\n" ; \
+	     exit 1 ; \
+	   fi ; \
+	 done
+
+$(patches): $(sha1s)
+	@echo -e "\n======= Create Patches =======\n" ; \
+	 ( cd create-1.3-20210621-patch ; ./create.patch.sh ) ; \
+	 echo -e "\n"
+
+download_clean:
+	@rm -f $(tarballs) $(sha1s) $(patches)
Index: build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/buildlist.c
===================================================================
--- build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/buildlist.c	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/buildlist.c	(revision 323)
@@ -0,0 +1,1267 @@
+/*
+ *  $Id: buildlist.c,v 1.95 2021/03/05 00:51:16 tom Exp $
+ *
+ *  buildlist.c -- implements the buildlist dialog
+ *
+ *  Copyright 2012-2020,2021	Thomas E. Dickey
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Lesser General Public License, version 2.1
+ *  as published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to
+ *	Free Software Foundation, Inc.
+ *	51 Franklin St., Fifth Floor
+ *	Boston, MA 02110, USA.
+ */
+
+#include <dlg_internals.h>
+#include <dlg_keys.h>
+
+/*
+ * Visually like menubox, but two columns.
+ */
+
+#define sLEFT         (-2)
+#define sRIGHT        (-1)
+
+#define KEY_LEFTCOL   '^'
+#define KEY_RIGHTCOL  '$'
+
+#define MIN_HIGH  (1 + (5 * MARGIN))
+
+typedef struct {
+    WINDOW *win;
+    int box_y;
+    int box_x;
+    int top_index;
+    int cur_index;
+    DIALOG_LISTITEM **ip;	/* pointers to items in this list */
+} MY_DATA;
+
+#if 0
+#define TRACE(p)    dlg_trace_msg p
+#else
+#define TRACE(p)		/* nothing */
+#endif
+
+#define okIndex(all,index) ((index) >= 0 && (index) < (all)->item_no)
+
+#define myItem(p,n) ((p)->ip)[n]
+#define mySide(n)   ((n)?"right":"left")
+
+typedef struct {
+    DIALOG_LISTITEM *items;	/* all items in the widget */
+    int base_y;			/* base for mouse coordinates */
+    int base_x;
+    int use_height;		/* actual size of column box */
+    int use_width;
+    int item_no;
+    int check_x;
+    int item_x;
+    MY_DATA list[2];
+} ALL_DATA;
+
+/*
+ * Translate a choice from items[] to a row-number in an unbounded column,
+ * starting at zero.
+ */
+static int
+index2row(ALL_DATA * all, int choice, int selected)
+{
+    MY_DATA *data = all->list + selected;
+    int result = -1;
+
+    if (okIndex(all, choice)) {
+	int row;
+
+	for (row = 0; row < all->item_no; ++row) {
+	    TRACE(("!... choice %d: %p vs row %d: %p\n",
+		   choice, all->items + choice,
+		   row, myItem(data, row)));
+	    if (myItem(data, row) == all->items + choice) {
+		result = row;
+		break;
+	    }
+	}
+    }
+    TRACE(("! index2row(choice %d, %s) = %d\n", choice, mySide(selected), result));
+    return result;
+}
+
+/*
+ * Convert a row-number back to an item number, i.e., index into items[].
+ */
+static int
+row2index(ALL_DATA * all, int row, int selected)
+{
+    MY_DATA *data = all->list + selected;
+    int result = -1;
+    int n;
+    for (n = 0; n < all->item_no; ++n) {
+	TRACE(("!... row %d: %p vs choice %d: %p\n",
+	       row, myItem(data, row),
+	       n, all->items + n));
+	if (myItem(data, row) == all->items + n) {
+	    result = n;
+	    break;
+	}
+    }
+    TRACE(("! row2index(row %d, %s) = %d\n", row, mySide(selected), result));
+    return result;
+}
+
+/*
+ * Print list item.  The 'selected' parameter is true if 'choice' is the
+ * current item.  That one is colored differently from the other items.
+ */
+static void
+print_item(ALL_DATA * all,
+	   WINDOW *win,
+	   DIALOG_LISTITEM * item,
+	   int row,
+	   int selected)
+{
+    chtype save = dlg_get_attrs(win);
+    int i;
+    bool both = (!dialog_vars.no_tags && !dialog_vars.no_items);
+    bool first = TRUE;
+    int climit = (all->item_x - all->check_x - 1);
+    const char *show = (dialog_vars.no_items
+			? item->name
+			: item->text);
+
+    /* Clear 'residue' of last item */
+    dlg_attrset(win, menubox_attr);
+    (void) wmove(win, row, 0);
+    for (i = 0; i < getmaxx(win); i++)
+	(void) waddch(win, ' ');
+
+    (void) wmove(win, row, all->check_x);
+    dlg_attrset(win, menubox_attr);
+
+    if (both) {
+	dlg_print_listitem(win, item->name, climit, first, selected);
+	(void) waddch(win, ' ');
+	first = FALSE;
+    }
+
+    (void) wmove(win, row, all->item_x);
+    climit = (getmaxx(win) - all->item_x + 1);
+    dlg_print_listitem(win, show, climit, first, selected);
+
+    if (selected) {
+	dlg_item_help(item->help);
+    }
+    dlg_attrset(win, save);
+}
+
+/*
+ * Prints either the left (unselected) or right (selected) list.
+ */
+static void
+print_1_list(ALL_DATA * all,
+	     int choice,
+	     int selected)
+{
+    MY_DATA *data = all->list + selected;
+    DIALOG_LISTITEM *target = (okIndex(all, choice)
+			       ? all->items + choice
+			       : 0);
+    WINDOW *win = data->win;
+    int i, j;
+    int last = 0;
+    int top_row = index2row(all, data->top_index, selected);
+    int max_rows = getmaxy(win);
+
+    TRACE(("! print_1_list %d %s, top %d\n", choice, mySide(selected), top_row));
+    for (i = j = 0; j < max_rows; i++) {
+	int ii = i + top_row;
+	if (ii < 0) {
+	    continue;
+	} else if (myItem(data, ii)) {
+	    print_item(all,
+		       win,
+		       myItem(data, ii),
+		       j, myItem(data, ii) == target);
+	    last = ++j;
+	} else {
+	    break;
+	}
+    }
+    if (wmove(win, last, 0) != ERR) {
+	while (waddch(win, ' ') != ERR) {
+	    ;
+	}
+    }
+    (void) wnoutrefresh(win);
+}
+
+/*
+ * Return the previous item from the list, staying in the same column.  If no
+ * further movement is possible, return the same choice as given.
+ */
+static int
+prev_item(ALL_DATA * all, int choice, int selected)
+{
+    int result = choice;
+    int row = index2row(all, choice, selected);
+    if (row > 0) {
+	row--;
+	result = row2index(all, row, selected);
+    }
+    TRACE(("! prev_item choice %d, %s = %d\n", choice, mySide(selected), result));
+    return result;
+}
+
+/*
+ * Return true if the given choice is on the first page in the current column.
+ */
+static bool
+stop_prev(ALL_DATA * all, int choice, int selected)
+{
+    return (prev_item(all, choice, selected) == choice);
+}
+
+static bool
+check_hotkey(DIALOG_LISTITEM * items, int choice, int selected)
+{
+    bool result = FALSE;
+
+    if ((items[choice].state != 0) == selected) {
+	if (dlg_match_char(dlg_last_getc(),
+			   (dialog_vars.no_tags
+			    ? items[choice].text
+			    : items[choice].name))) {
+	    result = TRUE;
+	}
+    }
+    return result;
+}
+
+/*
+ * Return the next item from the list, staying in the same column.  If no
+ * further movement is possible, return the same choice as given.
+ */
+static int
+next_item(ALL_DATA * all, int choice, int selected)
+{
+    MY_DATA *data = all->list + selected;
+    int result = choice;
+    int row = index2row(all, choice, selected);
+    TRACE(("! given item %d, testing next-item on row %d\n", choice, row + 1));
+    if (myItem(data, row + 1)) {
+	result = row2index(all, row + 1, selected);
+    }
+    TRACE(("! next_item(%d, %s) ->%d\n", choice, mySide(selected), result));
+    return result;
+}
+
+/*
+ * Return the first choice from items[] for the given column.
+ */
+static int
+first_item(ALL_DATA * all, int selected)
+{
+    MY_DATA *data = all->list + selected;
+    int result = -1;
+
+    if (myItem(data, 0) != 0) {
+	int n;
+
+	for (n = 0; n < all->item_no; ++n) {
+	    if (myItem(data, 0) == &all->items[n]) {
+		result = n;
+		break;
+	    }
+	}
+    }
+    TRACE(("! first_item %s = %d\n", mySide(selected), result));
+    return result;
+}
+
+/*
+ * Return the last choice from items[] for the given column.
+ */
+static int
+last_item(ALL_DATA * all, int selected)
+{
+    MY_DATA *data = all->list + selected;
+    int result = -1;
+    int n;
+
+    for (n = 0; myItem(data, n) != 0; ++n) {
+	result = n;
+    }
+    if (result >= 0) {
+	result = row2index(all, result, selected);
+    }
+    TRACE(("! last_item %s = %d\n", mySide(selected), result));
+    return result;
+}
+
+static int
+skip_rows(ALL_DATA * all, int row, int skip, int selected)
+{
+    MY_DATA *data = all->list + selected;
+    int result = row;
+
+    if (skip > 0) {
+	int n;
+
+	for (n = row + 1; (n < all->item_no) && (n <= row + skip); ++n) {
+	    if (myItem(data, n) == 0)
+		break;
+	    result = n;
+	}
+    } else if (skip < 0) {
+	result -= skip;
+	if (result < 0)
+	    result = 0;
+    }
+    TRACE(("! skip_rows row %d, skip %d, %s = %d\n",
+	   row, skip, mySide(selected), result));
+    return result;
+}
+
+/*
+ * Find the closest item in the given column starting with the given choice.
+ */
+static int
+closest_item(ALL_DATA * all, int choice, int selected)
+{
+    int prev = choice;
+    int next = choice;
+    int result = choice;
+    int n;
+
+    for (n = choice; n >= 0; --n) {
+	if ((all->items[n].state != 0) == selected) {
+	    prev = n;
+	    break;
+	}
+    }
+    for (n = choice; n < all->item_no; ++n) {
+	if ((all->items[n].state != 0) == selected) {
+	    next = n;
+	    break;
+	}
+    }
+    if (prev != choice) {
+	result = prev;
+	if (next != choice) {
+	    if ((choice - prev) > (next - choice)) {
+		result = next;
+	    }
+	}
+    } else if (next != choice) {
+	result = next;
+    }
+    TRACE(("! XXX closest item choice %d, %s = %d\n",
+	   choice, mySide(selected), result));
+    return result;
+}
+
+static void
+print_both(ALL_DATA * all,
+	   int choice)
+{
+    int selected;
+    int cur_y, cur_x;
+    WINDOW *dialog = wgetparent(all->list[0].win);
+
+    TRACE(("! print_both %d\n", choice));
+    getyx(dialog, cur_y, cur_x);
+    for (selected = 0; selected < 2; ++selected) {
+	MY_DATA *data = all->list + selected;
+	WINDOW *win = data->win;
+	int thumb_top = index2row(all, data->top_index, selected);
+	int thumb_max = index2row(all, -1, selected);
+	int thumb_end = thumb_top + getmaxy(win);
+
+	print_1_list(all, choice, selected);
+
+	dlg_mouse_setcode(selected * KEY_MAX);
+	dlg_draw_scrollbar(dialog,
+			   (long) (data->top_index),
+			   (long) (thumb_top),
+			   (long) MIN(thumb_end, thumb_max),
+			   (long) thumb_max,
+			   data->box_x + all->check_x,
+			   data->box_x + getmaxx(win),
+			   data->box_y,
+			   data->box_y + getmaxy(win) + 1,
+			   menubox_border2_attr,
+			   menubox_border_attr);
+    }
+    (void) wmove(dialog, cur_y, cur_x);
+    dlg_mouse_setcode(0);
+}
+
+static void
+set_top_item(ALL_DATA * all, int choice, int selected)
+{
+    if (choice != all->list[selected].top_index) {
+	DLG_TRACE(("# set top of %s column to %d\n",
+		   mySide(selected),
+		   choice));
+	all->list[selected].top_index = choice;
+    }
+}
+
+/*
+ * Adjust the top-index as needed to ensure that it and the given item are
+ * visible.
+ */
+static void
+fix_top_item(ALL_DATA * all, int cur_item, int selected)
+{
+    int top_item = all->list[selected].top_index;
+    int cur_row = index2row(all, cur_item, selected);
+    int top_row = index2row(all, top_item, selected);
+
+    if (cur_row < top_row) {
+	top_item = cur_item;
+    } else if ((cur_row - top_row) >= all->use_height) {
+	top_item = row2index(all, cur_row + 1 - all->use_height, selected);
+    }
+    if (cur_row < all->use_height) {
+	top_item = row2index(all, 0, selected);
+    }
+    DLG_TRACE(("# fix_top_item(cur_item %d, %s) ->top_item %d\n",
+	       cur_item, mySide(selected), top_item));
+    set_top_item(all, top_item, selected);
+}
+
+static void
+append_right_side(ALL_DATA * all, int choice)
+{
+    MY_DATA *data = &all->list[1];
+    int j;
+    for (j = 0; j < all->item_no; ++j) {
+	if (myItem(data, j) == 0) {
+	    myItem(data, j) = &all->items[choice];
+	    break;
+	}
+    }
+}
+
+static void
+amend_right_side(ALL_DATA * all, int choice)
+{
+    MY_DATA *data = &all->list[1];
+    int j, k;
+    for (j = 0; j < all->item_no; ++j) {
+	if (myItem(data, j) == &all->items[choice]) {
+	    for (k = j; k < all->item_no; ++k) {
+		if ((myItem(data, k) = myItem(data, k + 1)) == 0)
+		    break;
+	    }
+	    break;
+	}
+    }
+}
+
+static void
+fill_one_side(ALL_DATA * all, int selected)
+{
+    int i, j;
+    MY_DATA *data = all->list + selected;
+
+    for (i = j = 0; j < all->item_no; ++j) {
+	myItem(data, i) = 0;
+	if ((all->items[j].state != 0) == selected) {
+	    myItem(data, i) = all->items + j;
+	    TRACE(("! %s item[%d] %p = all[%d] %p\n",
+		   mySide(selected),
+		   i, myItem(data, i),
+		   j, all->items + j));
+	    ++i;
+	}
+    }
+    myItem(data, i) = 0;
+}
+
+static void
+fill_both_sides(ALL_DATA * all)
+{
+    int k;
+
+    for (k = 0; k < 2; ++k) {
+	fill_one_side(all, k);
+    }
+}
+
+/*
+ * This is an alternate interface to 'buildlist' which allows the application
+ * to read the list item states back directly without putting them in the
+ * output buffer.
+ */
+int
+dlg_buildlist(const char *title,
+	      const char *cprompt,
+	      int height,
+	      int width,
+	      int list_height,
+	      int item_no,
+	      DIALOG_LISTITEM * items,
+	      const char *states,
+	      int order_mode,
+	      int *current_item)
+{
+#define THIS_FUNC "dlg_buildlist"
+    /* *INDENT-OFF* */
+    static DLG_KEYS_BINDING binding[] = {
+	HELPKEY_BINDINGS,
+	ENTERKEY_BINDINGS,
+	DLG_KEYS_DATA( DLGK_FIELD_NEXT, KEY_RIGHT ),
+	DLG_KEYS_DATA( DLGK_FIELD_NEXT, TAB ),
+	DLG_KEYS_DATA( DLGK_FIELD_PREV, KEY_BTAB ),
+	DLG_KEYS_DATA( DLGK_FIELD_PREV, KEY_LEFT ),
+	DLG_KEYS_DATA( DLGK_ITEM_FIRST, KEY_HOME ),
+	DLG_KEYS_DATA( DLGK_ITEM_LAST,	KEY_END ),
+	DLG_KEYS_DATA( DLGK_ITEM_LAST,	KEY_LL ),
+	DLG_KEYS_DATA( DLGK_ITEM_NEXT,	'+' ),
+	DLG_KEYS_DATA( DLGK_ITEM_NEXT,	KEY_DOWN ),
+	DLG_KEYS_DATA( DLGK_ITEM_NEXT,  CHR_NEXT ),
+	DLG_KEYS_DATA( DLGK_ITEM_PREV,	'-' ),
+	DLG_KEYS_DATA( DLGK_ITEM_PREV,	KEY_UP ),
+	DLG_KEYS_DATA( DLGK_ITEM_PREV,  CHR_PREVIOUS ),
+	DLG_KEYS_DATA( DLGK_PAGE_NEXT,	KEY_NPAGE ),
+	DLG_KEYS_DATA( DLGK_PAGE_NEXT,	DLGK_MOUSE(KEY_NPAGE) ),
+	DLG_KEYS_DATA( DLGK_PAGE_NEXT,	DLGK_MOUSE(KEY_NPAGE+KEY_MAX) ),
+	DLG_KEYS_DATA( DLGK_PAGE_PREV,	KEY_PPAGE ),
+	DLG_KEYS_DATA( DLGK_PAGE_PREV,	DLGK_MOUSE(KEY_PPAGE) ),
+	DLG_KEYS_DATA( DLGK_PAGE_PREV,	DLGK_MOUSE(KEY_PPAGE+KEY_MAX) ),
+	DLG_KEYS_DATA( DLGK_GRID_LEFT,	KEY_LEFTCOL ),
+	DLG_KEYS_DATA( DLGK_GRID_RIGHT,	KEY_RIGHTCOL ),
+	TOGGLEKEY_BINDINGS,
+	END_KEYS_BINDING
+    };
+    /* *INDENT-ON* */
+
+#ifdef KEY_RESIZE
+    int old_height = height;
+    int old_width = width;
+#endif
+    ALL_DATA all;
+    MY_DATA *data = all.list;
+    int i, j, k, key2, found, x, y, cur_x, cur_y;
+    int key, fkey;
+    bool save_visit = dialog_state.visit_items;
+    int button;
+    int cur_item;
+    int name_width, text_width, full_width, list_width;
+    int result = DLG_EXIT_UNKNOWN;
+    int num_states;
+    bool first = TRUE;
+    WINDOW *dialog;
+    char *prompt;
+    const char **buttons = dlg_ok_labels();
+    const char *widget_name = "buildlist";
+
+    dialog_state.plain_buttons = TRUE;
+
+    /*
+     * Unlike other uses of --visit-items, we have two windows to visit.
+     */
+    if (dialog_state.visit_cols)
+	dialog_state.visit_cols = 2;
+
+    memset(&all, 0, sizeof(all));
+    all.items = items;
+    all.item_no = item_no;
+    for (k = 0; k < 2; ++k) {
+	data[k].ip = dlg_calloc(DIALOG_LISTITEM *, (item_no + 2));
+    }
+    fill_both_sides(&all);
+
+    if (dialog_vars.default_item != 0) {
+	cur_item = dlg_default_listitem(items);
+    } else {
+	if ((cur_item = first_item(&all, 0)) < 0)
+	    cur_item = first_item(&all, 1);
+    }
+    button = (dialog_state.visit_items
+	      ? (items[cur_item].state ? sRIGHT : sLEFT)
+	      : dlg_default_button());
+
+    dlg_does_output();
+
+#ifdef KEY_RESIZE
+  retry:
+#endif
+
+    prompt = dlg_strclone(cprompt);
+    dlg_tab_correct_str(prompt);
+
+    all.use_height = list_height;
+    all.use_width = (2 * (dlg_calc_list_width(item_no, items)
+			  + 4
+			  + 2 * MARGIN)
+		     + 1);
+    all.use_width = MAX(26, all.use_width);
+    if (all.use_height == 0) {
+	/* calculate height without items (4) */
+	dlg_auto_size(title, prompt, &height, &width, MIN_HIGH, all.use_width);
+	dlg_calc_listh(&height, &all.use_height, item_no);
+    } else {
+	dlg_auto_size(title, prompt,
+		      &height, &width,
+		      MIN_HIGH + all.use_height, all.use_width);
+    }
+    dlg_button_layout(buttons, &width);
+    dlg_print_size(height, width);
+    dlg_ctl_size(height, width);
+
+    /* we need at least two states */
+    if (states == 0 || strlen(states) < 2)
+	states = " *";
+    num_states = (int) strlen(states);
+
+    x = dlg_box_x_ordinate(width);
+    y = dlg_box_y_ordinate(height);
+
+    dialog = dlg_new_window(height, width, y, x);
+    dlg_register_window(dialog, widget_name, binding);
+    dlg_register_buttons(dialog, widget_name, buttons);
+
+    dlg_mouse_setbase(all.base_x = x, all.base_y = y);
+
+    dlg_draw_box2(dialog, 0, 0, height, width, dialog_attr, border_attr, border2_attr);
+    dlg_draw_bottom_box2(dialog, border_attr, border2_attr, dialog_attr);
+    dlg_draw_title(dialog, title);
+
+    dlg_attrset(dialog, dialog_attr);
+    dlg_print_autowrap(dialog, prompt, height, width);
+
+    list_width = (width - 6 * MARGIN - 2) / 2;
+    getyx(dialog, cur_y, cur_x);
+    data[0].box_y = cur_y + 1;
+    data[0].box_x = MARGIN + 1;
+    data[1].box_y = cur_y + 1;
+    data[1].box_x = data[0].box_x + 1 + 2 * MARGIN + list_width;
+
+    /*
+     * After displaying the prompt, we know how much space we really have.
+     * Limit the list to avoid overwriting the ok-button.
+     */
+    if (all.use_height + MIN_HIGH > height - cur_y)
+       all.use_height = height - MIN_HIGH - cur_y;
+    if (all.use_height <= 0)
+	all.use_height = 1;
+
+    for (k = 0; k < 2; ++k) {
+	/* create new window for the list */
+	data[k].win = dlg_sub_window(dialog, all.use_height, list_width,
+				     y + data[k].box_y + 1,
+				     x + data[k].box_x + 1);
+
+	/* draw a box around the list items */
+	dlg_draw_box(dialog, data[k].box_y, data[k].box_x,
+		     all.use_height + 2 * MARGIN,
+		     list_width + 2 * MARGIN,
+		     menubox_border_attr, menubox_border2_attr);
+    }
+
+    text_width = 0;
+    name_width = 0;
+    /* Find length of longest item to center buildlist */
+    for (i = 0; i < item_no; i++) {
+	text_width = MAX(text_width, dlg_count_columns(items[i].text));
+	name_width = MAX(name_width, dlg_count_columns(items[i].name));
+    }
+
+    /* If the name+text is wider than the list is allowed, then truncate
+     * one or both of them.  If the name is no wider than 1/4 of the list,
+     * leave it intact.
+     */
+    all.use_width = (list_width - 6 * MARGIN);
+    if (dialog_vars.no_tags && !dialog_vars.no_items) {
+	full_width = MIN(all.use_width, text_width);
+    } else if (dialog_vars.no_items) {
+	full_width = MIN(all.use_width, name_width);
+    } else {
+	if (text_width >= 0
+	    && name_width >= 0
+	    && all.use_width > 0
+	    && text_width + name_width > all.use_width) {
+	    int need = (int) (0.25 * all.use_width);
+	    if (name_width > need) {
+		int want = (int) (all.use_width * ((double) name_width) /
+				  (text_width + name_width));
+		name_width = (want > need) ? want : need;
+	    }
+	    text_width = all.use_width - name_width;
+	}
+	full_width = text_width + name_width;
+    }
+
+    all.check_x = (all.use_width - full_width) / 2;
+    all.item_x = ((dialog_vars.no_tags
+		   ? 0
+		   : (dialog_vars.no_items
+		      ? 0
+		      : (name_width + 2)))
+		  + all.check_x);
+
+    /* ensure we are scrolled to show the current choice */
+    j = MIN(all.use_height, item_no);
+    for (i = 0; i < 2; ++i) {
+	if ((items[cur_item].state != 0) == i) {
+	    int top_item = cur_item - j + 1;
+	    if (top_item < 0)
+		top_item = 0;
+	    while ((items[top_item].state != 0) != i)
+		++top_item;
+	    set_top_item(&all, top_item, i);
+	} else {
+	    set_top_item(&all, 0, i);
+	}
+    }
+
+    /* register the new window, along with its borders */
+    for (i = 0; i < 2; ++i) {
+	dlg_mouse_mkbigregion(data[i].box_y + 1,
+			      data[i].box_x,
+			      all.use_height,
+			      list_width + 2,
+			      2 * KEY_MAX + (i * (1 + all.use_height)),
+			      1, 1, 1 /* by lines */ );
+    }
+
+    dlg_draw_buttons(dialog, height - 2, 0, buttons, button, FALSE, width);
+
+    while (result == DLG_EXIT_UNKNOWN) {
+	int which = (items[cur_item].state != 0);
+	MY_DATA *moi = data + which;
+	int at_top = index2row(&all, moi->top_index, which);
+	int at_end = index2row(&all, -1, which);
+	int at_bot = skip_rows(&all, at_top, all.use_height, which);
+	int was_mouse;
+
+	DLG_TRACE(("# ** state %d:%d top %d (%d:%d:%d) %s\n",
+		   cur_item, item_no - 1,
+		   moi->top_index,
+		   at_top, at_bot, at_end,
+		   mySide(which)));
+
+	if (first) {
+	    print_both(&all, cur_item);
+	    dlg_trace_win(dialog);
+	    first = FALSE;
+	}
+
+	if (button < 0) {	/* --visit-items */
+	    int cur_row = index2row(&all, cur_item, which);
+	    cur_y = (data[which].box_y
+		     + cur_row
+		     + 1);
+	    if (at_top > 0)
+		cur_y -= at_top;
+	    cur_x = (data[which].box_x
+		     + all.check_x + 1);
+	    DLG_TRACE(("# ...visit row %d (%d,%d)\n", cur_row, cur_y, cur_x));
+	    wmove(dialog, cur_y, cur_x);
+	}
+
+	key = dlg_mouse_wgetch(dialog, &fkey);
+	if (dlg_result_key(key, fkey, &result)) {
+	    if (!dlg_button_key(result, &button, &key, &fkey))
+		break;
+	}
+
+	was_mouse = (fkey && is_DLGK_MOUSE(key));
+	if (was_mouse)
+	    key -= M_EVENT;
+
+	if (!was_mouse) {
+	    ;
+	} else if (key >= 2 * KEY_MAX) {
+	    i = (key - 2 * KEY_MAX) % (1 + all.use_height);
+	    j = (key - 2 * KEY_MAX) / (1 + all.use_height);
+	    k = row2index(&all, i + at_top, j);
+	    DLG_TRACE(("# MOUSE column %d, row %d ->item %d\n", j, i, k));
+	    if (k >= 0 && j < 2) {
+		if (j != which) {
+		    /*
+		     * Mouse click was in the other column.
+		     */
+		    moi = data + j;
+		    fix_top_item(&all, k, j);
+		}
+		which = j;
+		at_top = index2row(&all, moi->top_index, which);
+		at_bot = skip_rows(&all, at_top, all.use_height, which);
+		cur_item = k;
+		print_both(&all, cur_item);
+		key = DLGK_TOGGLE;	/* force the selected item to toggle */
+	    } else {
+		beep();
+		continue;
+	    }
+	    fkey = FALSE;
+	} else if (key >= KEY_MIN) {
+	    if (key > KEY_MAX) {
+		if (which == 0) {
+		    key = KEY_RIGHTCOL;		/* switch to right-column */
+		    fkey = FALSE;
+		} else {
+		    key -= KEY_MAX;
+		}
+	    } else {
+		if (which == 1) {
+		    key = KEY_LEFTCOL;	/* switch to left-column */
+		    fkey = FALSE;
+		}
+	    }
+	    key = dlg_lookup_key(dialog, key, &fkey);
+	}
+
+	/*
+	 * A space toggles the item status.  Normally we put the cursor on
+	 * the next available item in the same column.  But if there are no
+	 * more items in the column, move the cursor to the other column.
+	 */
+	if (key == DLGK_TOGGLE) {
+	    int new_choice;
+	    int new_state = items[cur_item].state + 1;
+
+	    if ((new_choice = next_item(&all, cur_item, which)) == cur_item) {
+		new_choice = prev_item(&all, cur_item, which);
+	    }
+	    DLG_TRACE(("# cur_item %d, new_choice:%d\n", cur_item, new_choice));
+	    /* FIXME - how to test and handle multiple states? */
+	    if (new_state >= num_states)
+		new_state = 0;
+
+	    items[cur_item].state = new_state;
+	    if (order_mode) {
+		fill_one_side(&all, 0);
+		if (new_state) {
+		    append_right_side(&all, cur_item);
+		} else {
+		    amend_right_side(&all, cur_item);
+		}
+	    } else {
+		fill_both_sides(&all);
+	    }
+	    if (cur_item == moi->top_index) {
+		set_top_item(&all, new_choice, which);
+	    }
+
+	    if (new_choice >= 0) {
+		fix_top_item(&all, cur_item, !which);
+		cur_item = new_choice;
+	    }
+	    print_both(&all, cur_item);
+	    dlg_trace_win(dialog);
+	    continue;		/* wait for another key press */
+	}
+
+	/*
+	 * Check if key pressed matches first character of any item tag in
+	 * list.  If there is more than one match, we will cycle through
+	 * each one as the same key is pressed repeatedly.
+	 */
+	found = FALSE;
+	if (!fkey) {
+	    if (button < 0 || !dialog_state.visit_items) {
+		for (j = cur_item + 1; j < item_no; j++) {
+		    if (check_hotkey(items, j, which)) {
+			found = TRUE;
+			i = j;
+			break;
+		    }
+		}
+		if (!found) {
+		    for (j = 0; j <= cur_item; j++) {
+			if (check_hotkey(items, j, which)) {
+			    found = TRUE;
+			    i = j;
+			    break;
+			}
+		    }
+		}
+		if (found)
+		    dlg_flush_getc();
+	    } else if ((j = dlg_char_to_button(key, buttons)) >= 0) {
+		button = j;
+		ungetch('\n');
+		continue;
+	    }
+	}
+
+	/*
+	 * A single digit (1-9) positions the selection to that line in the
+	 * current screen.
+	 */
+	if (!found
+	    && (key <= '9')
+	    && (key > '0')
+	    && (key - '1' < at_bot)) {
+	    found = TRUE;
+	    i = key - '1';
+	}
+
+	if (!found && fkey) {
+	    switch (key) {
+	    case DLGK_FIELD_PREV:
+		if ((button == sRIGHT) && dialog_state.visit_items) {
+		    key = DLGK_GRID_LEFT;
+		    button = sLEFT;
+		} else {
+		    button = dlg_prev_button(buttons, button);
+		    dlg_draw_buttons(dialog, height - 2, 0, buttons, button,
+				     FALSE, width);
+		    if (button == sRIGHT) {
+			key = DLGK_GRID_RIGHT;
+		    } else {
+			continue;
+		    }
+		}
+		break;
+	    case DLGK_FIELD_NEXT:
+		if ((button == sLEFT) && dialog_state.visit_items) {
+		    key = DLGK_GRID_RIGHT;
+		    button = sRIGHT;
+		} else {
+		    button = dlg_next_button(buttons, button);
+		    dlg_draw_buttons(dialog, height - 2, 0, buttons, button,
+				     FALSE, width);
+		    if (button == sLEFT) {
+			key = DLGK_GRID_LEFT;
+		    } else {
+			continue;
+		    }
+		}
+		break;
+	    }
+
+	    i = cur_item;
+	    found = TRUE;
+	    switch (key) {
+	    case DLGK_GRID_LEFT:
+		i = closest_item(&all, cur_item, 0);
+		fix_top_item(&all, i, 0);
+		break;
+	    case DLGK_GRID_RIGHT:
+		if (order_mode) {
+		    i = last_item(&all, 1);
+		} else {
+		    i = closest_item(&all, cur_item, 1);
+		}
+		fix_top_item(&all, i, 1);
+		break;
+	    case DLGK_PAGE_PREV:
+		if (cur_item > moi->top_index) {
+		    i = moi->top_index;
+		} else if (moi->top_index != 0) {
+		    int temp = at_top;
+		    if ((temp -= all.use_height) < 0)
+			temp = 0;
+		    i = row2index(&all, temp, which);
+		}
+		break;
+	    case DLGK_PAGE_NEXT:
+		if ((at_end - at_bot) < all.use_height) {
+		    i = next_item(&all,
+				  row2index(&all, at_end, which),
+				  which);
+		} else {
+		    i = next_item(&all,
+				  row2index(&all, at_bot, which),
+				  which);
+		    at_top = at_bot;
+		    set_top_item(&all,
+				 next_item(&all,
+					   row2index(&all, at_top, which),
+					   which),
+				 which);
+		    at_bot = skip_rows(&all, at_top, all.use_height, which);
+		    at_bot = MIN(at_bot, at_end);
+		}
+		break;
+	    case DLGK_ITEM_FIRST:
+		i = first_item(&all, which);
+		break;
+	    case DLGK_ITEM_LAST:
+		i = last_item(&all, which);
+		break;
+	    case DLGK_ITEM_PREV:
+		i = prev_item(&all, cur_item, which);
+		if (stop_prev(&all, cur_item, which))
+		    continue;
+		break;
+	    case DLGK_ITEM_NEXT:
+		i = next_item(&all, cur_item, which);
+		break;
+	    default:
+		found = FALSE;
+		break;
+	    }
+	}
+
+	if (found) {
+	    if (i != cur_item) {
+		int now_at = index2row(&all, i, which);
+		int oops = item_no;
+		int old_item;
+
+		DLG_TRACE(("# <--CHOICE %d\n", i));
+		DLG_TRACE(("# <--topITM %d\n", moi->top_index));
+		DLG_TRACE(("# <--now_at %d\n", now_at));
+		DLG_TRACE(("# <--at_top %d\n", at_top));
+		DLG_TRACE(("# <--at_bot %d\n", at_bot));
+
+		if (now_at >= at_bot) {
+		    while (now_at >= at_bot) {
+			if ((at_bot - at_top) >= all.use_height) {
+			    set_top_item(&all,
+					 next_item(&all, moi->top_index, which),
+					 which);
+			}
+			at_top = index2row(&all, moi->top_index, which);
+			at_bot = skip_rows(&all, at_top, all.use_height, which);
+
+			DLG_TRACE(("# ...at_bot %d (now %d vs %d)\n",
+				   at_bot, now_at, at_end));
+			DLG_TRACE(("# ...topITM %d\n", moi->top_index));
+			DLG_TRACE(("# ...at_top %d (diff %d)\n", at_top,
+				   at_bot - at_top));
+
+			if (at_bot >= at_end) {
+			    /*
+			     * If we bumped into the end, move the top-item
+			     * down by one line so that we can display the
+			     * last item in the list.
+			     */
+			    if ((at_bot - at_top) > all.use_height) {
+				set_top_item(&all,
+					     next_item(&all, moi->top_index, which),
+					     which);
+			    } else if (at_top > 0 &&
+				       (at_bot - at_top) >= all.use_height) {
+				set_top_item(&all,
+					     next_item(&all, moi->top_index, which),
+					     which);
+			    }
+			    break;
+			}
+			if (--oops < 0) {
+			    DLG_TRACE(("# OOPS-forward\n"));
+			    break;
+			}
+		    }
+		} else if (now_at < at_top) {
+		    while (now_at < at_top) {
+			old_item = moi->top_index;
+			set_top_item(&all,
+				     prev_item(&all, moi->top_index, which),
+				     which);
+			at_top = index2row(&all, moi->top_index, which);
+
+			DLG_TRACE(("# ...at_top %d (now %d)\n", at_top, now_at));
+			DLG_TRACE(("# ...topITM %d\n", moi->top_index));
+
+			if (moi->top_index >= old_item)
+			    break;
+			if (at_top <= now_at)
+			    break;
+			if (--oops < 0) {
+			    DLG_TRACE(("# OOPS-backward\n"));
+			    break;
+			}
+		    }
+		}
+		DLG_TRACE(("# -->now_at %d\n", now_at));
+		cur_item = i;
+		print_both(&all, cur_item);
+	    }
+	    dlg_trace_win(dialog);
+	    continue;		/* wait for another key press */
+	}
+
+	if (fkey) {
+	    switch (key) {
+	    case DLGK_ENTER:
+		result = dlg_enter_buttoncode(button);
+		break;
+	    case DLGK_LEAVE:
+		result = dlg_ok_buttoncode(button);
+		break;
+#ifdef KEY_RESIZE
+	    case KEY_RESIZE:
+		dlg_will_resize(dialog);
+		/* reset data */
+		height = old_height;
+		width = old_width;
+		free(prompt);
+		_dlg_resize_cleanup(dialog);
+		/* repaint */
+		first = TRUE;
+		goto retry;
+#endif
+	    default:
+		if (was_mouse) {
+		    if ((key2 = dlg_ok_buttoncode(key)) >= 0) {
+			result = key2;
+			break;
+		    }
+		    beep();
+		}
+	    }
+	} else if (key > 0) {
+	    beep();
+	}
+    }
+
+    /*
+     * If told to re-order the list, update it to reflect the current display:
+     * a) The left-side will be at the beginning, without gaps.
+     * b) The right-side will follow, in display-order.
+     */
+    if (order_mode) {
+	DIALOG_LISTITEM *redo;
+	int row;
+	int choice;
+	int new_item = cur_item;
+
+	redo = dlg_calloc(DIALOG_LISTITEM, (size_t) item_no + 1);
+	assert_ptr(redo, THIS_FUNC);
+
+	j = 0;
+	for (k = 0; k < 2; ++k) {
+	    for (row = 0; row < item_no; ++row) {
+		if (myItem(all.list + k, row) == 0)
+		    break;
+		choice = row2index(&all, row, k);
+		if (choice == cur_item)
+		    new_item = j;
+		redo[j++] = items[choice];
+	    }
+	}
+
+	cur_item = new_item;
+	memcpy(items, redo, sizeof(DIALOG_LISTITEM) * (size_t) (item_no + 1));
+
+	free(redo);
+    }
+
+    for (k = 0; k < 2; ++k) {
+	free(data[k].ip);
+    }
+
+    dialog_state.visit_cols = save_visit;
+    dlg_del_window(dialog);
+    dlg_mouse_free_regions();
+    free(prompt);
+
+    *current_item = cur_item;
+    return result;
+#undef THIS_FUNC
+}
+
+/*
+ * Display a dialog box with a list of options that can be turned on or off
+ */
+int
+dialog_buildlist(const char *title,
+		 const char *cprompt,
+		 int height,
+		 int width,
+		 int list_height,
+		 int item_no,
+		 char **items,
+		 int order_mode)
+{
+#define THIS_FUNC "dialog_buildlist"
+    int result;
+    int i, j;
+    DIALOG_LISTITEM *listitems;
+    bool separate_output = dialog_vars.separate_output;
+    bool show_status = FALSE;
+    int current = 0;
+    char *help_result;
+
+    DLG_TRACE(("# buildlist args:\n"));
+    DLG_TRACE2S("title", title);
+    DLG_TRACE2S("message", cprompt);
+    DLG_TRACE2N("height", height);
+    DLG_TRACE2N("width", width);
+    DLG_TRACE2N("lheight", list_height);
+    DLG_TRACE2N("llength", item_no);
+    /* FIXME dump the items[][] too */
+    DLG_TRACE2N("order", order_mode != 0);
+
+    listitems = dlg_calloc(DIALOG_LISTITEM, (size_t) item_no + 1);
+    assert_ptr(listitems, THIS_FUNC);
+
+    for (i = j = 0; i < item_no; ++i) {
+	listitems[i].name = items[j++];
+	listitems[i].text = (dialog_vars.no_items
+			     ? dlg_strempty()
+			     : items[j++]);
+	listitems[i].state = !dlg_strcmp(items[j++], "on");
+	listitems[i].help = ((dialog_vars.item_help)
+			     ? items[j++]
+			     : dlg_strempty());
+    }
+    dlg_align_columns(&listitems[0].text, (int) sizeof(DIALOG_LISTITEM), item_no);
+
+    result = dlg_buildlist(title,
+			   cprompt,
+			   height,
+			   width,
+			   list_height,
+			   item_no,
+			   listitems,
+			   NULL,
+			   order_mode,
+			   &current);
+
+    switch (result) {
+    case DLG_EXIT_OK:		/* FALLTHRU */
+    case DLG_EXIT_EXTRA:
+	show_status = TRUE;
+	break;
+    case DLG_EXIT_HELP:
+	dlg_add_help_listitem(&result, &help_result, &listitems[current]);
+	if ((show_status = dialog_vars.help_status)) {
+	    if (separate_output) {
+		dlg_add_string(help_result);
+	    } else {
+		dlg_add_quoted(help_result);
+	    }
+	} else {
+	    dlg_add_string(help_result);
+	}
+	break;
+    }
+
+    if (show_status) {
+	for (i = 0; i < item_no; i++) {
+	    if (listitems[i].state) {
+		if (dlg_need_separator())
+		    dlg_add_separator();
+		if (separate_output) {
+		    dlg_add_string(listitems[i].name);
+		} else {
+		    dlg_add_quoted(listitems[i].name);
+		}
+	    }
+	}
+	AddLastKey();
+    }
+
+    dlg_free_columns(&listitems[0].text, (int) sizeof(DIALOG_LISTITEM), item_no);
+    free(listitems);
+    return result;
+#undef THIS_FUNC
+}
Index: build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/checklist.c
===================================================================
--- build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/checklist.c	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/checklist.c	(revision 323)
@@ -0,0 +1,703 @@
+/*
+ *  $Id: checklist.c,v 1.167 2020/11/23 00:37:47 tom Exp $
+ *
+ *  checklist.c -- implements the checklist box
+ *
+ *  Copyright 2000-2019,2020	Thomas E. Dickey
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Lesser General Public License, version 2.1
+ *  as published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to
+ *	Free Software Foundation, Inc.
+ *	51 Franklin St., Fifth Floor
+ *	Boston, MA 02110, USA.
+ *
+ *  An earlier version of this program lists as authors:
+ *	Savio Lam (lam836@cs.cuhk.hk)
+ *	Stuart Herbert - S.Herbert@sheffield.ac.uk: radiolist extension
+ *	Alessandro Rubini - rubini@ipvvis.unipv.it: merged the two
+ */
+
+#include <dialog.h>
+#include <dlg_keys.h>
+
+#define MIN_HIGH  4
+
+typedef struct {
+    /* the outer-window */
+    WINDOW *dialog;
+    int box_y;
+    int box_x;
+    int check_x;
+    int item_x;
+    int checkflag;
+    int use_height;
+    int use_width;
+    /* the inner-window */
+    WINDOW *list;
+    DIALOG_LISTITEM *items;
+    int item_no;
+    const char *states;
+} ALL_DATA;
+
+/*
+ * Print list item.  The 'selected' parameter is true if 'choice' is the
+ * current item.  That one is colored differently from the other items.
+ */
+static void
+print_item(ALL_DATA * data,
+	   WINDOW *win,
+	   DIALOG_LISTITEM * item,
+	   const char *states,
+	   int choice,
+	   int selected)
+{
+    chtype save = dlg_get_attrs(win);
+    int i;
+    bool both = (!dialog_vars.no_tags && !dialog_vars.no_items);
+    bool first = TRUE;
+    int climit = (getmaxx(win) - data->check_x + 1);
+    const char *show = (dialog_vars.no_items
+			? item->name
+			: item->text);
+
+    /* Clear 'residue' of last item */
+    dlg_attrset(win, menubox_attr);
+    (void) wmove(win, choice, 0);
+    for (i = 0; i < data->use_width; i++)
+	(void) waddch(win, ' ');
+
+    (void) wmove(win, choice, data->check_x);
+    dlg_attrset(win, selected ? check_selected_attr : check_attr);
+    (void) wprintw(win,
+		   (data->checkflag == FLAG_CHECK) ? "[%c]" : "(%c)",
+		   states[item->state]);
+    dlg_attrset(win, menubox_attr);
+    (void) waddch(win, ' ');
+
+    if (both) {
+	dlg_print_listitem(win, item->name, climit, first, selected);
+	first = FALSE;
+    }
+
+    (void) wmove(win, choice, data->item_x);
+    dlg_print_listitem(win, show, climit, first, selected);
+
+    if (selected) {
+	dlg_item_help(item->help);
+    }
+    dlg_attrset(win, save);
+}
+
+static void
+print_list(ALL_DATA * data, int choice, int scrollamt, int max_choice)
+{
+    int i;
+    int cur_y, cur_x;
+
+    getyx(data->dialog, cur_y, cur_x);
+    for (i = 0; i < max_choice; i++) {
+	print_item(data,
+		   data->list,
+		   &data->items[i + scrollamt],
+		   data->states,
+		   i, i == choice);
+    }
+    (void) wnoutrefresh(data->list);
+
+    dlg_draw_scrollbar(data->dialog,
+		       (long) (scrollamt),
+		       (long) (scrollamt),
+		       (long) (scrollamt + max_choice),
+		       (long) (data->item_no),
+		       data->box_x + data->check_x,
+		       data->box_x + data->use_width,
+		       data->box_y,
+		       data->box_y + data->use_height + 1,
+		       menubox_border2_attr,
+		       menubox_border_attr);
+
+    (void) wmove(data->dialog, cur_y, cur_x);
+}
+
+static bool
+check_hotkey(DIALOG_LISTITEM * items, int choice)
+{
+    bool result = FALSE;
+
+    if (dlg_match_char(dlg_last_getc(),
+		       (dialog_vars.no_tags
+			? items[choice].text
+			: items[choice].name))) {
+	result = TRUE;
+    }
+    return result;
+}
+
+/*
+ * This is an alternate interface to 'checklist' which allows the application
+ * to read the list item states back directly without putting them in the
+ * output buffer.  It also provides for more than two states over which the
+ * check/radio box can display.
+ */
+int
+dlg_checklist(const char *title,
+	      const char *cprompt,
+	      int height,
+	      int width,
+	      int list_height,
+	      int item_no,
+	      DIALOG_LISTITEM * items,
+	      const char *states,
+	      int flag,
+	      int *current_item)
+{
+    /* *INDENT-OFF* */
+    static DLG_KEYS_BINDING binding[] = {
+	HELPKEY_BINDINGS,
+	ENTERKEY_BINDINGS,
+	DLG_KEYS_DATA( DLGK_FIELD_NEXT, KEY_RIGHT ),
+	DLG_KEYS_DATA( DLGK_FIELD_NEXT, TAB ),
+	DLG_KEYS_DATA( DLGK_FIELD_PREV, KEY_BTAB ),
+	DLG_KEYS_DATA( DLGK_FIELD_PREV, KEY_LEFT ),
+	DLG_KEYS_DATA( DLGK_ITEM_FIRST, KEY_HOME ),
+	DLG_KEYS_DATA( DLGK_ITEM_LAST,	KEY_END ),
+	DLG_KEYS_DATA( DLGK_ITEM_LAST,	KEY_LL ),
+	DLG_KEYS_DATA( DLGK_ITEM_NEXT,	'+' ),
+	DLG_KEYS_DATA( DLGK_ITEM_NEXT,	KEY_DOWN ),
+	DLG_KEYS_DATA( DLGK_ITEM_NEXT,  CHR_NEXT ),
+	DLG_KEYS_DATA( DLGK_ITEM_PREV,	'-' ),
+	DLG_KEYS_DATA( DLGK_ITEM_PREV,	KEY_UP ),
+	DLG_KEYS_DATA( DLGK_ITEM_PREV,  CHR_PREVIOUS ),
+	DLG_KEYS_DATA( DLGK_PAGE_NEXT,	KEY_NPAGE ),
+	DLG_KEYS_DATA( DLGK_PAGE_NEXT,	DLGK_MOUSE(KEY_NPAGE) ),
+	DLG_KEYS_DATA( DLGK_PAGE_PREV,	KEY_PPAGE ),
+	DLG_KEYS_DATA( DLGK_PAGE_PREV,	DLGK_MOUSE(KEY_PPAGE) ),
+	TOGGLEKEY_BINDINGS,
+	END_KEYS_BINDING
+    };
+    /* *INDENT-ON* */
+
+#ifdef KEY_RESIZE
+    int old_height = height;
+    int old_width = width;
+#endif
+    ALL_DATA all;
+    int i, j, key2, found, x, y, cur_x, cur_y;
+    int key, fkey;
+    int button = dialog_state.visit_items ? -1 : dlg_default_button();
+    int choice = dlg_default_listitem(items);
+    int scrollamt = 0;
+    int max_choice;
+    int use_width, list_width, name_width, text_width;
+    int result = DLG_EXIT_UNKNOWN;
+    int num_states;
+    WINDOW *dialog;
+    char *prompt;
+    const char **buttons = dlg_ok_labels();
+    const char *widget_name;
+
+    DLG_TRACE(("# %s args:\n", flag ? "checklist" : "radiolist"));
+    DLG_TRACE2S("title", title);
+    DLG_TRACE2S("message", cprompt);
+    DLG_TRACE2N("height", height);
+    DLG_TRACE2N("width", width);
+    DLG_TRACE2N("lheight", list_height);
+    DLG_TRACE2N("llength", item_no);
+    /* FIXME dump the items[][] too */
+    DLG_TRACE2S("states", states);
+    DLG_TRACE2N("flag", flag);
+    DLG_TRACE2N("current", *current_item);
+
+    dialog_state.plain_buttons = TRUE;
+
+    memset(&all, 0, sizeof(all));
+    all.items = items;
+    all.item_no = item_no;
+
+    dlg_does_output();
+
+    /*
+     * If this is a radiobutton list, ensure that no more than one item is
+     * selected initially.  Allow none to be selected, since some users may
+     * wish to provide this flavor.
+     */
+    if (flag == FLAG_RADIO) {
+	bool first = TRUE;
+
+	for (i = 0; i < item_no; i++) {
+	    if (items[i].state) {
+		if (first) {
+		    first = FALSE;
+		} else {
+		    items[i].state = 0;
+		}
+	    }
+	}
+	widget_name = "radiolist";
+    } else {
+	widget_name = "checklist";
+    }
+#ifdef KEY_RESIZE
+  retry:
+#endif
+
+    prompt = dlg_strclone(cprompt);
+    dlg_tab_correct_str(prompt);
+
+    all.use_height = list_height;
+    use_width = dlg_calc_list_width(item_no, items) + 10;
+    use_width = MAX(26, use_width);
+    if (all.use_height == 0) {
+	/* calculate height without items (4) */
+	dlg_auto_size(title, prompt, &height, &width, MIN_HIGH, use_width);
+	dlg_calc_listh(&height, &all.use_height, item_no);
+    } else {
+	dlg_auto_size(title, prompt,
+		      &height, &width,
+		      MIN_HIGH + all.use_height, use_width);
+    }
+    dlg_button_layout(buttons, &width);
+    dlg_print_size(height, width);
+    dlg_ctl_size(height, width);
+
+    /* we need at least two states */
+    if (states == 0 || strlen(states) < 2)
+	states = " *";
+    num_states = (int) strlen(states);
+    all.states = states;
+
+    all.checkflag = flag;
+
+    x = dlg_box_x_ordinate(width);
+    y = dlg_box_y_ordinate(height);
+
+    dialog = dlg_new_window(height, width, y, x);
+    all.dialog = dialog;
+    dlg_register_window(dialog, widget_name, binding);
+    dlg_register_buttons(dialog, widget_name, buttons);
+
+    dlg_mouse_setbase(x, y);
+
+    dlg_draw_box2(dialog, 0, 0, height, width, dialog_attr, border_attr, border2_attr);
+    dlg_draw_bottom_box2(dialog, border_attr, border2_attr, dialog_attr);
+    dlg_draw_title(dialog, title);
+
+    dlg_attrset(dialog, dialog_attr);
+    dlg_print_autowrap(dialog, prompt, height, width);
+
+    all.use_width = width - 6;
+    getyx(dialog, cur_y, cur_x);
+    all.box_y = cur_y + 1;
+    all.box_x = (width - all.use_width) / 2 - 1;
+
+    /*
+     * After displaying the prompt, we know how much space we really have.
+     * Limit the list to avoid overwriting the ok-button.
+     */
+    if (all.use_height + MIN_HIGH > height - cur_y)
+       all.use_height = height - MIN_HIGH - cur_y;
+    if (all.use_height <= 0)
+	all.use_height = 1;
+
+    max_choice = MIN(all.use_height, item_no);
+    max_choice = MAX(max_choice, 1);
+
+    /* create new window for the list */
+    all.list = dlg_sub_window(dialog, all.use_height, all.use_width,
+			      y + all.box_y + 1, x + all.box_x + 1);
+
+    /* draw a box around the list items */
+    dlg_draw_box(dialog, all.box_y, all.box_x,
+		 all.use_height + 2 * MARGIN,
+		 all.use_width + 2 * MARGIN,
+		 menubox_border_attr, menubox_border2_attr);
+
+    text_width = 0;
+    name_width = 0;
+    /* Find length of longest item to center checklist */
+    for (i = 0; i < item_no; i++) {
+	text_width = MAX(text_width, dlg_count_columns(items[i].text));
+	name_width = MAX(name_width, dlg_count_columns(items[i].name));
+    }
+
+    /* If the name+text is wider than the list is allowed, then truncate
+     * one or both of them.  If the name is no wider than 1/4 of the list,
+     * leave it intact.
+     */
+    use_width = (all.use_width - 6);
+    if (dialog_vars.no_tags) {
+	list_width = MIN(all.use_width, text_width);
+    } else if (dialog_vars.no_items) {
+	list_width = MIN(all.use_width, name_width);
+    } else {
+	if (text_width >= 0
+	    && name_width >= 0
+	    && use_width > 0
+	    && text_width + name_width > use_width) {
+	    int need = (int) (0.25 * use_width);
+	    if (name_width > need) {
+		int want = (int) (use_width * ((double) name_width) /
+				  (text_width + name_width));
+		name_width = (want > need) ? want : need;
+	    }
+	    text_width = use_width - name_width;
+	}
+	list_width = (text_width + name_width);
+    }
+
+    all.check_x = (use_width - list_width) / 2;
+    all.item_x = ((dialog_vars.no_tags
+		   ? 0
+		   : (dialog_vars.no_items
+		      ? 0
+		      : (2 + name_width)))
+		  + all.check_x + 4);
+
+    /* ensure we are scrolled to show the current choice */
+    scrollamt = MIN(scrollamt, max_choice + item_no - 1);
+    if (choice >= (max_choice + scrollamt - 1)) {
+	scrollamt = MAX(0, choice - max_choice + 1);
+	choice = max_choice - 1;
+    }
+    print_list(&all, choice, scrollamt, max_choice);
+
+    /* register the new window, along with its borders */
+    dlg_mouse_mkbigregion(all.box_y + 1, all.box_x,
+			  all.use_height, all.use_width + 2,
+			  KEY_MAX, 1, 1, 1 /* by lines */ );
+
+    dlg_draw_buttons(dialog, height - 2, 0, buttons, button, FALSE, width);
+
+    dlg_trace_win(dialog);
+
+    while (result == DLG_EXIT_UNKNOWN) {
+	int was_mouse;
+
+	if (button < 0)		/* --visit-items */
+	    wmove(dialog, all.box_y + choice + 1, all.box_x + all.check_x + 2);
+
+	key = dlg_mouse_wgetch(dialog, &fkey);
+	if (dlg_result_key(key, fkey, &result)) {
+	    if (!dlg_button_key(result, &button, &key, &fkey))
+		break;
+	}
+
+	was_mouse = (fkey && is_DLGK_MOUSE(key));
+	if (was_mouse)
+	    key -= M_EVENT;
+
+	if (was_mouse && (key >= KEY_MAX)) {
+	    getyx(dialog, cur_y, cur_x);
+	    i = (key - KEY_MAX);
+	    if (i < max_choice) {
+		choice = (key - KEY_MAX);
+		print_list(&all, choice, scrollamt, max_choice);
+
+		key = DLGK_TOGGLE;	/* force the selected item to toggle */
+	    } else {
+		beep();
+		continue;
+	    }
+	    fkey = FALSE;
+	} else if (was_mouse && key >= KEY_MIN) {
+	    key = dlg_lookup_key(dialog, key, &fkey);
+	}
+
+	/*
+	 * A space toggles the item status.  We handle either a checklist
+	 * (any number of items can be selected) or radio list (zero or one
+	 * items can be selected).
+	 */
+	if (key == DLGK_TOGGLE) {
+	    int current = scrollamt + choice;
+	    int next = items[current].state + 1;
+
+	    if (next >= num_states)
+		next = 0;
+
+	    if (flag == FLAG_CHECK) {	/* checklist? */
+		getyx(dialog, cur_y, cur_x);
+		items[current].state = next;
+		print_item(&all, all.list,
+			   &items[scrollamt + choice],
+			   states,
+			   choice, TRUE);
+		(void) wnoutrefresh(all.list);
+		(void) wmove(dialog, cur_y, cur_x);
+	    } else {		/* radiolist */
+		for (i = 0; i < item_no; i++) {
+		    if (i != current) {
+			items[i].state = 0;
+		    }
+		}
+		if (items[current].state) {
+		    getyx(dialog, cur_y, cur_x);
+		    items[current].state = next ? next : 1;
+		    print_item(&all, all.list,
+			       &items[current],
+			       states,
+			       choice, TRUE);
+		    (void) wnoutrefresh(all.list);
+		    (void) wmove(dialog, cur_y, cur_x);
+		} else {
+		    items[current].state = 1;
+		    print_list(&all, choice, scrollamt, max_choice);
+		}
+	    }
+	    continue;		/* wait for another key press */
+	}
+
+	/*
+	 * Check if key pressed matches first character of any item tag in
+	 * list.  If there is more than one match, we will cycle through
+	 * each one as the same key is pressed repeatedly.
+	 */
+	found = FALSE;
+	if (!fkey) {
+	    if (button < 0 || !dialog_state.visit_items) {
+		for (j = scrollamt + choice + 1; j < item_no; j++) {
+		    if (check_hotkey(items, j)) {
+			found = TRUE;
+			i = j - scrollamt;
+			break;
+		    }
+		}
+		if (!found) {
+		    for (j = 0; j <= scrollamt + choice; j++) {
+			if (check_hotkey(items, j)) {
+			    found = TRUE;
+			    i = j - scrollamt;
+			    break;
+			}
+		    }
+		}
+		if (found)
+		    dlg_flush_getc();
+	    } else if ((j = dlg_char_to_button(key, buttons)) >= 0) {
+		button = j;
+		ungetch('\n');
+		continue;
+	    }
+	}
+
+	/*
+	 * A single digit (1-9) positions the selection to that line in the
+	 * current screen.
+	 */
+	if (!found
+	    && (key <= '9')
+	    && (key > '0')
+	    && (key - '1' < max_choice)) {
+	    found = TRUE;
+	    i = key - '1';
+	}
+
+	if (!found) {
+	    if (fkey) {
+		found = TRUE;
+		switch (key) {
+		case DLGK_ITEM_FIRST:
+		    i = -scrollamt;
+		    break;
+		case DLGK_ITEM_LAST:
+		    i = item_no - 1 - scrollamt;
+		    break;
+		case DLGK_PAGE_PREV:
+		    if (choice)
+			i = 0;
+		    else if (scrollamt != 0)
+			i = -MIN(scrollamt, max_choice);
+		    else
+			continue;
+		    break;
+		case DLGK_PAGE_NEXT:
+		    i = MIN(choice + max_choice, item_no - scrollamt - 1);
+		    break;
+		case DLGK_ITEM_PREV:
+		    i = choice - 1;
+		    if (choice == 0 && scrollamt == 0)
+			continue;
+		    break;
+		case DLGK_ITEM_NEXT:
+		    i = choice + 1;
+		    if (scrollamt + choice >= item_no - 1)
+			continue;
+		    break;
+		default:
+		    found = FALSE;
+		    break;
+		}
+	    }
+	}
+
+	if (found) {
+	    if (i != choice) {
+		getyx(dialog, cur_y, cur_x);
+		if (i < 0 || i >= max_choice) {
+		    if (i < 0) {
+			scrollamt += i;
+			choice = 0;
+		    } else {
+			choice = max_choice - 1;
+			scrollamt += (i - max_choice + 1);
+		    }
+		    print_list(&all, choice, scrollamt, max_choice);
+		} else {
+		    choice = i;
+		    print_list(&all, choice, scrollamt, max_choice);
+		}
+	    }
+	    continue;		/* wait for another key press */
+	}
+
+	if (fkey) {
+	    switch (key) {
+	    case DLGK_ENTER:
+		result = dlg_enter_buttoncode(button);
+		break;
+	    case DLGK_LEAVE:
+		result = dlg_ok_buttoncode(button);
+		break;
+	    case DLGK_FIELD_PREV:
+		button = dlg_prev_button(buttons, button);
+		dlg_draw_buttons(dialog, height - 2, 0, buttons, button,
+				 FALSE, width);
+		break;
+	    case DLGK_FIELD_NEXT:
+		button = dlg_next_button(buttons, button);
+		dlg_draw_buttons(dialog, height - 2, 0, buttons, button,
+				 FALSE, width);
+		break;
+#ifdef KEY_RESIZE
+	    case KEY_RESIZE:
+		dlg_will_resize(dialog);
+		/* reset data */
+		height = old_height;
+		width = old_width;
+		free(prompt);
+		_dlg_resize_cleanup(dialog);
+		/* repaint */
+		goto retry;
+#endif
+	    default:
+		if (was_mouse) {
+		    if ((key2 = dlg_ok_buttoncode(key)) >= 0) {
+			result = key2;
+			break;
+		    }
+		    beep();
+		}
+	    }
+	} else if (key > 0) {
+	    beep();
+	}
+    }
+
+    dlg_del_window(dialog);
+    dlg_mouse_free_regions();
+    free(prompt);
+    *current_item = (scrollamt + choice);
+    return result;
+}
+
+/*
+ * Display a dialog box with a list of options that can be turned on or off
+ * The `flag' parameter is used to select between radiolist and checklist.
+ */
+int
+dialog_checklist(const char *title,
+		 const char *cprompt,
+		 int height,
+		 int width,
+		 int list_height,
+		 int item_no,
+		 char **items,
+		 int flag)
+{
+    int result;
+    int i, j;
+    DIALOG_LISTITEM *listitems;
+    bool separate_output = ((flag == FLAG_CHECK)
+			    && (dialog_vars.separate_output));
+    bool show_status = FALSE;
+    int current = 0;
+    char *help_result;
+
+    listitems = dlg_calloc(DIALOG_LISTITEM, (size_t) item_no + 1);
+    assert_ptr(listitems, "dialog_checklist");
+
+    for (i = j = 0; i < item_no; ++i) {
+	listitems[i].name = items[j++];
+	listitems[i].text = (dialog_vars.no_items
+			     ? dlg_strempty()
+			     : items[j++]);
+	listitems[i].state = !dlg_strcmp(items[j++], "on");
+	listitems[i].help = ((dialog_vars.item_help)
+			     ? items[j++]
+			     : dlg_strempty());
+    }
+    dlg_align_columns(&listitems[0].text, (int) sizeof(DIALOG_LISTITEM), item_no);
+
+    result = dlg_checklist(title,
+			   cprompt,
+			   height,
+			   width,
+			   list_height,
+			   item_no,
+			   listitems,
+			   NULL,
+			   flag,
+			   &current);
+
+    switch (result) {
+    case DLG_EXIT_OK:		/* FALLTHRU */
+    case DLG_EXIT_EXTRA:
+	show_status = TRUE;
+	break;
+    case DLG_EXIT_HELP:
+	dlg_add_help_listitem(&result, &help_result, &listitems[current]);
+	if ((show_status = dialog_vars.help_status)) {
+	    if (separate_output) {
+		dlg_add_string(help_result);
+		dlg_add_separator();
+	    } else {
+		dlg_add_quoted(help_result);
+	    }
+	} else {
+	    dlg_add_string(help_result);
+	}
+	break;
+    }
+
+    if (show_status) {
+	for (i = 0; i < item_no; i++) {
+	    if (listitems[i].state) {
+		if (separate_output) {
+		    dlg_add_string(listitems[i].name);
+		    dlg_add_separator();
+		} else {
+		    if (dlg_need_separator())
+			dlg_add_separator();
+		    if (flag == FLAG_CHECK)
+			dlg_add_quoted(listitems[i].name);
+		    else
+			dlg_add_string(listitems[i].name);
+		}
+	    }
+	}
+	dlg_add_last_key(separate_output);
+    }
+
+    dlg_free_columns(&listitems[0].text, (int) sizeof(DIALOG_LISTITEM), item_no);
+    free(listitems);
+    return result;
+}
Index: build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/menubox.c
===================================================================
--- build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/menubox.c	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/menubox.c	(revision 323)
@@ -0,0 +1,815 @@
+/*
+ *  $Id: menubox.c,v 1.171 2020/11/23 21:03:11 tom Exp $
+ *
+ *  menubox.c -- implements the menu box
+ *
+ *  Copyright 2000-2019,2020	Thomas E. Dickey
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Lesser General Public Licens, version 2.1e
+ *  as published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to
+ *	Free Software Foundation, Inc.
+ *	51 Franklin St., Fifth Floor
+ *	Boston, MA 02110, USA.
+ *
+ *  An earlier version of this program lists as authors
+ *	Savio Lam (lam836@cs.cuhk.hk)
+ */
+
+#include <dlg_internals.h>
+#include <dlg_keys.h>
+
+typedef enum {
+    Unselected = 0,
+    Selected,
+    Editing
+} Mode;
+
+typedef struct {
+    /* the outer-window */
+    WINDOW *dialog;
+    int box_y;
+    int box_x;
+    int tag_x;
+    int item_x;
+    int menu_height;
+    int menu_width;
+    /* the inner-window */
+    WINDOW *menu;
+    DIALOG_LISTITEM *items;
+    int item_no;
+} ALL_DATA;
+
+#define MIN_HIGH  4
+
+#define INPUT_ROWS     3	/* rows per inputmenu entry */
+
+#define RowHeight(i) (is_inputmenu ? ((i) * INPUT_ROWS) : ((i) * 1))
+#define ItemToRow(i) (is_inputmenu ? ((i) * INPUT_ROWS + 1) : (i))
+#define RowToItem(i) (is_inputmenu ? ((i) / INPUT_ROWS + 0) : (i))
+
+/*
+ * Print menu item
+ */
+static void
+print_item(ALL_DATA * data,
+	   WINDOW *win,
+	   DIALOG_LISTITEM * item,
+	   int choice,
+	   Mode selected,
+	   bool is_inputmenu)
+{
+    chtype save = dlg_get_attrs(win);
+    int climit = (data->item_x - data->tag_x - GUTTER);
+    int my_width = data->menu_width;
+    int my_x = data->item_x;
+    int my_y = ItemToRow(choice);
+    bool both = (!dialog_vars.no_tags && !dialog_vars.no_items);
+    bool first = TRUE;
+    chtype bordchar;
+    const char *show = (dialog_vars.no_items
+			? item->name
+			: item->text);
+
+    switch (selected) {
+    default:
+    case Unselected:
+	bordchar = item_attr;
+	break;
+    case Selected:
+	bordchar = item_selected_attr;
+	break;
+    case Editing:
+	bordchar = dialog_attr;
+	break;
+    }
+
+    /* Clear 'residue' of last item and mark current current item */
+    if (is_inputmenu) {
+	int n;
+
+	dlg_attrset(win, (selected != Unselected) ? item_selected_attr : item_attr);
+	for (n = my_y - 1; n < my_y + INPUT_ROWS - 1; n++) {
+	    wmove(win, n, 0);
+	    wprintw(win, "%*s", my_width, " ");
+	}
+    } else {
+	dlg_attrset(win, menubox_attr);
+	wmove(win, my_y, 0);
+	wprintw(win, "%*s", my_width, " ");
+    }
+
+    /* highlight first char of the tag to be special */
+    if (both) {
+	(void) wmove(win, my_y, data->tag_x);
+	dlg_print_listitem(win, item->name, climit, first, selected);
+	first = FALSE;
+    }
+
+    /* Draw the input field box (only for inputmenu) */
+    (void) wmove(win, my_y, my_x);
+    if (is_inputmenu) {
+	my_width -= 1;
+	dlg_draw_box(win, my_y - 1, my_x, INPUT_ROWS, my_width - my_x - data->tag_x,
+		     bordchar,
+		     bordchar);
+	my_width -= 1;
+	++my_x;
+    }
+
+    /* print actual item */
+    wmove(win, my_y, my_x);
+    dlg_print_listitem(win, show, my_width - my_x, first, selected);
+
+    if (selected) {
+	dlg_item_help(item->help);
+    }
+    dlg_attrset(win, save);
+}
+
+/*
+ * Allow the user to edit the text of a menu entry.
+ */
+static int
+input_menu_edit(ALL_DATA * data,
+		DIALOG_LISTITEM * items,
+		int choice,
+		char **resultp)
+{
+    chtype save = dlg_get_attrs(data->menu);
+    char *result;
+    int offset = 0;
+    int key = 0, fkey = 0;
+    bool first = TRUE;
+    /* see above */
+    bool is_inputmenu = TRUE;
+    int y = ItemToRow(choice);
+    int code = TRUE;
+    int max_len = dlg_max_input(MAX((int) strlen(items->text) + 1, MAX_LEN));
+
+    result = dlg_malloc(char, (size_t) max_len);
+    assert_ptr(result, "input_menu_edit");
+
+    /* original item is used to initialize the input string. */
+    result[0] = '\0';
+    strcpy(result, items->text);
+
+    print_item(data, data->menu, items, choice, Editing, TRUE);
+
+    /* taken out of inputbox.c - but somewhat modified */
+    for (;;) {
+	if (!first) {
+	    int check = DLG_EXIT_UNKNOWN;
+	    key = dlg_mouse_wgetch(data->menu, &fkey);
+	    if (dlg_result_key(key, fkey, &check)) {
+		if (check == DLG_EXIT_CANCEL) {
+		    code = FALSE;
+		    break;
+		} else {
+		    flash();
+		}
+	    }
+	}
+	if (dlg_edit_string(result, &offset, key, fkey, first)) {
+	    dlg_show_string(data->menu, result, offset, inputbox_attr,
+			    y,
+			    data->item_x + 1,
+			    data->menu_width - data->item_x - 3,
+			    FALSE, first);
+	    first = FALSE;
+	} else if (key == ESC || key == TAB) {
+	    code = FALSE;
+	    break;
+	} else {
+	    break;
+	}
+    }
+    print_item(data, data->menu, items, choice, Selected, TRUE);
+    dlg_attrset(data->menu, save);
+
+    *resultp = result;
+    return code;
+}
+
+static int
+handle_button(int code, DIALOG_LISTITEM * items, int choice)
+{
+    char *help_result;
+
+    switch (code) {
+    case DLG_EXIT_OK:		/* FALLTHRU */
+    case DLG_EXIT_EXTRA:
+	dlg_add_string(items[choice].name);
+	break;
+    case DLG_EXIT_HELP:
+	dlg_add_help_listitem(&code, &help_result, &items[choice]);
+	dlg_add_string(help_result);
+	break;
+    }
+    AddLastKey();
+    return code;
+}
+
+int
+dlg_renamed_menutext(DIALOG_LISTITEM * items, int current, char *newtext)
+{
+    if (dialog_vars.input_result)
+	dialog_vars.input_result[0] = '\0';
+    dlg_add_result("RENAMED ");
+    dlg_add_string(items[current].name);
+    dlg_add_result(" ");
+    dlg_add_string(newtext);
+    AddLastKey();
+    return DLG_EXIT_EXTRA;
+}
+
+int
+dlg_dummy_menutext(DIALOG_LISTITEM * items, int current, char *newtext)
+{
+    (void) items;
+    (void) current;
+    (void) newtext;
+    return DLG_EXIT_ERROR;
+}
+
+static void
+print_menu(ALL_DATA * data, int choice, int scrollamt, int max_choice, bool is_inputmenu)
+{
+    int i;
+
+    for (i = 0; i < max_choice; i++) {
+	print_item(data,
+		   data->menu,
+		   &data->items[i + scrollamt],
+		   i,
+		   (i == choice) ? Selected : Unselected,
+		   is_inputmenu);
+    }
+
+    /* Clean bottom lines */
+    if (is_inputmenu) {
+	int spare_lines, x_count;
+	spare_lines = data->menu_height % INPUT_ROWS;
+	dlg_attrset(data->menu, menubox_attr);
+	for (; spare_lines; spare_lines--) {
+	    wmove(data->menu, data->menu_height - spare_lines, 0);
+	    for (x_count = 0; x_count < data->menu_width;
+		 x_count++) {
+		waddch(data->menu, ' ');
+	    }
+	}
+    }
+
+    (void) wnoutrefresh(data->menu);
+
+    dlg_draw_scrollbar(data->dialog,
+		       scrollamt,
+		       scrollamt,
+		       scrollamt + max_choice,
+		       data->item_no,
+		       data->box_x,
+		       data->box_x + data->menu_width,
+		       data->box_y,
+		       data->box_y + data->menu_height + 1,
+		       menubox_border2_attr,
+		       menubox_border_attr);
+}
+
+static bool
+check_hotkey(DIALOG_LISTITEM * items, int choice)
+{
+    bool result = FALSE;
+
+    if (dlg_match_char(dlg_last_getc(),
+		       (dialog_vars.no_tags
+			? items[choice].text
+			: items[choice].name))) {
+	result = TRUE;
+    }
+    return result;
+}
+
+/*
+ * This is an alternate interface to 'menu' which allows the application
+ * to read the list item states back directly without putting them in the
+ * output buffer.
+ */
+int
+dlg_menu(const char *title,
+	 const char *cprompt,
+	 int height,
+	 int width,
+	 int menu_height,
+	 int item_no,
+	 DIALOG_LISTITEM * items,
+	 int *current_item,
+	 DIALOG_INPUTMENU rename_menutext)
+{
+    /* *INDENT-OFF* */
+    static DLG_KEYS_BINDING binding[] = {
+	HELPKEY_BINDINGS,
+	ENTERKEY_BINDINGS,
+	TOGGLEKEY_BINDINGS,
+	DLG_KEYS_DATA( DLGK_FIELD_NEXT,	KEY_RIGHT ),
+	DLG_KEYS_DATA( DLGK_FIELD_NEXT,	TAB ),
+	DLG_KEYS_DATA( DLGK_FIELD_PREV,	KEY_BTAB ),
+	DLG_KEYS_DATA( DLGK_FIELD_PREV,	KEY_LEFT ),
+	DLG_KEYS_DATA( DLGK_ITEM_NEXT,	'+' ),
+	DLG_KEYS_DATA( DLGK_ITEM_NEXT,	KEY_DOWN ),
+	DLG_KEYS_DATA( DLGK_ITEM_NEXT,  CHR_NEXT ),
+	DLG_KEYS_DATA( DLGK_ITEM_PREV,	'-' ),
+	DLG_KEYS_DATA( DLGK_ITEM_PREV,	KEY_UP ),
+	DLG_KEYS_DATA( DLGK_ITEM_PREV,  CHR_PREVIOUS ),
+	DLG_KEYS_DATA( DLGK_PAGE_FIRST,	KEY_HOME ),
+	DLG_KEYS_DATA( DLGK_PAGE_LAST,	KEY_END ),
+	DLG_KEYS_DATA( DLGK_PAGE_LAST,	KEY_LL ),
+	DLG_KEYS_DATA( DLGK_PAGE_NEXT,	KEY_NPAGE ),
+	DLG_KEYS_DATA( DLGK_PAGE_PREV,	KEY_PPAGE ),
+	END_KEYS_BINDING
+    };
+    static DLG_KEYS_BINDING binding2[] = {
+	INPUTSTR_BINDINGS,
+	HELPKEY_BINDINGS,
+	ENTERKEY_BINDINGS,
+	END_KEYS_BINDING
+    };
+    /* *INDENT-ON* */
+
+#ifdef KEY_RESIZE
+    int old_LINES = LINES;
+    int old_COLS = COLS;
+    int old_height = height;
+    int old_width = width;
+#endif
+    ALL_DATA all;
+    int i, j, x, y, cur_x, cur_y;
+    int fkey;
+    int button = dialog_state.visit_items ? -1 : dlg_default_button();
+    int choice = dlg_default_listitem(items);
+    int result = DLG_EXIT_UNKNOWN;
+    int scrollamt = 0;
+    int max_choice;
+    int use_width, name_width, text_width, list_width;
+    WINDOW *dialog, *menu;
+    char *prompt = 0;
+    const char **buttons = dlg_ok_labels();
+    bool is_inputmenu = ((rename_menutext != 0)
+			 && (rename_menutext != dlg_dummy_menutext));
+
+    DLG_TRACE(("# menubox args:\n"));
+    DLG_TRACE2S("title", title);
+    DLG_TRACE2S("message", cprompt);
+    DLG_TRACE2N("height", height);
+    DLG_TRACE2N("width", width);
+    DLG_TRACE2N("lheight", menu_height);
+    DLG_TRACE2N("llength", item_no);
+    /* FIXME dump the items[][] too */
+    DLG_TRACE2N("rename", rename_menutext != 0);
+
+    dialog_state.plain_buttons = TRUE;
+
+    all.items = items;
+    all.item_no = item_no;
+
+    dlg_does_output();
+
+#ifdef KEY_RESIZE
+  retry:
+#endif
+
+    prompt = dlg_strclone(cprompt);
+    dlg_tab_correct_str(prompt);
+
+    all.menu_height = menu_height;
+    use_width = dlg_calc_list_width(item_no, items) + 10;
+    use_width = MAX(26, use_width);
+    if (all.menu_height == 0) {
+	/* calculate height without items (4) */
+	dlg_auto_size(title, prompt, &height, &width, MIN_HIGH, use_width);
+	dlg_calc_listh(&height, &all.menu_height, item_no);
+    } else {
+	dlg_auto_size(title, prompt,
+		      &height, &width,
+		      MIN_HIGH + all.menu_height, use_width);
+    }
+    dlg_button_layout(buttons, &width);
+    dlg_print_size(height, width);
+    dlg_ctl_size(height, width);
+
+    x = dlg_box_x_ordinate(width);
+    y = dlg_box_y_ordinate(height);
+
+    dialog = dlg_new_window(height, width, y, x);
+    all.dialog = dialog;
+
+    dlg_register_window(dialog, "menubox", binding);
+    dlg_register_buttons(dialog, "menubox", buttons);
+
+    dlg_mouse_setbase(x, y);
+
+    dlg_draw_box2(dialog, 0, 0, height, width, dialog_attr, border_attr, border2_attr);
+    dlg_draw_bottom_box2(dialog, border_attr, border2_attr, dialog_attr);
+    dlg_draw_title(dialog, title);
+
+    dlg_attrset(dialog, dialog_attr);
+    dlg_print_autowrap(dialog, prompt, height, width);
+
+    all.menu_width = width - 6;
+    getyx(dialog, cur_y, cur_x);
+    all.box_y = cur_y + 1;
+    all.box_x = (width - all.menu_width) / 2 - 1;
+
+    /*
+     * After displaying the prompt, we know how much space we really have.
+     * Limit the list to avoid overwriting the ok-button.
+     */
+    if (all.menu_height + MIN_HIGH > height - cur_y)
+       all.menu_height = height - MIN_HIGH - cur_y;
+    if (all.menu_height <= 0)
+	all.menu_height = 1;
+
+    /* Find out maximal number of displayable items at once. */
+    max_choice = MIN(all.menu_height,
+		     RowHeight(item_no));
+    if (is_inputmenu)
+	max_choice /= INPUT_ROWS;
+
+    /* create new window for the menu */
+    menu = dlg_sub_window(dialog, all.menu_height, all.menu_width,
+			  y + all.box_y + 1,
+			  x + all.box_x + 1);
+    all.menu = menu;
+
+    dlg_register_window(menu, "menu", binding2);
+    dlg_register_buttons(menu, "menu", buttons);
+
+    /* draw a box around the menu items */
+    dlg_draw_box(dialog,
+		 all.box_y, all.box_x,
+		 all.menu_height + 2, all.menu_width + 2,
+		 menubox_border_attr, menubox_border2_attr);
+
+    name_width = 0;
+    text_width = 0;
+
+    /* Find length of longest item to center menu  *
+     * only if --menu was given, using --inputmenu *
+     * won't be centered.                         */
+    for (i = 0; i < item_no; i++) {
+	name_width = MAX(name_width, dlg_count_columns(items[i].name));
+	text_width = MAX(text_width, dlg_count_columns(items[i].text));
+    }
+
+    /* If the name+text is wider than the list is allowed, then truncate
+     * one or both of them.  If the name is no wider than 30% of the list,
+     * leave it intact.
+     *
+     * FIXME: the gutter width and name/list ratio should be configurable.
+     */
+    use_width = (all.menu_width - GUTTER);
+    if (dialog_vars.no_tags) {
+	list_width = MIN(use_width, text_width);
+    } else if (dialog_vars.no_items) {
+	list_width = MIN(use_width, name_width);
+    } else {
+	if (text_width >= 0
+	    && name_width >= 0
+	    && use_width > 0
+	    && text_width + name_width > use_width) {
+	    int need = (int) (0.30 * use_width);
+	    if (name_width > need) {
+		int want = (int) (use_width
+				  * ((double) name_width)
+				  / (text_width + name_width));
+		name_width = (want > need) ? want : need;
+	    }
+	    text_width = use_width - name_width;
+	}
+	list_width = (text_width + name_width);
+    }
+
+    all.tag_x = (is_inputmenu
+		 ? 0
+		 : (use_width - list_width) / 2);
+    all.item_x = ((dialog_vars.no_tags
+		   ? 0
+		   : (dialog_vars.no_items
+		      ? 0
+		      : (GUTTER + name_width)))
+		  + all.tag_x);
+
+    if (choice - scrollamt >= max_choice) {
+	scrollamt = choice - (max_choice - 1);
+	choice = max_choice - 1;
+    }
+
+    print_menu(&all, choice, scrollamt, max_choice, is_inputmenu);
+
+    /* register the new window, along with its borders */
+    dlg_mouse_mkbigregion(all.box_y + 1, all.box_x,
+			  all.menu_height + 2, all.menu_width + 2,
+			  KEY_MAX, 1, 1, 1 /* by lines */ );
+
+    dlg_draw_buttons(dialog, height - 2, 0, buttons, button, FALSE, width);
+
+    dlg_trace_win(dialog);
+
+    while (result == DLG_EXIT_UNKNOWN) {
+	int key, found;
+
+	if (button < 0)		/* --visit-items */
+	    wmove(dialog,
+		  all.box_y + ItemToRow(choice) + 1,
+		  all.box_x + all.tag_x + 1);
+
+	key = dlg_mouse_wgetch(dialog, &fkey);
+	if (dlg_result_key(key, fkey, &result)) {
+	    if (!dlg_button_key(result, &button, &key, &fkey))
+		break;
+	}
+
+	found = FALSE;
+	if (fkey) {
+	    /*
+	     * Allow a mouse-click on a box to switch selection to that box.
+	     * Handling a button click is a little more complicated, since we
+	     * push a KEY_ENTER back onto the input stream so we'll put the
+	     * cursor at the right place before handling the "keypress".
+	     */
+	    if (key >= DLGK_MOUSE(KEY_MAX)) {
+		key -= DLGK_MOUSE(KEY_MAX);
+		i = RowToItem(key);
+		if (i < max_choice) {
+		    found = TRUE;
+		} else {
+		    beep();
+		    continue;
+		}
+	    } else if (is_DLGK_MOUSE(key)
+		       && dlg_ok_buttoncode(key - M_EVENT) >= 0) {
+		button = (key - M_EVENT);
+		ungetch('\n');
+		continue;
+	    }
+	} else {
+	    /*
+	     * Check if key pressed matches first character of any item tag in
+	     * list.  If there is more than one match, we will cycle through
+	     * each one as the same key is pressed repeatedly.
+	     */
+	    if (button < 0 || !dialog_state.visit_items) {
+		for (j = scrollamt + choice + 1; j < item_no; j++) {
+		    if (check_hotkey(items, j)) {
+			found = TRUE;
+			i = j - scrollamt;
+			break;
+		    }
+		}
+		if (!found) {
+		    for (j = 0; j <= scrollamt + choice; j++) {
+			if (check_hotkey(items, j)) {
+			    found = TRUE;
+			    i = j - scrollamt;
+			    break;
+			}
+		    }
+		}
+		if (found)
+		    dlg_flush_getc();
+	    } else if ((j = dlg_char_to_button(key, buttons)) >= 0) {
+		button = j;
+		ungetch('\n');
+		continue;
+	    }
+
+	    /*
+	     * A single digit (1-9) positions the selection to that line in the
+	     * current screen.
+	     */
+	    if (!found
+		&& (key <= '9')
+		&& (key > '0')
+		&& (key - '1' < max_choice)) {
+		found = TRUE;
+		i = key - '1';
+	    }
+	}
+
+	if (!found && fkey) {
+	    found = TRUE;
+	    switch (key) {
+	    case DLGK_PAGE_FIRST:
+		i = -scrollamt;
+		break;
+	    case DLGK_PAGE_LAST:
+		i = item_no - 1 - scrollamt;
+		break;
+	    case DLGK_MOUSE(KEY_PPAGE):
+	    case DLGK_PAGE_PREV:
+		if (choice)
+		    i = 0;
+		else if (scrollamt != 0)
+		    i = -MIN(scrollamt, max_choice);
+		else
+		    continue;
+		break;
+	    case DLGK_MOUSE(KEY_NPAGE):
+	    case DLGK_PAGE_NEXT:
+		i = MIN(choice + max_choice, item_no - scrollamt - 1);
+		break;
+	    case DLGK_ITEM_PREV:
+		i = choice - 1;
+		if (choice == 0 && scrollamt == 0)
+		    continue;
+		break;
+	    case DLGK_ITEM_NEXT:
+		i = choice + 1;
+		if (scrollamt + choice >= item_no - 1)
+		    continue;
+		break;
+	    default:
+		found = FALSE;
+		break;
+	    }
+	}
+
+	if (found) {
+	    if (i != choice) {
+		getyx(dialog, cur_y, cur_x);
+		if (i < 0 || i >= max_choice) {
+		    if (i < 0) {
+			scrollamt += i;
+			choice = 0;
+		    } else {
+			choice = max_choice - 1;
+			scrollamt += (i - max_choice + 1);
+		    }
+		    print_menu(&all, choice, scrollamt, max_choice, is_inputmenu);
+		} else {
+		    choice = i;
+		    print_menu(&all, choice, scrollamt, max_choice, is_inputmenu);
+		    (void) wmove(dialog, cur_y, cur_x);
+		    wrefresh(dialog);
+		}
+	    }
+	    continue;		/* wait for another key press */
+	}
+
+	if (fkey) {
+	    switch (key) {
+	    case DLGK_FIELD_PREV:
+		button = dlg_prev_button(buttons, button);
+		dlg_draw_buttons(dialog, height - 2, 0, buttons, button,
+				 FALSE, width);
+		break;
+
+	    case DLGK_FIELD_NEXT:
+		button = dlg_next_button(buttons, button);
+		dlg_draw_buttons(dialog, height - 2, 0, buttons, button,
+				 FALSE, width);
+		break;
+
+	    case DLGK_TOGGLE:
+	    case DLGK_ENTER:
+	    case DLGK_LEAVE:
+		result = ((key == DLGK_LEAVE)
+			  ? dlg_ok_buttoncode(button)
+			  : dlg_enter_buttoncode(button));
+
+		/*
+		 * If dlg_menu() is called from dialog_menu(), we want to
+		 * capture the results into dialog_vars.input_result.
+		 */
+		if (result == DLG_EXIT_ERROR) {
+		    result = DLG_EXIT_UNKNOWN;
+		} else if (is_inputmenu
+			   || rename_menutext == dlg_dummy_menutext) {
+		    result = handle_button(result,
+					   items,
+					   scrollamt + choice);
+		}
+
+		/*
+		 * If we have a rename_menutext function, interpret the Extra
+		 * button as a request to rename the menu's text.  If that
+		 * function doesn't return "Unknown", we will exit from this
+		 * function.  Usually that is done for dialog_menu(), so the
+		 * shell script can use the updated value.  If it does return
+		 * "Unknown", update the list item only.  A direct caller of
+		 * dlg_menu() can free the renamed value - we cannot.
+		 */
+		if (is_inputmenu && result == DLG_EXIT_EXTRA) {
+		    char *tmp;
+
+		    if (input_menu_edit(&all,
+					&items[scrollamt + choice],
+					choice,
+					&tmp)) {
+			result = rename_menutext(items, scrollamt + choice, tmp);
+			if (result == DLG_EXIT_UNKNOWN) {
+			    items[scrollamt + choice].text = tmp;
+			} else {
+			    free(tmp);
+			}
+		    } else {
+			result = DLG_EXIT_UNKNOWN;
+			print_item(&all,
+				   menu,
+				   &items[scrollamt + choice],
+				   choice,
+				   Selected,
+				   is_inputmenu);
+			(void) wnoutrefresh(menu);
+			free(tmp);
+		    }
+
+		    if (result == DLG_EXIT_UNKNOWN) {
+			dlg_draw_buttons(dialog, height - 2, 0,
+					 buttons, button, FALSE, width);
+		    }
+		}
+		break;
+#ifdef KEY_RESIZE
+	    case KEY_RESIZE:
+		dlg_will_resize(dialog);
+		/* reset data */
+		resizeit(height, LINES);
+		resizeit(width, COLS);
+		free(prompt);
+		_dlg_resize_cleanup(dialog);
+		/* repaint */
+		goto retry;
+#endif
+	    default:
+		flash();
+		break;
+	    }
+	}
+    }
+
+    dlg_mouse_free_regions();
+    dlg_unregister_window(menu);
+    dlg_del_window(dialog);
+    free(prompt);
+
+    *current_item = scrollamt + choice;
+
+    DLG_TRACE2N("current", *current_item);
+    return result;
+}
+
+/*
+ * Display a menu for choosing among a number of options
+ */
+int
+dialog_menu(const char *title,
+	    const char *cprompt,
+	    int height,
+	    int width,
+	    int menu_height,
+	    int item_no,
+	    char **items)
+{
+    int result;
+    int choice;
+    int i, j;
+    DIALOG_LISTITEM *listitems;
+
+    listitems = dlg_calloc(DIALOG_LISTITEM, (size_t) item_no + 1);
+    assert_ptr(listitems, "dialog_menu");
+
+    for (i = j = 0; i < item_no; ++i) {
+	listitems[i].name = items[j++];
+	listitems[i].text = (dialog_vars.no_items
+			     ? dlg_strempty()
+			     : items[j++]);
+	listitems[i].help = ((dialog_vars.item_help)
+			     ? items[j++]
+			     : dlg_strempty());
+    }
+    dlg_align_columns(&listitems[0].text, sizeof(DIALOG_LISTITEM), item_no);
+
+    result = dlg_menu(title,
+		      cprompt,
+		      height,
+		      width,
+		      menu_height,
+		      item_no,
+		      listitems,
+		      &choice,
+		      (dialog_vars.input_menu
+		       ? dlg_renamed_menutext
+		       : dlg_dummy_menutext));
+
+    dlg_free_columns(&listitems[0].text, sizeof(DIALOG_LISTITEM), item_no);
+    free(listitems);
+    return result;
+}
Index: build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/treeview.c
===================================================================
--- build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/treeview.c	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/treeview.c	(revision 323)
@@ -0,0 +1,675 @@
+/*
+ *  $Id: treeview.c,v 1.43 2020/11/23 00:38:31 tom Exp $
+ *
+ *  treeview.c -- implements the treeview dialog
+ *
+ *  Copyright 2012-2019,2020	Thomas E. Dickey
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Lesser General Public License, version 2.1
+ *  as published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to
+ *	Free Software Foundation, Inc.
+ *	51 Franklin St., Fifth Floor
+ *	Boston, MA 02110, USA.
+ */
+
+#include <dlg_internals.h>
+#include <dlg_keys.h>
+
+#define INDENT 3
+#define MIN_HIGH  (1 + (5 * MARGIN))
+
+typedef struct {
+    /* the outer-window */
+    WINDOW *dialog;
+    bool is_check;
+    int box_y;
+    int box_x;
+    int check_x;
+    int item_x;
+    int use_height;
+    int use_width;
+    /* the inner-window */
+    WINDOW *list;
+    DIALOG_LISTITEM *items;
+    int item_no;
+    int *depths;
+    const char *states;
+} ALL_DATA;
+
+/*
+ * Print list item.  The 'selected' parameter is true if 'choice' is the
+ * current item.  That one is colored differently from the other items.
+ */
+static void
+print_item(ALL_DATA * data,
+	   DIALOG_LISTITEM * item,
+	   const char *states,
+	   int depths,
+	   int choice,
+	   int selected)
+{
+    WINDOW *win = data->list;
+    chtype save = dlg_get_attrs(win);
+    int i;
+    bool first = TRUE;
+    int climit = (getmaxx(win) - data->check_x + 1);
+    const char *show = (dialog_vars.no_items
+			? item->name
+			: item->text);
+
+    /* Clear 'residue' of last item */
+    dlg_attrset(win, menubox_attr);
+    (void) wmove(win, choice, 0);
+    for (i = 0; i < data->use_width; i++)
+	(void) waddch(win, ' ');
+
+    (void) wmove(win, choice, data->check_x);
+    dlg_attrset(win, selected ? check_selected_attr : check_attr);
+    (void) wprintw(win,
+		   data->is_check ? "[%c]" : "(%c)",
+		   states[item->state]);
+    dlg_attrset(win, menubox_attr);
+
+    dlg_attrset(win, selected ? item_selected_attr : item_attr);
+    for (i = 0; i < depths; ++i) {
+	int j;
+	(void) wmove(win, choice, data->item_x + INDENT * i);
+	(void) waddch(win, ACS_VLINE);
+	for (j = INDENT - 1; j > 0; --j)
+	    (void) waddch(win, ' ');
+    }
+    (void) wmove(win, choice, data->item_x + INDENT * depths);
+
+    dlg_print_listitem(win, show, climit, first, selected);
+
+    if (selected) {
+	dlg_item_help(item->help);
+    }
+    dlg_attrset(win, save);
+}
+
+static void
+print_list(ALL_DATA * data,
+	   int choice,
+	   int scrollamt,
+	   int max_choice)
+{
+    int i;
+    int cur_y, cur_x;
+
+    getyx(data->dialog, cur_y, cur_x);
+
+    for (i = 0; i < max_choice; i++) {
+	print_item(data,
+		   &data->items[scrollamt + i],
+		   data->states,
+		   data->depths[scrollamt + i],
+		   i, i == choice);
+    }
+    (void) wnoutrefresh(data->list);
+
+    dlg_draw_scrollbar(data->dialog,
+		       (long) (scrollamt),
+		       (long) (scrollamt),
+		       (long) (scrollamt + max_choice),
+		       (long) (data->item_no),
+		       data->box_x + data->check_x,
+		       data->box_x + data->use_width,
+		       data->box_y,
+		       data->box_y + data->use_height + 1,
+		       menubox_border2_attr,
+		       menubox_border_attr);
+
+    (void) wmove(data->dialog, cur_y, cur_x);
+}
+
+static bool
+check_hotkey(DIALOG_LISTITEM * items, int choice)
+{
+    bool result = FALSE;
+
+    if (dlg_match_char(dlg_last_getc(),
+		       (dialog_vars.no_tags
+			? items[choice].text
+			: items[choice].name))) {
+	result = TRUE;
+    }
+    return result;
+}
+
+/*
+ * This is an alternate interface to 'treeview' which allows the application
+ * to read the list item states back directly without putting them in the
+ * output buffer.
+ */
+int
+dlg_treeview(const char *title,
+	     const char *cprompt,
+	     int height,
+	     int width,
+	     int list_height,
+	     int item_no,
+	     DIALOG_LISTITEM * items,
+	     const char *states,
+	     int *depths,
+	     int flag,
+	     int *current_item)
+{
+    /* *INDENT-OFF* */
+    static DLG_KEYS_BINDING binding[] = {
+	HELPKEY_BINDINGS,
+	ENTERKEY_BINDINGS,
+	DLG_KEYS_DATA( DLGK_FIELD_NEXT, KEY_RIGHT ),
+	DLG_KEYS_DATA( DLGK_FIELD_NEXT, TAB ),
+	DLG_KEYS_DATA( DLGK_FIELD_PREV, KEY_BTAB ),
+	DLG_KEYS_DATA( DLGK_FIELD_PREV, KEY_LEFT ),
+	DLG_KEYS_DATA( DLGK_ITEM_FIRST, KEY_HOME ),
+	DLG_KEYS_DATA( DLGK_ITEM_LAST,	KEY_END ),
+	DLG_KEYS_DATA( DLGK_ITEM_LAST,	KEY_LL ),
+	DLG_KEYS_DATA( DLGK_ITEM_NEXT,	'+' ),
+	DLG_KEYS_DATA( DLGK_ITEM_NEXT,	KEY_DOWN ),
+	DLG_KEYS_DATA( DLGK_ITEM_NEXT,  CHR_NEXT ),
+	DLG_KEYS_DATA( DLGK_ITEM_PREV,	'-' ),
+	DLG_KEYS_DATA( DLGK_ITEM_PREV,	KEY_UP ),
+	DLG_KEYS_DATA( DLGK_ITEM_PREV,  CHR_PREVIOUS ),
+	DLG_KEYS_DATA( DLGK_PAGE_NEXT,	KEY_NPAGE ),
+	DLG_KEYS_DATA( DLGK_PAGE_NEXT,	DLGK_MOUSE(KEY_NPAGE) ),
+	DLG_KEYS_DATA( DLGK_PAGE_PREV,	KEY_PPAGE ),
+	DLG_KEYS_DATA( DLGK_PAGE_PREV,	DLGK_MOUSE(KEY_PPAGE) ),
+	TOGGLEKEY_BINDINGS,
+	END_KEYS_BINDING
+    };
+    /* *INDENT-ON* */
+
+#ifdef KEY_RESIZE
+    int old_height = height;
+    int old_width = width;
+#endif
+    ALL_DATA all;
+    int i, j, key2, found, x, y, cur_y, box_x, box_y;
+    int key, fkey;
+    int button = dialog_state.visit_items ? -1 : dlg_default_button();
+    int choice = dlg_default_listitem(items);
+    int scrollamt = 0;
+    int max_choice;
+    int use_height;
+    int use_width, name_width, text_width, tree_width;
+    int result = DLG_EXIT_UNKNOWN;
+    int num_states;
+    WINDOW *dialog, *list;
+    char *prompt = dlg_strclone(cprompt);
+    const char **buttons = dlg_ok_labels();
+    const char *widget_name;
+
+    /* we need at least two states */
+    if (states == 0 || strlen(states) < 2)
+	states = " *";
+    num_states = (int) strlen(states);
+
+    dialog_state.plain_buttons = TRUE;
+
+    memset(&all, 0, sizeof(all));
+    all.items = items;
+    all.item_no = item_no;
+    all.states = states;
+    all.depths = depths;
+
+    dlg_does_output();
+    dlg_tab_correct_str(prompt);
+
+    /*
+     * If this is a radiobutton list, ensure that no more than one item is
+     * selected initially.  Allow none to be selected, since some users may
+     * wish to provide this flavor.
+     */
+    if (flag == FLAG_RADIO) {
+	bool first = TRUE;
+
+	for (i = 0; i < item_no; i++) {
+	    if (items[i].state) {
+		if (first) {
+		    first = FALSE;
+		} else {
+		    items[i].state = 0;
+		}
+	    }
+	}
+    } else {
+	all.is_check = TRUE;
+    }
+    widget_name = "treeview";
+#ifdef KEY_RESIZE
+  retry:
+#endif
+
+    use_height = list_height;
+    use_width = dlg_calc_list_width(item_no, items) + 10;
+    use_width = MAX(26, use_width);
+    if (use_height == 0) {
+	/* calculate height without items (4) */
+	dlg_auto_size(title, prompt, &height, &width, MIN_HIGH, use_width);
+	dlg_calc_listh(&height, &use_height, item_no);
+    } else {
+	dlg_auto_size(title, prompt, &height, &width, MIN_HIGH + use_height, use_width);
+    }
+    dlg_button_layout(buttons, &width);
+    dlg_print_size(height, width);
+    dlg_ctl_size(height, width);
+
+    x = dlg_box_x_ordinate(width);
+    y = dlg_box_y_ordinate(height);
+
+    dialog = dlg_new_window(height, width, y, x);
+    dlg_register_window(dialog, widget_name, binding);
+    dlg_register_buttons(dialog, widget_name, buttons);
+
+    dlg_mouse_setbase(x, y);
+
+    dlg_draw_box2(dialog, 0, 0, height, width, dialog_attr, border_attr, border2_attr);
+    dlg_draw_bottom_box2(dialog, border_attr, border2_attr, dialog_attr);
+    dlg_draw_title(dialog, title);
+
+    dlg_attrset(dialog, dialog_attr);
+    dlg_print_autowrap(dialog, prompt, height, width);
+
+    all.use_width = width - 4;
+    cur_y = getcury(dialog);
+    box_y = cur_y + 1;
+    box_x = (width - all.use_width) / 2 - 1;
+
+    /*
+     * After displaying the prompt, we know how much space we really have.
+     * Limit the list to avoid overwriting the ok-button.
+     */
+    if (use_height + MIN_HIGH > height - cur_y)
+        use_height = height - MIN_HIGH - cur_y;
+    if (use_height <= 0)
+	use_height = 1;
+
+    max_choice = MIN(use_height, item_no);
+
+    /* create new window for the list */
+    list = dlg_sub_window(dialog, use_height, all.use_width,
+			  y + box_y + 1, x + box_x + 1);
+
+    /* draw a box around the list items */
+    dlg_draw_box(dialog, box_y, box_x,
+		 use_height + 2 * MARGIN,
+		 all.use_width + 2 * MARGIN,
+		 menubox_border_attr, menubox_border2_attr);
+
+    text_width = 0;
+    name_width = 0;
+    tree_width = 0;
+    /* Find length of longest item to center treeview */
+    for (i = 0; i < item_no; i++) {
+	tree_width = MAX(tree_width, INDENT * depths[i]);
+	text_width = MAX(text_width, dlg_count_columns(items[i].text));
+	name_width = MAX(name_width, dlg_count_columns(items[i].name));
+    }
+    if (dialog_vars.no_tags && !dialog_vars.no_items) {
+	tree_width += text_width;
+    } else if (dialog_vars.no_items) {
+	tree_width += name_width;
+    } else {
+	tree_width += (text_width + name_width);
+    }
+
+    use_width = (all.use_width - 4);
+    tree_width = MIN(tree_width, all.use_width);
+
+    all.check_x = (use_width - tree_width) / 2;
+    all.item_x = ((dialog_vars.no_tags
+		   ? 0
+		   : (dialog_vars.no_items
+		      ? 0
+		      : (2 + name_width)))
+		  + all.check_x + 4);
+
+    /* ensure we are scrolled to show the current choice */
+    if (choice >= (max_choice + scrollamt)) {
+	scrollamt = choice - max_choice + 1;
+	choice = max_choice - 1;
+    }
+
+    /* register the new window, along with its borders */
+    dlg_mouse_mkbigregion(box_y + 1, box_x,
+			  use_height, all.use_width + 2,
+			  KEY_MAX, 1, 1, 1 /* by lines */ );
+
+    all.dialog = dialog;
+    all.box_x = box_x;
+    all.box_y = box_y;
+    all.use_height = use_height;
+    all.list = list;
+    print_list(&all, choice, scrollamt, max_choice);
+
+    dlg_draw_buttons(dialog, height - 2, 0, buttons, button, FALSE, width);
+
+    dlg_trace_win(dialog);
+
+    while (result == DLG_EXIT_UNKNOWN) {
+	int was_mouse;
+
+	if (button < 0)		/* --visit-items */
+	    wmove(dialog, box_y + choice + 1, box_x + all.check_x + 2);
+
+	key = dlg_mouse_wgetch(dialog, &fkey);
+	if (dlg_result_key(key, fkey, &result)) {
+	    if (!dlg_button_key(result, &button, &key, &fkey))
+		break;
+	}
+
+	was_mouse = (fkey && is_DLGK_MOUSE(key));
+	if (was_mouse)
+	    key -= M_EVENT;
+
+	if (was_mouse && (key >= KEY_MAX)) {
+	    i = (key - KEY_MAX);
+	    if (i < max_choice) {
+		choice = (key - KEY_MAX);
+		print_list(&all, choice, scrollamt, max_choice);
+
+		key = DLGK_TOGGLE;	/* force the selected item to toggle */
+	    } else {
+		beep();
+		continue;
+	    }
+	    fkey = FALSE;
+	} else if (was_mouse && key >= KEY_MIN) {
+	    key = dlg_lookup_key(dialog, key, &fkey);
+	}
+
+	/*
+	 * A space toggles the item status.
+	 */
+	if (key == DLGK_TOGGLE) {
+	    int current = scrollamt + choice;
+	    int next = items[current].state + 1;
+
+	    if (next >= num_states)
+		next = 0;
+
+	    if (flag == FLAG_CHECK) {	/* checklist? */
+		items[current].state = next;
+	    } else {
+		for (i = 0; i < item_no; i++) {
+		    if (i != current) {
+			items[i].state = 0;
+		    }
+		}
+		if (items[current].state) {
+		    items[current].state = next ? next : 1;
+		} else {
+		    items[current].state = 1;
+		}
+	    }
+	    print_list(&all, choice, scrollamt, max_choice);
+	    continue;		/* wait for another key press */
+	}
+
+	/*
+	 * Check if key pressed matches first character of any item tag in
+	 * list.  If there is more than one match, we will cycle through
+	 * each one as the same key is pressed repeatedly.
+	 */
+	found = FALSE;
+	if (!fkey) {
+	    if (button < 0 || !dialog_state.visit_items) {
+		for (j = scrollamt + choice + 1; j < item_no; j++) {
+		    if (check_hotkey(items, j)) {
+			found = TRUE;
+			i = j - scrollamt;
+			break;
+		    }
+		}
+		if (!found) {
+		    for (j = 0; j <= scrollamt + choice; j++) {
+			if (check_hotkey(items, j)) {
+			    found = TRUE;
+			    i = j - scrollamt;
+			    break;
+			}
+		    }
+		}
+		if (found)
+		    dlg_flush_getc();
+	    } else if ((j = dlg_char_to_button(key, buttons)) >= 0) {
+		button = j;
+		ungetch('\n');
+		continue;
+	    }
+	}
+
+	/*
+	 * A single digit (1-9) positions the selection to that line in the
+	 * current screen.
+	 */
+	if (!found
+	    && (key <= '9')
+	    && (key > '0')
+	    && (key - '1' < max_choice)) {
+	    found = TRUE;
+	    i = key - '1';
+	}
+
+	if (!found) {
+	    if (fkey) {
+		found = TRUE;
+		switch (key) {
+		case DLGK_ITEM_FIRST:
+		    i = -scrollamt;
+		    break;
+		case DLGK_ITEM_LAST:
+		    i = item_no - 1 - scrollamt;
+		    break;
+		case DLGK_PAGE_PREV:
+		    if (choice)
+			i = 0;
+		    else if (scrollamt != 0)
+			i = -MIN(scrollamt, max_choice);
+		    else
+			continue;
+		    break;
+		case DLGK_PAGE_NEXT:
+		    i = MIN(choice + max_choice, item_no - scrollamt - 1);
+		    break;
+		case DLGK_ITEM_PREV:
+		    i = choice - 1;
+		    if (choice == 0 && scrollamt == 0)
+			continue;
+		    break;
+		case DLGK_ITEM_NEXT:
+		    i = choice + 1;
+		    if (scrollamt + choice >= item_no - 1)
+			continue;
+		    break;
+		default:
+		    found = FALSE;
+		    break;
+		}
+	    }
+	}
+
+	if (found) {
+	    if (i != choice) {
+		if (i < 0 || i >= max_choice) {
+		    if (i < 0) {
+			scrollamt += i;
+			choice = 0;
+		    } else {
+			choice = max_choice - 1;
+			scrollamt += (i - max_choice + 1);
+		    }
+		    print_list(&all, choice, scrollamt, max_choice);
+		} else {
+		    choice = i;
+		    print_list(&all, choice, scrollamt, max_choice);
+		}
+	    }
+	    continue;		/* wait for another key press */
+	}
+
+	if (fkey) {
+	    switch (key) {
+	    case DLGK_ENTER:
+		result = dlg_enter_buttoncode(button);
+		break;
+	    case DLGK_LEAVE:
+		result = dlg_ok_buttoncode(button);
+		break;
+	    case DLGK_FIELD_PREV:
+		button = dlg_prev_button(buttons, button);
+		dlg_draw_buttons(dialog, height - 2, 0, buttons, button,
+				 FALSE, width);
+		break;
+	    case DLGK_FIELD_NEXT:
+		button = dlg_next_button(buttons, button);
+		dlg_draw_buttons(dialog, height - 2, 0, buttons, button,
+				 FALSE, width);
+		break;
+#ifdef KEY_RESIZE
+	    case KEY_RESIZE:
+		dlg_will_resize(dialog);
+		/* reset data */
+		height = old_height;
+		width = old_width;
+		/* repaint */
+		_dlg_resize_cleanup(dialog);
+		goto retry;
+#endif
+	    default:
+		if (was_mouse) {
+		    if ((key2 = dlg_ok_buttoncode(key)) >= 0) {
+			result = key2;
+			break;
+		    }
+		    beep();
+		}
+	    }
+	} else if (key > 0) {
+	    beep();
+	}
+    }
+
+    dlg_del_window(dialog);
+    dlg_mouse_free_regions();
+    free(prompt);
+    *current_item = (scrollamt + choice);
+    return result;
+}
+
+/*
+ * Display a set of items as a tree.
+ */
+int
+dialog_treeview(const char *title,
+		const char *cprompt,
+		int height,
+		int width,
+		int list_height,
+		int item_no,
+		char **items,
+		int flag)
+{
+    int result;
+    int i, j;
+    DIALOG_LISTITEM *listitems;
+    int *depths;
+    bool show_status = FALSE;
+    int current = 0;
+    char *help_result;
+
+    DLG_TRACE(("# treeview args:\n"));
+    DLG_TRACE2S("title", title);
+    DLG_TRACE2S("message", cprompt);
+    DLG_TRACE2N("height", height);
+    DLG_TRACE2N("width", width);
+    DLG_TRACE2N("lheight", list_height);
+    DLG_TRACE2N("llength", item_no);
+    /* FIXME dump the items[][] too */
+    DLG_TRACE2N("flag", flag);
+
+    listitems = dlg_calloc(DIALOG_LISTITEM, (size_t) item_no + 1);
+    assert_ptr(listitems, "dialog_treeview");
+
+    depths = dlg_calloc(int, (size_t) item_no + 1);
+    assert_ptr(depths, "dialog_treeview");
+
+    for (i = j = 0; i < item_no; ++i) {
+	listitems[i].name = items[j++];
+	listitems[i].text = (dialog_vars.no_items
+			     ? dlg_strempty()
+			     : items[j++]);
+	listitems[i].state = !dlg_strcmp(items[j++], "on");
+	depths[i] = atoi(items[j++]);
+	listitems[i].help = ((dialog_vars.item_help)
+			     ? items[j++]
+			     : dlg_strempty());
+    }
+    dlg_align_columns(&listitems[0].text, (int) sizeof(DIALOG_LISTITEM), item_no);
+
+    result = dlg_treeview(title,
+			  cprompt,
+			  height,
+			  width,
+			  list_height,
+			  item_no,
+			  listitems,
+			  NULL,
+			  depths,
+			  flag,
+			  &current);
+
+    switch (result) {
+    case DLG_EXIT_OK:		/* FALLTHRU */
+    case DLG_EXIT_EXTRA:
+	show_status = TRUE;
+	break;
+    case DLG_EXIT_HELP:
+	dlg_add_help_listitem(&result, &help_result, &listitems[current]);
+	if ((show_status = dialog_vars.help_status)) {
+	    if (dialog_vars.separate_output) {
+		dlg_add_string(help_result);
+		dlg_add_separator();
+	    } else {
+		dlg_add_quoted(help_result);
+	    }
+	} else {
+	    dlg_add_string(help_result);
+	}
+	break;
+    }
+
+    if (show_status) {
+	for (i = 0; i < item_no; i++) {
+	    if (listitems[i].state) {
+		if (dlg_need_separator())
+		    dlg_add_separator();
+		if (dialog_vars.separate_output) {
+		    dlg_add_string(listitems[i].name);
+		} else {
+		    if (flag == FLAG_CHECK)
+			dlg_add_quoted(listitems[i].name);
+		    else
+			dlg_add_string(listitems[i].name);
+		}
+	    }
+	}
+	AddLastKey();
+    }
+
+    dlg_free_columns(&listitems[0].text, (int) sizeof(DIALOG_LISTITEM), item_no);
+    free(depths);
+    free(listitems);
+    return result;
+}
Index: build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/util.c
===================================================================
--- build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/util.c	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/util.c	(revision 323)
@@ -0,0 +1,3031 @@
+/*
+ *  $Id: util.c,v 1.303 2021/06/15 00:10:11 tom Exp $
+ *
+ *  util.c -- miscellaneous utilities for dialog
+ *
+ *  Copyright 2000-2020,2021	Thomas E. Dickey
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Lesser General Public License, version 2.1
+ *  as published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to
+ *	Free Software Foundation, Inc.
+ *	51 Franklin St., Fifth Floor
+ *	Boston, MA 02110, USA.
+ *
+ *  An earlier version of this program lists as authors
+ *	Savio Lam (lam836@cs.cuhk.hk)
+ */
+
+#include <dialog.h>
+#include <dlg_keys.h>
+#include <dlg_internals.h>
+
+#include <sys/time.h>
+
+#ifdef HAVE_SETLOCALE
+#include <locale.h>
+#endif
+
+#ifdef NEED_WCHAR_H
+#include <wchar.h>
+#endif
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#if defined(NCURSES_VERSION)
+#define CAN_KEEP_TITE 1
+#elif defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 800000000)
+#define CAN_KEEP_TITE 1
+#else
+#define CAN_KEEP_TITE 0
+#endif
+
+#if CAN_KEEP_TITE
+#if defined(NCURSES_VERSION) && defined(HAVE_NCURSESW_TERM_H)
+#include <ncursesw/term.h>
+#elif defined(NCURSES_VERSION) && defined(HAVE_NCURSES_TERM_H)
+#include <ncurses/term.h>
+#else
+#include <term.h>
+#endif
+#endif
+
+#if defined(HAVE_WCHGAT)
+#  if defined(NCURSES_VERSION_PATCH)
+#    if NCURSES_VERSION_PATCH >= 20060715
+#      define USE_WCHGAT 1
+#    else
+#      define USE_WCHGAT 0
+#    endif
+#  else
+#    define USE_WCHGAT 1
+#  endif
+#else
+#  define USE_WCHGAT 0
+#endif
+
+/* globals */
+DIALOG_STATE dialog_state;
+DIALOG_VARS dialog_vars;
+
+#if !(defined(HAVE_WGETPARENT) && defined(HAVE_WINDOW__PARENT))
+#define NEED_WGETPARENT 1
+#else
+#undef NEED_WGETPARENT
+#endif
+
+#define concat(a,b) a##b
+
+#ifdef HAVE_RC_FILE
+#define RC_DATA(name,comment) , #name "_color", comment " color"
+#else
+#define RC_DATA(name,comment)	/*nothing */
+#endif
+
+#ifdef HAVE_COLOR
+#include <dlg_colors.h>
+#ifdef HAVE_RC_FILE2
+#define COLOR_DATA(upr) , \
+	concat(DLGC_FG_,upr), \
+	concat(DLGC_BG_,upr), \
+	concat(DLGC_HL_,upr), \
+	concat(DLGC_UL_,upr), \
+	concat(DLGC_RV_,upr)
+#else /* HAVE_RC_FILE2 */
+#define COLOR_DATA(upr) , \
+	concat(DLGC_FG_,upr), \
+	concat(DLGC_BG_,upr), \
+	concat(DLGC_HL_,upr)
+#endif /* HAVE_RC_FILE2 */
+#else /* HAVE_COLOR */
+#define COLOR_DATA(upr)		/*nothing */
+#endif /* HAVE_COLOR */
+
+#define UseShadow(dw) ((dw) != 0 && (dw)->normal != 0 && (dw)->shadow != 0)
+
+/*
+ * Table of color and attribute values, default is for mono display.
+ * The order matches the DIALOG_ATR() values.
+ */
+#define DATA(atr,upr,lwr,cmt) { atr COLOR_DATA(upr) RC_DATA(lwr,cmt) }
+/* *INDENT-OFF* */
+DIALOG_COLORS dlg_color_table[] =
+{
+    DATA(A_NORMAL,	SCREEN,			screen, "Screen"),
+    DATA(A_NORMAL,	SHADOW,			shadow, "Shadow"),
+    DATA(A_REVERSE,	DIALOG,			dialog, "Dialog box"),
+    DATA(A_REVERSE,	TITLE,			title, "Dialog box title"),
+    DATA(A_REVERSE,	BORDER,			border, "Dialog box border"),
+    DATA(A_BOLD,	BUTTON_ACTIVE,		button_active, "Active button"),
+    DATA(A_DIM,		BUTTON_INACTIVE,	button_inactive, "Inactive button"),
+    DATA(A_UNDERLINE,	BUTTON_KEY_ACTIVE,	button_key_active, "Active button key"),
+    DATA(A_UNDERLINE,	BUTTON_KEY_INACTIVE,	button_key_inactive, "Inactive button key"),
+    DATA(A_NORMAL,	BUTTON_LABEL_ACTIVE,	button_label_active, "Active button label"),
+    DATA(A_NORMAL,	BUTTON_LABEL_INACTIVE,	button_label_inactive, "Inactive button label"),
+    DATA(A_REVERSE,	INPUTBOX,		inputbox, "Input box"),
+    DATA(A_REVERSE,	INPUTBOX_BORDER,	inputbox_border, "Input box border"),
+    DATA(A_REVERSE,	SEARCHBOX,		searchbox, "Search box"),
+    DATA(A_REVERSE,	SEARCHBOX_TITLE,	searchbox_title, "Search box title"),
+    DATA(A_REVERSE,	SEARCHBOX_BORDER,	searchbox_border, "Search box border"),
+    DATA(A_REVERSE,	POSITION_INDICATOR,	position_indicator, "File position indicator"),
+    DATA(A_REVERSE,	MENUBOX,		menubox, "Menu box"),
+    DATA(A_REVERSE,	MENUBOX_BORDER,		menubox_border, "Menu box border"),
+    DATA(A_REVERSE,	ITEM,			item, "Item"),
+    DATA(A_NORMAL,	ITEM_SELECTED,		item_selected, "Selected item"),
+    DATA(A_REVERSE,	TAG,			tag, "Tag"),
+    DATA(A_REVERSE,	TAG_SELECTED,		tag_selected, "Selected tag"),
+    DATA(A_NORMAL,	TAG_KEY,		tag_key, "Tag key"),
+    DATA(A_BOLD,	TAG_KEY_SELECTED,	tag_key_selected, "Selected tag key"),
+    DATA(A_REVERSE,	CHECK,			check, "Check box"),
+    DATA(A_REVERSE,	CHECK_SELECTED,		check_selected, "Selected check box"),
+    DATA(A_REVERSE,	UARROW,			uarrow, "Up arrow"),
+    DATA(A_REVERSE,	DARROW,			darrow, "Down arrow"),
+    DATA(A_NORMAL,	ITEMHELP,		itemhelp, "Item help-text"),
+    DATA(A_BOLD,	FORM_ACTIVE_TEXT,	form_active_text, "Active form text"),
+    DATA(A_REVERSE,	FORM_TEXT,		form_text, "Form text"),
+    DATA(A_NORMAL,	FORM_ITEM_READONLY,	form_item_readonly, "Readonly form item"),
+    DATA(A_REVERSE,	GAUGE,			gauge, "Dialog box gauge"),
+    DATA(A_REVERSE,	BORDER2,		border2, "Dialog box border2"),
+    DATA(A_REVERSE,	INPUTBOX_BORDER2,	inputbox_border2, "Input box border2"),
+    DATA(A_REVERSE,	SEARCHBOX_BORDER2,	searchbox_border2, "Search box border2"),
+    DATA(A_REVERSE,	MENUBOX_BORDER2,	menubox_border2, "Menu box border2")
+};
+#undef DATA
+/* *INDENT-ON* */
+
+/*
+ * Maintain a list of subwindows so that we can delete them to cleanup.
+ * More important, this provides a fallback when wgetparent() is not available.
+ */
+static void
+add_subwindow(WINDOW *parent, WINDOW *child)
+{
+    DIALOG_WINDOWS *p = dlg_calloc(DIALOG_WINDOWS, 1);
+
+    if (p != 0) {
+	p->normal = parent;
+	p->shadow = child;
+	p->getc_timeout = WTIMEOUT_OFF;
+	p->next = dialog_state.all_subwindows;
+	dialog_state.all_subwindows = p;
+    }
+}
+
+static void
+del_subwindows(WINDOW *parent)
+{
+    DIALOG_WINDOWS *p = dialog_state.all_subwindows;
+    DIALOG_WINDOWS *q = 0;
+    DIALOG_WINDOWS *r;
+
+    while (p != 0) {
+	if (p->normal == parent) {
+	    delwin(p->shadow);
+	    r = p->next;
+	    if (q == 0) {
+		dialog_state.all_subwindows = r;
+	    } else {
+		q->next = r;
+	    }
+	    free(p);
+	    p = r;
+	} else {
+	    q = p;
+	    p = p->next;
+	}
+    }
+}
+
+/*
+ * Display background title if it exists ...
+ */
+void
+dlg_put_backtitle(void)
+{
+
+    if (dialog_vars.backtitle != NULL) {
+	chtype attr = A_NORMAL;
+	int backwidth = dlg_count_columns(dialog_vars.backtitle);
+	int i;
+
+	dlg_attrset(stdscr, screen_attr);
+	(void) wmove(stdscr, 0, 1);
+	dlg_print_text(stdscr, dialog_vars.backtitle, COLS - 2, &attr);
+	for (i = 0; i < COLS - backwidth; i++)
+	    (void) waddch(stdscr, ' ');
+	(void) wmove(stdscr, 1, 1);
+	for (i = 0; i < COLS - 2; i++)
+	    (void) waddch(stdscr, dlg_boxchar(ACS_HLINE));
+    }
+
+    (void) wnoutrefresh(stdscr);
+}
+
+/*
+ * Set window to attribute 'attr'.  There are more efficient ways to do this,
+ * but will not work on older/buggy ncurses versions.
+ */
+void
+dlg_attr_clear(WINDOW *win, int height, int width, chtype attr)
+{
+    int i, j;
+
+    dlg_attrset(win, attr);
+    for (i = 0; i < height; i++) {
+	(void) wmove(win, i, 0);
+	for (j = 0; j < width; j++)
+	    (void) waddch(win, ' ');
+    }
+    (void) touchwin(win);
+}
+
+void
+dlg_clear(void)
+{
+    dlg_attr_clear(stdscr, LINES, COLS, screen_attr);
+}
+
+#ifdef KEY_RESIZE
+void
+_dlg_resize_cleanup(WINDOW *w)
+{
+    dlg_clear();
+    dlg_put_backtitle();
+    dlg_del_window(w);
+    dlg_mouse_free_regions();
+}
+#endif /* KEY_RESIZE */
+
+#define isprivate(s) ((s) != 0 && strstr(s, "\033[?") != 0)
+
+#define TTY_DEVICE "/dev/tty"
+
+/*
+ * If $DIALOG_TTY exists, allow the program to try to open the terminal
+ * directly when stdout is redirected.  By default we require the "--stdout"
+ * option to be given, but some scripts were written making use of the
+ * behavior of dialog which tried opening the terminal anyway. 
+ */
+#define dialog_tty() (dlg_getenv_num("DIALOG_TTY", (int *)0) > 0)
+
+/*
+ * Open the terminal directly.  If one of stdin, stdout or stderr really points
+ * to a tty, use it.  Otherwise give up and open /dev/tty.
+ */
+static int
+open_terminal(char **result, int mode)
+{
+    const char *device = TTY_DEVICE;
+    if (!isatty(fileno(stderr))
+	|| (device = ttyname(fileno(stderr))) == 0) {
+	if (!isatty(fileno(stdout))
+	    || (device = ttyname(fileno(stdout))) == 0) {
+	    if (!isatty(fileno(stdin))
+		|| (device = ttyname(fileno(stdin))) == 0) {
+		device = TTY_DEVICE;
+	    }
+	}
+    }
+    *result = dlg_strclone(device);
+    return open(device, mode);
+}
+
+#if CAN_KEEP_TITE
+static int
+my_putc(int ch)
+{
+    char buffer[2];
+    int fd = fileno(dialog_state.screen_output);
+
+    buffer[0] = (char) ch;
+    return (int) write(fd, buffer, (size_t) 1);
+}
+#endif
+
+/*
+ * Do some initialization for dialog.
+ *
+ * 'input' is the real tty input of dialog.  Usually it is stdin, but if
+ * --input-fd option is used, it may be anything.
+ *
+ * 'output' is where dialog will send its result.  Usually it is stderr, but
+ * if --stdout or --output-fd is used, it may be anything.  We are concerned
+ * mainly with the case where it happens to be the same as stdout.
+ */
+void
+init_dialog(FILE *input, FILE *output)
+{
+    int fd1, fd2;
+    char *device = 0;
+
+    setlocale(LC_ALL, "");
+
+    dialog_state.output = output;
+    if (dialog_state.tab_len == 0)
+	dialog_state.tab_len = TAB_LEN;
+    if (dialog_state.aspect_ratio == 0)
+	dialog_state.aspect_ratio = DEFAULT_ASPECT_RATIO;
+#ifdef HAVE_COLOR
+    dialog_state.use_colors = USE_COLORS;	/* use colors by default? */
+    dialog_state.use_shadow = USE_SHADOW;	/* shadow dialog boxes by default? */
+#endif
+
+#ifdef HAVE_RC_FILE
+    if (dlg_parse_rc() == -1)	/* Read the configuration file */
+	dlg_exiterr("init_dialog: dlg_parse_rc");
+#endif
+
+    /*
+     * Some widgets (such as gauge) may read from the standard input.  Pipes
+     * only connect stdout/stdin, so there is not much choice.  But reading a
+     * pipe would get in the way of curses' normal reading stdin for getch.
+     *
+     * As in the --stdout (see below), reopening the terminal does not always
+     * work properly.  dialog provides a --pipe-fd option for this purpose.  We
+     * test that case first (differing fileno's for input/stdin).  If the
+     * fileno's are equal, but we're not reading from a tty, see if we can open
+     * /dev/tty.
+     */
+    dialog_state.pipe_input = stdin;
+    if (fileno(input) != fileno(stdin)) {
+	if ((fd1 = dup(fileno(input))) >= 0
+	    && (fd2 = dup(fileno(stdin))) >= 0) {
+	    (void) dup2(fileno(input), fileno(stdin));
+	    dialog_state.pipe_input = fdopen(fd2, "r");
+	    if (fileno(stdin) != 0)	/* some functions may read fd #0 */
+		(void) dup2(fileno(stdin), 0);
+	} else {
+	    dlg_exiterr("cannot open tty-input");
+	}
+	close(fd1);
+    } else if (!isatty(fileno(stdin))) {
+	if ((fd1 = open_terminal(&device, O_RDONLY)) >= 0) {
+	    if ((fd2 = dup(fileno(stdin))) >= 0) {
+		dialog_state.pipe_input = fdopen(fd2, "r");
+		if (freopen(device, "r", stdin) == 0)
+		    dlg_exiterr("cannot open tty-input");
+		if (fileno(stdin) != 0)		/* some functions may read fd #0 */
+		    (void) dup2(fileno(stdin), 0);
+	    }
+	    close(fd1);
+	}
+	free(device);
+    }
+
+    /*
+     * If stdout is not a tty and dialog is called with the --stdout option, we
+     * have to provide for a way to write to the screen.
+     *
+     * The curses library normally writes its output to stdout, leaving stderr
+     * free for scripting.  Scripts are simpler when stdout is redirected.  The
+     * newterm function is useful; it allows us to specify where the output
+     * goes.  Reopening the terminal is not portable since several
+     * configurations do not allow this to work properly:
+     *
+     * a) some getty implementations (and possibly broken tty drivers, e.g., on
+     *    HPUX 10 and 11) cause stdin to act as if it is still in cooked mode
+     *    even though results from ioctl's state that it is successfully
+     *    altered to raw mode.  Broken is the proper term.
+     *
+     * b) the user may not have permissions on the device, e.g., if one su's
+     *    from the login user to another non-privileged user.
+     */
+    if (!isatty(fileno(stdout))
+	&& (fileno(stdout) == fileno(output) || dialog_tty())) {
+	if ((fd1 = open_terminal(&device, O_WRONLY)) >= 0
+	    && (dialog_state.screen_output = fdopen(fd1, "w")) != 0) {
+	    if (newterm(NULL, dialog_state.screen_output, stdin) == 0) {
+		dlg_exiterr("cannot initialize curses");
+	    }
+	    free(device);
+	} else {
+	    dlg_exiterr("cannot open tty-output");
+	}
+    } else {
+	dialog_state.screen_output = stdout;
+	(void) initscr();
+    }
+    dlg_keep_tite(dialog_state.screen_output);
+#ifdef HAVE_FLUSHINP
+    (void) flushinp();
+#endif
+    (void) keypad(stdscr, TRUE);
+    (void) cbreak();
+    (void) noecho();
+
+    if (!dialog_state.no_mouse) {
+	mouse_open();
+    }
+
+    dialog_state.screen_initialized = TRUE;
+
+#ifdef HAVE_COLOR
+    if (dialog_state.use_colors || dialog_state.use_shadow)
+	dlg_color_setup();	/* Set up colors */
+#endif
+
+    /* Set screen to screen attribute */
+    dlg_clear();
+}
+
+void
+dlg_keep_tite(FILE *output)
+{
+    if (!dialog_vars.keep_tite) {
+#if CAN_KEEP_TITE
+	/*
+	 * Cancel xterm's alternate-screen mode.
+	 */
+	if ((fileno(output) != fileno(stdout)
+	     || isatty(fileno(output)))
+	    && key_mouse != 0	/* xterm and kindred */
+	    && isprivate(enter_ca_mode)
+	    && isprivate(exit_ca_mode)) {
+	    FILE *save = dialog_state.screen_output;
+
+	    /*
+	     * initscr() or newterm() already wrote enter_ca_mode as a side
+	     * effect of initializing the screen.  It would be nice to not even
+	     * do that, but we do not really have access to the correct copy of
+	     * the terminfo description until those functions have been
+	     * invoked.
+	     */
+	    (void) refresh();
+	    dialog_state.screen_output = output;
+	    (void) tputs(exit_ca_mode, 0, my_putc);
+	    (void) tputs(clear_screen, 0, my_putc);
+	    dialog_state.screen_output = save;
+
+	    /*
+	     * Prevent ncurses from switching "back" to the normal screen when
+	     * exiting from dialog.  That would move the cursor to the original
+	     * location saved in xterm.  Normally curses sets the cursor
+	     * position to the first line after the display, but the alternate
+	     * screen switching is done after that point.
+	     *
+	     * Cancelling the strings altogether also works around the buggy
+	     * implementation of alternate-screen in rxvt, etc., which clear
+	     * more of the display than they should.
+	     */
+	    enter_ca_mode = 0;
+	    exit_ca_mode = 0;
+	}
+#else
+	/*
+	 * For other implementations, there are no useful answers:
+	 * + SVr4 curses "could" support a similar approach, but the clue about
+	 *   xterm is absent from its terminal database.
+	 * + PDCurses does not provide terminfo.
+	 */
+	(void) output;
+#endif
+    }
+}
+
+#ifdef HAVE_COLOR
+static int defined_colors = 1;	/* pair-0 is reserved */
+/*
+ * Setup for color display
+ */
+void
+dlg_color_setup(void)
+{
+    if (has_colors()) {		/* Terminal supports color? */
+	unsigned i;
+
+	(void) start_color();
+
+#if defined(HAVE_USE_DEFAULT_COLORS)
+	use_default_colors();
+#endif
+
+#if defined(__NetBSD__) && defined(_CURSES_)
+#define C_ATTR(x,y) (((x) != 0 ? A_BOLD :  0) | COLOR_PAIR((y)))
+	/* work around bug in NetBSD curses */
+	for (i = 0; i < sizeof(dlg_color_table) /
+	     sizeof(dlg_color_table[0]); i++) {
+
+	    /* Initialize color pairs */
+	    (void) init_pair(i + 1,
+			     dlg_color_table[i].fg,
+			     dlg_color_table[i].bg);
+
+	    /* Setup color attributes */
+	    dlg_color_table[i].atr = C_ATTR(dlg_color_table[i].hilite, i + 1);
+	}
+	defined_colors = i + 1;
+#else
+	for (i = 0; i < sizeof(dlg_color_table) /
+	     sizeof(dlg_color_table[0]); i++) {
+
+	    /* Initialize color pairs */
+	    chtype atr = dlg_color_pair(dlg_color_table[i].fg,
+					dlg_color_table[i].bg);
+
+	    atr |= (dlg_color_table[i].hilite ? A_BOLD : 0);
+#ifdef HAVE_RC_FILE2
+	    atr |= (dlg_color_table[i].ul ? A_UNDERLINE : 0);
+	    atr |= (dlg_color_table[i].rv ? A_REVERSE : 0);
+#endif /* HAVE_RC_FILE2 */
+
+	    dlg_color_table[i].atr = atr;
+	}
+#endif
+    } else {
+	dialog_state.use_colors = FALSE;
+	dialog_state.use_shadow = FALSE;
+    }
+}
+
+int
+dlg_color_count(void)
+{
+    return TableSize(dlg_color_table);
+}
+
+/*
+ * Wrapper for getattrs(), or the more cumbersome X/Open wattr_get().
+ */
+chtype
+dlg_get_attrs(WINDOW *win)
+{
+    chtype result;
+#ifdef HAVE_GETATTRS
+    result = (chtype) getattrs(win);
+#else
+    attr_t my_result;
+    short my_pair;
+    wattr_get(win, &my_result, &my_pair, NULL);
+    result = my_result;
+#endif
+    return result;
+}
+
+/*
+ * Reuse color pairs (they are limited), returning a COLOR_PAIR() value if we
+ * have (or can) define a pair with the given color as foreground on the
+ * window's defined background.
+ */
+chtype
+dlg_color_pair(int foreground, int background)
+{
+    chtype result = 0;
+    int pair;
+    short fg, bg;
+    bool found = FALSE;
+
+    for (pair = 1; pair < defined_colors; ++pair) {
+	if (pair_content((short) pair, &fg, &bg) != ERR
+	    && fg == foreground
+	    && bg == background) {
+	    result = (chtype) COLOR_PAIR(pair);
+	    found = TRUE;
+	    break;
+	}
+    }
+    if (!found && (defined_colors + 1) < COLOR_PAIRS) {
+	pair = defined_colors++;
+	(void) init_pair((short) pair, (short) foreground, (short) background);
+	result = (chtype) COLOR_PAIR(pair);
+    }
+    return result;
+}
+
+/*
+ * Reuse color pairs (they are limited), returning a COLOR_PAIR() value if we
+ * have (or can) define a pair with the given color as foreground on the
+ * window's defined background.
+ */
+static chtype
+define_color(WINDOW *win, int foreground)
+{
+    short fg, bg, background;
+    if (dialog_state.text_only) {
+	background = COLOR_BLACK;
+    } else {
+	chtype attrs = dlg_get_attrs(win);
+	int pair;
+
+	if ((pair = PAIR_NUMBER(attrs)) != 0
+	    && pair_content((short) pair, &fg, &bg) != ERR) {
+	    background = bg;
+	} else {
+	    background = COLOR_BLACK;
+	}
+    }
+    return dlg_color_pair(foreground, background);
+}
+#endif
+
+/*
+ * End using dialog functions.
+ */
+void
+end_dialog(void)
+{
+    if (dialog_state.screen_initialized) {
+	dialog_state.screen_initialized = FALSE;
+	if (dialog_vars.erase_on_exit) {
+	    /*
+	     * Clear the screen to the native background color, and leave the
+	     * terminal cursor at the lower-left corner of the screen.
+	     */
+	    werase(stdscr);
+	    wrefresh(stdscr);
+	}
+	mouse_close();
+	(void) endwin();
+	(void) fflush(stdout);
+    }
+}
+
+#define ESCAPE_LEN 3
+#define isOurEscape(p) (((p)[0] == '\\') && ((p)[1] == 'Z') && ((p)[2] != 0))
+
+int
+dlg_count_real_columns(const char *text)
+{
+    int result = 0;
+    if (*text) {
+	result = dlg_count_columns(text);
+	if (result && dialog_vars.colors) {
+	    int hidden = 0;
+	    while (*text) {
+		if (isOurEscape(text)) {
+		    hidden += ESCAPE_LEN;
+		    text += ESCAPE_LEN;
+		} else {
+		    ++text;
+		}
+	    }
+	    result -= hidden;
+	}
+    }
+    return result;
+}
+
+static int
+centered(int width, const char *string)
+{
+    int need = dlg_count_real_columns(string);
+    int left;
+
+    left = (width - need) / 2 - 1;
+    if (left < 0)
+	left = 0;
+    return left;
+}
+
+#ifdef USE_WIDE_CURSES
+static bool
+is_combining(const char *txt, int *combined)
+{
+    bool result = FALSE;
+
+    if (*combined == 0) {
+	if (UCH(*txt) >= 128) {
+	    wchar_t wch;
+	    mbstate_t state;
+	    size_t given = strlen(txt);
+	    size_t len;
+
+	    memset(&state, 0, sizeof(state));
+	    len = mbrtowc(&wch, txt, given, &state);
+	    if ((int) len > 0 && wcwidth(wch) == 0) {
+		*combined = (int) len - 1;
+		result = TRUE;
+	    }
+	}
+    } else {
+	result = TRUE;
+	*combined -= 1;
+    }
+    return result;
+}
+#endif
+
+/*
+ * Print the name (tag) or text from a DIALOG_LISTITEM, highlighting the
+ * first character if selected.
+ */
+void
+dlg_print_listitem(WINDOW *win,
+		   const char *text,
+		   int climit,
+		   bool first,
+		   int selected)
+{
+    chtype attr = A_NORMAL;
+    int limit;
+    chtype attrs[4];
+
+    if (text == 0)
+	text = "";
+
+    if (first && !dialog_vars.no_hot_list) {
+	const int *indx = dlg_index_wchars(text);
+	attrs[3] = tag_key_selected_attr;
+	attrs[2] = tag_key_attr;
+	attrs[1] = tag_selected_attr;
+	attrs[0] = tag_attr;
+
+	dlg_attrset(win, selected ? attrs[3] : attrs[2]);
+	if (*text != '\0') {
+	    (void) waddnstr(win, text, indx[1]);
+
+	    if ((int) strlen(text) > indx[1]) {
+		limit = dlg_limit_columns(text, climit, 1);
+		if (limit > 1) {
+		    dlg_attrset(win, selected ? attrs[1] : attrs[0]);
+		    (void) waddnstr(win,
+				    text + indx[1],
+				    indx[limit] - indx[1]);
+		}
+	    }
+	}
+    } else {
+	const int *cols;
+
+	attrs[1] = item_selected_attr;
+	attrs[0] = item_attr;
+
+	cols = dlg_index_columns(text);
+	limit = dlg_limit_columns(text, climit, 0);
+
+	if (limit > 0) {
+	    dlg_attrset(win, selected ? attrs[1] : attrs[0]);
+	    dlg_print_text(win, text, cols[limit], &attr);
+	}
+    }
+}
+
+/*
+ * Print up to 'cols' columns from 'text', optionally rendering our escape
+ * sequence for attributes and color.
+ */
+void
+dlg_print_text(WINDOW *win, const char *txt, int cols, chtype *attr)
+{
+    int y_origin, x_origin;
+    int y_before, x_before = 0;
+    int y_after, x_after;
+    int tabbed = 0;
+    bool ended = FALSE;
+#ifdef USE_WIDE_CURSES
+    int combined = 0;
+#endif
+
+    if (dialog_state.text_only) {
+	y_origin = y_after = 0;
+	x_origin = x_after = 0;
+    } else {
+	y_after = 0;
+	x_after = 0;
+	getyx(win, y_origin, x_origin);
+    }
+    while (cols > 0 && (*txt != '\0')) {
+	bool thisTab;
+	chtype useattr;
+
+	if (dialog_vars.colors) {
+	    while (isOurEscape(txt)) {
+		int code;
+
+		txt += 2;
+		switch (code = CharOf(*txt)) {
+#ifdef HAVE_COLOR
+		case '0':
+		case '1':
+		case '2':
+		case '3':
+		case '4':
+		case '5':
+		case '6':
+		case '7':
+		    *attr &= ~A_COLOR;
+		    *attr |= define_color(win, code - '0');
+		    break;
+#endif
+		case 'B':
+		    *attr &= ~A_BOLD;
+		    break;
+		case 'b':
+		    *attr |= A_BOLD;
+		    break;
+		case 'R':
+		    *attr &= ~A_REVERSE;
+		    break;
+		case 'r':
+		    *attr |= A_REVERSE;
+		    break;
+		case 'U':
+		    *attr &= ~A_UNDERLINE;
+		    break;
+		case 'u':
+		    *attr |= A_UNDERLINE;
+		    break;
+		case 'n':
+		    *attr = A_NORMAL;
+		    break;
+		default:
+		    break;
+		}
+		++txt;
+	    }
+	}
+	if (ended || *txt == '\n' || *txt == '\0')
+	    break;
+	useattr = (*attr) & A_ATTRIBUTES;
+#ifdef HAVE_COLOR
+	/*
+	 * Prevent this from making text invisible when the foreground and
+	 * background colors happen to be the same, and there's no bold
+	 * attribute.
+	 */
+	if ((useattr & A_COLOR) != 0 && (useattr & A_BOLD) == 0) {
+	    short pair = (short) PAIR_NUMBER(useattr);
+	    short fg, bg;
+	    if (pair_content(pair, &fg, &bg) != ERR
+		&& fg == bg) {
+		useattr &= ~A_COLOR;
+		useattr |= dlg_color_pair(fg, ((bg == COLOR_BLACK)
+					       ? COLOR_WHITE
+					       : COLOR_BLACK));
+	    }
+	}
+#endif
+	/*
+	 * Write the character, using curses to tell exactly how wide it
+	 * is.  If it is a tab, discount that, since the caller thinks
+	 * tabs are nonprinting, and curses will expand tabs to one or
+	 * more blanks.
+	 */
+	thisTab = (CharOf(*txt) == TAB);
+	if (dialog_state.text_only) {
+	    x_before = x_after;
+	} else {
+	    if (thisTab) {
+		getyx(win, y_before, x_before);
+		(void) y_before;
+	    }
+	}
+	if (dialog_state.text_only) {
+	    int ch = CharOf(*txt++);
+	    if (thisTab) {
+		while ((x_after++) % 8) {
+		    fputc(' ', dialog_state.output);
+		}
+	    } else {
+		fputc(ch, dialog_state.output);
+		x_after++;	/* FIXME: handle meta per locale */
+	    }
+	} else {
+	    (void) waddch(win, CharOf(*txt++) | useattr);
+	    getyx(win, y_after, x_after);
+	}
+	if (thisTab && (y_after == y_origin))
+	    tabbed += (x_after - x_before);
+	if ((y_after != y_origin) ||
+	    (x_after >= (cols + tabbed + x_origin)
+#ifdef USE_WIDE_CURSES
+	     && !is_combining(txt, &combined)
+#endif
+	    )) {
+	    ended = TRUE;
+	}
+    }
+    if (dialog_state.text_only) {
+	fputc('\n', dialog_state.output);
+    }
+}
+
+/*
+ * Print one line of the prompt in the window within the limits of the
+ * specified right margin.  The line will end on a word boundary and a pointer
+ * to the start of the next line is returned, or a NULL pointer if the end of
+ * *prompt is reached.
+ */
+const char *
+dlg_print_line(WINDOW *win,
+	       chtype *attr,
+	       const char *prompt,
+	       int lm, int rm, int *x)
+{
+    const char *wrap_ptr;
+    const char *test_ptr;
+    const char *hide_ptr = 0;
+    const int *cols = dlg_index_columns(prompt);
+    const int *indx = dlg_index_wchars(prompt);
+    int wrap_inx = 0;
+    int test_inx = 0;
+    int cur_x = lm;
+    int hidden = 0;
+    int limit = dlg_count_wchars(prompt);
+    int n;
+    int tabbed = 0;
+
+    *x = 1;
+
+    /*
+     * Set *test_ptr to the end of the line or the right margin (rm), whichever
+     * is less, and set wrap_ptr to the end of the last word in the line.
+     */
+    for (n = 0; n < limit; ++n) {
+	int ch = *(test_ptr = prompt + indx[test_inx]);
+	if (ch == '\n' || ch == '\0' || cur_x >= (rm + hidden))
+	    break;
+	if (ch == TAB && n == 0) {
+	    tabbed = 8;		/* workaround for leading tabs */
+	} else if (isblank(UCH(ch))
+		   && n != 0
+		   && !isblank(UCH(prompt[indx[n - 1]]))) {
+	    wrap_inx = n;
+	    *x = cur_x;
+	} else if (dialog_vars.colors && isOurEscape(test_ptr)) {
+	    hide_ptr = test_ptr;
+	    hidden += ESCAPE_LEN;
+	    n += (ESCAPE_LEN - 1);
+	}
+	cur_x = lm + tabbed + cols[n + 1];
+	if (cur_x > (rm + hidden))
+	    break;
+	test_inx = n + 1;
+    }
+
+    /*
+     * If the line doesn't reach the right margin in the middle of a word, then
+     * we don't have to wrap it at the end of the previous word.
+     */
+    test_ptr = prompt + indx[test_inx];
+    if (*test_ptr == '\n' || isblank(UCH(*test_ptr)) || *test_ptr == '\0') {
+	wrap_inx = test_inx;
+	while (wrap_inx > 0 && isblank(UCH(prompt[indx[wrap_inx - 1]]))) {
+	    wrap_inx--;
+	}
+	*x = lm + indx[wrap_inx];
+    } else if (*x == 1 && cur_x >= rm) {
+	/*
+	 * If the line has no spaces, then wrap it anyway at the right margin
+	 */
+	*x = rm;
+	wrap_inx = test_inx;
+    }
+    wrap_ptr = prompt + indx[wrap_inx];
+#ifdef USE_WIDE_CURSES
+    if (UCH(*wrap_ptr) >= 128) {
+	int combined = 0;
+	while (is_combining(wrap_ptr, &combined)) {
+	    ++wrap_ptr;
+	}
+    }
+#endif
+
+    /*
+     * If we found hidden text past the last point that we will display,
+     * discount that from the displayed length.
+     */
+    if ((hide_ptr != 0) && (hide_ptr >= wrap_ptr)) {
+	hidden -= ESCAPE_LEN;
+	test_ptr = wrap_ptr;
+	while (test_ptr < wrap_ptr) {
+	    if (dialog_vars.colors && isOurEscape(test_ptr)) {
+		hidden -= ESCAPE_LEN;
+		test_ptr += ESCAPE_LEN;
+	    } else {
+		++test_ptr;
+	    }
+	}
+    }
+
+    /*
+     * Print the line if we have a window pointer.  Otherwise this routine
+     * is just being called for sizing the window.
+     */
+    if (dialog_state.text_only || win) {
+	dlg_print_text(win, prompt, (cols[wrap_inx] - hidden), attr);
+    }
+
+    /* *x tells the calling function how long the line was */
+    if (*x == 1) {
+	*x = rm;
+    }
+
+    *x -= hidden;
+
+    /* Find the start of the next line and return a pointer to it */
+    test_ptr = wrap_ptr;
+    while (isblank(UCH(*test_ptr)))
+	test_ptr++;
+    if (*test_ptr == '\n')
+	test_ptr++;
+    dlg_finish_string(prompt);
+    return (test_ptr);
+}
+
+static void
+justify_text(WINDOW *win,
+	     const char *prompt,
+	     int limit_y,
+	     int limit_x,
+	     int *high, int *wide)
+{
+    chtype attr = A_NORMAL;
+    int x;
+    int y = MARGIN;
+    int max_x = 2;
+    int lm = (2 * MARGIN);	/* left margin (box-border plus a space) */
+    int rm = limit_x;		/* right margin */
+    int bm = limit_y;		/* bottom margin */
+    int last_y = 0, last_x = 0;
+
+    dialog_state.text_height = 0;
+    dialog_state.text_width = 0;
+    if (dialog_state.text_only || win) {
+	rm -= (2 * MARGIN);
+	bm -= (2 * MARGIN);
+    }
+    if (prompt == 0)
+	prompt = "";
+
+    if (win != 0)
+	getyx(win, last_y, last_x);
+    while (y <= bm && *prompt) {
+	x = lm;
+
+	if (*prompt == '\n') {
+	    while (*prompt == '\n' && y < bm) {
+		if (*(prompt + 1) != '\0') {
+		    ++y;
+		    if (win != 0)
+			(void) wmove(win, y, lm);
+		}
+		prompt++;
+	    }
+	} else if (win != 0)
+	    (void) wmove(win, y, lm);
+
+	if (*prompt) {
+	    prompt = dlg_print_line(win, &attr, prompt, lm, rm, &x);
+	    if (win != 0)
+		getyx(win, last_y, last_x);
+	}
+	if (*prompt) {
+	    ++y;
+	    if (win != 0)
+		(void) wmove(win, y, lm);
+	}
+	max_x = MAX(max_x, x);
+    }
+    /* Move back to the last position after drawing prompt, for msgbox. */
+    if (win != 0)
+	(void) wmove(win, last_y, last_x);
+
+    /* Set the final height and width for the calling function */
+    if (high != 0)
+	*high = y;
+    if (wide != 0)
+	*wide = max_x;
+}
+
+/*
+ * Print a string of text in a window, automatically wrap around to the next
+ * line if the string is too long to fit on one line.  Note that the string may
+ * contain embedded newlines.
+ */
+void
+dlg_print_autowrap(WINDOW *win, const char *prompt, int height, int width)
+{
+    justify_text(win, prompt,
+		 height,
+		 width,
+		 (int *) 0, (int *) 0);
+}
+
+/*
+ * Display the message in a scrollable window.  Actually the way it works is
+ * that we create a "tall" window of the proper width, let the text wrap within
+ * that, and copy a slice of the result to the dialog.
+ *
+ * It works for ncurses.  Other curses implementations show only blanks (Tru64)
+ * or garbage (NetBSD).
+ */
+int
+dlg_print_scrolled(WINDOW *win,
+		   const char *prompt,
+		   int offset,
+		   int height,
+		   int width,
+		   int pauseopt)
+{
+    int oldy, oldx;
+    int last = 0;
+
+    (void) pauseopt;		/* used only for ncurses */
+
+    getyx(win, oldy, oldx);
+#ifdef NCURSES_VERSION
+    if (pauseopt) {
+	int wide = width - (2 * MARGIN);
+	int high = LINES;
+	int len;
+	WINDOW *dummy;
+
+#if defined(NCURSES_VERSION_PATCH) && NCURSES_VERSION_PATCH >= 20040417
+	/*
+	 * If we're not limited by the screensize, allow text to possibly be
+	 * one character per line.
+	 */
+	if ((len = dlg_count_columns(prompt)) > high)
+	    high = len;
+#endif
+	dummy = newwin(high, width, 0, 0);
+	if (dummy == 0) {
+	    dlg_attrset(win, dialog_attr);
+	    dlg_print_autowrap(win, prompt, height + 1 + (3 * MARGIN), width);
+	    last = 0;
+	} else {
+	    int y, x;
+
+	    wbkgdset(dummy, dialog_attr | ' ');
+	    dlg_attrset(dummy, dialog_attr);
+	    werase(dummy);
+	    dlg_print_autowrap(dummy, prompt, high, width);
+	    getyx(dummy, y, x);
+	    (void) x;
+
+	    copywin(dummy,	/* srcwin */
+		    win,	/* dstwin */
+		    offset + MARGIN,	/* sminrow */
+		    MARGIN,	/* smincol */
+		    MARGIN,	/* dminrow */
+		    MARGIN,	/* dmincol */
+		    height,	/* dmaxrow */
+		    wide,	/* dmaxcol */
+		    FALSE);
+
+	    delwin(dummy);
+
+	    /* if the text is incomplete, or we have scrolled, show the percentage */
+	    if (y > 0 && wide > 4) {
+		int percent = (int) ((height + offset) * 100.0 / y);
+
+		if (percent < 0)
+		    percent = 0;
+		if (percent > 100)
+		    percent = 100;
+
+		if (offset != 0 || percent != 100) {
+		    char buffer[5];
+
+		    dlg_attrset(win, position_indicator_attr);
+		    (void) wmove(win, MARGIN + height, wide - 4);
+		    (void) sprintf(buffer, "%d%%", percent);
+		    (void) waddstr(win, buffer);
+		    if ((len = (int) strlen(buffer)) < 4) {
+			dlg_attrset(win, border_attr);
+			whline(win, dlg_boxchar(ACS_HLINE), 4 - len);
+		    }
+		}
+	    }
+	    last = (y - height);
+	}
+    } else
+#endif
+    {
+	(void) offset;
+	dlg_attrset(win, dialog_attr);
+	dlg_print_autowrap(win, prompt, height + 1 + (3 * MARGIN), width);
+	last = 0;
+    }
+    wmove(win, oldy, oldx);
+    return last;
+}
+
+int
+dlg_check_scrolled(int key, int last, int page, bool * show, int *offset)
+{
+    int code = 0;
+
+    *show = FALSE;
+
+    switch (key) {
+    case DLGK_PAGE_FIRST:
+	if (*offset > 0) {
+	    *offset = 0;
+	    *show = TRUE;
+	}
+	break;
+    case DLGK_PAGE_LAST:
+	if (*offset < last) {
+	    *offset = last;
+	    *show = TRUE;
+	}
+	break;
+    case DLGK_GRID_UP:
+	if (*offset > 0) {
+	    --(*offset);
+	    *show = TRUE;
+	}
+	break;
+    case DLGK_GRID_DOWN:
+	if (*offset < last) {
+	    ++(*offset);
+	    *show = TRUE;
+	}
+	break;
+    case DLGK_PAGE_PREV:
+	if (*offset > 0) {
+	    *offset -= page;
+	    if (*offset < 0)
+		*offset = 0;
+	    *show = TRUE;
+	}
+	break;
+    case DLGK_PAGE_NEXT:
+	if (*offset < last) {
+	    *offset += page;
+	    if (*offset > last)
+		*offset = last;
+	    *show = TRUE;
+	}
+	break;
+    default:
+	code = -1;
+	break;
+    }
+    return code;
+}
+
+/*
+ * Calculate the window size for preformatted text.  This will calculate box
+ * dimensions that are at or close to the specified aspect ratio for the prompt
+ * string with all spaces and newlines preserved and additional newlines added
+ * as necessary.
+ */
+static void
+auto_size_preformatted(const char *prompt, int *height, int *width)
+{
+    int high = 0, wide = 0;
+    float car;			/* Calculated Aspect Ratio */
+    int max_y = SLINES - 1;
+    int max_x = SCOLS - 2;
+    int max_width = max_x;
+    int ar = dialog_state.aspect_ratio;
+
+    /* Get the initial dimensions */
+    justify_text((WINDOW *) 0, prompt, max_y, max_x, &high, &wide);
+    car = (float) (wide / high);
+
+    *height = high;
+    *width = wide;
+}
+
+/*
+ * Find the length of the longest "word" in the given string.  By setting the
+ * widget width at least this long, we can avoid splitting a word on the
+ * margin.
+ */
+static int
+longest_word(const char *string)
+{
+    int result = 0;
+
+    while (*string != '\0') {
+	int length = 0;
+	while (*string != '\0' && !isspace(UCH(*string))) {
+	    length++;
+	    string++;
+	}
+	result = MAX(result, length);
+	if (*string != '\0')
+	    string++;
+    }
+    return result;
+}
+
+/*
+ * if (height or width == -1) Maximize()
+ * if (height or width == 0), justify and return actual limits.
+ */
+static void
+real_auto_size(const char *title,
+	       const char *prompt,
+	       int *height, int *width,
+	       int boxlines, int mincols)
+{
+    int x = (dialog_vars.begin_set ? dialog_vars.begin_x : 2);
+    int y = (dialog_vars.begin_set ? dialog_vars.begin_y : 1);
+    int title_length = title ? dlg_count_columns(title) : 0;
+    int high;
+    int save_high = *height;
+    int save_wide = *width;
+    int max_high;
+    int max_wide;
+
+    if (prompt == 0) {
+	if (*height == 0)
+	    *height = -1;
+	if (*width == 0)
+	    *width = -1;
+    }
+
+    max_high = (*height < 0);
+    max_wide = (*width < 0);
+
+    if (*height > 0) {
+	high = *height;
+    } else {
+	high = SLINES - y;
+    }
+
+    if (*width <= 0) {
+	int wide;
+
+	if (prompt != 0) {
+	    wide = MAX(title_length, mincols);
+	    if (strchr(prompt, '\n') == 0) {
+		double val = (dialog_state.aspect_ratio *
+			      dlg_count_real_columns(prompt));
+		double xxx = sqrt(val);
+		int tmp = (int) xxx;
+		wide = MAX(wide, tmp);
+		wide = MAX(wide, longest_word(prompt));
+		justify_text((WINDOW *) 0, prompt, high, wide, height, width);
+	    } else {
+		auto_size_preformatted(prompt, height, width);
+	    }
+	} else {
+	    wide = SCOLS - x;
+	    justify_text((WINDOW *) 0, prompt, high, wide, height, width);
+	}
+    }
+
+    if (*width < title_length) {
+	justify_text((WINDOW *) 0, prompt, high, title_length, height, width);
+	*width = title_length;
+    }
+
+    dialog_state.text_height = *height;
+    dialog_state.text_width = *width;
+
+    if (*width < mincols && save_wide == 0)
+	*width = mincols;
+    if (prompt != 0) {
+	*width += ((2 * MARGIN) + SHADOW_COLS);
+	*height += boxlines + (2 * MARGIN);
+    }
+
+    if (save_high > 0)
+	*height = save_high;
+    if (save_wide > 0)
+	*width = save_wide;
+
+    if (max_high)
+	*height = SLINES - (dialog_vars.begin_set ? dialog_vars.begin_y : 0);
+    if (max_wide)
+	*width = SCOLS - (dialog_vars.begin_set ? dialog_vars.begin_x : 0);
+}
+
+/* End of real_auto_size() */
+
+void
+dlg_auto_size(const char *title,
+	      const char *prompt,
+	      int *height,
+	      int *width,
+	      int boxlines,
+	      int mincols)
+{
+    DLG_TRACE(("# dlg_auto_size(%d,%d) limits %d,%d\n",
+	       *height, *width,
+	       boxlines, mincols));
+
+    real_auto_size(title, prompt, height, width, boxlines, mincols);
+
+    if (*width > SCOLS) {
+	(*height)++;
+	*width = SCOLS;
+    }
+
+    if (*height > SLINES) {
+	*height = SLINES;
+    }
+    DLG_TRACE(("# ...dlg_auto_size(%d,%d) also %d,%d\n",
+	       *height, *width,
+	       dialog_state.text_height, dialog_state.text_width));
+}
+
+/*
+ * if (height or width == -1) Maximize()
+ * if (height or width == 0)
+ *    height=MIN(SLINES, num.lines in fd+n);
+ *    width=MIN(SCOLS, MAX(longer line+n, mincols));
+ */
+void
+dlg_auto_sizefile(const char *title,
+		  const char *file,
+		  int *height,
+		  int *width,
+		  int boxlines,
+		  int mincols)
+{
+    int count = 0;
+    int len = title ? dlg_count_columns(title) : 0;
+    int nc = 4;
+    int numlines = 2;
+    FILE *fd;
+
+    /* Open input file for reading */
+    if ((fd = fopen(file, "rb")) == NULL)
+	dlg_exiterr("dlg_auto_sizefile: Cannot open input file %s", file);
+
+    if ((*height == -1) || (*width == -1)) {
+	*height = SLINES - (dialog_vars.begin_set ? dialog_vars.begin_y : 0);
+	*width = SCOLS - (dialog_vars.begin_set ? dialog_vars.begin_x : 0);
+    }
+    if ((*height != 0) && (*width != 0)) {
+	(void) fclose(fd);
+	if (*width > SCOLS)
+	    *width = SCOLS;
+	if (*height > SLINES)
+	    *height = SLINES;
+	return;
+    }
+
+    while (!feof(fd)) {
+	int ch;
+	long offset;
+
+	if (ferror(fd))
+	    break;
+
+	offset = 0;
+	while (((ch = getc(fd)) != '\n') && !feof(fd)) {
+	    if ((ch == TAB) && (dialog_vars.tab_correct)) {
+		offset += dialog_state.tab_len - (offset % dialog_state.tab_len);
+	    } else {
+		offset++;
+	    }
+	}
+
+	if (offset > len)
+	    len = (int) offset;
+
+	count++;
+    }
+
+    /* now 'count' has the number of lines of fd and 'len' the max length */
+
+    *height = MIN(SLINES, count + numlines + boxlines);
+    *width = MIN(SCOLS, MAX((len + nc), mincols));
+    /* here width and height can be maximized if > SCOLS|SLINES because
+       textbox-like widgets don't put all <file> on the screen.
+       Msgbox-like widget instead have to put all <text> correctly. */
+
+    (void) fclose(fd);
+}
+
+/*
+ * Draw a rectangular box with line drawing characters.
+ *
+ * borderchar is used to color the upper/left edges.
+ *
+ * boxchar is used to color the right/lower edges.  It also is fill-color used
+ * for the box contents.
+ *
+ * Normally, if you are drawing a scrollable box, use menubox_border_attr for
+ * boxchar, and menubox_attr for borderchar since the scroll-arrows are drawn
+ * with menubox_attr at the top, and menubox_border_attr at the bottom.  That
+ * also (given the default color choices) produces a recessed effect.
+ *
+ * If you want a raised effect (and are not going to use the scroll-arrows),
+ * reverse this choice.
+ */
+void
+dlg_draw_box2(WINDOW *win, int y, int x, int height, int width,
+	      chtype boxchar, chtype borderchar, chtype borderchar2)
+{
+    int i, j;
+    chtype save = dlg_get_attrs(win);
+
+    dlg_attrset(win, 0);
+    for (i = 0; i < height; i++) {
+	(void) wmove(win, y + i, x);
+	for (j = 0; j < width; j++)
+	    if (!i && !j)
+		(void) waddch(win, borderchar | dlg_boxchar(ACS_ULCORNER));
+	    else if (i == height - 1 && !j)
+		(void) waddch(win, borderchar | dlg_boxchar(ACS_LLCORNER));
+	    else if (!i && j == width - 1)
+		(void) waddch(win, borderchar2 | dlg_boxchar(ACS_URCORNER));
+	    else if (i == height - 1 && j == width - 1)
+		(void) waddch(win, borderchar2 | dlg_boxchar(ACS_LRCORNER));
+	    else if (!i)
+		(void) waddch(win, borderchar | dlg_boxchar(ACS_HLINE));
+	    else if (i == height - 1)
+		(void) waddch(win, borderchar2 | dlg_boxchar(ACS_HLINE));
+	    else if (!j)
+		(void) waddch(win, borderchar | dlg_boxchar(ACS_VLINE));
+	    else if (j == width - 1)
+		(void) waddch(win, borderchar2 | dlg_boxchar(ACS_VLINE));
+	    else
+		(void) waddch(win, boxchar | ' ');
+    }
+    dlg_attrset(win, save);
+}
+
+void
+dlg_draw_box(WINDOW *win, int y, int x, int height, int width,
+	     chtype boxchar, chtype borderchar)
+{
+    dlg_draw_box2(win, y, x, height, width, boxchar, borderchar, boxchar);
+}
+
+/*
+ * Search the given 'list' for the given window 'win'.  Typically 'win' is an
+ * input-window, i.e., a window where we might use wgetch.
+ *
+ * The all-windows list has normal- and shadow-windows.  Since we never use the
+ * shadow as an input window, normally we just look for the normal-window.
+ *
+ * However, the all-subwindows list stores parent/child windows rather than
+ * normal/shadow windows.  When searching that list, we look for the child
+ * window (in the .shadow field).
+ */
+static DIALOG_WINDOWS *
+find_window(DIALOG_WINDOWS * list, WINDOW *win, bool normal)
+{
+    DIALOG_WINDOWS *result = 0;
+    DIALOG_WINDOWS *p;
+
+    for (p = list; p != 0; p = p->next) {
+	WINDOW *check = normal ? p->normal : p->shadow;
+	if (check == win) {
+	    result = p;
+	    break;
+	}
+    }
+    return result;
+}
+
+#define SearchTopWindows(win) find_window(dialog_state.all_windows, win, TRUE)
+#define SearchSubWindows(win) find_window(dialog_state.all_subwindows, win, FALSE)
+
+/*
+ * Check for the existence of a window, e.g., when used for input or updating
+ * the display.  This is used in dlg_getc() and related functions, to guard
+ * against an asynchronous window-deletion that might invalidate the input
+ * window used in dlg_getc().
+ */
+DIALOG_WINDOWS *
+_dlg_find_window(WINDOW *win)
+{
+    DIALOG_WINDOWS *result = 0;
+
+    if ((result = SearchTopWindows(win)) == NULL)
+	result = SearchSubWindows(win);
+    return result;
+}
+
+#ifdef HAVE_COLOR
+/*
+ * If we have wchgat(), use that for updating shadow attributes, to work with
+ * wide-character data.
+ */
+
+/*
+ * Check if the given point is "in" the given window.  If so, return the window
+ * pointer, otherwise null.
+ */
+static WINDOW *
+in_window(WINDOW *win, int y, int x)
+{
+    WINDOW *result = 0;
+    int y_base = getbegy(win);
+    int x_base = getbegx(win);
+    int y_last = getmaxy(win) + y_base;
+    int x_last = getmaxx(win) + x_base;
+
+    if (y >= y_base && y <= y_last && x >= x_base && x <= x_last)
+	result = win;
+    return result;
+}
+
+static WINDOW *
+window_at_cell(DIALOG_WINDOWS * dw, int y, int x)
+{
+    WINDOW *result = 0;
+    DIALOG_WINDOWS *p;
+    int y_want = y + getbegy(dw->shadow);
+    int x_want = x + getbegx(dw->shadow);
+
+    for (p = dialog_state.all_windows; p != 0; p = p->next) {
+	if (dw->normal != p->normal
+	    && dw->shadow != p->normal
+	    && (result = in_window(p->normal, y_want, x_want)) != 0) {
+	    break;
+	}
+    }
+    if (result == 0) {
+	result = stdscr;
+    }
+    return result;
+}
+
+static bool
+in_shadow(WINDOW *normal, WINDOW *shadow, int y, int x)
+{
+    bool result = FALSE;
+    int ybase = getbegy(normal);
+    int ylast = getmaxy(normal) + ybase;
+    int xbase = getbegx(normal);
+    int xlast = getmaxx(normal) + xbase;
+
+    y += getbegy(shadow);
+    x += getbegx(shadow);
+
+    if (y >= ybase + SHADOW_ROWS
+	&& y < ylast + SHADOW_ROWS
+	&& x >= xlast
+	&& x < xlast + SHADOW_COLS) {
+	/* in the right-side */
+	result = TRUE;
+    } else if (y >= ylast
+	       && y < ylast + SHADOW_ROWS
+	       && x >= ybase + SHADOW_COLS
+	       && x < ylast + SHADOW_COLS) {
+	/* check the bottom */
+	result = TRUE;
+    }
+
+    return result;
+}
+
+/*
+ * When erasing a shadow, check each cell to make sure that it is not part of
+ * another box's shadow.  This is a little complicated since most shadows are
+ * merged onto stdscr.
+ */
+static bool
+last_shadow(DIALOG_WINDOWS * dw, int y, int x)
+{
+    DIALOG_WINDOWS *p;
+    bool result = TRUE;
+
+    for (p = dialog_state.all_windows; p != 0; p = p->next) {
+	if (p->normal != dw->normal
+	    && in_shadow(p->normal, dw->shadow, y, x)) {
+	    result = FALSE;
+	    break;
+	}
+    }
+    return result;
+}
+
+static void
+repaint_cell(DIALOG_WINDOWS * dw, bool draw, int y, int x)
+{
+    WINDOW *win = dw->shadow;
+    WINDOW *cellwin;
+    int y2, x2;
+
+    if ((cellwin = window_at_cell(dw, y, x)) != 0
+	&& (draw || last_shadow(dw, y, x))
+	&& (y2 = (y + getbegy(win) - getbegy(cellwin))) >= 0
+	&& (x2 = (x + getbegx(win) - getbegx(cellwin))) >= 0
+	&& wmove(cellwin, y2, x2) != ERR) {
+	chtype the_cell = dlg_get_attrs(cellwin);
+	chtype the_attr = (draw ? shadow_attr : the_cell);
+
+	if (winch(cellwin) & A_ALTCHARSET) {
+	    the_attr |= A_ALTCHARSET;
+	}
+#if USE_WCHGAT
+	wchgat(cellwin, 1,
+	       the_attr & (chtype) (~A_COLOR),
+	       (short) PAIR_NUMBER(the_attr),
+	       NULL);
+#else
+	{
+	    chtype the_char = ((winch(cellwin) & A_CHARTEXT) | the_attr);
+	    (void) waddch(cellwin, the_char);
+	}
+#endif
+	wnoutrefresh(cellwin);
+    }
+}
+
+#define RepaintCell(dw, draw, y, x) repaint_cell(dw, draw, y, x)
+
+static void
+repaint_shadow(DIALOG_WINDOWS * dw, bool draw, int y, int x, int height, int width)
+{
+    if (UseShadow(dw)) {
+	int i, j;
+
+#if !USE_WCHGAT
+	chtype save = dlg_get_attrs(dw->shadow);
+	dlg_attrset(dw->shadow, draw ? shadow_attr : screen_attr);
+#endif
+	for (i = 0; i < SHADOW_ROWS; ++i) {
+	    for (j = 0; j < width; ++j) {
+		RepaintCell(dw, draw, i + y + height, j + x + SHADOW_COLS);
+	    }
+	}
+	for (i = 0; i < height; i++) {
+	    for (j = 0; j < SHADOW_COLS; ++j) {
+		RepaintCell(dw, draw, i + y + SHADOW_ROWS, j + x + width);
+	    }
+	}
+	(void) wnoutrefresh(dw->shadow);
+#if !USE_WCHGAT
+	dlg_attrset(dw->shadow, save);
+#endif
+    }
+}
+
+/*
+ * Draw a shadow on the parent window corresponding to the right- and
+ * bottom-edge of the child window, to give a 3-dimensional look.
+ */
+static void
+draw_childs_shadow(DIALOG_WINDOWS * dw)
+{
+    if (UseShadow(dw)) {
+	repaint_shadow(dw,
+		       TRUE,
+		       getbegy(dw->normal) - getbegy(dw->shadow),
+		       getbegx(dw->normal) - getbegx(dw->shadow),
+		       getmaxy(dw->normal),
+		       getmaxx(dw->normal));
+    }
+}
+
+/*
+ * Erase a shadow on the parent window corresponding to the right- and
+ * bottom-edge of the child window.
+ */
+static void
+erase_childs_shadow(DIALOG_WINDOWS * dw)
+{
+    if (UseShadow(dw)) {
+	repaint_shadow(dw,
+		       FALSE,
+		       getbegy(dw->normal) - getbegy(dw->shadow),
+		       getbegx(dw->normal) - getbegx(dw->shadow),
+		       getmaxy(dw->normal),
+		       getmaxx(dw->normal));
+    }
+}
+
+/*
+ * Draw shadows along the right and bottom edge to give a more 3D look
+ * to the boxes.
+ */
+void
+dlg_draw_shadow(WINDOW *win, int y, int x, int height, int width)
+{
+    repaint_shadow(SearchTopWindows(win), TRUE, y, x, height, width);
+}
+#endif /* HAVE_COLOR */
+
+/*
+ * Allow shell scripts to remap the exit codes so they can distinguish ESC
+ * from ERROR.
+ */
+void
+dlg_exit(int code)
+{
+    /* *INDENT-OFF* */
+    static const struct {
+	int code;
+	const char *name;
+    } table[] = {
+	{ DLG_EXIT_CANCEL, 	"DIALOG_CANCEL" },
+	{ DLG_EXIT_ERROR,  	"DIALOG_ERROR" },
+	{ DLG_EXIT_ESC,	   	"DIALOG_ESC" },
+	{ DLG_EXIT_EXTRA,  	"DIALOG_EXTRA" },
+	{ DLG_EXIT_HELP,   	"DIALOG_HELP" },
+	{ DLG_EXIT_OK,	   	"DIALOG_OK" },
+	{ DLG_EXIT_ITEM_HELP,	"DIALOG_ITEM_HELP" },
+	{ DLG_EXIT_TIMEOUT,	"DIALOG_TIMEOUT" },
+    };
+    /* *INDENT-ON* */
+
+    unsigned n;
+    bool overridden = FALSE;
+
+  retry:
+    for (n = 0; n < TableSize(table); n++) {
+	if (table[n].code == code) {
+	    if (dlg_getenv_num(table[n].name, &code)) {
+		overridden = TRUE;
+	    }
+	    break;
+	}
+    }
+
+    /*
+     * Prior to 2004/12/19, a widget using --item-help would exit with "OK"
+     * if the help button were selected.  Now we want to exit with "HELP",
+     * but allow the environment variable to override.
+     */
+    if (code == DLG_EXIT_ITEM_HELP && !overridden) {
+	code = DLG_EXIT_HELP;
+	goto retry;
+    }
+#ifdef HAVE_DLG_TRACE
+    dlg_trace((const char *) 0);	/* close it */
+#endif
+
+#ifdef NO_LEAKS
+    _dlg_inputstr_leaks();
+#if defined(NCURSES_VERSION) && (defined(HAVE_EXIT_CURSES) || defined(HAVE__NC_FREE_AND_EXIT))
+    exit_curses(code);
+#endif
+#endif
+
+    if (dialog_state.input == stdin) {
+	exit(code);
+    } else {
+	/*
+	 * Just in case of using --input-fd option, do not
+	 * call atexit functions of ncurses which may hang.
+	 */
+	if (dialog_state.input) {
+	    fclose(dialog_state.input);
+	    dialog_state.input = 0;
+	}
+	if (dialog_state.pipe_input) {
+	    if (dialog_state.pipe_input != stdin) {
+		fclose(dialog_state.pipe_input);
+		dialog_state.pipe_input = 0;
+	    }
+	}
+	_exit(code);
+    }
+}
+
+#define DATA(name) { DLG_EXIT_ ## name, #name }
+/* *INDENT-OFF* */
+static struct {
+    int code;
+    const char *name;
+} exit_codenames[] = {
+    DATA(ESC),
+    DATA(UNKNOWN),
+    DATA(ERROR),
+    DATA(OK),
+    DATA(CANCEL),
+    DATA(HELP),
+    DATA(EXTRA),
+    DATA(ITEM_HELP),
+};
+#undef DATA
+/* *INDENT-ON* */
+
+const char *
+dlg_exitcode2s(int code)
+{
+    const char *result = "?";
+    size_t n;
+
+    for (n = 0; n < TableSize(exit_codenames); ++n) {
+	if (exit_codenames[n].code == code) {
+	    result = exit_codenames[n].name;
+	    break;
+	}
+    }
+    return result;
+}
+
+int
+dlg_exitname2n(const char *name)
+{
+    int result = DLG_EXIT_UNKNOWN;
+    size_t n;
+
+    for (n = 0; n < TableSize(exit_codenames); ++n) {
+	if (!dlg_strcmp(exit_codenames[n].name, name)) {
+	    result = exit_codenames[n].code;
+	    break;
+	}
+    }
+    return result;
+}
+
+/* quit program killing all tailbg */
+void
+dlg_exiterr(const char *fmt, ...)
+{
+    int retval;
+    va_list ap;
+
+    end_dialog();
+
+    (void) fputc('\n', stderr);
+    va_start(ap, fmt);
+    (void) vfprintf(stderr, fmt, ap);
+    va_end(ap);
+    (void) fputc('\n', stderr);
+
+#ifdef HAVE_DLG_TRACE
+    va_start(ap, fmt);
+    dlg_trace_msg("## Error: ");
+    dlg_trace_va_msg(fmt, ap);
+    va_end(ap);
+#endif
+
+    dlg_killall_bg(&retval);
+
+    (void) fflush(stderr);
+    (void) fflush(stdout);
+    dlg_exit(strcmp(fmt, "timeout") == 0 ? DLG_EXIT_TIMEOUT : DLG_EXIT_ERROR);
+}
+
+/*
+ * Get a string from the environment, rejecting those which are entirely blank.
+ */
+char *
+dlg_getenv_str(const char *name)
+{
+    char *result = getenv(name);
+    if (result != NULL) {
+	while (*result != '\0' && isspace(UCH(*result)))
+	    ++result;
+	if (*result == '\0')
+	    result = NULL;
+    }
+    return result;
+}
+
+/*
+ * Get a number from the environment:
+ * + If the caller provides a pointer in the second parameter, return
+ *   success/failure for the function return, and the actual value via the
+ *   pointer.  Use this for decoding arbitrary numbers, e.g., negative or zero.
+ * + If the caller does not provide a pointer, return the decoded value for
+ *   the function-return.  Use this when only values greater than zero are
+ *   useful.
+ */
+int
+dlg_getenv_num(const char *name, int *value)
+{
+    int result = 0;
+    char *data = getenv(name);
+    if (data != NULL) {
+	char *temp = NULL;
+	long check = strtol(data, &temp, 0);
+	if (temp != 0 && temp != data && *temp == '\0') {
+	    result = (int) check;
+	    if (value != NULL) {
+		*value = result;
+		result = 1;
+	    }
+	}
+    }
+    return result;
+}
+
+void
+dlg_beeping(void)
+{
+    if (dialog_vars.beep_signal) {
+	(void) beep();
+	dialog_vars.beep_signal = 0;
+    }
+}
+
+void
+dlg_print_size(int height, int width)
+{
+    if (dialog_vars.print_siz) {
+	fprintf(dialog_state.output, "Size: %d, %d\n", height, width);
+	DLG_TRACE(("# print size: %dx%d\n", height, width));
+    }
+}
+
+void
+dlg_ctl_size(int height, int width)
+{
+    if (dialog_vars.size_err) {
+	if ((width > COLS) || (height > LINES)) {
+	    dlg_exiterr("Window too big. (height, width) = (%d, %d). Max allowed (%d, %d).",
+			height, width, LINES, COLS);
+	}
+#ifdef HAVE_COLOR
+	else if ((dialog_state.use_shadow)
+		 && ((width > SCOLS || height > SLINES))) {
+	    if ((width <= COLS) && (height <= LINES)) {
+		/* try again, without shadows */
+		dialog_state.use_shadow = 0;
+	    } else {
+		dlg_exiterr("Window+Shadow too big. (height, width) = (%d, %d). Max allowed (%d, %d).",
+			    height, width, SLINES, SCOLS);
+	    }
+	}
+#endif
+    }
+}
+
+/*
+ * If the --tab-correct was not selected, convert tabs to single spaces.
+ */
+void
+dlg_tab_correct_str(char *prompt)
+{
+    char *ptr;
+
+    if (dialog_vars.tab_correct) {
+	while ((ptr = strchr(prompt, TAB)) != NULL) {
+	    *ptr = ' ';
+	    prompt = ptr;
+	}
+    }
+}
+
+void
+dlg_calc_listh(int *height, int *list_height, int item_no)
+{
+    /* calculate new height and list_height */
+    int rows = SLINES - (dialog_vars.begin_set ? dialog_vars.begin_y : 0);
+    if (rows - (*height) > 0) {
+	if (rows - (*height) > item_no)
+	    *list_height = item_no;
+	else
+	    *list_height = rows - (*height);
+    }
+    (*height) += (*list_height);
+}
+
+/* obsolete */
+int
+dlg_calc_listw(int item_no, char **items, int group)
+{
+    int i, len1 = 0, len2 = 0;
+
+    for (i = 0; i < (item_no * group); i += group) {
+	int n;
+
+	if ((n = dlg_count_columns(items[i])) > len1)
+	    len1 = n;
+	if ((n = dlg_count_columns(items[i + 1])) > len2)
+	    len2 = n;
+    }
+    return len1 + len2;
+}
+
+int
+dlg_calc_list_width(int item_no, DIALOG_LISTITEM * items)
+{
+    int n, i, len1 = 0, len2 = 0;
+    int bits = ((dialog_vars.no_tags ? 1 : 0)
+		+ (dialog_vars.no_items ? 2 : 0));
+
+    for (i = 0; i < item_no; ++i) {
+	switch (bits) {
+	case 0:
+	    /* FALLTHRU */
+	case 1:
+	    if ((n = dlg_count_columns(items[i].name)) > len1)
+		len1 = n;
+	    if ((n = dlg_count_columns(items[i].text)) > len2)
+		len2 = n;
+	    break;
+	case 2:
+	    /* FALLTHRU */
+	case 3:
+	    if ((n = dlg_count_columns(items[i].name)) > len1)
+		len1 = n;
+	    break;
+	}
+    }
+    return len1 + len2;
+}
+
+char *
+dlg_strempty(void)
+{
+    static char empty[] = "";
+    return empty;
+}
+
+char *
+dlg_strclone(const char *cprompt)
+{
+    char *prompt = 0;
+    if (cprompt != 0) {
+	prompt = dlg_malloc(char, strlen(cprompt) + 1);
+	assert_ptr(prompt, "dlg_strclone");
+	strcpy(prompt, cprompt);
+    }
+    return prompt;
+}
+
+chtype
+dlg_asciibox(chtype ch)
+{
+    chtype result = 0;
+
+    if (ch == ACS_ULCORNER)
+	result = '+';
+    else if (ch == ACS_LLCORNER)
+	result = '+';
+    else if (ch == ACS_URCORNER)
+	result = '+';
+    else if (ch == ACS_LRCORNER)
+	result = '+';
+    else if (ch == ACS_HLINE)
+	result = '-';
+    else if (ch == ACS_VLINE)
+	result = '|';
+    else if (ch == ACS_LTEE)
+	result = '+';
+    else if (ch == ACS_RTEE)
+	result = '+';
+    else if (ch == ACS_UARROW)
+	result = '^';
+    else if (ch == ACS_DARROW)
+	result = 'v';
+
+    return result;
+}
+
+chtype
+dlg_boxchar(chtype ch)
+{
+    chtype result = dlg_asciibox(ch);
+
+    if (result != 0) {
+	if (dialog_vars.ascii_lines)
+	    ch = result;
+	else if (dialog_vars.no_lines)
+	    ch = ' ';
+    }
+    return ch;
+}
+
+int
+dlg_box_x_ordinate(int width)
+{
+    int x;
+
+    if (dialog_vars.begin_set == 1) {
+	x = dialog_vars.begin_x;
+    } else {
+	/* center dialog box on screen unless --begin-set */
+	x = (SCOLS - width) / 2;
+    }
+    return x;
+}
+
+int
+dlg_box_y_ordinate(int height)
+{
+    int y;
+
+    if (dialog_vars.begin_set == 1) {
+	y = dialog_vars.begin_y;
+    } else {
+	/* center dialog box on screen unless --begin-set */
+	y = (SLINES - height) / 2;
+    }
+    return y;
+}
+
+void
+dlg_draw_title(WINDOW *win, const char *title)
+{
+    if (title != NULL) {
+	chtype attr = A_NORMAL;
+	chtype save = dlg_get_attrs(win);
+	int x = centered(getmaxx(win), title);
+
+	dlg_attrset(win, title_attr);
+	wmove(win, 0, x);
+	dlg_print_text(win, title, getmaxx(win) - x, &attr);
+	dlg_attrset(win, save);
+	dlg_finish_string(title);
+    }
+}
+
+void
+dlg_draw_bottom_box2(WINDOW *win, chtype on_left, chtype on_right, chtype on_inside)
+{
+    int width = getmaxx(win);
+    int height = getmaxy(win);
+    int i;
+
+    dlg_attrset(win, on_left);
+    (void) wmove(win, height - 3, 0);
+    (void) waddch(win, dlg_boxchar(ACS_LTEE));
+    for (i = 0; i < width - 2; i++)
+	(void) waddch(win, dlg_boxchar(ACS_HLINE));
+    dlg_attrset(win, on_right);
+    (void) waddch(win, dlg_boxchar(ACS_RTEE));
+    dlg_attrset(win, on_inside);
+    (void) wmove(win, height - 2, 1);
+    for (i = 0; i < width - 2; i++)
+	(void) waddch(win, ' ');
+}
+
+void
+dlg_draw_bottom_box(WINDOW *win)
+{
+    dlg_draw_bottom_box2(win, border_attr, dialog_attr, dialog_attr);
+}
+
+/*
+ * Remove a window, repainting everything else.  This would be simpler if we
+ * used the panel library, but that is not _always_ available.
+ */
+void
+dlg_del_window(WINDOW *win)
+{
+    DIALOG_WINDOWS *p, *q, *r;
+
+    /*
+     * If --keep-window was set, do not delete/repaint the windows.
+     */
+    if (dialog_vars.keep_window)
+	return;
+
+    /* Leave the main window untouched if there are no background windows.
+     * We do this so the current window will not be cleared on exit, allowing
+     * things like the infobox demo to run without flicker.
+     */
+    if (dialog_state.getc_callbacks != 0) {
+	touchwin(stdscr);
+	wnoutrefresh(stdscr);
+    }
+
+    for (p = dialog_state.all_windows, q = r = 0; p != 0; r = p, p = p->next) {
+	if (p->normal == win) {
+	    q = p;		/* found a match - should be only one */
+	    if (r == 0) {
+		dialog_state.all_windows = p->next;
+	    } else {
+		r->next = p->next;
+	    }
+	} else {
+	    if (p->shadow != 0) {
+		touchwin(p->shadow);
+		wnoutrefresh(p->shadow);
+	    }
+	    touchwin(p->normal);
+	    wnoutrefresh(p->normal);
+	}
+    }
+
+    if (q) {
+	if (dialog_state.all_windows != 0)
+	    erase_childs_shadow(q);
+	del_subwindows(q->normal);
+	dlg_unregister_window(q->normal);
+	delwin(q->normal);
+	free(q);
+    }
+    doupdate();
+}
+
+/*
+ * Create a window, optionally with a shadow.
+ */
+WINDOW *
+dlg_new_window(int height, int width, int y, int x)
+{
+    return dlg_new_modal_window(stdscr, height, width, y, x);
+}
+
+/*
+ * "Modal" windows differ from normal ones by having a shadow in a window
+ * separate from the standard screen.
+ */
+WINDOW *
+dlg_new_modal_window(WINDOW *parent, int height, int width, int y, int x)
+{
+    WINDOW *win;
+    DIALOG_WINDOWS *p = dlg_calloc(DIALOG_WINDOWS, 1);
+
+    (void) parent;
+    if (p == 0
+	|| (win = newwin(height, width, y, x)) == 0) {
+	dlg_exiterr("Can't make new window at (%d,%d), size (%d,%d).\n",
+		    y, x, height, width);
+    }
+    p->next = dialog_state.all_windows;
+    p->normal = win;
+    p->getc_timeout = WTIMEOUT_OFF;
+    dialog_state.all_windows = p;
+#ifdef HAVE_COLOR
+    if (dialog_state.use_shadow) {
+	p->shadow = parent;
+	draw_childs_shadow(p);
+    }
+#endif
+
+    (void) keypad(win, TRUE);
+    return win;
+}
+
+/*
+ * dlg_getc() uses the return-value to determine how to handle an ERR return
+ * from a non-blocking read:
+ * a) if greater than zero, there was an expired timeout (blocking for a short
+ *    time), or
+ * b) if zero, it was a non-blocking read, or
+ * c) if negative, an error occurred on a blocking read.
+ */
+int
+dlg_set_timeout(WINDOW *win, bool will_getc)
+{
+    DIALOG_WINDOWS *p;
+    int result = 0;
+
+    if ((p = SearchTopWindows(win)) != NULL) {
+	int interval = (dialog_vars.timeout_secs * 1000);
+
+	if (will_getc || dialog_vars.pause_secs) {
+	    interval = WTIMEOUT_VAL;
+	} else {
+	    result = interval;
+	    if (interval <= 0) {
+		interval = WTIMEOUT_OFF;
+	    }
+	}
+	wtimeout(win, interval);
+	p->getc_timeout = interval;
+    }
+    return result;
+}
+
+void
+dlg_reset_timeout(WINDOW *win)
+{
+    DIALOG_WINDOWS *p;
+
+    if ((p = SearchTopWindows(win)) != NULL) {
+	wtimeout(win, p->getc_timeout);
+    } else {
+	wtimeout(win, WTIMEOUT_OFF);
+    }
+}
+
+/*
+ * Move/Resize a window, optionally with a shadow.
+ */
+#ifdef KEY_RESIZE
+void
+dlg_move_window(WINDOW *win, int height, int width, int y, int x)
+{
+    if (win != 0) {
+	DIALOG_WINDOWS *p;
+
+	dlg_ctl_size(height, width);
+
+	if ((p = SearchTopWindows(win)) != 0) {
+	    (void) wresize(win, height, width);
+	    (void) mvwin(win, y, x);
+#ifdef HAVE_COLOR
+	    if (p->shadow != 0) {
+		if (dialog_state.use_shadow) {
+		    (void) mvwin(p->shadow, y + SHADOW_ROWS, x + SHADOW_COLS);
+		} else {
+		    p->shadow = 0;
+		}
+	    }
+#endif
+	    (void) refresh();
+
+#ifdef HAVE_COLOR
+	    draw_childs_shadow(p);
+#endif
+	}
+    }
+}
+
+/*
+ * Having just received a KEY_RESIZE, wait a short time to ignore followup
+ * KEY_RESIZE events.
+ */
+void
+dlg_will_resize(WINDOW *win)
+{
+    int n, base;
+    int caught = 0;
+
+    dialog_state.had_resize = TRUE;
+    dlg_trace_win(win);
+    wtimeout(win, WTIMEOUT_VAL * 5);
+
+    for (n = base = 0; n < base + 10; ++n) {
+	int ch;
+
+	if ((ch = wgetch(win)) != ERR) {
+	    if (ch == KEY_RESIZE) {
+		base = n;
+		++caught;
+	    } else if (ch != ERR) {
+		ungetch(ch);
+		break;
+	    }
+	}
+    }
+    dlg_reset_timeout(win);
+    DLG_TRACE(("# caught %d KEY_RESIZE key%s\n",
+	       1 + caught,
+	       caught == 1 ? "" : "s"));
+}
+#endif /* KEY_RESIZE */
+
+WINDOW *
+dlg_der_window(WINDOW *parent, int height, int width, int y, int x)
+{
+    WINDOW *win;
+
+    /* existing uses of derwin are (almost) guaranteed to succeed, and the
+     * caller has to allow for failure.
+     */
+    if ((win = derwin(parent, height, width, y, x)) != 0) {
+	add_subwindow(parent, win);
+	(void) keypad(win, TRUE);
+    }
+    return win;
+}
+
+WINDOW *
+dlg_sub_window(WINDOW *parent, int height, int width, int y, int x)
+{
+    WINDOW *win;
+
+    if ((win = subwin(parent, height, width, y, x)) == 0) {
+	dlg_exiterr("Can't make sub-window at (%d,%d), size (%d,%d).\n",
+		    y, x, height, width);
+    }
+
+    add_subwindow(parent, win);
+    (void) keypad(win, TRUE);
+    return win;
+}
+
+/* obsolete */
+int
+dlg_default_item(char **items, int llen)
+{
+    int result = 0;
+
+    if (dialog_vars.default_item != 0) {
+	int count = 0;
+	while (*items != 0) {
+	    if (!strcmp(dialog_vars.default_item, *items)) {
+		result = count;
+		break;
+	    }
+	    items += llen;
+	    count++;
+	}
+    }
+    return result;
+}
+
+int
+dlg_default_listitem(DIALOG_LISTITEM * items)
+{
+    int result = 0;
+
+    if (dialog_vars.default_item != 0) {
+	int count = 0;
+	while (items->name != 0) {
+	    if (!strcmp(dialog_vars.default_item, items->name)) {
+		result = count;
+		break;
+	    }
+	    ++items;
+	    count++;
+	}
+    }
+    return result;
+}
+
+/*
+ * Draw the string for item_help
+ */
+void
+dlg_item_help(const char *txt)
+{
+    if (USE_ITEM_HELP(txt)) {
+	chtype attr = A_NORMAL;
+
+	dlg_attrset(stdscr, itemhelp_attr);
+	(void) wmove(stdscr, LINES - 1, 0);
+	(void) wclrtoeol(stdscr);
+	(void) addch(' ');
+	dlg_print_text(stdscr, txt, COLS - 1, &attr);
+
+	if (itemhelp_attr & A_COLOR) {
+	    int y, x;
+	    /* fill the remainder of the line with the window's attributes */
+	    getyx(stdscr, y, x);
+	    (void) y;
+	    while (x < COLS) {
+		(void) addch(' ');
+		++x;
+	    }
+	}
+	(void) wnoutrefresh(stdscr);
+    }
+}
+
+#ifndef HAVE_STRCASECMP
+int
+dlg_strcmp(const char *a, const char *b)
+{
+    int ac, bc, cmp;
+
+    for (;;) {
+	ac = UCH(*a++);
+	bc = UCH(*b++);
+	if (isalpha(ac) && islower(ac))
+	    ac = _toupper(ac);
+	if (isalpha(bc) && islower(bc))
+	    bc = _toupper(bc);
+	cmp = ac - bc;
+	if (ac == 0 || bc == 0 || cmp != 0)
+	    break;
+    }
+    return cmp;
+}
+#endif
+
+/*
+ * Returns true if 'dst' points to a blank which follows another blank which
+ * is not a leading blank on a line.
+ */
+static bool
+trim_blank(char *base, char *dst)
+{
+    int count = !!isblank(UCH(*dst));
+
+    while (dst-- != base) {
+	if (*dst == '\n') {
+	    break;
+	} else if (isblank(UCH(*dst))) {
+	    count++;
+	} else {
+	    break;
+	}
+    }
+    return (count > 1);
+}
+
+/*
+ * Change embedded "\n" substrings to '\n' characters and tabs to single
+ * spaces.  If there are no "\n"s, it will strip all extra spaces, for
+ * justification.  If it has "\n"'s, it will preserve extra spaces.  If cr_wrap
+ * is set, it will preserve '\n's.
+ */
+void
+dlg_trim_string(char *s)
+{
+    char *base = s;
+    char *p1;
+    char *p = s;
+    int has_newlines = !dialog_vars.no_nl_expand && (strstr(s, "\\n") != 0);
+
+    while (*p != '\0') {
+	if (*p == TAB && !dialog_vars.nocollapse)
+	    *p = ' ';
+
+	if (has_newlines) {	/* If prompt contains "\n" strings */
+	    if (*p == '\\' && *(p + 1) == 'n') {
+		*s++ = '\n';
+		p += 2;
+		p1 = p;
+		/*
+		 * Handle end of lines intelligently.  If '\n' follows "\n"
+		 * then ignore the '\n'.  This eliminates the need to escape
+		 * the '\n' character (no need to use "\n\").
+		 */
+		while (isblank(UCH(*p1)))
+		    p1++;
+		if (*p1 == '\n')
+		    p = p1 + 1;
+	    } else if (*p == '\n') {
+		if (dialog_vars.cr_wrap)
+		    *s++ = *p++;
+		else {
+		    /* Replace the '\n' with a space if cr_wrap is not set */
+		    if (!trim_blank(base, p))
+			*s++ = ' ';
+		    p++;
+		}
+	    } else		/* If *p != '\n' */
+		*s++ = *p++;
+	} else if (dialog_vars.trim_whitespace) {
+	    if (isblank(UCH(*p))) {
+		if (!isblank(UCH(*(s - 1)))) {
+		    *s++ = ' ';
+		    p++;
+		} else
+		    p++;
+	    } else if (*p == '\n') {
+		if (dialog_vars.cr_wrap)
+		    *s++ = *p++;
+		else if (!isblank(UCH(*(s - 1)))) {
+		    /* Strip '\n's if cr_wrap is not set. */
+		    *s++ = ' ';
+		    p++;
+		} else
+		    p++;
+	    } else
+		*s++ = *p++;
+	} else {		/* If there are no "\n" strings */
+	    if (isblank(UCH(*p)) && !dialog_vars.nocollapse) {
+		if (!trim_blank(base, p))
+		    *s++ = *p;
+		p++;
+	    } else
+		*s++ = *p++;
+	}
+    }
+
+    *s = '\0';
+}
+
+void
+dlg_set_focus(WINDOW *parent, WINDOW *win)
+{
+    if (win != 0) {
+	(void) wmove(parent,
+		     getpary(win) + getcury(win),
+		     getparx(win) + getcurx(win));
+	(void) wnoutrefresh(win);
+	(void) doupdate();
+    }
+}
+
+/*
+ * Returns the nominal maximum buffer size.
+ */
+int
+dlg_max_input(int max_len)
+{
+    if (dialog_vars.max_input != 0 && dialog_vars.max_input < MAX_LEN)
+	max_len = dialog_vars.max_input;
+
+    return max_len;
+}
+
+/*
+ * Free storage used for the result buffer.
+ */
+void
+dlg_clr_result(void)
+{
+    if (dialog_vars.input_length) {
+	dialog_vars.input_length = 0;
+	if (dialog_vars.input_result)
+	    free(dialog_vars.input_result);
+    }
+    dialog_vars.input_result = 0;
+}
+
+/*
+ * Setup a fixed-buffer for the result.
+ */
+char *
+dlg_set_result(const char *string)
+{
+    unsigned need = string ? (unsigned) strlen(string) + 1 : 0;
+
+    /* inputstr.c needs a fixed buffer */
+    if (need < MAX_LEN)
+	need = MAX_LEN;
+
+    /*
+     * If the buffer is not big enough, allocate a new one.
+     */
+    if (dialog_vars.input_length != 0
+	|| dialog_vars.input_result == 0
+	|| need > MAX_LEN) {
+
+	dlg_clr_result();
+
+	dialog_vars.input_length = need;
+	dialog_vars.input_result = dlg_malloc(char, need);
+	assert_ptr(dialog_vars.input_result, "dlg_set_result");
+    }
+
+    strcpy(dialog_vars.input_result, string ? string : "");
+
+    return dialog_vars.input_result;
+}
+
+/*
+ * Accumulate results in dynamically allocated buffer.
+ * If input_length is zero, it is a MAX_LEN buffer belonging to the caller.
+ */
+void
+dlg_add_result(const char *string)
+{
+    unsigned have = (dialog_vars.input_result
+		     ? (unsigned) strlen(dialog_vars.input_result)
+		     : 0);
+    unsigned want = (unsigned) strlen(string) + 1 + have;
+
+    if ((want >= MAX_LEN)
+	|| (dialog_vars.input_length != 0)
+	|| (dialog_vars.input_result == 0)) {
+
+	if (dialog_vars.input_length == 0
+	    || dialog_vars.input_result == 0) {
+
+	    char *save_result = dialog_vars.input_result;
+
+	    dialog_vars.input_length = want * 2;
+	    dialog_vars.input_result = dlg_malloc(char, dialog_vars.input_length);
+	    assert_ptr(dialog_vars.input_result, "dlg_add_result malloc");
+	    dialog_vars.input_result[0] = '\0';
+	    if (save_result != 0)
+		strcpy(dialog_vars.input_result, save_result);
+	} else if (want >= dialog_vars.input_length) {
+	    dialog_vars.input_length = want * 2;
+	    dialog_vars.input_result = dlg_realloc(char,
+						   dialog_vars.input_length,
+						   dialog_vars.input_result);
+	    assert_ptr(dialog_vars.input_result, "dlg_add_result realloc");
+	}
+    }
+    strcat(dialog_vars.input_result, string);
+}
+
+/*
+ * These are characters that (aside from the quote-delimiter) will have to
+ * be escaped in a single- or double-quoted string.
+ */
+#define FIX_SINGLE "\n\\"
+#define FIX_DOUBLE FIX_SINGLE "[]{}?*;`~#$^&()|<>"
+
+/*
+ * Returns the quote-delimiter.
+ */
+static const char *
+quote_delimiter(void)
+{
+    return dialog_vars.single_quoted ? "'" : "\"";
+}
+
+/*
+ * Returns true if we should quote the given string.
+ */
+static bool
+must_quote(char *string)
+{
+    bool code = FALSE;
+
+    if (*string != '\0') {
+	size_t len = strlen(string);
+	if (strcspn(string, quote_delimiter()) != len)
+	    code = TRUE;
+	else if (strcspn(string, "\n\t ") != len)
+	    code = TRUE;
+	else
+	    code = (strcspn(string, FIX_DOUBLE) != len);
+    } else {
+	code = TRUE;
+    }
+
+    return code;
+}
+
+/*
+ * Add a quoted string to the result buffer.
+ */
+void
+dlg_add_quoted(char *string)
+{
+    char temp[2];
+    const char *my_quote = quote_delimiter();
+    const char *must_fix = (dialog_vars.single_quoted
+			    ? FIX_SINGLE
+			    : FIX_DOUBLE);
+
+    if (must_quote(string)) {
+	temp[1] = '\0';
+	dlg_add_result(my_quote);
+	while (*string != '\0') {
+	    temp[0] = *string++;
+	    if ((strchr) (my_quote, *temp) || (strchr) (must_fix, *temp))
+		dlg_add_result("\\");
+	    dlg_add_result(temp);
+	}
+	dlg_add_result(my_quote);
+    } else {
+	dlg_add_result(string);
+    }
+}
+
+/*
+ * When adding a result, make that depend on whether "--quoted" is used.
+ */
+void
+dlg_add_string(char *string)
+{
+    if (dialog_vars.quoted) {
+	dlg_add_quoted(string);
+    } else {
+	dlg_add_result(string);
+    }
+}
+
+bool
+dlg_need_separator(void)
+{
+    bool result = FALSE;
+
+    if (dialog_vars.output_separator) {
+	result = TRUE;
+    } else if (dialog_vars.input_result && *(dialog_vars.input_result)) {
+	result = TRUE;
+    }
+    return result;
+}
+
+void
+dlg_add_separator(void)
+{
+    const char *separator = (dialog_vars.separate_output) ? "\n" : " ";
+
+    if (dialog_vars.output_separator)
+	separator = dialog_vars.output_separator;
+
+    dlg_add_result(separator);
+}
+
+#define HELP_PREFIX		"HELP "
+
+void
+dlg_add_help_listitem(int *result, char **tag, DIALOG_LISTITEM * item)
+{
+    dlg_add_result(HELP_PREFIX);
+    if (USE_ITEM_HELP(item->help)) {
+	*tag = dialog_vars.help_tags ? item->name : item->help;
+	*result = DLG_EXIT_ITEM_HELP;
+    } else {
+	*tag = item->name;
+    }
+}
+
+void
+dlg_add_help_formitem(int *result, char **tag, DIALOG_FORMITEM * item)
+{
+    dlg_add_result(HELP_PREFIX);
+    if (USE_ITEM_HELP(item->help)) {
+	*tag = dialog_vars.help_tags ? item->name : item->help;
+	*result = DLG_EXIT_ITEM_HELP;
+    } else {
+	*tag = item->name;
+    }
+}
+
+/*
+ * Some widgets support only one value of a given variable - save/restore the
+ * global dialog_vars so we can override it consistently.
+ */
+void
+dlg_save_vars(DIALOG_VARS * vars)
+{
+    *vars = dialog_vars;
+}
+
+/*
+ * Most of the data in DIALOG_VARS is normally set by command-line options.
+ * The input_result member is an exception; it is normally set by the dialog
+ * library to return result values.
+ */
+void
+dlg_restore_vars(DIALOG_VARS * vars)
+{
+    char *save_result = dialog_vars.input_result;
+    unsigned save_length = dialog_vars.input_length;
+
+    dialog_vars = *vars;
+    dialog_vars.input_result = save_result;
+    dialog_vars.input_length = save_length;
+}
+
+/*
+ * Called each time a widget is invoked which may do output, increment a count.
+ */
+void
+dlg_does_output(void)
+{
+    dialog_state.output_count += 1;
+}
+
+/*
+ * Compatibility for different versions of curses.
+ */
+#if !(defined(HAVE_GETBEGX) && defined(HAVE_GETBEGY))
+int
+dlg_getbegx(WINDOW *win)
+{
+    int y, x;
+    getbegyx(win, y, x);
+    (void) y;
+    return x;
+}
+int
+dlg_getbegy(WINDOW *win)
+{
+    int y, x;
+    getbegyx(win, y, x);
+    (void) x;
+    return y;
+}
+#endif
+
+#if !(defined(HAVE_GETCURX) && defined(HAVE_GETCURY))
+int
+dlg_getcurx(WINDOW *win)
+{
+    int y, x;
+    getyx(win, y, x);
+    (void) y;
+    return x;
+}
+int
+dlg_getcury(WINDOW *win)
+{
+    int y, x;
+    getyx(win, y, x);
+    (void) x;
+    return y;
+}
+#endif
+
+#if !(defined(HAVE_GETMAXX) && defined(HAVE_GETMAXY))
+int
+dlg_getmaxx(WINDOW *win)
+{
+    int y, x;
+    getmaxyx(win, y, x);
+    (void) y;
+    return x;
+}
+int
+dlg_getmaxy(WINDOW *win)
+{
+    int y, x;
+    getmaxyx(win, y, x);
+    (void) x;
+    return y;
+}
+#endif
+
+#if !(defined(HAVE_GETPARX) && defined(HAVE_GETPARY))
+int
+dlg_getparx(WINDOW *win)
+{
+    int y, x;
+    getparyx(win, y, x);
+    (void) y;
+    return x;
+}
+int
+dlg_getpary(WINDOW *win)
+{
+    int y, x;
+    getparyx(win, y, x);
+    (void) x;
+    return y;
+}
+#endif
+
+#ifdef NEED_WGETPARENT
+WINDOW *
+dlg_wgetparent(WINDOW *win)
+{
+#undef wgetparent
+    WINDOW *result = 0;
+    DIALOG_WINDOWS *p;
+
+    for (p = dialog_state.all_subwindows; p != 0; p = p->next) {
+	if (p->shadow == win) {
+	    result = p->normal;
+	    break;
+	}
+    }
+    return result;
+}
+#endif
Index: build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/dialog.m4
===================================================================
--- build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/dialog.m4	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/dialog.m4	(revision 323)
@@ -0,0 +1,324 @@
+dnl #
+dnl # /usr/share/aclocal/dialog.m4
+dnl #
+dnl # Configure paths for dialog
+dnl # Andrew V.Kosteltsev
+
+dnl ============================================================
+dnl
+dnl  Synopsis:
+dnl     AC_CHECK_DIALOG([MIN-VERSION [,                  # minimum dialog version, e.g. 1.3-20190211
+dnl                           DEFAULT-WITH-DIALOG [,     # default value for --with-dialog option
+dnl                           DEFAULT-WITH-DIALOG-TEST [,# default value for --with-dialog-test option
+dnl                           EXTEND-VARS [,                  # whether CFLAGS/LDFLAGS/etc are extended
+dnl                           ACTION-IF-FOUND [,              # action to perform if dialog was found
+dnl                           ACTION-IF-NOT-FOUND             # action to perform if dialog was not found
+dnl                          ]]]]]])
+dnl  Examples:
+dnl     AC_CHECK_DIALOG(1.3-20210621)
+dnl     AC_CHECK_DIALOG(1.3-20210621,,,no,CFLAGS="$CFLAGS -DHAVE_DIALOG $DIALOG_CFLAGS")
+dnl     AC_CHECK_DIALOG(1.3-20210621,yes,yes,yes,CFLAGS="$CFLAGS -DHAVE_DIALOG")
+dnl
+dnl
+dnl  If you have to change prefix returned by dialog-config script or change
+dnl  location of dialog-config, you may set environment variable DIALOG_CONFIG,
+dnl  for example:
+dnl
+dnl  # export DIALOG_CONFIG="dialog-config --prefix=/usr/local"
+dnl  # export DIALOG_CONFIG="/usr/bin/dialog-config --prefix=/usr/local"
+dnl
+dnl ============================================================
+dnl
+dnl ============================================================
+dnl  auxilliary macros
+dnl ============================================================
+AC_DEFUN([_AC_DIALOG_ERROR], [dnl
+AC_MSG_RESULT([*FAILED*])
+cat <<EOT | sed -e 's/^[[ 	]]*/ | /' -e 's/>>/  /' 1>&2
+$1
+EOT
+exit 1
+])
+
+AC_DEFUN([_AC_DIALOG_VERBOSE], [dnl
+if test ".$verbose" = .yes; then
+    AC_MSG_RESULT([  $1])
+fi
+])
+
+dnl ============================================================
+dnl  the user macro
+dnl ============================================================
+AC_DEFUN([AC_CHECK_DIALOG], [dnl
+dnl
+dnl ============================================================
+dnl  prerequisites
+dnl ============================================================
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_CPP])dnl
+dnl
+dnl ============================================================
+dnl  set DIALOG_CONFIG variable
+dnl ============================================================
+if test -z "$DIALOG_CONFIG"; then
+  DIALOG_CONFIG='dialog-config'
+fi
+dnl
+DIALOG_CFLAGS=''
+DIALOG_LDFLAGS=''
+DIALOG_LIBS=''
+AC_SUBST(DIALOG_CFLAGS)
+AC_SUBST(DIALOG_LDFLAGS)
+AC_SUBST(DIALOG_LIBS)
+dnl
+dnl ============================================================
+dnl  command line options
+dnl ============================================================
+_AC_DIALOG_VERBOSE([])
+AC_ARG_WITH(dialog,dnl
+[  --with-dialog[=ARG]       Build with dialog Library  (default=]ifelse([$2],,yes,$2)[)],dnl
+,dnl
+with_dialog="ifelse([$2],,yes,$2)"
+)dnl
+AC_ARG_WITH(dialog-test,dnl
+[  --with-dialog-test      Perform dialog Sanity Test (default=]ifelse([$3],,yes,$3)[)],dnl
+,dnl
+with_dialog_test="ifelse([$3],,yes,$3)"
+)dnl
+_AC_DIALOG_VERBOSE([+ Command Line Options:])
+_AC_DIALOG_VERBOSE([    o --with-dialog=$with_dialog])
+_AC_DIALOG_VERBOSE([    o --with-dialog-test=$with_dialog_test])
+dnl
+dnl ============================================================
+dnl  configuration
+dnl ============================================================
+if test ".$with_dialog" != .no; then
+    dialog_subdir=no
+    dialog_subdir_opts=''
+    case "$with_dialog" in
+        subdir:* )
+            dialog_subdir=yes
+            changequote(, )dnl
+            dialog_subdir_opts=`echo $with_dialog | sed -e 's/^subdir:[^ 	]*[ 	]*//'`
+            with_dialog=`echo $with_dialog | sed -e 's/^subdir:\([^ 	]*\).*$/\1/'`
+            changequote([, ])dnl
+            ;;
+    esac
+    dialog_version=""
+    dialog_location=""
+    dialog_type=""
+    dialog_cflags=""
+    dialog_ldflags=""
+    dialog_libs=""
+    if test ".$with_dialog" = .yes; then
+        #   via config script in $PATH
+        changequote(, )dnl
+        dialog_version=`($DIALOG_CONFIG --version) 2>/dev/null |\
+                      sed -e 's/^.*\([0-9]\.[0-9]*[-][0-9]*\).*$/\1/'`
+        changequote([, ])dnl
+        if test ".$dialog_version" != .; then
+            dialog_location=`$DIALOG_CONFIG --prefix`
+            dialog_type='installed'
+            dialog_cflags=`$DIALOG_CONFIG --cflags`
+            dialog_ldflags=`$DIALOG_CONFIG --ldflags`
+            dialog_libs=`$DIALOG_CONFIG --libs`
+        fi
+    elif test -d "$with_dialog"; then
+        with_dialog=`echo $with_dialog | sed -e 's;/*$;;'`
+        dialog_found=no
+        #   via config script under a specified directory
+        #   (a standard installation, but not a source tree)
+        if test ".$dialog_found" = .no; then
+            for _dir in $with_dialog/bin $with_dialog; do
+                if test -f "$_dir/dialog-config"; then
+                    test -f "$_dir/dialog-config.in" && continue # dialog-config in source tree!
+                    changequote(, )dnl
+                    dialog_version=`($_dir/dialog-config --version) 2>/dev/null |\
+                                  sed -e 's/^.*\([0-9]\.[0-9]*[.][0-9]*\).*$/\1/'`
+                    changequote([, ])dnl
+                    if test ".$dialog_version" != .; then
+                        dialog_location=`$_dir/dialog-config --prefix`
+                        dialog_type="installed"
+                        dialog_cflags=`$_dir/dialog-config --cflags`
+                        dialog_ldflags=`$_dir/dialog-config --ldflags`
+                        dialog_libs=`$_dir/dialog-config --libs`
+                        dialog_found=yes
+                        break
+                    fi
+                fi
+            done
+        fi
+    fi
+    _AC_DIALOG_VERBOSE([+ Determined Location:])
+    _AC_DIALOG_VERBOSE([    o path: $dialog_location])
+    _AC_DIALOG_VERBOSE([    o type: $dialog_type])
+    if test ".$dialog_version" = .; then
+        if test ".$with_dialog" != .yes; then
+             _AC_DIALOG_ERROR([dnl
+             Unable to locate dialog under $with_dialog.
+             Please specify the correct path to either a dialog installation tree
+             (use --with-dialog=DIR if you used --prefix=DIR for installing dialog in
+             the past).])
+        else
+             _AC_DIALOG_ERROR([dnl
+             Unable to locate dialog in any system-wide location (see \$PATH).
+             Please specify the correct path to either a dialog installation tree
+             (use --with-dialog=DIR if you used --prefix=DIR for installing dialog in
+             the past, or set the DIALOG_CONFIG environment variable to the full path
+             to dialog-config).])
+        fi
+    fi
+    dnl ========================================================
+    dnl  Check whether the found version is sufficiently new
+    dnl ========================================================
+    _req_version="ifelse([$1],,1.0.0,$1)"
+    for _var in dialog_version _req_version; do
+        eval "_val=\"\$${_var}\""
+        _major=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[.]]\)\([[0-9]]*\)/\1/'`
+        _minor=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[.]]\)\([[0-9]]*\)/\2/'`
+        _micro=`echo $_val | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\([[.]]\)\([[0-9]]*\)/\4/'`
+        _hex=`echo dummy | awk '{ printf("%d%02d%02d", major, minor, micro); }' \
+              "major=$_major" "minor=$_minor" "micro=$_micro"`
+        eval "${_var}_hex=\"\$_hex\""
+    done
+    _AC_DIALOG_VERBOSE([+ Determined Versions:])
+    _AC_DIALOG_VERBOSE([    o existing: $dialog_version -> 0x$dialog_version_hex])
+    _AC_DIALOG_VERBOSE([    o required: $_req_version -> 0x$_req_version_hex])
+    _ok=0
+    if test ".$dialog_version_hex" != .; then
+        if test ".$_req_version_hex" != .; then
+            if test $dialog_version_hex -ge $_req_version_hex; then
+                _ok=1
+            fi
+        fi
+    fi
+    if test ".$_ok" = .0; then
+        _AC_DIALOG_ERROR([dnl
+        Found dialog version $dialog_version, but required at least version $_req_version.
+        Upgrade dialog under $dialog_location to $_req_version or higher first, please.])
+    fi
+    dnl ========================================================
+    dnl  Perform dialog Sanity Compile Check
+    dnl ========================================================
+    if test ".$with_dialog_test" = .yes; then
+        _ac_save_CFLAGS="$CFLAGS"
+        _ac_save_LDFLAGS="$LDFLAGS"
+        _ac_save_LIBS="$LIBS"
+        CFLAGS="$CFLAGS $dialog_cflags"
+        LDFLAGS="$LDFLAGS $dialog_ldflags"
+        LIBS="$LIBS $dialog_libs"
+        _AC_DIALOG_VERBOSE([+ Test Build Environment:])
+        _AC_DIALOG_VERBOSE([    o CFLAGS="$CFLAGS"])
+        _AC_DIALOG_VERBOSE([    o LDFLAGS="$LDFLAGS"])
+        _AC_DIALOG_VERBOSE([    o LIBS="$LIBS"])
+        cross_compile=no
+        define([_code1], [
+#include <stdlib.h>
+#include <stdio.h>
+#include <strings.h>  /* index(3)    */
+
+#include <dialog.h>
+#include <dlg_colors.h>
+#include <dlg_keys.h>
+        ])
+        define([_code2], [
+  int status = 0;
+
+  bzero( (void *)&dialog_vars, sizeof(DIALOG_VARS) );
+
+  init_dialog(stdin, stdout);
+
+  dialog_vars.colors = 1;
+  dialog_vars.backtitle = "Test dialog Library";
+  dialog_vars.dlg_clear_screen = 1;
+  dialog_vars.sleep_secs = 1;
+
+
+  dlg_put_backtitle();
+
+  /*************************************************
+    Ruler: 68 characters + 2 spaces left and right:
+
+                           | ----handy-ruler----------------------------------------------------- | */
+  status = dialog_msgbox( " Dialog ==>libdialog<== [required] ",
+                          "\nPackage is installed and corect.\n",
+                          5, 72, 0 );
+
+  if( dialog_vars.sleep_secs )
+    (void)napms(dialog_vars.sleep_secs * 1000);
+
+  if( dialog_vars.dlg_clear_screen )
+  {
+    dlg_clear();
+    (void)refresh();
+  }
+  end_dialog();
+        ])
+        _AC_DIALOG_VERBOSE([+ Performing Sanity Checks:])
+        _AC_DIALOG_VERBOSE([    o pre-processor test])
+        AC_PREPROC_IFELSE([AC_LANG_PROGRAM([_code1], [_code2])], [_ok=yes], [_ok=no])
+        if test ".$_ok" != .yes; then
+            _AC_DIALOG_ERROR([dnl
+            Found dialog $dialog_version under $dialog_location, but
+            was unable to perform a sanity pre-processor check. This means
+            the dialog header dialog.h was not found.
+            We used the following build environment:
+            >> CPP="$CPP"
+            See config.log for possibly more details.])
+        fi
+        _AC_DIALOG_VERBOSE([    o link check])
+        AC_LINK_IFELSE([AC_LANG_PROGRAM([_code1], [_code2])], [_ok=yes], [_ok=no])
+        if test ".$_ok" != .yes; then
+            _AC_DIALOG_ERROR([dnl
+            Found dialog $dialog_version under $dialog_location, but
+            was unable to perform a sanity linker check. This means
+            the dialog library libdialog.a was not found.
+            We used the following build environment:
+            >> CC="$CC"
+            >> CFLAGS="$CFLAGS"
+            >> LDFLAGS="$LDFLAGS"
+            >> LIBS="$LIBS"
+            See config.log for possibly more details.])
+        fi
+        _extendvars="ifelse([$4],,yes,$4)"
+        if test ".$_extendvars" != .yes; then
+            CFLAGS="$_ac_save_CFLAGS"
+            LDFLAGS="$_ac_save_LDFLAGS"
+            LIBS="$_ac_save_LIBS"
+        fi
+    else
+        _extendvars="ifelse([$4],,yes,$4)"
+        if test ".$_extendvars" = .yes; then
+            if test ".$dialog_subdir" = .yes; then
+                CFLAGS="$CFLAGS $dialog_cflags"
+                LDFLAGS="$LDFLAGS $dialog_ldflags"
+                LIBS="$LIBS $dialog_libs"
+            fi
+        fi
+    fi
+    DIALOG_CFLAGS="$dialog_cflags"
+    DIALOG_LDFLAGS="$dialog_ldflags"
+    DIALOG_LIBS="$dialog_libs"
+    AC_SUBST(DIALOG_CFLAGS)
+    AC_SUBST(DIALOG_LDFLAGS)
+    AC_SUBST(DIALOG_LIBS)
+
+    AC_SUBST(HAVE_DIALOG, [1])
+
+    AC_CHECK_HEADERS(dialog.h dlg_colors.h dlg_keys.h)
+
+    _AC_DIALOG_VERBOSE([+ Final Results:])
+    _AC_DIALOG_VERBOSE([    o DIALOG_CFLAGS="$DIALOG_CFLAGS"])
+    _AC_DIALOG_VERBOSE([    o DIALOG_LDFLAGS="$DIALOG_LDFLAGS"])
+    _AC_DIALOG_VERBOSE([    o DIALOG_LIBS="$DIALOG_LIBS"])
+fi
+if test ".$with_dialog" != .no; then
+    AC_MSG_CHECKING(for libdialog)
+    AC_MSG_RESULT([version $dialog_version, $dialog_type under $dialog_location])
+    ifelse([$5], , :, [$5])
+else
+    AC_MSG_CHECKING(for libdialog)
+    AC_MSG_RESULT([no])
+    ifelse([$6], , :, [$6])
+fi
+])
Index: build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/dialog-config.in
===================================================================
--- build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/dialog-config.in	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/dialog-config.in	(revision 323)
@@ -0,0 +1,265 @@
+#!@SHELL@
+# $Id: dialog-config.in,v 1.14 2021/03/05 23:48:36 tom Exp $
+##############################################################################
+# Copyright (c) 2007-2019,2021 Thomas E. Dickey                              #
+#                                                                            #
+# Permission is hereby granted, free of charge, to any person obtaining a    #
+# copy of this software and associated documentation files (the "Software"), #
+# to deal in the Software without restriction, including without limitation  #
+# the rights to use, copy, modify, merge, publish, distribute, distribute    #
+# with modifications, sublicense, and/or sell copies of the Software, and to #
+# permit persons to whom the Software is furnished to do so, subject to the  #
+# following conditions:                                                      #
+#                                                                            #
+# The above copyright notice and this permission notice shall be included in #
+# all copies or substantial portions of the Software.                        #
+#                                                                            #
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,   #
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL    #
+# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER      #
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING    #
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER        #
+# DEALINGS IN THE SOFTWARE.                                                  #
+#                                                                            #
+# Except as contained in this notice, the name(s) of the above copyright     #
+# holders shall not be used in advertising or otherwise to promote the sale, #
+# use or other dealings in this Software without prior written               #
+# authorization.                                                             #
+##############################################################################
+
+prefix="@prefix@"
+exec_prefix="@exec_prefix@"
+datarootdir="@datarootdir@"
+
+same_prefix=yes
+same_exec_prefix=yes
+
+THIS="@PACKAGE@"
+
+test $# = 0 && exec @SHELL@ "$0" --error
+
+while test $# -gt 0; do
+
+	# (re)evaluate symbols that may depend upon $prefix
+	if [ "x$same_prefix" != "xyes" ]
+	then
+		eval exec_prefix='@exec_prefix@'
+		eval datarootdir='@datarootdir@'
+	elif [ "x$same_exec_prefix" != "xyes" ]
+	then
+		eval datarootdir='@datarootdir@'
+	fi
+
+	eval bindir='"@bindir@"'
+	eval includedir='"@includedir@"'
+	eval libdir='"@libdir@"'
+	eval datadir='"@datadir@"'
+	eval mandir='"@mandir@"'
+
+	[ -z "$includedir" ] && includedir="${prefix}/include" 
+
+	eval LDFLAGS='"@LDFLAGS@"'
+	eval LIBS='"@LIBS@"'
+	LIBS="-l${THIS} $LIBS"
+
+	# If the directory given by --libdir is not in the LDFLAGS+LIBS set,
+	# prepend it to LDFLAGS to help link this application's library.
+	found=no
+	for opt in $LDFLAGS $LIBS
+	do
+		if [ "x$-L${libdir}" = "x$opt" ]
+		then
+			found=yes
+			break
+		fi
+	done
+	if [ $found = no ]
+	then
+		[ -n "$LFLAGS" ] && LDFLAGS=" $LFDLAGS"
+		LDFLAGS="-L${libdir}$LDFLAGS"
+	fi
+	[ -z "$LDFLAGS" ] && LDFLAGS="-L${libdir}"
+
+	# Ignore -L options which do not correspond to an actual directory,
+	# or which are standard library directories (i.e., the linker is
+	# supposed to search those directories).
+	#
+	# There is no portable way to find the list of standard library
+	# directories.  Require a POSIX shell anyway, to keep this simple.
+	lib_flags=
+	for opt in $LDFLAGS $LIBS
+	do
+		case $opt in
+		-L*)
+			opt_lib=`echo "x$opt" | sed -e 's/^x-L//'`
+			[ -d "$opt_lib" ] || continue
+			case "$opt_lib" in
+			@LD_SEARCHPATH@) # skip standard libdir
+				continue
+				;;
+			*)
+				;;
+			esac
+			;;
+		esac
+		lib_flags="$lib_flags $opt"
+	done
+
+	case "$1" in
+	-*=*)
+		ARG=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'`
+		;;
+	*)
+		ARG=
+		;;
+	esac
+
+	case "$1" in
+	# basic configuration
+	--prefix=*)
+		prefix="$ARG"
+		test -z "$exec_prefix" && exec_prefix="$ARG"
+		same_prefix=no
+		;;
+	--prefix)
+		echo "$prefix"
+		;;
+	--exec-prefix=*)
+		exec_prefix="$ARG"
+		same_exec_prefix=no
+		;;
+	--exec-prefix)
+		echo "$exec_prefix"
+		;;
+	# compile/link
+	--cflags|--cflags-only-I)
+		INCS="-I$includedir"
+		sed -e 's,^[ ]*,,' -e 's, [ ]*, ,g' -e 's,[ ]*$,,' <<-ENDECHO
+			$INCS
+ENDECHO
+		;;
+	--cflags-only-other)
+		# no -D/-U options should be needed
+		echo
+		;;
+	--ldflags)
+		OPTS=
+		for opt in $LDFLAGS $LIBS
+		do
+			case "x$opt" in
+			x-[^l]*)
+				OPTS="$OPTS $opt"
+				;;
+			esac
+		done
+		printf "%s\n" "$OPTS"
+		;;
+	--libs)
+		OPTS=
+		for opt in $lib_flags
+		do
+			[ -n "$OPTS" ] && OPTS="$OPTS "
+			OPTS="${OPTS}${opt}"
+		done
+		printf "%s\n" "$OPTS"
+		;;
+	--libs-only-L)
+		OPTS=
+		for opt in $lib_flags
+		do
+			case "x$opt" in
+			x-L*)
+				[ -n "$OPTS" ] && OPTS="$OPTS "
+				OPTS="${OPTS}${opt}"
+				;;
+			esac
+		done
+		printf "%s\n" "$OPTS"
+		;;
+	--libs-only-l)
+		OPTS=
+		for opt in $lib_flags
+		do
+			case "x$opt" in
+			x-l*)
+				[ -n "$OPTS" ] && OPTS="$OPTS "
+				OPTS="${OPTS}${opt}"
+				;;
+			esac
+		done
+		printf "%s\n" "$OPTS"
+		;;
+	--libs-only-other)
+		OPTS=
+		for opt in $lib_flags
+		do
+			case "x$opt" in
+			x-[lL]*)
+				;;
+			*)
+				[ -n "$OPTS" ] && OPTS="$OPTS "
+				OPTS="${OPTS}${opt}"
+				;;
+			esac
+		done
+		printf "%s\n" "$OPTS"
+		;;
+	# identification
+	--version)
+		echo "@VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@"
+		;;
+	--abi-version)
+		echo "@VERSION@" | sed -e 's/:/./g'
+		;;
+	# locations
+	--bindir)
+		echo "${bindir}"
+		;;
+	--datadir)
+		echo "${datadir}"
+		;;
+	--libdir)
+		echo "${libdir}"
+		;;
+	--mandir)
+		echo "${mandir}"
+		;;
+	# general info
+	--help)
+		cat <<ENDHELP
+Usage: ${THIS}-config [options]
+
+Options:
+  --prefix           echos the package-prefix of ${THIS}
+  --prefix=ARG       sets the package-prefix of ${THIS}
+  --exec-prefix      echos the executable-prefix of ${THIS}
+  --exec-prefix=ARG  sets the executable-prefix of ${THIS}
+
+  --cflags           echos the C compiler flags needed to compile with ${THIS}
+  --ldflags          echos the linker flags needed to link with ${THIS}
+
+  --libs             echos the libraries needed to link with ${THIS}
+  --libs-only-L      echos -L linker options (search path) for ${THIS}
+  --libs-only-l      echos -l linker options (libraries) for ${THIS}
+  --libs-only-other  echos linker options other than -L/-l
+
+  --version          echos the release+patchdate version of ${THIS}
+  --abi-version      echos the ABI version of ${THIS}
+
+  --bindir           echos the directory containing ${THIS} programs
+  --datadir          echos the directory containing ${THIS} data
+  --libdir           echos the directory containing ${THIS} libraries
+  --mandir           echos the directory containing ${THIS} manual pages
+
+  --help             prints this message
+ENDHELP
+		;;
+	--error|*)
+		@SHELL@ "$0" --help 1>&2
+		exit 1
+		;;
+	esac
+	shift
+done
+# vile:shmode
Index: build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/fselect.c
===================================================================
--- build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/fselect.c	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/dialog-1.3-20210621-new/fselect.c	(revision 323)
@@ -0,0 +1,971 @@
+/*
+ *  $Id: fselect.c,v 1.117 2021/06/21 19:50:35 tom Exp $
+ *
+ *  fselect.c -- implements the file-selector box
+ *
+ *  Copyright 2000-2020,2021	Thomas E. Dickey
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Lesser General Public License, version 2.1
+ *  as published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to
+ *	Free Software Foundation, Inc.
+ *	51 Franklin St., Fifth Floor
+ *	Boston, MA 02110, USA.
+ */
+
+#include <dlg_internals.h>
+#include <dlg_keys.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#if HAVE_DIRENT_H
+# include <dirent.h>
+# define NAMLEN(dirent) strlen((dirent)->d_name)
+#else
+# define dirent direct
+# define NAMLEN(dirent) (dirent)->d_namlen
+# if HAVE_SYS_NDIR_H
+#  include <sys/ndir.h>
+# endif
+# if HAVE_SYS_DIR_H
+#  include <sys/dir.h>
+# endif
+# if HAVE_NDIR_H
+#  include <ndir.h>
+# endif
+#endif
+
+# if defined(_FILE_OFFSET_BITS) && defined(HAVE_STRUCT_DIRENT64)
+#  if !defined(_LP64) && (_FILE_OFFSET_BITS == 64)
+#   define      DIRENT  struct dirent64
+#  else
+#   define      DIRENT  struct dirent
+#  endif
+# else
+#  define       DIRENT  struct dirent
+# endif
+
+#define EXT_WIDE 1
+#define HDR_HIGH 1
+#define BTN_HIGH (1 + 2 * MARGIN)	/* Ok/Cancel, also input-box */
+#define MIN_HIGH (HDR_HIGH - MARGIN + (BTN_HIGH * 2) + 4 * MARGIN)
+#define MIN_WIDE (2 * MAX(dlg_count_columns(d_label), dlg_count_columns(f_label)) + 6 * MARGIN + 2 * EXT_WIDE)
+
+#define MOUSE_D (KEY_MAX + 0)
+#define MOUSE_F (KEY_MAX + 10000)
+#define MOUSE_T (KEY_MAX + 20000)
+
+typedef enum {
+    sDIRS = -3
+    ,sFILES = -2
+    ,sTEXT = -1
+} STATES;
+
+typedef struct {
+    WINDOW *par;		/* parent window */
+    WINDOW *win;		/* this window */
+    int length;			/* length of the data[] array */
+    int offset;			/* index of first item on screen */
+    int choice;			/* index of the selection */
+    int mousex;			/* base of mouse-code return-values */
+    unsigned allocd;
+    char **data;
+} LIST;
+
+typedef struct {
+    int length;
+    char **data;
+} MATCH;
+
+static void
+init_list(LIST * list, WINDOW *par, WINDOW *win, int mousex)
+{
+    list->par = par;
+    list->win = win;
+    list->length = 0;
+    list->offset = 0;
+    list->choice = 0;
+    list->mousex = mousex;
+    list->allocd = 0;
+    list->data = 0;
+    dlg_mouse_mkbigregion(getbegy(win), getbegx(win),
+			  getmaxy(win), getmaxx(win),
+			  mousex, 1, 1, 1 /* by lines */ );
+}
+
+static char *
+leaf_of(char *path)
+{
+    char *leaf = strrchr(path, '/');
+    if (leaf != 0)
+	leaf++;
+    else
+	leaf = path;
+    return leaf;
+}
+
+static char *
+data_of(LIST * list)
+{
+    if (list != 0
+	&& list->data != 0)
+	return list->data[list->choice];
+    return 0;
+}
+
+static void
+free_list(LIST * list, int reinit)
+{
+    if (list->data != 0) {
+	int n;
+
+	for (n = 0; list->data[n] != 0; n++)
+	    free(list->data[n]);
+	free(list->data);
+	list->data = 0;
+    }
+    if (reinit)
+	init_list(list, list->par, list->win, list->mousex);
+}
+
+static void
+add_to_list(LIST * list, char *text)
+{
+    unsigned need;
+
+    need = (unsigned) (list->length + 1);
+    if (need + 1 > list->allocd) {
+	list->allocd = 2 * (need + 1);
+	if (list->data == 0) {
+	    list->data = dlg_malloc(char *, list->allocd);
+	} else {
+	    list->data = dlg_realloc(char *, list->allocd, list->data);
+	}
+	assert_ptr(list->data, "add_to_list");
+    }
+    list->data[list->length++] = dlg_strclone(text);
+    list->data[list->length] = 0;
+}
+
+static void
+keep_visible(LIST * list)
+{
+    int high = getmaxy(list->win);
+
+    if (list->choice < list->offset) {
+	list->offset = list->choice;
+    }
+    if (list->choice - list->offset >= high)
+	list->offset = list->choice - high + 1;
+}
+
+#define Value(c) (int)((c) & 0xff)
+
+static int
+find_choice(char *target, LIST * list)
+{
+    int choice = list->choice;
+
+    if (*target == 0) {
+	list->choice = 0;
+    } else {
+	int n;
+	int len_1, cmp_1;
+
+	/* find the match with the longest length.  If more than one has the
+	 * same length, choose the one with the closest match of the final
+	 * character.
+	 */
+	len_1 = 0;
+	cmp_1 = 256;
+	for (n = 0; n < list->length; n++) {
+	    char *a = target;
+	    char *b = list->data[n];
+	    int len_2, cmp_2;
+
+	    len_2 = 0;
+	    while ((*a != 0) && (*b != 0) && (*a == *b)) {
+		a++;
+		b++;
+		len_2++;
+	    }
+	    cmp_2 = Value(*a) - Value(*b);
+	    if (cmp_2 < 0)
+		cmp_2 = -cmp_2;
+	    if ((len_2 > len_1)
+		|| (len_1 == len_2 && cmp_2 < cmp_1)) {
+		len_1 = len_2;
+		cmp_1 = cmp_2;
+		list->choice = n;
+	    }
+	}
+    }
+    if (choice != list->choice) {
+	keep_visible(list);
+    }
+    return (choice != list->choice);
+}
+
+static void
+display_list(LIST * list)
+{
+    if (list->win != 0) {
+	int n;
+	int x;
+	int y;
+	int top;
+	int bottom;
+
+	dlg_attr_clear(list->win, getmaxy(list->win), getmaxx(list->win), item_attr);
+	for (n = list->offset; n < list->length && list->data[n]; n++) {
+	    y = n - list->offset;
+	    if (y >= getmaxy(list->win))
+		break;
+	    (void) wmove(list->win, y, 0);
+	    if (n == list->choice)
+		dlg_attrset(list->win, item_selected_attr);
+	    (void) waddstr(list->win, list->data[n]);
+	    dlg_attrset(list->win, item_attr);
+	}
+	dlg_attrset(list->win, item_attr);
+
+	getparyx(list->win, y, x);
+
+	top = y - 1;
+	bottom = y + getmaxy(list->win);
+	dlg_draw_scrollbar(list->par,
+			   (long) list->offset,
+			   (long) list->offset,
+			   (long) (list->offset + getmaxy(list->win)),
+			   (long) (list->length),
+			   x + 1,
+			   x + getmaxx(list->win),
+			   top,
+			   bottom,
+			   menubox_border2_attr,
+			   menubox_border_attr);
+
+	(void) wmove(list->win, list->choice - list->offset, 0);
+	(void) wnoutrefresh(list->win);
+    }
+}
+
+/* FIXME: see arrows.c
+ * This workaround is used to allow two lists to have scroll-tabs at the same
+ * time, by reassigning their return-values to be different.  Just for
+ * readability, we use the names of keys with similar connotations, though all
+ * that is really required is that they're distinct, so we can put them in a
+ * switch statement.
+ */
+#if USE_MOUSE
+static void
+fix_arrows(LIST * list)
+{
+    if (list->win != 0) {
+	int x;
+	int y;
+	int top;
+	int right;
+	int bottom;
+
+	getparyx(list->win, y, x);
+	top = y - 1;
+	right = getmaxx(list->win);
+	bottom = y + getmaxy(list->win);
+
+	mouse_mkbutton(top, x, right,
+		       ((list->mousex == MOUSE_D)
+			? KEY_PREVIOUS
+			: KEY_PPAGE));
+	mouse_mkbutton(bottom, x, right,
+		       ((list->mousex == MOUSE_D)
+			? KEY_NEXT
+			: KEY_NPAGE));
+    }
+}
+
+#else
+#define fix_arrows(list)	/* nothing */
+#endif
+
+static bool
+show_list(char *target, LIST * list, bool keep)
+{
+    bool changed = keep || find_choice(target, list);
+    display_list(list);
+    return changed;
+}
+
+/*
+ * Highlight the closest match to 'target' in the given list, setting offset
+ * to match.
+ */
+static bool
+show_both_lists(char *input, LIST * d_list, LIST * f_list, bool keep)
+{
+    char *leaf = leaf_of(input);
+
+    return show_list(leaf, d_list, keep) || show_list(leaf, f_list, keep);
+}
+
+/*
+ * Move up/down in the given list
+ */
+static bool
+change_list(int choice, LIST * list)
+{
+    if (data_of(list) != 0) {
+	int last = list->length - 1;
+
+	choice += list->choice;
+	if (choice < 0)
+	    choice = 0;
+	if (choice > last)
+	    choice = last;
+	list->choice = choice;
+	keep_visible(list);
+	display_list(list);
+	return TRUE;
+    }
+    return FALSE;
+}
+
+static void
+scroll_list(int direction, LIST * list)
+{
+    if (data_of(list) != 0) {
+	int length = getmaxy(list->win);
+	if (change_list(direction * length, list))
+	    return;
+    }
+    beep();
+}
+
+static int
+compar(const void *a, const void *b)
+{
+    return strcmp(*(const char *const *) a, *(const char *const *) b);
+}
+
+static void
+match(char *name, LIST * d_list, LIST * f_list, MATCH * match_list)
+{
+    char *test = leaf_of(name);
+    size_t test_len = strlen(test);
+    char **matches = dlg_malloc(char *, (size_t) (d_list->length + f_list->length));
+    size_t data_len = 0;
+
+    if (matches != 0) {
+	int i;
+	char **new_ptr;
+
+	for (i = 2; i < d_list->length; i++) {
+	    if (strncmp(test, d_list->data[i], test_len) == 0) {
+		matches[data_len++] = d_list->data[i];
+	    }
+	}
+	for (i = 0; i < f_list->length; i++) {
+	    if (strncmp(test, f_list->data[i], test_len) == 0) {
+		matches[data_len++] = f_list->data[i];
+	    }
+	}
+	if ((new_ptr = dlg_realloc(char *, data_len + 1, matches)) != 0) {
+	    matches = new_ptr;
+	} else {
+	    free(matches);
+	    matches = 0;
+	    data_len = 0;
+	}
+    }
+    match_list->data = matches;
+    match_list->length = (int) data_len;
+}
+
+static void
+free_match(MATCH * match_list)
+{
+    free(match_list->data);
+    match_list->length = 0;
+}
+
+static int
+complete(char *name, LIST * d_list, LIST * f_list, char **buff_ptr)
+{
+    MATCH match_list;
+    char *test;
+    size_t test_len;
+    size_t i;
+    char *buff;
+
+    match(name, d_list, f_list, &match_list);
+    if (match_list.length == 0) {
+	free(match_list.data);
+	*buff_ptr = NULL;
+	return 0;
+    }
+
+    test = match_list.data[0];
+    test_len = strlen(test);
+    buff = dlg_malloc(char, test_len + 2);
+    if (match_list.length == 1) {
+	strcpy(buff, test);
+	i = test_len;
+	if (test == data_of(d_list)) {
+	    buff[test_len] = '/';
+	    i++;
+	}
+    } else {
+	int j;
+	char *next;
+
+	for (i = 0; i < test_len; i++) {
+	    char test_char = test[i];
+	    if (test_char == '\0')
+		break;
+	    for (j = 0; j < match_list.length; j++) {
+		if (match_list.data[j][i] != test_char) {
+		    break;
+		}
+	    }
+	    if (j == match_list.length) {
+		(buff)[i] = test_char;
+	    } else
+		break;
+	}
+	next = dlg_realloc(char, i + 1, buff);
+	if (next == NULL) {
+	    free(buff);
+	    *buff_ptr = NULL;
+	    return 0;
+	}
+	buff = next;
+    }
+    free_match(&match_list);
+    buff[i] = '\0';
+    *buff_ptr = buff;
+    return (i != 0);
+}
+
+static bool
+fill_lists(char *current, char *input, LIST * d_list, LIST * f_list, bool keep)
+{
+    bool result = TRUE;
+    bool rescan = FALSE;
+    struct stat sb;
+    int n;
+    char path[MAX_LEN + 1];
+
+    /* check if we've updated the lists */
+    for (n = 0; current[n] && input[n]; n++) {
+	if (current[n] != input[n])
+	    break;
+    }
+
+    if (current[n] == input[n]) {
+	result = FALSE;
+	rescan = (n == 0 && d_list->length == 0);
+    } else if (strchr(current + n, '/') == 0
+	       && strchr(input + n, '/') == 0) {
+	result = show_both_lists(input, d_list, f_list, keep);
+    } else {
+	rescan = TRUE;
+    }
+
+    if (rescan) {
+	DIR *dp;
+	size_t have = strlen(input);
+	char *leaf;
+
+	if (have > MAX_LEN)
+	    have = MAX_LEN;
+	memcpy(current, input, have);
+	current[have] = '\0';
+
+	/* refill the lists */
+	free_list(d_list, TRUE);
+	free_list(f_list, TRUE);
+	memcpy(path, current, have);
+	path[have] = '\0';
+	if ((leaf = strrchr(path, '/')) != 0) {
+	    *++leaf = 0;
+	} else {
+	    strcpy(path, "./");
+	    leaf = path + strlen(path);
+	}
+	DLG_TRACE(("opendir '%s'\n", path));
+	if ((dp = opendir(path)) != 0) {
+	    DIRENT *de;
+
+	    while ((de = readdir(dp)) != 0) {
+		size_t len = NAMLEN(de);
+		if (len == 0 || (len + have + 2) >= MAX_LEN)
+		    continue;
+		memcpy(leaf, de->d_name, len);
+		leaf[len] = '\0';
+		if (stat(path, &sb) == 0) {
+		    if ((sb.st_mode & S_IFMT) == S_IFDIR)
+			add_to_list(d_list, leaf);
+		    else if (f_list->win)
+			add_to_list(f_list, leaf);
+		}
+	    }
+	    (void) closedir(dp);
+	    /* sort the lists */
+	    if (d_list->data != 0 && d_list->length > 1) {
+		qsort(d_list->data,
+		      (size_t) d_list->length,
+		      sizeof(d_list->data[0]),
+		      compar);
+	    }
+	    if (f_list->data != 0 && f_list->length > 1) {
+		qsort(f_list->data,
+		      (size_t) f_list->length,
+		      sizeof(f_list->data[0]),
+		      compar);
+	    }
+	}
+
+	(void) show_both_lists(input, d_list, f_list, FALSE);
+	d_list->offset = d_list->choice;
+	f_list->offset = f_list->choice;
+	result = TRUE;
+    }
+    return result;
+}
+
+static bool
+usable_state(int state, LIST * dirs, LIST * files)
+{
+    bool result;
+
+    switch (state) {
+    case sDIRS:
+	result = (dirs->win != 0) && (data_of(dirs) != 0);
+	break;
+    case sFILES:
+	result = (files->win != 0) && (data_of(files) != 0);
+	break;
+    default:
+	result = TRUE;
+	break;
+    }
+    return result;
+}
+
+#define which_list() ((state == sFILES) \
+			? &f_list \
+			: ((state == sDIRS) \
+			  ? &d_list \
+			  : 0))
+#define NAVIGATE_BINDINGS \
+	DLG_KEYS_DATA( DLGK_FIELD_NEXT, KEY_RIGHT ), \
+	DLG_KEYS_DATA( DLGK_FIELD_NEXT, TAB ), \
+	DLG_KEYS_DATA( DLGK_FIELD_PREV, KEY_BTAB ), \
+	DLG_KEYS_DATA( DLGK_ITEM_NEXT,  KEY_DOWN ), \
+	DLG_KEYS_DATA( DLGK_ITEM_NEXT,  CHR_NEXT ), \
+	DLG_KEYS_DATA( DLGK_ITEM_NEXT,  KEY_NEXT ), \
+	DLG_KEYS_DATA( DLGK_ITEM_PREV,  CHR_PREVIOUS ), \
+	DLG_KEYS_DATA( DLGK_ITEM_PREV,  KEY_UP ), \
+	DLG_KEYS_DATA( DLGK_PAGE_NEXT,  KEY_NPAGE ), \
+	DLG_KEYS_DATA( DLGK_PAGE_PREV,  KEY_PPAGE )
+
+/*
+ * Display a dialog box for entering a filename
+ */
+static int
+dlg_fselect(const char *title, const char *path, int height, int width, int dselect)
+{
+    /* *INDENT-OFF* */
+    static DLG_KEYS_BINDING binding[] = {
+	HELPKEY_BINDINGS,
+	ENTERKEY_BINDINGS,
+	NAVIGATE_BINDINGS,
+	TOGGLEKEY_BINDINGS,
+	END_KEYS_BINDING
+    };
+    static DLG_KEYS_BINDING binding2[] = {
+	INPUTSTR_BINDINGS,
+	HELPKEY_BINDINGS,
+	ENTERKEY_BINDINGS,
+	NAVIGATE_BINDINGS,
+	TOGGLEKEY_BINDINGS,
+	END_KEYS_BINDING
+    };
+    /* *INDENT-ON* */
+
+#ifdef KEY_RESIZE
+    int old_height = height;
+    int old_width = width;
+    bool resized = FALSE;
+#endif
+    int tbox_y, tbox_x, tbox_width, tbox_height;
+    int dbox_y, dbox_x, dbox_width, dbox_height;
+    int fbox_y, fbox_x, fbox_width, fbox_height;
+    int show_buttons = TRUE;
+    int offset = 0;
+    int key = 0;
+    int fkey = FALSE;
+    int code;
+    int result = DLG_EXIT_UNKNOWN;
+    int state = dialog_vars.default_button >= 0 ? dlg_default_button() : sTEXT;
+    int button;
+    bool first = (state == sTEXT);
+    bool first_trace = TRUE;
+    char *input;
+    char *completed;
+    char current[MAX_LEN + 1];
+    WINDOW *dialog = 0;
+    WINDOW *w_text = 0;
+    WINDOW *w_work = 0;
+    const char **buttons = dlg_ok_labels();
+    const char *d_label = _("Directories");
+    const char *f_label = _("Files");
+    char *partial = 0;
+    int min_wide = MIN_WIDE;
+    int min_items = height ? 0 : 4;
+    LIST d_list, f_list;
+
+    DLG_TRACE(("# %s args:\n", dselect ? "dselect" : "fselect"));
+    DLG_TRACE2S("title", title);
+    DLG_TRACE2S("path", path);
+    DLG_TRACE2N("height", height);
+    DLG_TRACE2N("width", width);
+
+    dlg_does_output();
+
+    /* Set up the initial value */
+    input = dlg_set_result(path);
+    offset = (int) strlen(input);
+    *current = 0;
+
+    dlg_button_layout(buttons, &min_wide);
+
+#ifdef KEY_RESIZE
+  retry:
+#endif
+    if (height > 0)
+	height += MIN_HIGH;
+    dlg_auto_size(title, "", &height, &width, MIN_HIGH + min_items, min_wide);
+
+    dlg_print_size(height, width);
+    dlg_ctl_size(height, width);
+
+    dialog = dlg_new_window(height + 1, width,
+			    dlg_box_y_ordinate(height),
+			    dlg_box_x_ordinate(width));
+    dlg_register_window(dialog, "fselect", binding);
+    dlg_register_buttons(dialog, "fselect", buttons);
+
+    dlg_mouse_setbase(0, 0);
+
+    dlg_draw_box2(dialog, 0, 0, height + 1, width, dialog_attr, border_attr, border2_attr);
+    dlg_draw_bottom_box2(dialog, border_attr, border2_attr, dialog_attr);
+    dlg_draw_title(dialog, title);
+
+    dlg_attrset(dialog, dialog_attr);
+
+    /* Draw the input field box */
+    tbox_height = 1;
+    tbox_width = width - (4 * MARGIN + 2);
+    tbox_y = height - (BTN_HIGH * 2) + MARGIN + 1;
+    tbox_x = (width - tbox_width) / 2;
+
+    w_text = dlg_der_window(dialog, tbox_height, tbox_width, tbox_y, tbox_x);
+    if (w_text == 0) {
+	result = DLG_EXIT_ERROR;
+	goto finish;
+    }
+
+    dlg_draw_box(dialog, tbox_y - MARGIN, tbox_x - MARGIN,
+		 (2 * MARGIN + 1), tbox_width + (MARGIN + EXT_WIDE),
+		 menubox_border_attr, menubox_border2_attr);
+    dlg_mouse_mkbigregion(getbegy(dialog) + tbox_y - MARGIN,
+			  getbegx(dialog) + tbox_x - MARGIN,
+			  1 + (2 * MARGIN),
+			  tbox_width + (MARGIN + EXT_WIDE),
+			  MOUSE_T, 1, 1, 3 /* doesn't matter */ );
+
+    dlg_register_window(w_text, "fselect2", binding2);
+
+    /* Draw the directory listing box */
+    if (dselect)
+	dbox_width = (width - (6 * MARGIN));
+    else
+	dbox_width = (width - (6 * MARGIN + 2 * EXT_WIDE)) / 2;
+    dbox_height = height - MIN_HIGH;
+    dbox_y = (2 * MARGIN + 2);
+    dbox_x = tbox_x;
+
+    w_work = dlg_der_window(dialog, dbox_height, dbox_width, dbox_y, dbox_x);
+    if (w_work == 0) {
+	result = DLG_EXIT_ERROR;
+	goto finish;
+    }
+
+    (void) mvwaddstr(dialog, dbox_y - (MARGIN + 1), dbox_x - MARGIN, d_label);
+    dlg_draw_box(dialog,
+		 dbox_y - MARGIN, dbox_x - MARGIN,
+		 dbox_height + (MARGIN + 1), dbox_width + (MARGIN + 1),
+		 menubox_border_attr, menubox_border2_attr);
+    init_list(&d_list, dialog, w_work, MOUSE_D);
+
+    if (!dselect) {
+	/* Draw the filename listing box */
+	fbox_height = dbox_height;
+	fbox_width = dbox_width;
+	fbox_y = dbox_y;
+	fbox_x = tbox_x + dbox_width + (2 * MARGIN);
+
+	w_work = dlg_der_window(dialog, fbox_height, fbox_width, fbox_y, fbox_x);
+	if (w_work == 0) {
+	    result = DLG_EXIT_ERROR;
+	    goto finish;
+	}
+
+	(void) mvwaddstr(dialog, fbox_y - (MARGIN + 1), fbox_x - MARGIN, f_label);
+	dlg_draw_box(dialog,
+		     fbox_y - MARGIN, fbox_x - MARGIN,
+		     fbox_height + (MARGIN + 1), fbox_width + (MARGIN + 1),
+		     menubox_border_attr, menubox_border2_attr);
+	init_list(&f_list, dialog, w_work, MOUSE_F);
+    } else {
+	memset(&f_list, 0, sizeof(f_list));
+    }
+
+    while (result == DLG_EXIT_UNKNOWN) {
+
+	if (fill_lists(current, input, &d_list, &f_list, state < sTEXT))
+	    show_buttons = TRUE;
+
+#ifdef KEY_RESIZE
+	if (resized) {
+	    resized = FALSE;
+	    dlg_show_string(w_text, input, offset, inputbox_attr,
+			    0, 0, tbox_width, FALSE, first);
+	}
+#endif
+
+	/*
+	 * The last field drawn determines where the cursor is shown:
+	 */
+	if (show_buttons) {
+	    show_buttons = FALSE;
+	    button = (state < 0) ? 0 : state;
+	    dlg_draw_buttons(dialog, height - 1, 0, buttons, button, FALSE, width);
+	}
+
+	if (first_trace) {
+	    first_trace = FALSE;
+	    dlg_trace_win(dialog);
+	}
+
+	if (state < 0) {
+	    switch (state) {
+	    case sTEXT:
+		dlg_set_focus(dialog, w_text);
+		break;
+	    case sFILES:
+		dlg_set_focus(dialog, f_list.win);
+		break;
+	    case sDIRS:
+		dlg_set_focus(dialog, d_list.win);
+		break;
+	    }
+	}
+
+	if (first) {
+	    (void) wrefresh(dialog);
+	} else {
+	    fix_arrows(&d_list);
+	    fix_arrows(&f_list);
+	    key = dlg_mouse_wgetch((state == sTEXT) ? w_text : dialog, &fkey);
+	    if (dlg_result_key(key, fkey, &result)) {
+		if (!dlg_button_key(result, &button, &key, &fkey))
+		    break;
+	    }
+	}
+
+	if (key == DLGK_TOGGLE) {
+	    key = DLGK_SELECT;
+	    fkey = TRUE;
+	}
+
+	if (fkey) {
+	    switch (key) {
+	    case DLGK_MOUSE(KEY_PREVIOUS):
+		state = sDIRS;
+		scroll_list(-1, which_list());
+		continue;
+	    case DLGK_MOUSE(KEY_NEXT):
+		state = sDIRS;
+		scroll_list(1, which_list());
+		continue;
+	    case DLGK_MOUSE(KEY_PPAGE):
+		state = sFILES;
+		scroll_list(-1, which_list());
+		continue;
+	    case DLGK_MOUSE(KEY_NPAGE):
+		state = sFILES;
+		scroll_list(1, which_list());
+		continue;
+	    case DLGK_PAGE_PREV:
+		scroll_list(-1, which_list());
+		continue;
+	    case DLGK_PAGE_NEXT:
+		scroll_list(1, which_list());
+		continue;
+	    case DLGK_ITEM_PREV:
+		if (change_list(-1, which_list()))
+		    continue;
+		/* FALLTHRU */
+	    case DLGK_FIELD_PREV:
+		show_buttons = TRUE;
+		do {
+		    state = dlg_prev_ok_buttonindex(state, sDIRS);
+		} while (!usable_state(state, &d_list, &f_list));
+		continue;
+	    case DLGK_ITEM_NEXT:
+		if (change_list(1, which_list()))
+		    continue;
+		/* FALLTHRU */
+	    case DLGK_FIELD_NEXT:
+		show_buttons = TRUE;
+		do {
+		    state = dlg_next_ok_buttonindex(state, sDIRS);
+		} while (!usable_state(state, &d_list, &f_list));
+		continue;
+	    case DLGK_SELECT:
+		completed = 0;
+		if (partial != 0) {
+		    free(partial);
+		    partial = 0;
+		}
+		if (state == sFILES && !dselect) {
+		    completed = data_of(&f_list);
+		} else if (state == sDIRS) {
+		    completed = data_of(&d_list);
+		} else {
+		    if (complete(input, &d_list, &f_list, &partial)) {
+			completed = partial;
+		    }
+		}
+		if (completed != 0) {
+		    state = sTEXT;
+		    show_buttons = TRUE;
+		    strcpy(leaf_of(input), completed);
+		    offset = (int) strlen(input);
+		    dlg_show_string(w_text, input, offset, inputbox_attr,
+				    0, 0, tbox_width, 0, first);
+		    if (partial != NULL) {
+			free(partial);
+			partial = 0;
+		    }
+		    continue;
+		} else {	/* if (state < sTEXT) */
+		    (void) beep();
+		    continue;
+		}
+		/* FALLTHRU */
+	    case DLGK_ENTER:
+		result = (state > 0) ? dlg_enter_buttoncode(state) : DLG_EXIT_OK;
+		continue;
+	    case DLGK_LEAVE:
+		if (state >= 0)
+		    result = dlg_ok_buttoncode(state);
+		break;
+#ifdef KEY_RESIZE
+	    case KEY_RESIZE:
+		dlg_will_resize(dialog);
+		/* reset data */
+		height = old_height;
+		width = old_width;
+		show_buttons = TRUE;
+		*current = 0;
+		resized = TRUE;
+		/* repaint */
+		free_list(&d_list, FALSE);
+		free_list(&f_list, FALSE);
+		_dlg_resize_cleanup(dialog);
+		goto retry;
+#endif
+	    default:
+		if (key >= DLGK_MOUSE(MOUSE_T)) {
+		    state = sTEXT;
+		    continue;
+		} else if (key >= DLGK_MOUSE(MOUSE_F)) {
+		    if (f_list.win != 0) {
+			state = sFILES;
+			f_list.choice = (key - DLGK_MOUSE(MOUSE_F)) + f_list.offset;
+			display_list(&f_list);
+		    }
+		    continue;
+		} else if (key >= DLGK_MOUSE(MOUSE_D)) {
+		    if (d_list.win != 0) {
+			state = sDIRS;
+			d_list.choice = (key - DLGK_MOUSE(MOUSE_D)) + d_list.offset;
+			display_list(&d_list);
+		    }
+		    continue;
+		} else if (is_DLGK_MOUSE(key)
+			   && (code = dlg_ok_buttoncode(key - M_EVENT)) >= 0) {
+		    result = code;
+		    continue;
+		}
+		break;
+	    }
+	}
+
+	if (state < 0) {	/* Input box selected if we're editing */
+	    int edit = dlg_edit_string(input, &offset, key, fkey, first);
+
+	    if (edit) {
+		dlg_show_string(w_text, input, offset, inputbox_attr,
+				0, 0, tbox_width, 0, first);
+		first = FALSE;
+		state = sTEXT;
+	    }
+	} else if ((code = dlg_char_to_button(key, buttons)) >= 0) {
+	    result = dlg_ok_buttoncode(code);
+	    break;
+	}
+    }
+    AddLastKey();
+
+    dlg_unregister_window(w_text);
+    dlg_del_window(dialog);
+    dlg_mouse_free_regions();
+    free_list(&d_list, FALSE);
+    free_list(&f_list, FALSE);
+
+  finish:
+    if (partial != 0)
+	free(partial);
+    return result;
+}
+
+/*
+ * Display a dialog box for entering a filename
+ */
+int
+dialog_fselect(const char *title, const char *path, int height, int width)
+{
+    return dlg_fselect(title, path, height, width, FALSE);
+}
+
+/*
+ * Display a dialog box for entering a directory
+ */
+int
+dialog_dselect(const char *title, const char *path, int height, int width)
+{
+    return dlg_fselect(title, path, height, width, TRUE);
+}
Index: build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/file.list
===================================================================
--- build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/file.list	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/file.list	(revision 323)
@@ -0,0 +1,7 @@
+dialog-1.3-20210621/buildlist.c
+dialog-1.3-20210621/checklist.c
+dialog-1.3-20210621/dialog-config.in
+dialog-1.3-20210621/fselect.c
+dialog-1.3-20210621/menubox.c
+dialog-1.3-20210621/treeview.c
+dialog-1.3-20210621/util.c
Index: build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/create.patch.sh
===================================================================
--- build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/create.patch.sh	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/create.patch.sh	(revision 323)
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+VERSION=1.3-20210621
+
+tar --files-from=file.list -xzvf ../dialog-$VERSION.tgz
+mv dialog-$VERSION dialog-$VERSION-orig
+
+cp -rf ./dialog-$VERSION-new ./dialog-$VERSION
+
+diff --unified -Nr  dialog-$VERSION-orig  dialog-$VERSION > dialog-$VERSION.patch
+
+mv dialog-$VERSION.patch ../patches
+
+rm -rf ./dialog-$VERSION
+rm -rf ./dialog-$VERSION-orig

Property changes on: build-system-1.8.1/3pp/sources/packages/dialog/create-1.3-20210621-patch/create.patch.sh
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: build-system-1.8.1/3pp/sources/packages/dialog/patches/README
===================================================================
--- build-system-1.8.1/3pp/sources/packages/dialog/patches/README	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/dialog/patches/README	(revision 323)
@@ -0,0 +1,6 @@
+
+/* begin *
+
+   dialog-1.3-20210621.patch   - Some enhance the appearance of dialogs.
+
+ * end */
Index: build-system-1.8.1/3pp/sources/packages/dialog/patches
===================================================================
--- build-system-1.8.1/3pp/sources/packages/dialog/patches	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/dialog/patches	(revision 323)

Property changes on: build-system-1.8.1/3pp/sources/packages/dialog/patches
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/sources/packages/dialog
===================================================================
--- build-system-1.8.1/3pp/sources/packages/dialog	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/dialog	(revision 323)

Property changes on: build-system-1.8.1/3pp/sources/packages/dialog
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/sources/packages/fakeroot/Makefile
===================================================================
--- build-system-1.8.1/3pp/sources/packages/fakeroot/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/fakeroot/Makefile	(revision 323)
@@ -0,0 +1,48 @@
+
+COMPONENT_TARGETS = $(HARDWARE_NOARCH)
+
+
+include ../../../../../build-system/constants.mk
+
+
+url         = $(DOWNLOAD_SERVER)/sources/packages/a/fakeroot
+
+
+versions    = 1.26
+pkgname     = fakeroot
+suffix      = tar.xz
+
+tarballs    = $(addsuffix .$(suffix), $(addprefix $(pkgname)-, $(versions)))
+sha1s       = $(addsuffix .sha1sum, $(tarballs))
+
+
+BUILD_TARGETS = $(tarballs) $(sha1s)
+
+
+include ../../../../../build-system/core.mk
+
+
+.PHONY: download_clean
+
+
+$(tarballs):
+	@echo -e "\n======= Downloading source tarballs =======\n" ; \
+	 for tarball in $(tarballs) ; do \
+	   echo "$(url)/$$tarball" | xargs -n 1 -P 100 wget $(WGET_OPTIONS) - & \
+	 done ; wait
+
+$(sha1s): $(tarballs)
+	@for sha in $@ ; do \
+	   echo -e "\n======= Downloading '$$sha' signature =======\n" ; \
+	   echo "$(url)/$$sha" | xargs -n 1 -P 100 wget $(WGET_OPTIONS) - & wait %1 ; \
+	   touch $$sha ; \
+	   echo -e "\n======= Check the '$$sha' sha1sum =======\n" ; \
+	   sha1sum --check $$sha ; ret="$$?" ; \
+	   if [ "$$ret" == "1" ]; then \
+	     echo -e "\n======= ERROR: Bad '$$sha' sha1sum =======\n" ; \
+	     exit 1 ; \
+	   fi ; \
+	 done
+
+download_clean:
+	@rm -f $(tarballs) $(sha1s)
Index: build-system-1.8.1/3pp/sources/packages/fakeroot
===================================================================
--- build-system-1.8.1/3pp/sources/packages/fakeroot	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/fakeroot	(revision 323)

Property changes on: build-system-1.8.1/3pp/sources/packages/fakeroot
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/Makefile
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/Makefile	(revision 323)
@@ -0,0 +1,56 @@
+
+COMPONENT_TARGETS = $(HARDWARE_NOARCH)
+
+
+include ../../../../../build-system/constants.mk
+
+
+url         = $(DOWNLOAD_SERVER)/sources/packages/a/genext2fs
+
+versions    = 1.4.1
+
+tarballs    = $(addsuffix .tar.gz, $(addprefix genext2fs-, $(versions)))
+sha1s       = $(addsuffix .sha1sum, $(tarballs))
+
+patches     = $(CURDIR)/patches/genext2fs-1.4.1-blocksize.patch
+patches    += $(CURDIR)/patches/genext2fs-1.4.1-configure.patch
+
+.NOTPARALLEL: $(patches)
+
+
+BUILD_TARGETS = $(tarballs) $(sha1s) $(patches)
+
+
+include ../../../../../build-system/core.mk
+
+
+.PHONY: download_clean
+
+
+$(tarballs):
+	@echo -e "\n======= Downloading source tarballs =======" ; \
+	 for tarball in $(tarballs) ; do \
+	   echo "$(url)/$$tarball" | xargs -n 1 -P 100 wget $(WGET_OPTIONS) - & \
+	 done ; wait
+
+$(sha1s): $(tarballs)
+	@for sha in $@ ; do \
+	   echo -e "\n======= Downloading '$$sha' signature =======\n" ; \
+	   echo "$(url)/$$sha" | xargs -n 1 -P 100 wget $(WGET_OPTIONS) - & wait %1 ; \
+	   touch $$sha ; \
+	   echo -e "\n======= Check the '$$sha' sha1sum =======\n" ; \
+	   sha1sum --check $$sha ; ret="$$?" ; \
+	   if [ "$$ret" == "1" ]; then \
+	     echo -e "\n======= ERROR: Bad '$$sha' sha1sum =======\n" ; \
+	     exit 1 ; \
+	   fi ; \
+	 done
+
+$(patches): $(sha1s)
+	@echo -e "\n======= Create Patches =======\n" ; \
+	 ( cd create-1.4.1-blocksize-patch ; ./create.patch.sh ) ; \
+	 ( cd create-1.4.1-configure-patch ; ./create.patch.sh ) ; \
+	 echo -e "\n"
+
+download_clean:
+	@rm -f $(tarballs) $(sha1s) $(patches)
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new/genext2fs.8
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new/genext2fs.8	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new/genext2fs.8	(revision 323)
@@ -0,0 +1,178 @@
+.\"                                      Hey, EMACS: -*- nroff -*-
+.\" First parameter, NAME, should be all caps
+.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
+.\" other parameters are allowed: see man(7), man(1)
+.TH GENEXT2FS 8 "October 11, 2015"
+.\" Please adjust this date whenever revising the manpage.
+.\"
+.\" Some roff macros, for reference:
+.\" .nh        disable hyphenation
+.\" .hy        enable hyphenation
+.\" .ad l      left justify
+.\" .ad b      justify to both left and right margins
+.\" .nf        disable filling
+.\" .fi        enable filling
+.\" .br        insert line break
+.\" .sp <n>    insert n+1 empty lines
+.\" for manpage-specific macros, see man(7)
+.SH NAME
+genext2fs \- ext2 filesystem generator for embedded systems
+.SH SYNOPSIS
+.B genext2fs
+.RI "[ options ] [ output\-image ]"
+.SH DESCRIPTION
+\fBgenext2fs\fP generates an ext2 filesystem
+as a normal (non-root) user. It does not require you to mount
+the image file to copy files on it, nor does it require that
+you become the superuser to make device nodes.
+
+The filesystem image is created in the file \fIoutput-image\fP. If not
+specified, it is sent to stdout.
+
+By default, the maximum number of inodes in the filesystem is the minimum
+number required to accommodate the initial contents.
+In this way, a minimal filesystem (typically read-only) can be created with
+minimal free inodes.
+If required, free inodes can be added by passing the relevant options.
+The filesystem image size in blocks can be minimised by trial and error.
+.SH OPTIONS
+.TP
+.BI "\-x, \-\-starting\-image image"
+Use this image as a starting point.
+.TP
+.BI "\-d, \-\-root directory[:path]"
+Add the given directory and contents at a particular path (by default
+the root).
+.TP
+.BI "\-D, \-\-devtable spec\-file[:path]"
+Use \fBspec-file\fP to specify inodes to be added, at the given
+path (by default the root), including files, directories and
+special files like devices.
+If the specified files are already present in the image, their
+ownership and permission modes will be adjusted accordingly.
+Furthermore, you can use a single table entry to create many devices
+with a range of minor numbers (see examples below).
+All specified inodes receive the mtime of \fBspec-file\fP itself.
+.TP
+.BI "\-B, \-\-block\-size bytes"
+Size of the block (valid block sizes: 1024, 20148 or 4096 bytes).
+.TP
+.BI "\-b, \-\-size\-in\-blocks blocks"
+Size of the image in blocks.
+.TP
+.BI "\-N, \-\-number\-of\-inodes inodes"
+Maximum number of inodes.
+.TP
+.BI "\-i, \-\-bytes\-per\-inode ratio"
+Used to calculate the maximum number of inodes from the available blocks.
+.TP
+.BI "\-m, \-\-reserved\-percentage"
+Number of reserved blocks as a percentage of size. Reserving 0 blocks will prevent creation of the "lost+found" directory.
+.TP
+.BI "\-o, \-\-creator\-os OS"
+The default value for Creator OS ('linux', 'hurd', 'freebsd' or a numerical value: 0, 1, 3).
+.TP
+.BI "\-g, \-\-block\-map path"
+Generate a block map file for this path.
+.TP
+.BI "\-e, \-\-fill\-value value"
+Fill unallocated blocks with value.
+.TP
+.BI "\-z, \-\-allow\-holes"
+Make files with holes.
+.TP
+.BI "\-f, \-\-faketime"
+Use a timestamp of 0 for inode and filesystem creation, instead of the present. Useful for testing.
+.TP
+.BI "\-q, \-\-squash"
+Squash permissions and owners (same as -P -U).
+.TP
+.BI "\-U, \-\-squash\-uids"
+Squash ownership of inodes added using the -d option, making them all
+owned by root:root.
+.TP
+.BI "\-P, \-\-squash\-perms"
+Squash permissions of inodes added using the -d option. Analogous to
+"umask 077".
+.TP
+.BI "\-v, \-\-verbose"
+Print resulting filesystem structure.
+.TP
+.BI "\-V, \-\-version"
+Print genext2fs version.
+.TP
+.BI "\-h, \-\-help"
+Display help.
+.SH EXAMPLES
+
+.EX
+.B
+genext2fs -b 1440 -d src /dev/fd0
+.EE
+
+All files in the 
+.I src
+directory will be written to
+.B /dev/fd0
+as a new ext2 filesystem image. You can then mount the floppy as
+usual.
+
+.EX
+.B
+genext2fs -b 1024 -d src -D device_table.txt flashdisk.img
+.EE
+
+This example builds a filesystem from all the files in 
+.I src,
+then device nodes are created based on the contents of the file
+.I device_table.txt.
+Entries in the device table take the form of:
+
+<name> <type> <mode> <uid> <gid> <major> <minor> <start> <inc> <count>
+
+where name is the file name and type can be one of: 
+.RS
+.nf
+f	A regular file
+d	Directory
+c	Character special device file
+b	Block special device file
+p	Fifo (named pipe)
+.fi
+.RE
+uid is the user id for the target file, gid is the group id for the
+target file.  The rest of the entries (major, minor, etc) apply only 
+to device special files.
+
+An example device file follows:
+
+.RS
+.nf
+# name	type mode uid gid major minor start inc count
+
+/dev		d	755	0	0	-	-	-	-	-
+/dev/mem	c	640	0	0	1	1	0	0	-
+/dev/tty	c	666	0	0	5	0	0	0	-
+/dev/tty	c	666	0	0	4	0	0	1	6
+/dev/loop	b	640	0	0	7	0	0	1	2
+/dev/hda	b	640	0	0	3	0	0	0	-
+/dev/hda	b	640	0	0	3	1	1	1	16
+/dev/log	s	666	0	0	-	-	-	-	-
+.fi
+.RE
+
+This device table creates the /dev directory, a character device
+node /dev/mem (major 1, minor 1), and also creates /dev/tty, 
+/dev/tty[0-5], /dev/loop[0-1], /dev/hda, /dev/hda1 to /dev/hda15 and
+/dev/log socket.
+
+.SH SEE ALSO
+.BR mkfs(8),
+.BR genromfs(8),
+.BR mkisofs(8),
+.BR mkfs.jffs2(1)
+.br
+.SH AUTHOR
+This manual page was written by David Kimdon <dwhedon@debian.org>,
+for the Debian GNU/Linux system (but may be used by others).
+Examples provided by Erik Andersen <andersen@codepoet.org>.
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new/genext2fs.c
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new/genext2fs.c	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new/genext2fs.c	(revision 323)
@@ -0,0 +1,2721 @@
+/* vi: set sw=8 ts=8: */
+// genext2fs.c
+//
+// ext2 filesystem generator for embedded systems
+// Copyright (C) 2000 Xavier Bestel <xavier.bestel@free.fr>
+//
+// Please direct support requests to genext2fs-devel@lists.sourceforge.net
+//
+// 'du' portions taken from coreutils/du.c in busybox:
+//	Copyright (C) 1999,2000 by Lineo, inc. and John Beppu
+//	Copyright (C) 1999,2000,2001 by John Beppu <beppu@codepoet.org>
+//	Copyright (C) 2002  Edward Betts <edward@debian.org>
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; version
+// 2 of the License.
+//
+// Changes:
+// 	 3 Jun 2000	Initial release
+// 	 6 Jun 2000	Bugfix: fs size multiple of 8
+// 			Bugfix: fill blocks with inodes
+// 	14 Jun 2000	Bugfix: bad chdir() with -d option
+// 			Bugfix: removed size=8n constraint
+// 			Changed -d file to -f file
+// 			Added -e option
+// 	22 Jun 2000	Changed types for 64bits archs
+// 	24 Jun 2000	Added endianness swap
+// 			Bugfix: bad dir name lookup
+// 	03 Aug 2000	Bugfix: ind. blocks endian swap
+// 	09 Aug 2000	Bugfix: symlinks endian swap
+// 	01 Sep 2000	Bugfix: getopt returns int, not char	proski@gnu.org
+// 	10 Sep 2000	Bugfix: device nodes endianness		xavier.gueguen@col.bsf.alcatel.fr
+// 			Bugfix: getcwd values for Solaris	xavier.gueguen@col.bsf.alcatel.fr
+// 			Bugfix: ANSI scanf for non-GNU C	xavier.gueguen@col.bsf.alcatel.fr
+// 	28 Jun 2001	Bugfix: getcwd differs for Solaris/GNU	mike@sowbug.com
+// 	 8 Mar 2002	Bugfix: endianness swap of x-indirects
+// 	23 Mar 2002	Bugfix: test for IFCHR or IFBLK was flawed
+// 	10 Oct 2002	Added comments,makefile targets,	vsundar@ixiacom.com    
+// 			endianess swap assert check.  
+// 			Copyright (C) 2002 Ixia communications
+// 	12 Oct 2002	Added support for triple indirection	vsundar@ixiacom.com
+// 			Copyright (C) 2002 Ixia communications
+// 	14 Oct 2002	Added support for groups		vsundar@ixiacom.com
+// 			Copyright (C) 2002 Ixia communications
+// 	 5 Jan 2003	Bugfixes: reserved inodes should be set vsundar@usc.edu
+// 			only in the first group; directory names
+// 			need to be null padded at the end; and 
+// 			number of blocks per group should be a 
+// 			multiple of 8. Updated md5 values. 
+// 	 6 Jan 2003	Erik Andersen <andersee@debian.org> added
+// 			mkfs.jffs2 compatible device table support,
+// 			along with -q, -P, -U
+
+
+#include <config.h>
+#include <stdio.h>
+
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#if MAJOR_IN_MKDEV
+# include <sys/mkdev.h>
+#elif MAJOR_IN_SYSMACROS
+# include <sys/sysmacros.h>
+#endif
+
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+# if HAVE_STDDEF_H
+#  include <stddef.h>
+# endif
+#endif
+
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+#  include <stdint.h>
+# endif
+#endif
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if HAVE_DIRENT_H
+# include <dirent.h>
+# define NAMLEN(dirent) strlen((dirent)->d_name)
+#else
+# define dirent direct
+# define NAMLEN(dirent) (dirent)->d_namlen
+# if HAVE_SYS_NDIR_H
+#  include <sys/ndir.h>
+# endif
+# if HAVE_SYS_DIR_H
+#  include <sys/dir.h>
+# endif
+# if HAVE_NDIR_H
+#  include <ndir.h>
+# endif
+#endif
+
+#if HAVE_LIBGEN_H
+# include <libgen.h>
+#endif
+
+#include <stdarg.h>
+#include <assert.h>
+#include <time.h>
+#include <ctype.h>
+#include <errno.h>
+
+#if HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#if HAVE_GETOPT_H
+# include <getopt.h>
+#endif
+
+#if HAVE_LIMITS_H
+# include <limits.h>
+#endif
+
+struct stats {
+	unsigned long nblocks;
+	unsigned long ninodes;
+};
+
+// block size
+
+static int blocksize = 1024;
+
+#define BLOCKSIZE         blocksize
+#define BLOCKS_PER_GROUP  8192
+#define INODES_PER_GROUP  8192
+/* Percentage of blocks that are reserved.*/
+#define RESERVED_BLOCKS       5/100
+#define MAX_RESERVED_BLOCKS  25/100
+
+/* The default value for s_creator_os. */
+#if defined(__GNU__)
+# define CREATOR_OS  1 /* Hurd */
+#elif defined(__FreeBSD__)
+# define CREATOR_OS  3 /* FreeBSD */
+#else
+# define CREATOR_OS  0 /* Linux */
+#endif
+
+
+// inode block size (why is it != BLOCKSIZE ?!?)
+/* The field i_blocks in the ext2 inode stores the number of data blocks
+   but in terms of 512 bytes. That is what INODE_BLOCKSIZE represents.
+   INOBLK is the number of such blocks in an actual disk block            */
+
+#define INODE_BLOCKSIZE   512
+#define INOBLK            (BLOCKSIZE / INODE_BLOCKSIZE)
+
+// reserved inodes
+
+#define EXT2_BAD_INO         1     // Bad blocks inode
+#define EXT2_ROOT_INO        2     // Root inode
+#define EXT2_ACL_IDX_INO     3     // ACL inode
+#define EXT2_ACL_DATA_INO    4     // ACL inode
+#define EXT2_BOOT_LOADER_INO 5     // Boot loader inode
+#define EXT2_UNDEL_DIR_INO   6     // Undelete directory inode
+#define EXT2_FIRST_INO       11    // First non reserved inode
+
+// magic number for ext2
+
+#define EXT2_MAGIC_NUMBER  0xEF53
+
+
+// direct/indirect block addresses
+
+#define EXT2_NDIR_BLOCKS   11                    // direct blocks
+#define EXT2_IND_BLOCK     12                    // indirect block
+#define EXT2_DIND_BLOCK    13                    // double indirect block
+#define EXT2_TIND_BLOCK    14                    // triple indirect block
+#define EXT2_INIT_BLOCK    0xFFFFFFFF            // just initialized (not really a block address)
+
+// end of a block walk
+
+#define WALK_END           0xFFFFFFFE
+
+// file modes
+
+#define FM_IFMT    0170000	// format mask
+#define FM_IFSOCK  0140000	// socket
+#define FM_IFLNK   0120000	// symbolic link
+#define FM_IFREG   0100000	// regular file
+
+#define FM_IFBLK   0060000	// block device
+#define FM_IFDIR   0040000	// directory
+#define FM_IFCHR   0020000	// character device
+#define FM_IFIFO   0010000	// fifo
+
+#define FM_IMASK   0007777	// *all* perms mask for everything below
+
+#define FM_ISUID   0004000	// SUID
+#define FM_ISGID   0002000	// SGID
+#define FM_ISVTX   0001000	// sticky bit
+
+#define FM_IRWXU   0000700	// entire "user" mask
+#define FM_IRUSR   0000400	// read
+#define FM_IWUSR   0000200	// write
+#define FM_IXUSR   0000100	// execute
+
+#define FM_IRWXG   0000070	// entire "group" mask
+#define FM_IRGRP   0000040	// read
+#define FM_IWGRP   0000020	// write
+#define FM_IXGRP   0000010	// execute
+
+#define FM_IRWXO   0000007	// entire "other" mask
+#define FM_IROTH   0000004	// read
+#define FM_IWOTH   0000002	// write
+#define FM_IXOTH   0000001	// execute
+
+// options
+
+#define OP_HOLES     0x01       // make files with holes
+
+/* Defines for accessing group details */
+
+// Number of groups in the filesystem
+#define GRP_NBGROUPS(fs) \
+	(((fs)->sb.s_blocks_count - fs->sb.s_first_data_block + \
+	  (fs)->sb.s_blocks_per_group - 1) / (fs)->sb.s_blocks_per_group)
+
+// Get group block bitmap (bbm) given the group number
+#define GRP_GET_GROUP_BBM(fs,grp) ( get_blk((fs), get_gd((fs),(grp))->bg_block_bitmap) )
+
+// Get group inode bitmap (ibm) given the group number
+#define GRP_GET_GROUP_IBM(fs,grp) ( get_blk((fs), get_gd((fs),(grp))->bg_inode_bitmap) )
+
+// Given an inode number find the group it belongs to
+#define GRP_GROUP_OF_INODE(fs,nod) ( ((nod)-1) / (fs)->sb.s_inodes_per_group)
+
+//Given an inode number get the inode bitmap that covers it
+#define GRP_GET_INODE_BITMAP(fs,nod) \
+	( GRP_GET_GROUP_IBM((fs),GRP_GROUP_OF_INODE((fs),(nod))) )
+
+//Given an inode number find its offset within the inode bitmap that covers it
+#define GRP_IBM_OFFSET(fs,nod) \
+	( (nod) - GRP_GROUP_OF_INODE((fs),(nod))*(fs)->sb.s_inodes_per_group )
+
+// Given a block number find the group it belongs to
+#define GRP_GROUP_OF_BLOCK(fs,blk) ( ((blk)-1) / (fs)->sb.s_blocks_per_group)
+	
+//Given a block number get the block bitmap that covers it
+#define GRP_GET_BLOCK_BITMAP(fs,blk) \
+	( GRP_GET_GROUP_BBM((fs),GRP_GROUP_OF_BLOCK((fs),(blk))) )
+
+//Given a block number find its offset within the block bitmap that covers it
+#define GRP_BBM_OFFSET(fs,blk) \
+	( (blk) - GRP_GROUP_OF_BLOCK((fs),(blk))*(fs)->sb.s_blocks_per_group )
+
+
+// used types
+
+typedef signed char int8;
+typedef unsigned char uint8;
+typedef signed short int16;
+typedef unsigned short uint16;
+typedef signed int int32;
+typedef unsigned int uint32;
+
+
+// the GNU C library has a wonderful scanf("%as", string) which will
+// allocate the string with the right size, good to avoid buffer
+// overruns. the following macros use it if available or use a
+// hacky workaround
+// moreover it will define a snprintf() like a sprintf(), i.e.
+// without the buffer overrun checking, to work around bugs in
+// older solaris. Note that this is still not very portable, in that
+// the return value cannot be trusted.
+
+#if 0 /* SCANF_CAN_MALLOC */
+/* C99 define "a" for floating point, so you can have
+   runtime surprise according the library versions    */
+# define SCANF_PREFIX "a"
+# define SCANF_STRING(s) (&s)
+#else
+# define SCANF_PREFIX "511"
+# define SCANF_STRING(s) (s = malloc(512))
+#endif /* SCANF_CAN_MALLOC */
+
+#if PREFER_PORTABLE_SNPRINTF
+static inline int
+portable_snprintf(char *str, size_t n, const char *fmt, ...)
+{
+	int ret;
+	va_list ap;
+	va_start(ap, fmt);
+	ret = vsprintf(str, fmt, ap);
+	va_end(ap);
+	return ret;
+}
+# define SNPRINTF portable_snprintf
+#else
+# define SNPRINTF snprintf
+#endif /* PREFER_PORTABLE_SNPRINTF */
+
+#if !HAVE_GETLINE
+// getline() replacement for Darwin and Solaris etc.
+// This code uses backward seeks (unless rchunk is set to 1) which can't work
+// on pipes etc. However, add2fs_from_file() only calls getline() for
+// regular files, so a larger rchunk and backward seeks are okay.
+
+ssize_t 
+getdelim(char **lineptr, size_t *n, int delim, FILE *stream)
+{
+	char *p;                    // reads stored here
+	size_t const rchunk = 512;  // number of bytes to read
+	size_t const mchunk = 512;  // number of extra bytes to malloc
+	size_t m = rchunk + 1;      // initial buffer size
+	
+	if (*lineptr) {
+		if (*n < m) {
+			*lineptr = (char*)realloc(*lineptr, m);
+			if (!*lineptr) return -1;
+			*n = m;
+		}
+	} else {
+		*lineptr = (char*)malloc(m);
+		if (!*lineptr) return -1;
+		*n = m;
+	}
+
+	m = 0; // record length including seperator
+
+	do {
+		size_t i;     // number of bytes read etc
+		size_t j = 0; // number of bytes searched
+
+		p = *lineptr + m;
+
+		i = fread(p, 1, rchunk, stream);
+		if (i < rchunk && ferror(stream))
+			return -1;
+		while (j < i) {
+			++j;
+			if (*p++ == (char)delim) {
+				*p = '\0';
+				if (j != i) {
+					if (fseek(stream, j - i, SEEK_CUR))
+						return -1;
+					if (feof(stream))
+						clearerr(stream);
+				}
+				m += j;
+				return m;
+			}
+		}
+
+		m += j;
+		if (feof(stream)) {
+			if (m) return m;
+			if (!i) return -1;
+		}
+
+		// allocate space for next read plus possible null terminator
+		i = ((m + (rchunk + 1 > mchunk ? rchunk + 1 : mchunk) +
+		      mchunk - 1) / mchunk) * mchunk;
+		if (i != *n) {
+			*lineptr = (char*)realloc(*lineptr, i);
+			if (!*lineptr) return -1;
+			*n = i;
+		}
+	} while (1);
+}
+#define getline(a,b,c) getdelim(a,b,'\n',c)
+#endif /* HAVE_GETLINE */
+
+// Convert a numerical string to a float, and multiply the result by an
+// IEC or SI multiplier if provided; supported multipliers are Ki, Mi, Gi, k, M
+// and G.
+
+float
+SI_atof(const char *nptr)
+{
+	float f = 0;
+	float m = 1;
+	char *suffixptr;
+
+#if HAVE_STRTOF
+	f = strtof(nptr, &suffixptr);
+#else
+	f = (float)strtod(nptr, &suffixptr);
+#endif /* HAVE_STRTOF */
+
+	if (*suffixptr) {
+		if (!strcmp(suffixptr, "Ki"))
+			m = 1 << 10;
+		else if (!strcmp(suffixptr, "Mi"))
+			m = 1 << 20;
+		else if (!strcmp(suffixptr, "Gi"))
+			m = 1 << 30;
+		else if (!strcmp(suffixptr, "k"))
+			m = 1000;
+		else if (!strcmp(suffixptr, "M"))
+			m = 1000 * 1000;
+		else if (!strcmp(suffixptr, "G"))
+			m = 1000 * 1000 * 1000;
+	}
+	return f * m;
+}
+
+// endianness swap
+
+static inline uint16
+swab16(uint16 val)
+{
+	return (val >> 8) | (val << 8);
+}
+
+static inline uint32
+swab32(uint32 val)
+{
+	return ((val>>24) | ((val>>8)&0xFF00) |
+			((val<<8)&0xFF0000) | (val<<24));
+}
+
+
+// on-disk structures
+// this trick makes me declare things only once
+// (once for the structures, once for the endianness swap)
+
+#define superblock_decl \
+	udecl32(s_inodes_count)        /* Count of inodes in the filesystem */ \
+	udecl32(s_blocks_count)        /* Count of blocks in the filesystem */ \
+	udecl32(s_r_blocks_count)      /* Count of the number of reserved blocks */ \
+	udecl32(s_free_blocks_count)   /* Count of the number of free blocks */ \
+	udecl32(s_free_inodes_count)   /* Count of the number of free inodes */ \
+	udecl32(s_first_data_block)    /* The first block which contains data */ \
+	udecl32(s_log_block_size)      /* Indicator of the block size */ \
+	decl32(s_log_frag_size)        /* Indicator of the size of the fragments */ \
+	udecl32(s_blocks_per_group)    /* Count of the number of blocks in each block group */ \
+	udecl32(s_frags_per_group)     /* Count of the number of fragments in each block group */ \
+	udecl32(s_inodes_per_group)    /* Count of the number of inodes in each block group */ \
+	udecl32(s_mtime)               /* The time that the filesystem was last mounted */ \
+	udecl32(s_wtime)               /* The time that the filesystem was last written to */ \
+	udecl16(s_mnt_count)           /* The number of times the file system has been mounted */ \
+	decl16(s_max_mnt_count)        /* The number of times the file system can be mounted */ \
+	udecl16(s_magic)               /* Magic number indicating ex2fs */ \
+	udecl16(s_state)               /* Flags indicating the current state of the filesystem */ \
+	udecl16(s_errors)              /* Flags indicating the procedures for error reporting */ \
+	udecl16(s_minor_rev_level)     /* The minor revision level of the filesystem */ \
+	udecl32(s_lastcheck)           /* The time that the filesystem was last checked */ \
+	udecl32(s_checkinterval)       /* The maximum time permissable between checks */ \
+	udecl32(s_creator_os)          /* Indicator of which OS created the filesystem */ \
+	udecl32(s_rev_level)           /* The revision level of the filesystem */ \
+	udecl16(s_def_resuid)          /* The default uid for reserved blocks */ \
+	udecl16(s_def_resgid)          /* The default gid for reserved blocks */
+
+#define groupdescriptor_decl \
+	udecl32(bg_block_bitmap)       /* Block number of the block bitmap */ \
+	udecl32(bg_inode_bitmap)       /* Block number of the inode bitmap */ \
+	udecl32(bg_inode_table)        /* Block number of the inode table */ \
+	udecl16(bg_free_blocks_count)  /* Free blocks in the group */ \
+	udecl16(bg_free_inodes_count)  /* Free inodes in the group */ \
+	udecl16(bg_used_dirs_count)    /* Number of directories in the group */ \
+	udecl16(bg_pad)
+
+#define inode_decl \
+	udecl16(i_mode)                /* Entry type and file mode */ \
+	udecl16(i_uid)                 /* User id */ \
+	udecl32(i_size)                /* File/dir size in bytes */ \
+	udecl32(i_atime)               /* Last access time */ \
+	udecl32(i_ctime)               /* Creation time */ \
+	udecl32(i_mtime)               /* Last modification time */ \
+	udecl32(i_dtime)               /* Deletion time */ \
+	udecl16(i_gid)                 /* Group id */ \
+	udecl16(i_links_count)         /* Number of (hard) links to this inode */ \
+	udecl32(i_blocks)              /* Number of blocks used (1 block = 512 bytes) */ \
+	udecl32(i_flags)               /* ??? */ \
+	udecl32(i_reserved1) \
+	utdecl32(i_block,15)           /* Blocks table */ \
+	udecl32(i_version)             /* ??? */ \
+	udecl32(i_file_acl)            /* File access control list */ \
+	udecl32(i_dir_acl)             /* Directory access control list */ \
+	udecl32(i_faddr)               /* Fragment address */ \
+	udecl8(i_frag)                 /* Fragments count*/ \
+	udecl8(i_fsize)                /* Fragment size */ \
+	udecl16(i_pad1)
+
+#define directory_decl \
+	udecl32(d_inode)               /* Inode entry */ \
+	udecl16(d_rec_len)             /* Total size on record */ \
+	udecl16(d_name_len)            /* Size of entry name */
+
+#define decl8(x) int8 x;
+#define udecl8(x) uint8 x;
+#define decl16(x) int16 x;
+#define udecl16(x) uint16 x;
+#define decl32(x) int32 x;
+#define udecl32(x) uint32 x;
+#define utdecl32(x,n) uint32 x[n];
+
+typedef struct
+{
+	superblock_decl
+	uint32 s_reserved[235];       // Reserved
+} superblock;
+
+typedef struct
+{
+	groupdescriptor_decl
+	uint32 bg_reserved[3];
+} groupdescriptor;
+
+typedef struct
+{
+	inode_decl
+	uint32 i_reserved2[2];
+} inode;
+
+typedef struct
+{
+	directory_decl
+	char d_name[0];
+} directory;
+
+typedef uint8 *block;
+
+/* blockwalker fields:
+   The blockwalker is used to access all the blocks of a file (including
+   the indirection blocks) through repeated calls to walk_bw.  
+   
+   bpdir -> index into the inode->i_block[]. Indicates level of indirection.
+   bnum -> total number of blocks so far accessed. including indirection
+           blocks.
+   bpind,bpdind,bptind -> index into indirection blocks.
+   
+   bpind, bpdind, bptind do *NOT* index into single, double and triple
+   indirect blocks resp. as you might expect from their names. Instead 
+   they are in order the 1st, 2nd & 3rd index to be used
+   
+   As an example..
+   To access data block number 70000:
+        bpdir: 15 (we are doing triple indirection)
+        bpind: 0 ( index into the triple indirection block)
+        bpdind: 16 ( index into the double indirection block)
+        bptind: 99 ( index into the single indirection block)
+	70000 = 12 + 256 + 256*256 + 16*256 + 100 (indexing starts from zero)
+
+   So,for double indirection bpind will index into the double indirection 
+   block and bpdind into the single indirection block. For single indirection
+   only bpind will be used.
+*/
+   
+typedef struct
+{
+	uint32 bnum;
+	uint32 bpdir;
+	uint32 bpind;
+	uint32 bpdind;
+	uint32 bptind;
+} blockwalker;
+
+
+/* Filesystem structure that support groups */
+typedef struct
+{
+	uint8 zero[1024];      // Room for bootloader stuff
+	superblock sb;         // The superblock, always at 1024
+	// group descriptors come next, see get_gd() below
+} filesystem;
+
+// now the endianness swap
+
+#undef decl8
+#undef udecl8
+#undef decl16
+#undef udecl16
+#undef decl32
+#undef udecl32
+#undef utdecl32
+
+#define decl8(x)
+#define udecl8(x)
+#define decl16(x) this->x = swab16(this->x);
+#define udecl16(x) this->x = swab16(this->x);
+#define decl32(x) this->x = swab32(this->x);
+#define udecl32(x) this->x = swab32(this->x);
+#define utdecl32(x,n) { int i; for(i=0; i<n; i++) this->x[i] = swab32(this->x[i]); }
+
+#define HDLINK_CNT   16
+static int32 hdlink_cnt = HDLINK_CNT;
+struct hdlink_s
+{
+	uint32	src_inode;
+	uint32	dst_nod;
+};
+
+struct hdlinks_s 
+{
+	int32 count;
+	struct hdlink_s *hdl;
+};
+
+static struct hdlinks_s hdlinks;
+
+static void
+swap_sb(superblock *sb)
+{
+#define this sb
+	superblock_decl
+#undef this
+}
+
+static void
+swap_gd(groupdescriptor *gd)
+{
+#define this gd
+	groupdescriptor_decl
+#undef this
+}
+
+static void
+swap_nod(inode *nod)
+{
+#define this nod
+	inode_decl
+#undef this
+}
+
+static void
+swap_dir(directory *dir)
+{
+#define this dir
+	directory_decl
+#undef this
+}
+
+static void
+swap_block(block b)
+{
+	int i;
+	uint32 *blk = (uint32*)b;
+	for(i = 0; i < BLOCKSIZE/4; i++)
+		blk[i] = swab32(blk[i]);
+}
+
+#undef decl8
+#undef udecl8
+#undef decl16
+#undef udecl16
+#undef decl32
+#undef udecl32
+#undef utdecl32
+
+static char * app_name;
+static const char *const memory_exhausted = "memory exhausted";
+
+// error (un)handling
+static void
+verror_msg(const char *s, va_list p)
+{
+	fflush(stdout);
+	fprintf(stderr, "%s: ", app_name);
+	vfprintf(stderr, s, p);
+}
+static void
+error_msg(const char *s, ...)
+{
+	va_list p;
+	va_start(p, s);
+	verror_msg(s, p);
+	va_end(p);
+	putc('\n', stderr);
+}
+
+static void
+error_msg_and_die(const char *s, ...)
+{
+	va_list p;
+	va_start(p, s);
+	verror_msg(s, p);
+	va_end(p);
+	putc('\n', stderr);
+	exit(EXIT_FAILURE);
+}
+
+static void
+vperror_msg(const char *s, va_list p)
+{
+	int err = errno;
+	if (s == 0)
+		s = "";
+	verror_msg(s, p);
+	if (*s)
+		s = ": ";
+	fprintf(stderr, "%s%s\n", s, strerror(err));
+}
+
+static void
+perror_msg_and_die(const char *s, ...)
+{
+	va_list p;
+	va_start(p, s);
+	vperror_msg(s, p);
+	va_end(p);
+	exit(EXIT_FAILURE);
+}
+
+static FILE *
+xfopen(const char *path, const char *mode)
+{
+	FILE *fp;
+	if ((fp = fopen(path, mode)) == NULL)
+		perror_msg_and_die("%s", path);
+	return fp;
+}
+
+static char *
+xstrdup(const char *s)
+{
+	char *t;
+
+	if (s == NULL)
+		return NULL;
+	t = strdup(s);
+	if (t == NULL)
+		error_msg_and_die(memory_exhausted);
+	return t;
+}
+
+static void *
+xrealloc(void *ptr, size_t size)
+{
+	ptr = realloc(ptr, size);
+	if (ptr == NULL && size != 0)
+		error_msg_and_die(memory_exhausted);
+	return ptr;
+}
+
+static char *
+xreadlink(const char *path)
+{
+	static const int GROWBY = 80; /* how large we will grow strings by */
+
+	char *buf = NULL;
+	int bufsize = 0, readsize = 0;
+
+	do {
+		buf = xrealloc(buf, bufsize += GROWBY);
+		readsize = readlink(path, buf, bufsize); /* 1st try */
+		if (readsize == -1) {
+			perror_msg_and_die("%s:%s", app_name, path);
+		}
+	}
+	while (bufsize < readsize + 1);
+
+	buf[readsize] = '\0';
+	return buf;
+}
+
+int
+is_hardlink(ino_t inode)
+{
+	int i;
+
+	for(i = 0; i < hdlinks.count; i++) {
+		if(hdlinks.hdl[i].src_inode == inode)
+			return i;
+	}
+	return -1;		
+}
+
+// printf helper macro
+#define plural(a) (a), ((a) > 1) ? "s" : ""
+
+// temporary working block
+static inline uint8 *
+get_workblk(void)
+{
+	unsigned char* b=calloc(1,BLOCKSIZE);
+	return b;
+}
+static inline void
+free_workblk(block b)
+{
+	free(b);
+}
+
+/* Rounds qty upto a multiple of siz. siz should be a power of 2 */
+static inline uint32
+rndup(uint32 qty, uint32 siz)
+{
+	return (qty + (siz - 1)) & ~(siz - 1);
+}
+
+// check if something is allocated in the bitmap
+static inline uint32
+allocated(block b, uint32 item)
+{
+	return b[(item-1) / 8] & (1 << ((item-1) % 8));
+}
+
+// return a given block from a filesystem
+static inline uint8 *
+get_blk(filesystem *fs, uint32 blk)
+{
+	return (uint8*)fs + blk*BLOCKSIZE;
+}
+
+// the group descriptors are aligned on the block size
+static inline groupdescriptor *
+get_gd(filesystem *fs, int no)
+{
+	int gdblk = (sizeof (filesystem) + BLOCKSIZE - 1) / BLOCKSIZE;
+	return ((groupdescriptor *) get_blk(fs, gdblk)) + no;
+}
+
+// return a given inode from a filesystem
+static inline inode *
+get_nod(filesystem *fs, uint32 nod)
+{
+	int grp,offset;
+	inode *itab;
+
+	offset = GRP_IBM_OFFSET(fs,nod);
+	grp = GRP_GROUP_OF_INODE(fs,nod);
+	itab = (inode *)get_blk(fs, get_gd(fs,grp)->bg_inode_table);
+	return itab+offset-1;
+}
+
+// allocate a given block/inode in the bitmap
+// allocate first free if item == 0
+static uint32
+allocate(block b, uint32 item)
+{
+	if(!item)
+	{
+		int i;
+		uint8 bits;
+		for(i = 0; i < BLOCKSIZE; i++)
+			if((bits = b[i]) != (uint8)-1)
+			{
+				int j;
+				for(j = 0; j < 8; j++)
+					if(!(bits & (1 << j)))
+						break;
+				item = i * 8 + j + 1;
+				break;
+			}
+		if(i == BLOCKSIZE)
+			return 0;
+	}
+	b[(item-1) / 8] |= (1 << ((item-1) % 8));
+	return item;
+}
+
+// deallocate a given block/inode
+static void
+deallocate(block b, uint32 item)
+{
+	b[(item-1) / 8] &= ~(1 << ((item-1) % 8));
+}
+
+// allocate a block
+static uint32
+alloc_blk(filesystem *fs, uint32 nod)
+{
+	uint32 bk=0;
+	uint32 grp,nbgroups;
+
+	grp = GRP_GROUP_OF_INODE(fs,nod);
+	nbgroups = GRP_NBGROUPS(fs);
+	if(!(bk = allocate(GRP_GET_GROUP_BBM(fs, grp), 0))) {
+		for(grp=0;grp<nbgroups && !bk;grp++)
+			bk = allocate(GRP_GET_GROUP_BBM(fs, grp), 0);
+		grp--;
+	}
+	if (!bk)
+		error_msg_and_die("couldn't allocate a block (no free space)");
+	if(!(get_gd(fs, grp)->bg_free_blocks_count--))
+		error_msg_and_die("group descr %d. free blocks count == 0 (corrupted fs?)",grp);
+	if(!(fs->sb.s_free_blocks_count--))
+		error_msg_and_die("superblock free blocks count == 0 (corrupted fs?)");
+	return fs->sb.s_first_data_block + fs->sb.s_blocks_per_group*grp + (bk-1);
+}
+
+// free a block
+static void
+free_blk(filesystem *fs, uint32 bk)
+{
+	uint32 grp;
+
+	grp = bk / fs->sb.s_blocks_per_group;
+	bk %= fs->sb.s_blocks_per_group;
+	deallocate(GRP_GET_GROUP_BBM(fs, grp), bk);
+	get_gd(fs, grp)->bg_free_blocks_count++;
+	fs->sb.s_free_blocks_count++;
+}
+
+// allocate an inode
+static uint32
+alloc_nod(filesystem *fs)
+{
+	uint32 nod,best_group=0;
+	uint32 grp,nbgroups,avefreei;
+
+	nbgroups = GRP_NBGROUPS(fs);
+
+	/* Distribute inodes amongst all the blocks                           */
+	/* For every block group with more than average number of free inodes */
+	/* find the one with the most free blocks and allocate node there     */
+	/* Idea from find_group_dir in fs/ext2/ialloc.c in 2.4.19 kernel      */
+	/* We do it for all inodes.                                           */
+	avefreei  =  fs->sb.s_free_inodes_count / nbgroups;
+	for(grp=0; grp<nbgroups; grp++) {
+		if (get_gd(fs, grp)->bg_free_inodes_count < avefreei ||
+		    get_gd(fs, grp)->bg_free_inodes_count == 0)
+			continue;
+		if (!best_group || 
+			get_gd(fs, grp)->bg_free_blocks_count > get_gd(fs, best_group)->bg_free_blocks_count)
+			best_group = grp;
+	}
+	if (!(nod = allocate(GRP_GET_GROUP_IBM(fs, best_group), 0)))
+		error_msg_and_die("couldn't allocate an inode (no free inode)");
+	if(!(get_gd(fs, best_group)->bg_free_inodes_count--))
+		error_msg_and_die("group descr. free blocks count == 0 (corrupted fs?)");
+	if(!(fs->sb.s_free_inodes_count--))
+		error_msg_and_die("superblock free blocks count == 0 (corrupted fs?)");
+	return fs->sb.s_inodes_per_group*best_group+nod;
+}
+
+// print a bitmap allocation
+static void
+print_bm(block b, uint32 max)
+{
+	uint32 i;
+	printf("----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0\n");
+	for(i=1; i <= max; i++)
+	{
+		putchar(allocated(b, i) ? '*' : '.');
+		if(!(i % 100))
+			printf("\n");
+	}
+	if((i-1) % 100)
+		printf("\n");
+}
+
+// initalize a blockwalker (iterator for blocks list)
+static inline void
+init_bw(blockwalker *bw)
+{
+	bw->bnum = 0;
+	bw->bpdir = EXT2_INIT_BLOCK;
+}
+
+// return next block of inode (WALK_END for end)
+// if *create>0, append a newly allocated block at the end
+// if *create<0, free the block - warning, the metadata blocks contents is
+//				  used after being freed, so once you start
+//				  freeing blocks don't stop until the end of
+//				  the file. moreover, i_blocks isn't updated.
+//				  in fact, don't do that, just use extend_blk
+// if hole!=0, create a hole in the file
+static uint32
+walk_bw(filesystem *fs, uint32 nod, blockwalker *bw, int32 *create, uint32 hole)
+{
+	uint32 *bkref = 0;
+	uint32 *b;
+	int extend = 0, reduce = 0;
+	if(create && (*create) < 0)
+		reduce = 1;
+	if(bw->bnum >= get_nod(fs, nod)->i_blocks / INOBLK)
+	{
+		if(create && (*create) > 0)
+		{
+			(*create)--;
+			extend = 1;
+		}
+		else	
+			return WALK_END;
+	}
+	// first direct block
+	if(bw->bpdir == EXT2_INIT_BLOCK)
+	{
+		bkref = &get_nod(fs, nod)->i_block[bw->bpdir = 0];
+		if(extend) // allocate first block
+			*bkref = hole ? 0 : alloc_blk(fs,nod);
+		if(reduce) // free first block
+			free_blk(fs, *bkref);
+	}
+	// direct block
+	else if(bw->bpdir < EXT2_NDIR_BLOCKS)
+	{
+		bkref = &get_nod(fs, nod)->i_block[++bw->bpdir];
+		if(extend) // allocate block
+			*bkref = hole ? 0 : alloc_blk(fs,nod);
+		if(reduce) // free block
+			free_blk(fs, *bkref);
+	}
+	// first block in indirect block
+	else if(bw->bpdir == EXT2_NDIR_BLOCKS)
+	{
+		bw->bnum++;
+		bw->bpdir = EXT2_IND_BLOCK;
+		bw->bpind = 0;
+		if(extend) // allocate indirect block
+			get_nod(fs, nod)->i_block[bw->bpdir] = alloc_blk(fs,nod);
+		if(reduce) // free indirect block
+			free_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]);
+		b = (uint32*)get_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]);
+		bkref = &b[bw->bpind];
+		if(extend) // allocate first block
+			*bkref = hole ? 0 : alloc_blk(fs,nod);
+		if(reduce) // free first block
+			free_blk(fs, *bkref);
+	}
+	// block in indirect block
+	else if((bw->bpdir == EXT2_IND_BLOCK) && (bw->bpind < BLOCKSIZE/4 - 1))
+	{
+		bw->bpind++;
+		b = (uint32*)get_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]);
+		bkref = &b[bw->bpind];
+		if(extend) // allocate block
+			*bkref = hole ? 0 : alloc_blk(fs,nod);
+		if(reduce) // free block
+			free_blk(fs, *bkref);
+	}
+	// first block in first indirect block in first double indirect block
+	else if(bw->bpdir == EXT2_IND_BLOCK)
+	{
+		bw->bnum += 2;
+		bw->bpdir = EXT2_DIND_BLOCK;
+		bw->bpind = 0;
+		bw->bpdind = 0;
+		if(extend) // allocate double indirect block
+			get_nod(fs, nod)->i_block[bw->bpdir] = alloc_blk(fs,nod);
+		if(reduce) // free double indirect block
+			free_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]);
+		b = (uint32*)get_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]);
+		if(extend) // allocate first indirect block
+			b[bw->bpind] = alloc_blk(fs,nod);
+		if(reduce) // free  firstindirect block
+			free_blk(fs, b[bw->bpind]);
+		b = (uint32*)get_blk(fs, b[bw->bpind]);
+		bkref = &b[bw->bpdind];
+		if(extend) // allocate first block
+			*bkref = hole ? 0 : alloc_blk(fs,nod);
+		if(reduce) // free first block
+			free_blk(fs, *bkref);
+	}
+	// block in indirect block in double indirect block
+	else if((bw->bpdir == EXT2_DIND_BLOCK) && (bw->bpdind < BLOCKSIZE/4 - 1))
+	{
+		bw->bpdind++;
+		b = (uint32*)get_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]);
+		b = (uint32*)get_blk(fs, b[bw->bpind]);
+		bkref = &b[bw->bpdind];
+		if(extend) // allocate block
+			*bkref = hole ? 0 : alloc_blk(fs,nod);
+		if(reduce) // free block
+			free_blk(fs, *bkref);
+	}
+	// first block in indirect block in double indirect block
+	else if((bw->bpdir == EXT2_DIND_BLOCK) && (bw->bpind < BLOCKSIZE/4 - 1))
+	{
+		bw->bnum++;
+		bw->bpdind = 0;
+		bw->bpind++;
+		b = (uint32*)get_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]);
+		if(extend) // allocate indirect block
+			b[bw->bpind] = alloc_blk(fs,nod);
+		if(reduce) // free indirect block
+			free_blk(fs, b[bw->bpind]);
+		b = (uint32*)get_blk(fs, b[bw->bpind]);
+		bkref = &b[bw->bpdind];
+		if(extend) // allocate first block
+			*bkref = hole ? 0 : alloc_blk(fs,nod);
+		if(reduce) // free first block
+			free_blk(fs, *bkref);
+	}
+
+	/* Adding support for triple indirection */
+	/* Just starting triple indirection. Allocate the indirection
+	   blocks and the first data block
+	 */
+	else if (bw->bpdir == EXT2_DIND_BLOCK) 
+	{
+	  	bw->bnum += 3;
+		bw->bpdir = EXT2_TIND_BLOCK;
+		bw->bpind = 0;
+		bw->bpdind = 0;
+		bw->bptind = 0;
+		if(extend) // allocate triple indirect block
+			get_nod(fs, nod)->i_block[bw->bpdir] = alloc_blk(fs,nod);
+		if(reduce) // free triple indirect block
+			free_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]);
+		b = (uint32*)get_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]);
+		if(extend) // allocate first double indirect block
+			b[bw->bpind] = alloc_blk(fs,nod);
+		if(reduce) // free first double indirect block
+			free_blk(fs, b[bw->bpind]);
+		b = (uint32*)get_blk(fs, b[bw->bpind]);
+		if(extend) // allocate first indirect block
+			b[bw->bpdind] = alloc_blk(fs,nod);
+		if(reduce) // free first indirect block
+			free_blk(fs, b[bw->bpind]);
+		b = (uint32*)get_blk(fs, b[bw->bpdind]);
+		bkref = &b[bw->bptind];
+		if(extend) // allocate first data block
+			*bkref = hole ? 0 : alloc_blk(fs,nod);
+		if(reduce) // free first block
+			free_blk(fs, *bkref);
+	}
+	/* Still processing a single indirect block down the indirection
+	   chain.Allocate a data block for it
+	 */
+	else if ( (bw->bpdir == EXT2_TIND_BLOCK) && 
+		  (bw->bptind < BLOCKSIZE/4 -1) )
+	{
+		bw->bptind++;
+		b = (uint32*)get_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]);
+		b = (uint32*)get_blk(fs, b[bw->bpind]);
+		b = (uint32*)get_blk(fs, b[bw->bpdind]);
+		bkref = &b[bw->bptind];
+		if(extend) // allocate data block
+			*bkref = hole ? 0 : alloc_blk(fs,nod);
+		if(reduce) // free block
+			free_blk(fs, *bkref);
+	}
+	/* Finished processing a single indirect block. But still in the 
+	   same double indirect block. Allocate new single indirect block
+	   for it and a data block
+	 */
+	else if ( (bw->bpdir == EXT2_TIND_BLOCK) &&
+		  (bw->bpdind < BLOCKSIZE/4 -1) )
+	{
+		bw->bnum++;
+		bw->bptind = 0;
+		bw->bpdind++;
+		b = (uint32*)get_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]);
+		b = (uint32*)get_blk(fs, b[bw->bpind]);
+		if(extend) // allocate single indirect block
+			b[bw->bpdind] = alloc_blk(fs,nod);
+		if(reduce) // free indirect block
+			free_blk(fs, b[bw->bpind]);
+		b = (uint32*)get_blk(fs, b[bw->bpdind]);
+		bkref = &b[bw->bptind];
+		if(extend) // allocate first data block
+			*bkref = hole ? 0 : alloc_blk(fs,nod);
+		if(reduce) // free first block
+			free_blk(fs, *bkref);
+	}
+	/* Finished processing a double indirect block. Allocate the next
+	   double indirect block and the single,data blocks for it
+	 */
+	else if ( (bw->bpdir == EXT2_TIND_BLOCK) && 
+		  (bw->bpind < BLOCKSIZE/4 - 1) )
+	{
+		bw->bnum += 2;
+		bw->bpdind = 0;
+		bw->bptind = 0;
+		bw->bpind++;
+		b = (uint32*)get_blk(fs, get_nod(fs, nod)->i_block[bw->bpdir]);
+		if(extend) // allocate double indirect block
+			b[bw->bpind] = alloc_blk(fs,nod);
+		if(reduce) // free double indirect block
+			free_blk(fs, b[bw->bpind]);
+		b = (uint32*)get_blk(fs, b[bw->bpind]);
+		if(extend) // allocate single indirect block
+			b[bw->bpdind] = alloc_blk(fs,nod);
+		if(reduce) // free indirect block
+			free_blk(fs, b[bw->bpind]);
+		b = (uint32*)get_blk(fs, b[bw->bpdind]);
+		bkref = &b[bw->bptind];
+		if(extend) // allocate first block
+			*bkref = hole ? 0 : alloc_blk(fs,nod);
+		if(reduce) // free first block
+			free_blk(fs, *bkref);
+	}
+	else
+		error_msg_and_die("file too big !"); 
+	/* End change for walking triple indirection */
+
+	if(*bkref)
+	{
+		bw->bnum++;
+		if(!reduce && !allocated(GRP_GET_BLOCK_BITMAP(fs,*bkref), GRP_BBM_OFFSET(fs,*bkref)))
+			error_msg_and_die("[block %d of inode %d is unallocated !]", *bkref, nod);
+	}
+	if(extend)
+		get_nod(fs, nod)->i_blocks = bw->bnum * INOBLK;
+	return *bkref;
+}
+
+// add blocks to an inode (file/dir/etc...)
+static void
+extend_blk(filesystem *fs, uint32 nod, block b, int amount)
+{
+	int create = amount;
+	blockwalker bw, lbw;
+	uint32 bk;
+	init_bw(&bw);
+	if(amount < 0)
+	{
+		uint32 i;
+		for(i = 0; i < get_nod(fs, nod)->i_blocks / INOBLK + amount; i++)
+			walk_bw(fs, nod, &bw, 0, 0);
+		while(walk_bw(fs, nod, &bw, &create, 0) != WALK_END)
+			/*nop*/;
+		get_nod(fs, nod)->i_blocks += amount * INOBLK;
+	}
+	else
+	{
+		lbw = bw;
+		while((bk = walk_bw(fs, nod, &bw, 0, 0)) != WALK_END)
+			lbw = bw;
+		bw = lbw;
+		while(create)
+		{
+			int i, copyb = 0;
+			if(!(fs->sb.s_reserved[200] & OP_HOLES))
+				copyb = 1;
+			else
+				for(i = 0; i < BLOCKSIZE / 4; i++)
+					if(((int32*)(b + BLOCKSIZE * (amount - create)))[i])
+					{
+						copyb = 1;
+						break;
+					}
+			if((bk = walk_bw(fs, nod, &bw, &create, !copyb)) == WALK_END)
+				break;
+			if(copyb)
+				memcpy(get_blk(fs, bk), b + BLOCKSIZE * (amount - create - 1), BLOCKSIZE);
+		}
+	}
+}
+
+// link an entry (inode #) to a directory
+static void
+add2dir(filesystem *fs, uint32 dnod, uint32 nod, const char* name)
+{
+	blockwalker bw;
+	uint32 bk;
+	uint8 *b;
+	directory *d;
+	int reclen, nlen;
+	inode *node;
+	inode *pnode;
+
+	pnode = get_nod(fs, dnod);
+	if((pnode->i_mode & FM_IFMT) != FM_IFDIR)
+		error_msg_and_die("can't add '%s' to a non-directory", name);
+	if(!*name)
+		error_msg_and_die("can't create an inode with an empty name");
+	if(strchr(name, '/'))
+		error_msg_and_die("bad name '%s' (contains a slash)", name);
+	nlen = strlen(name);
+	reclen = sizeof(directory) + rndup(nlen, 4);
+	if(reclen > BLOCKSIZE)
+		error_msg_and_die("bad name '%s' (too long)", name);
+	init_bw(&bw);
+	while((bk = walk_bw(fs, dnod, &bw, 0, 0)) != WALK_END) // for all blocks in dir
+	{
+		b = get_blk(fs, bk);
+		// for all dir entries in block
+		for(d = (directory*)b; (int8*)d + sizeof(*d) < (int8*)b + BLOCKSIZE; d = (directory*)((int8*)d + d->d_rec_len))
+		{
+			// if empty dir entry, large enough, use it
+			if((!d->d_inode) && (d->d_rec_len >= reclen))
+			{
+				d->d_inode = nod;
+				node = get_nod(fs, nod);
+				node->i_links_count++;
+				d->d_name_len = nlen;
+				strncpy(d->d_name, name, nlen);
+				return;
+			}
+			// if entry with enough room (last one?), shrink it & use it
+			if(d->d_rec_len >= (sizeof(directory) + rndup(d->d_name_len, 4) + reclen))
+			{
+				reclen = d->d_rec_len;
+				d->d_rec_len = sizeof(directory) + rndup(d->d_name_len, 4);
+				reclen -= d->d_rec_len;
+				d = (directory*) (((int8*)d) + d->d_rec_len);
+				d->d_rec_len = reclen;
+				d->d_inode = nod;
+				node = get_nod(fs, nod);
+				node->i_links_count++;
+				d->d_name_len = nlen;
+				strncpy(d->d_name, name, nlen);
+				return;
+			}
+		}
+	}
+	// we found no free entry in the directory, so we add a block
+	if(!(b = get_workblk()))
+		error_msg_and_die("get_workblk() failed.");
+	d = (directory*)b;
+	d->d_inode = nod;
+	node = get_nod(fs, nod);
+	node->i_links_count++;
+	d->d_rec_len = BLOCKSIZE;
+	d->d_name_len = nlen;
+	strncpy(d->d_name, name, nlen);
+	extend_blk(fs, dnod, b, 1);
+	get_nod(fs, dnod)->i_size += BLOCKSIZE;
+	free_workblk(b);
+}
+
+// find an entry in a directory
+static uint32
+find_dir(filesystem *fs, uint32 nod, const char * name)
+{
+	blockwalker bw;
+	uint32 bk;
+	int nlen = strlen(name);
+	init_bw(&bw);
+	while((bk = walk_bw(fs, nod, &bw, 0, 0)) != WALK_END)
+	{
+		directory *d;
+		uint8 *b;
+		b = get_blk(fs, bk);
+		for(d = (directory*)b; (int8*)d + sizeof(*d) < (int8*)b + BLOCKSIZE; d = (directory*)((int8*)d + d->d_rec_len))
+			if(d->d_inode && (nlen == d->d_name_len) && !strncmp(d->d_name, name, nlen))
+				return d->d_inode;
+	}
+	return 0;
+}
+
+// find the inode of a full path
+static uint32
+find_path(filesystem *fs, uint32 nod, const char * name)
+{
+	char *p, *n, *n2 = xstrdup(name);
+	n = n2;
+	while(*n == '/')
+	{
+		nod = EXT2_ROOT_INO;
+		n++;
+	}
+	while(*n)
+	{
+		if((p = strchr(n, '/')))
+			(*p) = 0;
+		if(!(nod = find_dir(fs, nod, n)))
+			break;
+		if(p)
+			n = p + 1;
+		else
+			break;
+	}
+	free(n2);
+	return nod;
+}
+
+// create a simple inode
+static uint32
+mknod_fs(filesystem *fs, uint32 parent_nod, const char *name, uint16 mode, uint16 uid, uint16 gid, uint8 major, uint8 minor, uint32 ctime, uint32 mtime)
+{
+	uint32 nod;
+	inode *node;
+	if((nod = find_dir(fs, parent_nod, name)))
+	{
+		node = get_nod(fs, nod);
+		if((node->i_mode & FM_IFMT) != (mode & FM_IFMT))
+			error_msg_and_die("node '%s' already exists and isn't of the same type", name);
+		node->i_mode = mode;
+	}
+	else
+	{
+		nod = alloc_nod(fs);
+		node = get_nod(fs, nod);
+		node->i_mode = mode;
+		add2dir(fs, parent_nod, nod, name);
+		switch(mode & FM_IFMT)
+		{
+			case FM_IFLNK:
+				mode = FM_IFLNK | FM_IRWXU | FM_IRWXG | FM_IRWXO;
+				break;
+			case FM_IFBLK:
+			case FM_IFCHR:
+				((uint8*)get_nod(fs, nod)->i_block)[0] = minor;
+				((uint8*)get_nod(fs, nod)->i_block)[1] = major;
+				break;
+			case FM_IFDIR:
+				add2dir(fs, nod, nod, ".");
+				add2dir(fs, nod, parent_nod, "..");
+				get_gd(fs, GRP_GROUP_OF_INODE(fs,nod))->bg_used_dirs_count++;
+				break;
+		}
+	}
+	node->i_uid = uid;
+	node->i_gid = gid;
+	node->i_atime = mtime;
+	node->i_ctime = ctime;
+	node->i_mtime = mtime;
+	return nod;
+}
+
+// make a full-fledged directory (i.e. with "." & "..")
+static inline uint32
+mkdir_fs(filesystem *fs, uint32 parent_nod, const char *name, uint32 mode,
+	uid_t uid, gid_t gid, uint32 ctime, uint32 mtime)
+{
+	return mknod_fs(fs, parent_nod, name, mode|FM_IFDIR, uid, gid, 0, 0, ctime, mtime);
+}
+
+// make a symlink
+static uint32
+mklink_fs(filesystem *fs, uint32 parent_nod, const char *name, size_t size, uint8 *b, uid_t uid, gid_t gid, uint32 ctime, uint32 mtime)
+{
+	uint32 nod = mknod_fs(fs, parent_nod, name, FM_IFLNK | FM_IRWXU | FM_IRWXG | FM_IRWXO, uid, gid, 0, 0, ctime, mtime);
+	extend_blk(fs, nod, 0, - (int)get_nod(fs, nod)->i_blocks / INOBLK);
+	get_nod(fs, nod)->i_size = size;
+	if(size <= 4 * (EXT2_TIND_BLOCK+1))
+	{
+		strncpy((char*)get_nod(fs, nod)->i_block, (char*)b, size);
+		return nod;
+	}
+	extend_blk(fs, nod, b, rndup(size, BLOCKSIZE) / BLOCKSIZE);
+	return nod;
+}
+
+// make a file from a FILE*
+static uint32
+mkfile_fs(filesystem *fs, uint32 parent_nod, const char *name, uint32 mode, size_t size, FILE *f, uid_t uid, gid_t gid, uint32 ctime, uint32 mtime)
+{
+	uint8 * b;
+	uint32 nod = mknod_fs(fs, parent_nod, name, mode|FM_IFREG, uid, gid, 0, 0, ctime, mtime);
+	extend_blk(fs, nod, 0, - (int)get_nod(fs, nod)->i_blocks / INOBLK);
+	get_nod(fs, nod)->i_size = size;
+	if (size) {
+		if(!(b = (uint8*)calloc(rndup(size, BLOCKSIZE), 1)))
+			error_msg_and_die("not enough mem to read file '%s'", name);
+		if(f)
+			fread(b, size, 1, f); // FIXME: ugly. use mmap() ...
+		extend_blk(fs, nod, b, rndup(size, BLOCKSIZE) / BLOCKSIZE);
+		free(b);
+	}
+	return nod;
+}
+
+// retrieves a mode info from a struct stat
+static uint32
+get_mode(struct stat *st)
+{
+	uint32 mode = 0;
+
+	if(st->st_mode & S_IRUSR)
+		mode |= FM_IRUSR;
+	if(st->st_mode & S_IWUSR)
+		mode |= FM_IWUSR;
+	if(st->st_mode & S_IXUSR)
+		mode |= FM_IXUSR;
+	if(st->st_mode & S_IRGRP)
+		mode |= FM_IRGRP;
+	if(st->st_mode & S_IWGRP)
+		mode |= FM_IWGRP;
+	if(st->st_mode & S_IXGRP)
+		mode |= FM_IXGRP;
+	if(st->st_mode & S_IROTH)
+		mode |= FM_IROTH;
+	if(st->st_mode & S_IWOTH)
+		mode |= FM_IWOTH;
+	if(st->st_mode & S_IXOTH)
+		mode |= FM_IXOTH;
+	if(st->st_mode & S_ISUID)
+		mode |= FM_ISUID;
+	if(st->st_mode & S_ISGID)
+		mode |= FM_ISGID;
+	if(st->st_mode & S_ISVTX)
+		mode |= FM_ISVTX;
+	return mode;
+}
+
+// add or fixup entries to the filesystem from a text file
+/*  device table entries take the form of:
+    <path>	<type> <mode>	<uid>	<gid>	<major>	<minor>	<start>	<inc>	<count>
+    /dev/mem     c    640       0       0         1       1       0     0         -
+
+    type can be one of: 
+	f	A regular file
+	d	Directory
+	c	Character special device file
+	b	Block special device file
+	p	Fifo (named pipe)
+
+    I don't bother with symlinks (permissions are irrelevant), hard
+    links (special cases of regular files), or sockets (why bother).
+
+    Regular files must exist in the target root directory.  If a char,
+    block, fifo, or directory does not exist, it will be created.
+*/
+
+static void
+add2fs_from_file(filesystem *fs, uint32 this_nod, FILE * fh, uint32 fs_timestamp, struct stats *stats)
+{
+	unsigned long mode, uid, gid, major, minor;
+	unsigned long start, increment, count;
+	uint32 nod, ctime, mtime;
+	char *c, type, *path = NULL, *path2 = NULL, *dir, *name, *line = NULL;
+	size_t len;
+	struct stat st;
+	int nbargs, lineno = 0;
+
+	fstat(fileno(fh), &st);
+	ctime = fs_timestamp;
+	mtime = st.st_mtime;
+	while(getline(&line, &len, fh) >= 0)
+	{
+		mode = uid = gid = major = minor = 0;
+		start = 0; increment = 1; count = 0;
+		lineno++;
+		if((c = strchr(line, '#')))
+			*c = 0;
+		if (path) {
+			free(path);
+			path = NULL;
+		}
+		if (path2) {
+			free(path2);
+			path2 = NULL;
+		}
+		nbargs = sscanf (line, "%" SCANF_PREFIX "s %c %lo %lu %lu %lu %lu %lu %lu %lu",
+					SCANF_STRING(path), &type, &mode, &uid, &gid, &major, &minor,
+					&start, &increment, &count);
+		if(nbargs < 3)
+		{
+			if(nbargs > 0)
+				error_msg("device table line %d skipped: bad format for entry '%s'", lineno, path);
+			continue;
+		}
+		mode &= FM_IMASK;
+		path2 = strdup(path);
+		name = basename(path);
+		dir = dirname(path2);
+		if((!strcmp(name, ".")) || (!strcmp(name, "..")))
+		{
+			error_msg("device table line %d skipped", lineno);
+			continue;
+		}
+		if(fs)
+		{
+			if(!(nod = find_path(fs, this_nod, dir)))
+			{
+				error_msg("device table line %d skipped: can't find directory '%s' to create '%s''", lineno, dir, name);
+				continue;
+			}
+		}
+		else
+			nod = 0;
+		switch (type)
+		{
+			case 'd':
+				mode |= FM_IFDIR;
+				break;
+			case 'f':
+				mode |= FM_IFREG;
+				break;
+			case 'p':
+				mode |= FM_IFIFO;
+				break;
+			case 's':
+				mode |= FM_IFSOCK;
+				break;
+			case 'c':
+				mode |= FM_IFCHR;
+				break;
+			case 'b':
+				mode |= FM_IFBLK;
+				break;
+			default:
+				error_msg("device table line %d skipped: bad type '%c' for entry '%s'", lineno, type, name);
+				continue;
+		}
+		if(stats) {
+			if(count > 0)
+				stats->ninodes += count - start;
+			else
+				stats->ninodes++;
+		} else {
+			if(count > 0)
+			{
+				char *dname;
+				unsigned long i;
+				unsigned len;
+				len = strlen(name) + 10;
+				dname = malloc(len + 1);
+				for(i = start; i < count; i++)
+				{
+					SNPRINTF(dname, len, "%s%lu", name, i);
+					mknod_fs(fs, nod, dname, mode, uid, gid, major, minor + (i * increment - start), ctime, mtime);
+				}
+				free(dname);
+			}
+			else
+				mknod_fs(fs, nod, name, mode, uid, gid, major, minor, ctime, mtime);
+		}
+	}
+	if (line)
+		free(line);
+	if (path) 
+		free(path);
+	if (path2)
+		free(path2);
+}
+
+// adds a tree of entries to the filesystem from current dir
+static void
+add2fs_from_dir(filesystem *fs, uint32 this_nod, int squash_uids, int squash_perms, uint32 fs_timestamp, struct stats *stats)
+{
+	uint32 nod;
+	uint32 uid, gid, mode, ctime, mtime;
+	const char *name;
+	FILE *fh;
+	DIR *dh;
+	struct dirent *dent;
+	struct stat st;
+	char *lnk;
+	uint32 save_nod;
+
+	if(!(dh = opendir(".")))
+		perror_msg_and_die(".");
+	while((dent = readdir(dh)))
+	{
+		if((!strcmp(dent->d_name, ".")) || (!strcmp(dent->d_name, "..")))
+			continue;
+		lstat(dent->d_name, &st);
+		uid = st.st_uid;
+		gid = st.st_gid;
+		ctime = fs_timestamp;
+		mtime = st.st_mtime;
+		name = dent->d_name;
+		mode = get_mode(&st);
+		if(squash_uids)
+			uid = gid = 0;
+		if(squash_perms)
+			mode &= ~(FM_IRWXG | FM_IRWXO);
+		if(stats)
+			switch(st.st_mode & S_IFMT)
+			{
+				case S_IFLNK:
+				case S_IFREG:
+					if((st.st_mode & S_IFMT) == S_IFREG || st.st_size > 4 * (EXT2_TIND_BLOCK+1))
+						stats->nblocks += (st.st_size + BLOCKSIZE - 1) / BLOCKSIZE;
+				case S_IFCHR:
+				case S_IFBLK:
+				case S_IFIFO:
+				case S_IFSOCK:
+					stats->ninodes++;
+					break;
+				case S_IFDIR:
+					stats->ninodes++;
+					if(chdir(dent->d_name) < 0)
+						perror_msg_and_die(dent->d_name);
+					add2fs_from_dir(fs, this_nod, squash_uids, squash_perms, fs_timestamp, stats);
+					chdir("..");
+					break;
+				default:
+					break;
+			}
+		else
+		{
+			save_nod = 0;
+			/* Check for hardlinks */
+			if (!S_ISDIR(st.st_mode) && !S_ISLNK(st.st_mode) && st.st_nlink > 1) {
+				int32 hdlink = is_hardlink(st.st_ino);
+				if (hdlink >= 0) {
+					add2dir(fs, this_nod, hdlinks.hdl[hdlink].dst_nod, name);
+					continue;
+				} else {
+					save_nod = 1;
+				}
+			}
+			switch(st.st_mode & S_IFMT)
+			{
+#if HAVE_STRUCT_STAT_ST_RDEV
+				case S_IFCHR:
+					nod = mknod_fs(fs, this_nod, name, mode|FM_IFCHR, uid, gid, major(st.st_rdev), minor(st.st_rdev), ctime, mtime);
+					break;
+				case S_IFBLK:
+					nod = mknod_fs(fs, this_nod, name, mode|FM_IFBLK, uid, gid, major(st.st_rdev), minor(st.st_rdev), ctime, mtime);
+					break;
+#endif
+				case S_IFIFO:
+					nod = mknod_fs(fs, this_nod, name, mode|FM_IFIFO, uid, gid, 0, 0, ctime, mtime);
+					break;
+				case S_IFSOCK:
+					nod = mknod_fs(fs, this_nod, name, mode|FM_IFSOCK, uid, gid, 0, 0, ctime, mtime);
+					break;
+				case S_IFLNK:
+					lnk = xreadlink(dent->d_name);
+					mklink_fs(fs, this_nod, name, st.st_size, (uint8*)lnk, uid, gid, ctime, mtime);
+					free(lnk);
+					break;
+				case S_IFREG:
+					fh = xfopen(dent->d_name, "rb");
+					nod = mkfile_fs(fs, this_nod, name, mode, st.st_size, fh, uid, gid, ctime, mtime);
+					fclose(fh);
+					break;
+				case S_IFDIR:
+					nod = mkdir_fs(fs, this_nod, name, mode, uid, gid, ctime, mtime);
+					if(chdir(dent->d_name) < 0)
+						perror_msg_and_die(name);
+					add2fs_from_dir(fs, nod, squash_uids, squash_perms, fs_timestamp, stats);
+					chdir("..");
+					break;
+				default:
+					error_msg("ignoring entry %s", name);
+			}
+			if (save_nod) {
+				if (hdlinks.count == hdlink_cnt) {
+					if ((hdlinks.hdl = 
+						 realloc (hdlinks.hdl, (hdlink_cnt + HDLINK_CNT) *
+								  sizeof (struct hdlink_s))) == NULL) {
+						error_msg_and_die("Not enough memory");
+					}
+					hdlink_cnt += HDLINK_CNT;
+				}
+				hdlinks.hdl[hdlinks.count].src_inode = st.st_ino;
+				hdlinks.hdl[hdlinks.count].dst_nod = nod;
+				hdlinks.count++;
+			}
+		}
+	}
+	closedir(dh);
+}
+
+// endianness swap of x-indirect blocks
+static void
+swap_goodblocks(filesystem *fs, inode *nod)
+{
+	uint32 i,j;
+	int done=0;
+	uint32 *b,*b2;
+
+	uint32 nblk = nod->i_blocks / INOBLK;
+	if((nod->i_size && !nblk) || ((nod->i_mode & FM_IFBLK) == FM_IFBLK) || ((nod->i_mode & FM_IFCHR) == FM_IFCHR))
+		for(i = 0; i <= EXT2_TIND_BLOCK; i++)
+			nod->i_block[i] = swab32(nod->i_block[i]);
+	if(nblk <= EXT2_IND_BLOCK)
+		return;
+	swap_block(get_blk(fs, nod->i_block[EXT2_IND_BLOCK]));
+	if(nblk <= EXT2_DIND_BLOCK + BLOCKSIZE/4)
+		return;
+	/* Currently this will fail b'cos the number of blocks as stored
+	   in i_blocks also includes the indirection blocks (see
+	   walk_bw). But this function assumes that i_blocks only
+	   stores the count of data blocks ( Actually according to
+	   "Understanding the Linux Kernel" (Table 17-3 p502 1st Ed)
+	   i_blocks IS supposed to store the count of data blocks). so
+	   with a file of size 268K nblk would be 269.The above check
+	   will be false even though double indirection hasn't been
+	   started.This is benign as 0 means block 0 which has been
+	   zeroed out and therefore points back to itself from any offset
+	 */
+	// FIXME: I have fixed that, but I have the feeling the rest of
+	// ths function needs to be fixed for the same reasons - Xav
+	assert(nod->i_block[EXT2_DIND_BLOCK] != 0);
+	for(i = 0; i < BLOCKSIZE/4; i++)
+		if(nblk > EXT2_IND_BLOCK + BLOCKSIZE/4 + (BLOCKSIZE/4)*i )
+			if (((uint32*)get_blk(fs, nod->i_block[EXT2_DIND_BLOCK]))[i])
+				swap_block(get_blk(fs, ((uint32*)get_blk(fs, nod->i_block[EXT2_DIND_BLOCK]))[i]));
+	swap_block(get_blk(fs, nod->i_block[EXT2_DIND_BLOCK]));
+	if(nblk <= EXT2_IND_BLOCK + BLOCKSIZE/4 + BLOCKSIZE/4 * BLOCKSIZE/4)
+		return;
+	/* Adding support for triple indirection */
+	b = (uint32*)get_blk(fs,nod->i_block[EXT2_TIND_BLOCK]);
+	for(i=0;i < BLOCKSIZE/4 && !done ; i++) {
+		b2 = (uint32*)get_blk(fs,b[i]); 
+		for(j=0; j<BLOCKSIZE/4;j++) {
+			if (nblk > ( EXT2_IND_BLOCK + BLOCKSIZE/4 + 
+				     (BLOCKSIZE/4)*(BLOCKSIZE/4) + 
+				     i*(BLOCKSIZE/4)*(BLOCKSIZE/4) + 
+				     j*(BLOCKSIZE/4)) ) 
+			  if (b2[j])
+			  	swap_block(get_blk(fs,b2[j]));
+			else {
+			  done = 1;
+			  break;
+			}
+		}
+		swap_block((uint8 *)b2);
+	}
+	swap_block((uint8 *)b);
+	return;
+}
+
+static void
+swap_badblocks(filesystem *fs, inode *nod)
+{
+	uint32 i,j;
+	int done=0;
+	uint32 *b,*b2;
+
+	uint32 nblk = nod->i_blocks / INOBLK;
+	if((nod->i_size && !nblk) || ((nod->i_mode & FM_IFBLK) == FM_IFBLK) || ((nod->i_mode & FM_IFCHR) == FM_IFCHR))
+		for(i = 0; i <= EXT2_TIND_BLOCK; i++)
+			nod->i_block[i] = swab32(nod->i_block[i]);
+	if(nblk <= EXT2_IND_BLOCK)
+		return;
+	swap_block(get_blk(fs, nod->i_block[EXT2_IND_BLOCK]));
+	if(nblk <= EXT2_DIND_BLOCK + BLOCKSIZE/4)
+		return;
+	/* See comment in swap_goodblocks */
+	assert(nod->i_block[EXT2_DIND_BLOCK] != 0);
+	swap_block(get_blk(fs, nod->i_block[EXT2_DIND_BLOCK]));
+	for(i = 0; i < BLOCKSIZE/4; i++)
+		if(nblk > EXT2_IND_BLOCK + BLOCKSIZE/4 + (BLOCKSIZE/4)*i )
+			if (((uint32*)get_blk(fs, nod->i_block[EXT2_DIND_BLOCK]))[i])
+				swap_block(get_blk(fs, ((uint32*)get_blk(fs, nod->i_block[EXT2_DIND_BLOCK]))[i]));
+	if(nblk <= EXT2_IND_BLOCK + BLOCKSIZE/4 + BLOCKSIZE/4 * BLOCKSIZE/4)
+		return;
+	/* Adding support for triple indirection */
+	b = (uint32*)get_blk(fs,nod->i_block[EXT2_TIND_BLOCK]);
+	swap_block((uint8 *)b);
+	for(i=0;i < BLOCKSIZE/4 && !done ; i++) {
+		b2 = (uint32*)get_blk(fs,b[i]); 
+		swap_block((uint8 *)b2);
+		for(j=0; j<BLOCKSIZE/4;j++) {
+			if (nblk > ( EXT2_IND_BLOCK + BLOCKSIZE/4 + 
+				     (BLOCKSIZE/4)*(BLOCKSIZE/4) + 
+				     i*(BLOCKSIZE/4)*(BLOCKSIZE/4) + 
+				     j*(BLOCKSIZE/4)) ) 
+			  if (b2[j])
+				swap_block(get_blk(fs,b2[j]));
+			else {
+			  done = 1;
+			  break;
+			}
+		}
+	}
+	return;
+}
+
+// endianness swap of the whole filesystem
+static void
+swap_goodfs(filesystem *fs)
+{
+	uint32 i;
+	for(i = 1; i < fs->sb.s_inodes_count; i++)
+	{
+		inode *nod = get_nod(fs, i);
+		if(nod->i_mode & FM_IFDIR)
+		{
+			blockwalker bw;
+			uint32 bk;
+			init_bw(&bw);
+			while((bk = walk_bw(fs, i, &bw, 0, 0)) != WALK_END)
+			{
+				directory *d;
+				uint8 *b;
+				b = get_blk(fs, bk);
+				for(d = (directory*)b; (int8*)d + sizeof(*d) < (int8*)b + BLOCKSIZE; d = (directory*)((int8*)d + swab16(d->d_rec_len)))
+					swap_dir(d);
+			}
+		}
+		swap_goodblocks(fs, nod);
+		swap_nod(nod);
+	}
+	for(i=0;i<GRP_NBGROUPS(fs);i++)
+		swap_gd(get_gd(fs, i));
+	swap_sb(&fs->sb);
+}
+
+static void
+swap_badfs(filesystem *fs)
+{
+	uint32 i;
+	swap_sb(&fs->sb);
+	for(i=0;i<GRP_NBGROUPS(fs);i++)
+		swap_gd(get_gd(fs, i));
+	for(i = 1; i < fs->sb.s_inodes_count; i++)
+	{
+		inode *nod = get_nod(fs, i);
+		swap_nod(nod);
+		swap_badblocks(fs, nod);
+		if(nod->i_mode & FM_IFDIR)
+		{
+			blockwalker bw;
+			uint32 bk;
+			init_bw(&bw);
+			while((bk = walk_bw(fs, i, &bw, 0, 0)) != WALK_END)
+			{
+				directory *d;
+				uint8 *b;
+				b = get_blk(fs, bk);
+				for(d = (directory*)b; (int8*)d + sizeof(*d) < (int8*)b + BLOCKSIZE; d = (directory*)((int8*)d + d->d_rec_len))
+					swap_dir(d);
+			}
+		}
+	}
+}
+
+// initialize an empty filesystem
+static filesystem *
+init_fs(int nbblocks, int nbinodes, int nbresrvd, int holes,
+		uint32 fs_timestamp, uint32 creator_os)
+{
+	uint32 i;
+	filesystem *fs;
+	directory *d;
+	uint8 * b;
+	uint32 nod, first_block;
+	uint32 nbgroups,nbinodes_per_group,overhead_per_group,free_blocks,
+		free_blocks_per_group,nbblocks_per_group,min_nbgroups;
+	uint32 gdsz,itblsz,bbmpos,ibmpos,itblpos;
+	uint32 j;
+	uint8 *bbm,*ibm;
+	inode *itab0;
+	
+	if(nbresrvd < 0)
+		error_msg_and_die("reserved blocks value is invalid. Note: options have changed, see --help or the man page.");
+	if(nbinodes < EXT2_FIRST_INO - 1 + (nbresrvd ? 1 : 0))
+		error_msg_and_die("too few inodes. Note: options have changed, see --help or the man page.");
+	if(nbblocks < 8)
+		error_msg_and_die("too few blocks. Note: options have changed, see --help or the man page.");
+
+	/* nbinodes is the total number of inodes in the system.
+	 * a block group can have no more than 8192 inodes.
+	 */
+	min_nbgroups = (nbinodes + INODES_PER_GROUP - 1) / INODES_PER_GROUP;
+
+	/* On filesystems with 1k block size, the bootloader area uses a full
+	 * block. For 2048 and up, the superblock can be fitted into block 0.
+	 */
+	first_block = (BLOCKSIZE == 1024);
+
+	/* nbblocks is the total number of blocks in the filesystem.
+	 * a block group can have no more than 8192 blocks.
+	 */
+	nbgroups = (nbblocks - first_block + BLOCKS_PER_GROUP - 1) / BLOCKS_PER_GROUP;
+	if(nbgroups < min_nbgroups) nbgroups = min_nbgroups;
+	nbblocks_per_group = rndup((nbblocks - first_block + nbgroups - 1)/nbgroups, 8);
+	nbinodes_per_group = rndup((nbinodes + nbgroups - 1)/nbgroups,
+						(BLOCKSIZE/sizeof(inode)));
+	if (nbinodes_per_group < 16)
+		nbinodes_per_group = 16; //minimum number b'cos the first 10 are reserved
+
+	gdsz = rndup(nbgroups*sizeof(groupdescriptor),BLOCKSIZE)/BLOCKSIZE;
+	itblsz = nbinodes_per_group * sizeof(inode)/BLOCKSIZE;
+	overhead_per_group = 3 /*sb,bbm,ibm*/ + gdsz + itblsz;
+	free_blocks = nbblocks - overhead_per_group*nbgroups - first_block;
+	free_blocks_per_group = nbblocks_per_group - overhead_per_group;
+	if(free_blocks < 0)
+		error_msg_and_die("too much overhead, try fewer inodes or more blocks. Note: options have changed, see --help or the man page.");
+
+	if(!(fs = (filesystem*)calloc(nbblocks, BLOCKSIZE)))
+		error_msg_and_die("not enough memory for filesystem");
+
+	// create the superblock for an empty filesystem
+	fs->sb.s_inodes_count = nbinodes_per_group * nbgroups;
+	fs->sb.s_blocks_count = nbblocks;
+	fs->sb.s_r_blocks_count = nbresrvd;
+	fs->sb.s_free_blocks_count = free_blocks;
+	fs->sb.s_free_inodes_count = fs->sb.s_inodes_count - EXT2_FIRST_INO + 1;
+	fs->sb.s_first_data_block = first_block;
+	fs->sb.s_log_block_size = BLOCKSIZE >> 11;
+	fs->sb.s_log_frag_size = BLOCKSIZE >> 11;
+	fs->sb.s_blocks_per_group = nbblocks_per_group;
+	fs->sb.s_frags_per_group = nbblocks_per_group;
+	fs->sb.s_inodes_per_group = nbinodes_per_group;
+	fs->sb.s_wtime = fs_timestamp;
+	fs->sb.s_magic = EXT2_MAGIC_NUMBER;
+	fs->sb.s_lastcheck = fs_timestamp;
+	fs->sb.s_creator_os = creator_os;
+
+	// set up groupdescriptors
+	for(i=0, bbmpos=first_block+1+gdsz, ibmpos=bbmpos+1, itblpos=ibmpos+1;
+		i<nbgroups;
+		i++, bbmpos+=nbblocks_per_group, ibmpos+=nbblocks_per_group, itblpos+=nbblocks_per_group)
+	{
+		groupdescriptor *gd = get_gd(fs, i);
+
+		if(free_blocks > free_blocks_per_group) {
+			gd->bg_free_blocks_count = free_blocks_per_group;
+			free_blocks -= free_blocks_per_group;
+		} else {
+			gd->bg_free_blocks_count = free_blocks;
+			free_blocks = 0; // this is the last block group
+		}
+		if(i)
+			gd->bg_free_inodes_count = nbinodes_per_group;
+		else
+			gd->bg_free_inodes_count = nbinodes_per_group -
+							EXT2_FIRST_INO + 2;
+		gd->bg_used_dirs_count = 0;
+		gd->bg_block_bitmap = bbmpos;
+		gd->bg_inode_bitmap = ibmpos;
+		gd->bg_inode_table = itblpos;
+	}
+
+	/* Mark non-filesystem blocks and inodes as allocated */
+	/* Mark system blocks and inodes as allocated         */
+	for(i = 0; i<nbgroups;i++) {
+
+		/* Block bitmap */
+		bbm = GRP_GET_GROUP_BBM(fs, i);
+		//non-filesystem blocks
+		for(j = get_gd(fs, i)->bg_free_blocks_count
+		        + overhead_per_group + 1; j <= BLOCKSIZE * 8; j++)
+			allocate(bbm, j); 
+		//system blocks
+		for(j = 1; j <= overhead_per_group; j++)
+			allocate(bbm, j); 
+		
+		/* Inode bitmap */
+		ibm = GRP_GET_GROUP_IBM(fs, i);
+		//non-filesystem inodes
+		for(j = fs->sb.s_inodes_per_group+1; j <= BLOCKSIZE * 8; j++)
+			allocate(ibm, j);
+
+		//system inodes
+		if(i == 0)
+			for(j = 1; j < EXT2_FIRST_INO; j++)
+				allocate(ibm, j);
+	}
+
+	// make root inode and directory
+	/* We have groups now. Add the root filesystem in group 0 */
+	/* Also increment the directory count for group 0 */
+	get_gd(fs, 0)->bg_free_inodes_count--;
+	get_gd(fs, 0)->bg_used_dirs_count = 1;
+	itab0 = (inode *)get_blk(fs, get_gd(fs,0)->bg_inode_table);
+	itab0[EXT2_ROOT_INO-1].i_mode = FM_IFDIR | FM_IRWXU | FM_IRGRP | FM_IROTH | FM_IXGRP | FM_IXOTH; 
+	itab0[EXT2_ROOT_INO-1].i_ctime = fs_timestamp;
+	itab0[EXT2_ROOT_INO-1].i_mtime = fs_timestamp;
+	itab0[EXT2_ROOT_INO-1].i_atime = fs_timestamp;
+	itab0[EXT2_ROOT_INO-1].i_size = BLOCKSIZE;
+	itab0[EXT2_ROOT_INO-1].i_links_count = 2;
+
+	if(!(b = get_workblk()))
+		error_msg_and_die("get_workblk() failed.");
+	d = (directory*)b;
+	d->d_inode = EXT2_ROOT_INO;
+	d->d_rec_len = sizeof(directory)+4;
+	d->d_name_len = 1;
+	strcpy(d->d_name, ".");
+	d = (directory*)(b + d->d_rec_len);
+	d->d_inode = EXT2_ROOT_INO;
+	d->d_rec_len = BLOCKSIZE - (sizeof(directory)+4);
+	d->d_name_len = 2;
+	strcpy(d->d_name, "..");
+	extend_blk(fs, EXT2_ROOT_INO, b, 1);
+
+	// make lost+found directory and reserve blocks
+	if(fs->sb.s_r_blocks_count)
+	{
+		nod = mkdir_fs(fs, EXT2_ROOT_INO, "lost+found", FM_IRWXU, 0, 0, fs_timestamp, fs_timestamp);
+		memset(b, 0, BLOCKSIZE);
+		((directory*)b)->d_rec_len = BLOCKSIZE;
+		/* We run into problems with e2fsck if directory lost+found grows
+		 * bigger than this. Need to find out why this happens - sundar
+		 */
+		if (fs->sb.s_r_blocks_count > fs->sb.s_blocks_count * MAX_RESERVED_BLOCKS ) 
+			fs->sb.s_r_blocks_count = fs->sb.s_blocks_count * MAX_RESERVED_BLOCKS;
+		for(i = 1; i < fs->sb.s_r_blocks_count; i++)
+			extend_blk(fs, nod, b, 1);
+		get_nod(fs, nod)->i_size = fs->sb.s_r_blocks_count * BLOCKSIZE;
+	}
+	free_workblk(b);
+
+	// administrative info
+	fs->sb.s_state = 1;
+	fs->sb.s_max_mnt_count = 20;
+
+	// options for me
+	if(holes)
+		fs->sb.s_reserved[200] |= OP_HOLES;
+	
+	return fs;
+}
+
+// loads a filesystem from disk
+static filesystem *
+load_fs(FILE * fh, int swapit)
+{
+	size_t fssize;
+	filesystem *fs;
+	if((fseek(fh, 0, SEEK_END) < 0) || ((ssize_t)(fssize = ftell(fh)) == -1))
+		perror_msg_and_die("input filesystem image");
+	rewind(fh);
+	fssize = (fssize + BLOCKSIZE - 1) / BLOCKSIZE;
+	if(fssize < 16) // totally arbitrary
+		error_msg_and_die("too small filesystem");
+	if(!(fs = (filesystem*)calloc(fssize, BLOCKSIZE)))
+		error_msg_and_die("not enough memory for filesystem");
+	if(fread(fs, BLOCKSIZE, fssize, fh) != fssize)
+		perror_msg_and_die("input filesystem image");
+	if(swapit)
+		swap_badfs(fs);
+	if(fs->sb.s_rev_level || (fs->sb.s_magic != EXT2_MAGIC_NUMBER))
+		error_msg_and_die("not a suitable ext2 filesystem");
+	return fs;
+}
+
+static void
+free_fs(filesystem *fs)
+{
+	free(fs);
+}
+
+// just walk through blocks list
+static void
+flist_blocks(filesystem *fs, uint32 nod, FILE *fh)
+{
+	blockwalker bw;
+	uint32 bk;
+	init_bw(&bw);
+	while((bk = walk_bw(fs, nod, &bw, 0, 0)) != WALK_END)
+		fprintf(fh, " %d", bk);
+	fprintf(fh, "\n");
+}
+
+// walk through blocks list
+static void
+list_blocks(filesystem *fs, uint32 nod)
+{
+	int bn = 0;
+	blockwalker bw;
+	uint32 bk;
+	init_bw(&bw);
+	printf("blocks in inode %d:", nod);
+	while((bk = walk_bw(fs, nod, &bw, 0, 0)) != WALK_END)
+		printf(" %d", bk), bn++;
+	printf("\n%d blocks (%d bytes)\n", bn, bn * BLOCKSIZE);
+}
+
+// saves blocks to FILE*
+static void
+write_blocks(filesystem *fs, uint32 nod, FILE* f)
+{
+	blockwalker bw;
+	uint32 bk;
+	int32 fsize = get_nod(fs, nod)->i_size;
+	init_bw(&bw);
+	while((bk = walk_bw(fs, nod, &bw, 0, 0)) != WALK_END)
+	{
+		if(fsize <= 0)
+			error_msg_and_die("wrong size while saving inode %d", nod);
+		if(fwrite(get_blk(fs, bk), (fsize > BLOCKSIZE) ? BLOCKSIZE : fsize, 1, f) != 1)
+			error_msg_and_die("error while saving inode %d", nod);
+		fsize -= BLOCKSIZE;
+	}
+}
+
+
+// print block/char device minor and major
+static void
+print_dev(filesystem *fs, uint32 nod)
+{
+	int minor, major;
+	minor = ((uint8*)get_nod(fs, nod)->i_block)[0];
+	major = ((uint8*)get_nod(fs, nod)->i_block)[1];
+	printf("major: %d, minor: %d\n", major, minor);
+}
+
+// print an inode as a directory
+static void
+print_dir(filesystem *fs, uint32 nod)
+{
+	blockwalker bw;
+	uint32 bk;
+	init_bw(&bw);
+	printf("directory for inode %d:\n", nod);
+	while((bk = walk_bw(fs, nod, &bw, 0, 0)) != WALK_END)
+	{
+		directory *d;
+		uint8 *b;
+		b = get_blk(fs, bk);
+		for(d = (directory*)b; (int8*)d + sizeof(*d) < (int8*)b + BLOCKSIZE; d = (directory*)((int8*)d + d->d_rec_len))
+			if(d->d_inode)
+			{
+				int i;
+				printf("entry '");
+				for(i = 0; i < d->d_name_len; i++)
+					putchar(d->d_name[i]);
+				printf("' (inode %d): rec_len: %d (name_len: %d)\n", d->d_inode, d->d_rec_len, d->d_name_len);
+			}
+	}
+}
+
+// print a symbolic link
+static void
+print_link(filesystem *fs, uint32 nod)
+{
+	if(!get_nod(fs, nod)->i_blocks)
+		printf("links to '%s'\n", (char*)get_nod(fs, nod)->i_block);
+	else
+	{
+		printf("links to '");
+		write_blocks(fs, nod, stdout);
+		printf("'\n");
+	}
+}
+
+// make a ls-like printout of permissions
+static void
+make_perms(uint32 mode, char perms[11])
+{
+	strcpy(perms, "----------");
+	if(mode & FM_IRUSR)
+		perms[1] = 'r';
+	if(mode & FM_IWUSR)
+		perms[2] = 'w';
+	if(mode & FM_IXUSR)
+		perms[3] = 'x';
+	if(mode & FM_IRGRP)
+		perms[4] = 'r';
+	if(mode & FM_IWGRP)
+		perms[5] = 'w';
+	if(mode & FM_IXGRP)
+		perms[6] = 'x';
+	if(mode & FM_IROTH)
+		perms[7] = 'r';
+	if(mode & FM_IWOTH)
+		perms[8] = 'w';
+	if(mode & FM_IXOTH)
+		perms[9] = 'x';
+	if(mode & FM_ISUID)
+		perms[3] = 's';
+	if(mode & FM_ISGID)
+		perms[6] = 's';
+	if(mode & FM_ISVTX)
+		perms[9] = 't';
+	switch(mode & FM_IFMT)
+	{
+		case 0:
+			*perms = '0';
+			break;
+		case FM_IFSOCK:
+			*perms = 's';
+			break;
+		case FM_IFLNK:
+			*perms = 'l';
+			break;
+		case FM_IFREG:
+			*perms = '-';
+			break;
+		case FM_IFBLK:
+			*perms = 'b';
+			break;
+		case FM_IFDIR:
+			*perms = 'd';
+			break;
+		case FM_IFCHR:
+			*perms = 'c';
+			break;
+		case FM_IFIFO:
+			*perms = 'p';
+			break;
+		default:
+			*perms = '?';
+	}
+}
+
+// print an inode
+static void
+print_inode(filesystem *fs, uint32 nod)
+{
+	char *s;
+	char perms[11];
+	if(!get_nod(fs, nod)->i_mode)
+		return;
+	switch(nod)
+	{
+		case EXT2_BAD_INO:
+			s = "bad blocks";
+			break;
+		case EXT2_ROOT_INO:
+			s = "root";
+			break;
+		case EXT2_ACL_IDX_INO:
+		case EXT2_ACL_DATA_INO:
+			s = "ACL";
+			break;
+		case EXT2_BOOT_LOADER_INO:
+			s = "boot loader";
+			break;
+		case EXT2_UNDEL_DIR_INO:
+			s = "undelete directory";
+			break;
+		default:
+			s = (nod >= EXT2_FIRST_INO) ? "normal" : "unknown reserved"; 
+	}
+	printf("inode %d (%s, %d links): ", nod, s, get_nod(fs, nod)->i_links_count);
+	if(!allocated(GRP_GET_INODE_BITMAP(fs,nod), GRP_IBM_OFFSET(fs,nod)))
+	{
+		printf("unallocated\n");
+		return;
+	}
+	make_perms(get_nod(fs, nod)->i_mode, perms);
+	printf("%s,  size: %d byte%s (%d block%s)\n", perms, plural(get_nod(fs, nod)->i_size), plural(get_nod(fs, nod)->i_blocks / INOBLK));
+	switch(get_nod(fs, nod)->i_mode & FM_IFMT)
+	{
+		case FM_IFSOCK:
+			list_blocks(fs, nod);
+			break;
+		case FM_IFLNK:
+			print_link(fs, nod);
+			break;
+		case FM_IFREG:
+			list_blocks(fs, nod);
+			break;
+		case FM_IFBLK:
+			print_dev(fs, nod);
+			break;
+		case FM_IFDIR:
+			list_blocks(fs, nod);
+			print_dir(fs, nod);
+			break;
+		case FM_IFCHR:
+			print_dev(fs, nod);
+			break;
+		case FM_IFIFO:
+			list_blocks(fs, nod);
+			break;
+		default:
+			list_blocks(fs, nod);
+	}
+	printf("Done with inode %d\n",nod);
+}
+
+// describes various fields in a filesystem
+static void
+print_fs(filesystem *fs)
+{
+	uint32 i;
+	uint8 *ibm;
+
+	printf("%d blocks (%d free, %d reserved), first data block: %d\n",
+	       fs->sb.s_blocks_count, fs->sb.s_free_blocks_count,
+	       fs->sb.s_r_blocks_count, fs->sb.s_first_data_block);
+	printf("%d inodes (%d free)\n", fs->sb.s_inodes_count,
+	       fs->sb.s_free_inodes_count);
+	printf("block size = %d, frag size = %d\n",
+	       fs->sb.s_log_block_size ? (fs->sb.s_log_block_size << 11) : 1024,
+	       fs->sb.s_log_frag_size ? (fs->sb.s_log_frag_size << 11) : 1024);
+	printf("number of groups: %d\n",GRP_NBGROUPS(fs));
+	printf("%d blocks per group,%d frags per group,%d inodes per group\n",
+	     fs->sb.s_blocks_per_group, fs->sb.s_frags_per_group,
+	     fs->sb.s_inodes_per_group);
+	printf("Size of inode table: %d blocks\n",
+		(int)(fs->sb.s_inodes_per_group * sizeof(inode) / BLOCKSIZE));
+	for (i = 0; i < GRP_NBGROUPS(fs); i++) {
+		printf("Group No: %d\n", i+1);
+		printf("block bitmap: block %d,inode bitmap: block %d, inode table: block %d\n",
+		     get_gd(fs, i)->bg_block_bitmap,
+		     get_gd(fs, i)->bg_inode_bitmap,
+		     get_gd(fs, i)->bg_inode_table);
+		printf("block bitmap allocation:\n");
+		print_bm(GRP_GET_GROUP_BBM(fs, i),fs->sb.s_blocks_per_group);
+		printf("inode bitmap allocation:\n");
+		ibm = GRP_GET_GROUP_IBM(fs, i);
+		print_bm(ibm, fs->sb.s_inodes_per_group);
+		for (i = 1; i <= fs->sb.s_inodes_per_group; i++)
+			if (allocated(ibm, i))
+				print_inode(fs, i);
+	}
+}
+
+static void
+dump_fs(filesystem *fs, FILE * fh, int swapit)
+{
+	uint32 nbblocks = fs->sb.s_blocks_count;
+	fs->sb.s_reserved[200] = 0;
+	if(swapit)
+		swap_goodfs(fs);
+	if(fwrite(fs, BLOCKSIZE, nbblocks, fh) < nbblocks)
+		perror_msg_and_die("output filesystem image");
+	if(swapit)
+		swap_badfs(fs);
+}
+
+static void
+populate_fs(filesystem *fs, char **dopt, int didx, int squash_uids, int squash_perms, uint32 fs_timestamp, struct stats *stats)
+{
+	int i;
+	for(i = 0; i < didx; i++)
+	{
+		struct stat st;
+		FILE *fh;
+		int pdir;
+		char *pdest;
+		uint32 nod = EXT2_ROOT_INO;
+		if(fs)
+			if((pdest = strchr(dopt[i], ':')))
+			{
+				*(pdest++) = 0;
+				if(!(nod = find_path(fs, EXT2_ROOT_INO, pdest)))
+					error_msg_and_die("path %s not found in filesystem", pdest);
+			}
+		stat(dopt[i], &st);
+		switch(st.st_mode & S_IFMT)
+		{
+			case S_IFREG:
+				fh = xfopen(dopt[i], "rb");
+				add2fs_from_file(fs, nod, fh, fs_timestamp, stats);
+				fclose(fh);
+				break;
+			case S_IFDIR:
+				if((pdir = open(".", O_RDONLY)) < 0)
+					perror_msg_and_die(".");
+				if(chdir(dopt[i]) < 0)
+					perror_msg_and_die(dopt[i]);
+				add2fs_from_dir(fs, nod, squash_uids, squash_perms, fs_timestamp, stats);
+				if(fchdir(pdir) < 0)
+					perror_msg_and_die("fchdir");
+				if(close(pdir) < 0)
+					perror_msg_and_die("close");
+				break;
+			default:
+				error_msg_and_die("%s is neither a file nor a directory", dopt[i]);
+		}
+	}
+}
+
+static void
+showversion(void)
+{
+	printf("genext2fs " VERSION "\n");
+}
+
+static void
+showhelp(void)
+{
+	fprintf(stderr, "Usage: %s [options] image\n"
+	"Create an ext2 filesystem image from directories/files\n\n"
+	"  -x, --starting-image <image>\n"
+	"  -d, --root <directory>\n"
+	"  -D, --devtable <file>\n"
+	"  -B, --block-size <bytes>\n"
+	"  -b, --size-in-blocks <blocks>\n"
+	"  -i, --bytes-per-inode <bytes per inode>\n"
+	"  -N, --number-of-inodes <number of inodes>\n"
+	"  -m, --reserved-percentage <percentage of blocks to reserve>\n"
+	"  -o, --creator-os <os>      'linux', 'hurd', 'freebsd' or a numerical value.\n"
+	"  -g, --block-map <path>     Generate a block map file for this path.\n"
+	"  -e, --fill-value <value>   Fill unallocated blocks with value.\n"
+	"  -z, --allow-holes          Allow files with holes.\n"
+	"  -f, --faketime             Set filesystem timestamps to 0 (for testing).\n"
+	"  -q, --squash               Same as \"-U -P\".\n"
+	"  -U, --squash-uids          Squash owners making all files be owned by root.\n"
+	"  -P, --squash-perms         Squash permissions on all files.\n"
+	"  -h, --help\n"
+	"  -V, --version\n"
+	"  -v, --verbose\n\n"
+	"Report bugs to genext2fs-devel@lists.sourceforge.net\n", app_name);
+}
+
+#define MAX_DOPT 128
+#define MAX_GOPT 128
+
+#define MAX_FILENAME 255
+
+extern char* optarg;
+extern int optind, opterr, optopt;
+
+// parse the value for -o <os>
+int
+lookup_creator_os(const char *name)
+{
+	static const char *const creators[] =
+		{"linux", "hurd", "2", "freebsd", NULL};
+	char *endptr;
+	int i;
+
+	// numerical value ?
+	i = strtol(name, &endptr, 0);
+	if(name[0] && *endptr == '\0')
+		return i;
+
+	// symbolic name ?
+	for(i=0; creators[i]; i++)
+	       if(strcasecmp(creators[i], name) == 0)
+		       return i;
+
+	// whatever ?
+	return -1;
+}
+
+int
+main(int argc, char **argv)
+{
+	int nbblocks = -1;
+	int nbinodes = -1;
+	int nbresrvd = -1;
+	float bytes_per_inode = -1;
+	float reserved_frac = -1;
+	int fs_timestamp = -1;
+	int creator_os = CREATOR_OS;
+	char * fsout = "-";
+	char * fsin = 0;
+	char * dopt[MAX_DOPT];
+	int didx = 0;
+	char * gopt[MAX_GOPT];
+	int gidx = 0;
+	int verbose = 0;
+	int holes = 0;
+	int emptyval = 0;
+	int squash_uids = 0;
+	int squash_perms = 0;
+	uint16 endian = 1;
+	int bigendian = !*(char*)&endian;
+	filesystem *fs;
+	int i;
+	int c;
+	struct stats stats;
+
+#if HAVE_GETOPT_LONG
+	struct option longopts[] = {
+	  { "starting-image",	required_argument,	NULL, 'x' },
+	  { "root",		required_argument,	NULL, 'd' },
+	  { "devtable",		required_argument,	NULL, 'D' },
+	  { "block-size",	required_argument,	NULL, 'B' },
+	  { "size-in-blocks",	required_argument,	NULL, 'b' },
+	  { "bytes-per-inode",	required_argument,	NULL, 'i' },
+	  { "number-of-inodes",	required_argument,	NULL, 'N' },
+	  { "reserved-percentage", required_argument,	NULL, 'm' },
+	  { "creator-os",	required_argument,	NULL, 'o' },
+	  { "block-map",	required_argument,	NULL, 'g' },
+	  { "fill-value",	required_argument,	NULL, 'e' },
+	  { "allow-holes",	no_argument, 		NULL, 'z' },
+	  { "faketime",		no_argument,		NULL, 'f' },
+	  { "squash",		no_argument,		NULL, 'q' },
+	  { "squash-uids",	no_argument,		NULL, 'U' },
+	  { "squash-perms",	no_argument,		NULL, 'P' },
+	  { "help",		no_argument,		NULL, 'h' },
+	  { "version",		no_argument,		NULL, 'V' },
+	  { "verbose",		no_argument,		NULL, 'v' },
+	  { 0, 0, 0, 0}
+	} ;
+
+	app_name = argv[0];
+
+	while((c = getopt_long(argc, argv, "x:d:D:B:b:i:N:m:o:g:e:zfqUPhVv", longopts, NULL)) != EOF) {
+#else
+	app_name = argv[0];
+
+	while((c = getopt(argc, argv,      "x:d:D:B:b:i:N:m:o:g:e:zfqUPhVv")) != EOF) {
+#endif /* HAVE_GETOPT_LONG */
+		switch(c)
+		{
+			case 'x':
+				fsin = optarg;
+				break;
+			case 'd':
+			case 'D':
+				dopt[didx++] = optarg;
+				break;
+			case 'B':
+				blocksize = SI_atof(optarg);
+				break;
+			case 'b':
+				nbblocks = SI_atof(optarg);
+				break;
+			case 'i':
+				bytes_per_inode = SI_atof(optarg);
+				break;
+			case 'N':
+				nbinodes = SI_atof(optarg);
+				break;
+			case 'm':
+				reserved_frac = SI_atof(optarg) / 100;
+				break;
+			case 'o':
+				creator_os = lookup_creator_os(optarg);
+				break;
+			case 'g':
+				gopt[gidx++] = optarg;
+				break;
+			case 'e':
+				emptyval = atoi(optarg);
+				break;
+			case 'z':
+				holes = 1;
+				break;
+			case 'f':
+				fs_timestamp = 0;
+				break;
+			case 'q':
+				squash_uids = 1;
+				squash_perms = 1;
+				break;
+			case 'U':
+				squash_uids = 1;
+				break;
+			case 'P':
+				squash_perms = 1;
+				break;
+			case 'h':
+				showhelp();
+				exit(0);
+			case 'V':
+				showversion();
+				exit(0);
+			case 'v':
+				verbose = 1;
+				showversion();
+				break;
+			default:
+				error_msg_and_die("Note: options have changed, see --help or the man page.");
+		}
+	}
+
+	if(optind < (argc - 1))
+		error_msg_and_die("Too many arguments. Try --help or else see the man page.");
+	if(optind > (argc - 1))
+		error_msg_and_die("Not enough arguments. Try --help or else see the man page.");
+	fsout = argv[optind];
+
+	if(blocksize != 1024 && blocksize != 2048 && blocksize != 4096)
+		error_msg_and_die("Valid block sizes: 1024, 2048 or 4096.");
+	if(creator_os < 0)
+		error_msg_and_die("Creator OS unknown.");
+
+	hdlinks.hdl = (struct hdlink_s *)malloc(hdlink_cnt * sizeof(struct hdlink_s));
+	if (!hdlinks.hdl)
+		error_msg_and_die("Not enough memory");
+	hdlinks.count = 0 ;
+
+	if(fsin)
+	{
+		if(strcmp(fsin, "-"))
+		{
+			FILE * fh = xfopen(fsin, "rb");
+			fs = load_fs(fh, bigendian);
+			fclose(fh);
+		}
+		else
+			fs = load_fs(stdin, bigendian);
+	}
+	else
+	{
+		if(reserved_frac == -1)
+			nbresrvd = nbblocks * RESERVED_BLOCKS;
+		else 
+			nbresrvd = nbblocks * reserved_frac;
+
+		stats.ninodes = EXT2_FIRST_INO - 1 + (nbresrvd ? 1 : 0);
+		stats.nblocks = 0;
+
+		populate_fs(NULL, dopt, didx, squash_uids, squash_perms, fs_timestamp, &stats);
+
+		if(nbinodes == -1)
+			nbinodes = stats.ninodes;
+		else
+			if(stats.ninodes > (unsigned long)nbinodes)
+			{
+				fprintf(stderr, "number of inodes too low, increasing to %ld\n", stats.ninodes);
+				nbinodes = stats.ninodes;
+			}
+
+		if(bytes_per_inode != -1) {
+			int tmp_nbinodes = nbblocks * BLOCKSIZE / bytes_per_inode;
+			if(tmp_nbinodes > nbinodes)
+				nbinodes = tmp_nbinodes;
+		}
+		if(fs_timestamp == -1)
+			fs_timestamp = time(NULL);
+		fs = init_fs(nbblocks, nbinodes, nbresrvd, holes,
+				fs_timestamp, creator_os);
+	}
+	
+	populate_fs(fs, dopt, didx, squash_uids, squash_perms, fs_timestamp, NULL);
+
+	if(emptyval) {
+		uint32 b;
+		for(b = 1; b < fs->sb.s_blocks_count; b++)
+			if(!allocated(GRP_GET_BLOCK_BITMAP(fs,b),GRP_BBM_OFFSET(fs,b)))
+				memset(get_blk(fs, b), emptyval, BLOCKSIZE);
+	}
+	if(verbose)
+		print_fs(fs);
+	for(i = 0; i < gidx; i++)
+	{
+		uint32 nod;
+		char fname[MAX_FILENAME];
+		char *p;
+		FILE *fh;
+		if(!(nod = find_path(fs, EXT2_ROOT_INO, gopt[i])))
+			error_msg_and_die("path %s not found in filesystem", gopt[i]);
+		while((p = strchr(gopt[i], '/')))
+			*p = '_';
+		SNPRINTF(fname, MAX_FILENAME-1, "%s.blk", gopt[i]);
+		fh = xfopen(fname, "wb");
+		fprintf(fh, "%d:", get_nod(fs, nod)->i_size);
+		flist_blocks(fs, nod, fh);
+		fclose(fh);
+	}
+	if(strcmp(fsout, "-"))
+	{
+		FILE * fh = xfopen(fsout, "wb");
+		dump_fs(fs, fh, bigendian);
+		fclose(fh);
+	}
+	else
+		dump_fs(fs, stdout, bigendian);
+	free_fs(fs);
+	return 0;
+}
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new/test-gen.lib
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new/test-gen.lib	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new/test-gen.lib	(revision 323)
@@ -0,0 +1,56 @@
+#!/bin/sh
+
+# These routines contain the filesystem generation code.
+# This code is sourced by the other scripts so that digest
+# generation is consistent.
+
+# dgen - Exercises the -d directory option of genext2fs
+# Creates an image with a file of given size
+# Usage: dgen file-size number-of-blocks 
+dgen () {
+	size=$1; blocks=$2; blocksz=$3;
+	rm -rf test
+	mkdir -p test
+	cd test
+	if [ x$size = x0 ]; then
+		> file.$1
+	else
+		dd if=/dev/zero of=file.$1 bs=$size count=1 2>/dev/null
+	fi
+        chmod 777 file.$1
+	TZ=UTC-11 touch -t 200502070321.43 file.$1 .
+	cd ..
+	./genext2fs -B $blocksz -N 17 -b $blocks -d test -f -o Linux -q ext2.img
+}
+
+# fgen - Exercises the -f spec-file option of genext2fs
+# Creates an image with the devices mentioned in the given spec file 
+# Usage: fgen spec-file number-of-blocks 
+fgen () {
+	fname=$1; blocks=$2; 
+	mkdir -p test
+	cp $fname test
+	TZ=UTC-11 touch -t 200502070321.43 test/$fname
+	./genext2fs -N 92 -b $blocks -D test/$fname -f -o Linux ext2.img
+}
+
+# gen_cleanup - Remove the files generated by the above functions
+# Usage: gen_cleanup
+gen_cleanup () {
+	rm -rf ext2.img test
+}
+
+# calc_digest - Return the MD5 digest of the test image
+# Usage: calc_digest
+calc_digest () {
+	digest=`md5sum ext2.img 2>/dev/null | cut -f 1 -d " "`
+	if [ x$digest != x ] ; then
+ 		echo $digest
+	else
+		digest=`md5 ext2.img 2>/dev/null | cut -f 4 -d " "`
+		echo $digest
+	fi
+}
+
+LC_ALL=C
+export LC_ALL
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new/test-mount.sh
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new/test-mount.sh	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new/test-mount.sh	(revision 323)
@@ -0,0 +1,95 @@
+#!/bin/sh
+
+# Use this script if you need to regenerate the digest values
+# in test.sh, or if you don't care about digests and you just
+# want to see some fsck results. Should be run as root.
+
+set -e
+
+. ./test-gen.lib
+
+test_cleanup () {
+	umount mnt 2>/dev/null || true
+	rm -rf mnt fout lsout
+}
+
+fail () {
+	echo FAILED
+	test_cleanup
+	gen_cleanup
+	exit 1
+}
+
+pass () {
+	md5=`calc_digest`
+	echo PASSED
+	echo $@ $md5
+	test_cleanup
+	gen_cleanup
+}
+
+# dtest-mount - Exercise the -d directory option of genext2fs
+# Creates an image with a file of given size, verifies it
+# and returns the command line with which to invoke dtest()
+# Usage: dtest-mount file-size number-of-blocks 
+dtest_mount () {
+	size=$1; blocks=$2; blocksz=$3;
+	echo Testing $blocks blocks of $blocksz bytes with file of size $size
+	dgen $size $blocks $blocksz
+	/sbin/e2fsck -fn ext2.img || fail
+	mkdir -p mnt
+	mount -t ext2 -o ro,loop ext2.img mnt || fail
+	if (! [ -f mnt/file.$size ]) || \
+	      [ $size != "`ls -al mnt | grep file.$size |
+	                                awk '{print $5}'`" ] ; then
+		fail
+	fi
+	pass dtest $size $blocks $blocksz
+}
+
+# ftest-mount - Exercise the -f spec-file option of genext2fs
+# Creates an image with the devices mentioned in the given spec 
+# file, verifies it, and returns the command line with which to
+# invoke ftest()
+# Usage: ftest-mount spec-file number-of-blocks 
+ftest_mount () {
+	fname=$1; blocks=$2 
+	echo Testing with devices file $fname
+	fgen $fname $blocks
+	/sbin/e2fsck -fn ext2.img || fail
+	mkdir -p mnt
+	mount -t ext2 -o ro,loop ext2.img mnt || fail
+	[ -d mnt/dev ] || fail
+	# Exclude those devices that have interpolated
+	# minor numbers, as being too hard to match.
+	egrep -v "(hda|hdb|tty|loop|ram|ubda)" $fname | \
+		grep '^[^	#]*	[bc]' | \
+		awk '{print $1,$4,$5,$6","$7}'| \
+		sort -d -k3.6 > fout
+	ls -aln mnt/dev | \
+		egrep -v "(hda|hdb|tty|loop|ram|ubda)" | \
+		grep ^[bc] | \
+		awk '{ print "/dev/"$10,$3,$4,$5$6}' | \
+		sort -d -k3.6 > lsout
+	diff fout lsout || fail
+	pass ftest $fname $blocks
+}
+
+dtest_mount 0 4096 1024
+dtest_mount 0 2048 2048
+dtest_mount 0 1024 4096
+dtest_mount 0 8193 1024
+dtest_mount 0 8194 1024
+dtest_mount 0 8193 4096
+dtest_mount 0 8194 2048
+dtest_mount 1 4096 1024
+dtest_mount 1 1024 4096
+dtest_mount 12288 4096 1024
+dtest_mount 274432 4096 1024
+dtest_mount 8388608 9000 1024
+dtest_mount 8388608 4500 2048
+dtest_mount 8388608 2250 4096
+dtest_mount 16777216 20000 1024
+dtest_mount 16777216 10000 2048
+
+ftest_mount device_table.txt 4096

Property changes on: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new/test-mount.sh
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new/test.sh
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new/test.sh	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new/test.sh	(revision 323)
@@ -0,0 +1,72 @@
+#!/bin/sh
+
+# This script generates a variety of filesystems and checks that they
+# are identical to ones that are known to be mountable, and pass fsck
+# and various other sanity checks.
+
+# Passing these tests is preferable to passing test-mount.sh because
+# this script doesn't require root, and because passing these tests
+# guarantees byte-for-byte agreement with other builds, ports,
+# architectures, times of day etc.
+
+set -e
+
+. ./test-gen.lib
+
+# md5cmp - Calculate MD5 digest and compare it to an expected value.
+# Usage: md5cmp expected-digest
+md5cmp () {
+	checksum=$1
+	md5=`calc_digest`
+	if [ x$md5 = x$checksum ] ; then
+		echo PASSED
+	else
+		echo FAILED
+		exit 1
+	fi
+}
+
+# dtest - Exercises the -d directory option of genext2fs
+# Creates an image with a file of given size and verifies it
+# Usage: dtest file-size number-of-blocks correct-checksum
+dtest () {
+	size=$1; blocks=$2; blocksz=$3; checksum=$4
+	echo Testing with file of size $size
+	dgen $size $blocks $blocksz
+	md5cmp $checksum
+	gen_cleanup
+}
+
+# ftest - Exercises the -f spec-file option of genext2fs
+# Creates an image with the devices mentioned in the given spec 
+# file and verifies it
+# Usage: ftest spec-file number-of-blocks correct-checksum
+ftest () {
+	fname=$1; blocks=$2; checksum=$3
+	echo Testing with devices file $fname
+	fgen $fname $blocks
+	md5cmp $checksum
+	gen_cleanup
+}
+
+# NB: to regenerate these values, always use test-mount.sh, that is,
+# replace the following lines with the output of
+# sudo sh test-mount.sh|grep test
+
+dtest 0 4096 1024 3bc6424b8fcd51a0de34ee59d91d5f16
+dtest 0 2048 2048 230afa16496df019878cc2370c661cdc
+dtest 0 1024 4096 ebff5eeb38b70f3f1cd081e60eb44561
+dtest 0 8193 1024 f174804f6b433b552706cbbfc60c416d
+dtest 0 8194 1024 4855a55d0cbdc44584634df49ebd5711
+dtest 0 8193 4096 c493679698418ec7e6552005e2d2a6d8
+dtest 0 8194 2048 ec13f328fa7543563f35f494bddc059c
+dtest 1 4096 1024 09c569b6bfb45222c729c42d04d5451f
+dtest 1 1024 4096 d318a326fdc907810ae9e6b0a20e9b06
+dtest 12288 4096 1024 61febcbfbf32024ef99103fcdc282c39
+dtest 274432 4096 1024 0c517803552c55c1806e4220b0a0164f
+dtest 8388608 9000 1024 e0e5ea15bced10ab486d8135584b5d8e
+dtest 8388608 4500 2048 39f4d537a72f5053fd6891721c59680d
+dtest 8388608 2250 4096 1d697fa4bc2cfffe02ac91edfadc40bf
+dtest 16777216 20000 1024 fdf636eb905ab4dc1bf76dce5ac5d209
+dtest 16777216 10000 2048 f9824a81ea5e74fdf469c097927c292b
+ftest device_table.txt 4096 a0af06d944b11d2902dfd705484c64cc

Property changes on: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new/test.sh
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new	(revision 323)

Property changes on: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/genext2fs-1.4.1-new
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/create.patch.sh
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/create.patch.sh	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/create.patch.sh	(revision 323)
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+VERSION=1.4.1
+
+tar --files-from=file.list -xzvf ../genext2fs-$VERSION.tar.gz
+mv genext2fs-$VERSION genext2fs-$VERSION-orig
+
+cp -rf ./genext2fs-$VERSION-new ./genext2fs-$VERSION
+
+diff -b --unified -Nr  genext2fs-$VERSION-orig  genext2fs-$VERSION > genext2fs-$VERSION-blocksize.patch
+
+mv genext2fs-$VERSION-blocksize.patch ../patches
+
+rm -rf ./genext2fs-$VERSION
+rm -rf ./genext2fs-$VERSION-orig

Property changes on: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/create.patch.sh
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/file.list
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/file.list	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch/file.list	(revision 323)
@@ -0,0 +1,5 @@
+genext2fs-1.4.1/genext2fs.8
+genext2fs-1.4.1/genext2fs.c
+genext2fs-1.4.1/test-gen.lib
+genext2fs-1.4.1/test-mount.sh
+genext2fs-1.4.1/test.sh
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch	(revision 323)

Property changes on: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-blocksize-patch
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/genext2fs-1.4.1-new/m4/ac_func_scanf_can_malloc.m4
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/genext2fs-1.4.1-new/m4/ac_func_scanf_can_malloc.m4	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/genext2fs-1.4.1-new/m4/ac_func_scanf_can_malloc.m4	(revision 323)
@@ -0,0 +1,53 @@
+dnl AC_FUNC_SCANF_CAN_MALLOC macro
+dnl
+dnl (c) Finn Thain 2006
+dnl Copying and distribution of this file, with or without modification,
+dnl are permitted in any medium without royalty provided the copyright
+dnl notice and this notice are preserved.
+
+# AC_FUNC_SCANF_CAN_MALLOC()
+# --------------------------------------
+AC_DEFUN([AC_FUNC_SCANF_CAN_MALLOC],
+  [ AC_CHECK_HEADERS([stdlib.h])
+    AC_CACHE_CHECK([whether scanf can malloc], [ac_cv_func_scanf_can_malloc],
+    [ AC_RUN_IFELSE(
+      [ AC_LANG_PROGRAM(
+        [
+#include <stdio.h>
+#if STDC_HEADERS || HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+        ], [
+  union { float f; char *p; } u;
+  char *p;
+  u.f = 0;
+  char *scan_this = "56789";
+  int matched = sscanf(scan_this, "%as", &u);
+  if(matched < 1) return 1; /* shouldn't happens */
+  if(u.f == (float)56789) return 2;
+
+  p = u.p;
+  while(*scan_this && *p == *scan_this) {
+    ++p;
+    ++scan_this;
+  };
+  free(u.p);
+  if(*scan_this == 0) return 0;
+  return 3;
+        ])
+      ],
+      [ac_scanf_can_malloc=yes],
+      [ac_scanf_can_malloc=no],
+      [
+case $host_alias in
+  *-*-linux* ) ac_scanf_can_malloc=yes ;;
+  *-*-solaris* ) ac_scanf_can_malloc=no ;;
+  *-*-darwin* ) ac_scanf_can_malloc=no ;;
+  * ) ac_scanf_can_malloc=no ;;
+esac
+      ])
+    ])
+if test x$ac_scanf_can_malloc = "xyes"; then
+  AC_DEFINE([SCANF_CAN_MALLOC], 1, [Define to 1 if the scanf %a conversion format mallocs a buffer. Undefine if %a format denotes a float.])
+fi
+  ])
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/genext2fs-1.4.1-new/m4
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/genext2fs-1.4.1-new/m4	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/genext2fs-1.4.1-new/m4	(revision 323)

Property changes on: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/genext2fs-1.4.1-new/m4
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/genext2fs-1.4.1-new/configure.ac
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/genext2fs-1.4.1-new/configure.ac	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/genext2fs-1.4.1-new/configure.ac	(revision 323)
@@ -0,0 +1,41 @@
+#                                               -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.59)
+AC_INIT([genext2fs],[1.4.1])
+
+builtin(include, [m4/ac_func_snprintf.m4])dnl
+builtin(include, [m4/ac_func_scanf_can_malloc.m4])dnl
+
+AM_INIT_AUTOMAKE([subdir-objects no-dist-gzip dist-xz])
+AC_CONFIG_HEADERS([config.h])
+
+AC_GNU_SOURCE
+
+# Checks for programs.
+AC_PROG_CC
+AC_PROG_INSTALL
+
+# Checks for header files.
+AC_HEADER_DIRENT
+AC_HEADER_STDC
+AC_HEADER_MAJOR
+AC_CHECK_HEADERS([fcntl.h inttypes.h limits.h memory.h stddef.h stdint.h stdlib.h string.h strings.h unistd.h])
+AC_CHECK_HEADERS([libgen.h getopt.h])
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_TYPE_UID_T
+AC_C_INLINE
+AC_CHECK_TYPE(size_t, unsigned)
+AC_CHECK_TYPE(ssize_t, signed)
+AC_CHECK_MEMBERS([struct stat.st_rdev])
+
+# Checks for library functions.
+AC_CHECK_FUNCS([getopt_long getline strtof])
+AC_FUNC_SNPRINTF
+AC_FUNC_SCANF_CAN_MALLOC
+
+AC_OUTPUT([Makefile],[
+chmod a+x $ac_top_srcdir/test-mount.sh $ac_top_srcdir/test.sh
+])
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/genext2fs-1.4.1-new
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/genext2fs-1.4.1-new	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/genext2fs-1.4.1-new	(revision 323)

Property changes on: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/genext2fs-1.4.1-new
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/create.patch.sh
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/create.patch.sh	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/create.patch.sh	(revision 323)
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+VERSION=1.4.1
+
+tar --files-from=file.list -xzvf ../genext2fs-$VERSION.tar.gz
+mv genext2fs-$VERSION genext2fs-$VERSION-orig
+
+cp -rf ./genext2fs-$VERSION-new ./genext2fs-$VERSION
+
+diff -b --unified -Nr  genext2fs-$VERSION-orig  genext2fs-$VERSION > genext2fs-$VERSION-configure.patch
+
+mv genext2fs-$VERSION-configure.patch ../patches
+
+rm -rf ./genext2fs-$VERSION
+rm -rf ./genext2fs-$VERSION-orig

Property changes on: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/create.patch.sh
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/file.list
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/file.list	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch/file.list	(revision 323)
@@ -0,0 +1,2 @@
+genext2fs-1.4.1/configure.in
+genext2fs-1.4.1/m4/ac_func_scanf_can_malloc.m4
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch	(revision 323)

Property changes on: build-system-1.8.1/3pp/sources/packages/genext2fs/create-1.4.1-configure-patch
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/patches/README
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/patches/README	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/patches/README	(revision 323)
@@ -0,0 +1,10 @@
+
+/* begin *
+
+   genext2fs-1.4.1-blocksize.patch - adds the two options to set block size and CREATOR_OS.
+                                     Also the two duncrions swap_goodblocks() [line: 1751]
+                                     and swap_badblocks() [line: 1810] are fixed;
+
+   genext2fs-1.4.1-configure.patch - changes according to new version of autotools.
+
+ * end */
Index: build-system-1.8.1/3pp/sources/packages/genext2fs/patches
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs/patches	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs/patches	(revision 323)

Property changes on: build-system-1.8.1/3pp/sources/packages/genext2fs/patches
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/sources/packages/genext2fs
===================================================================
--- build-system-1.8.1/3pp/sources/packages/genext2fs	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/genext2fs	(revision 323)

Property changes on: build-system-1.8.1/3pp/sources/packages/genext2fs
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/sources/packages/jsmin/Makefile
===================================================================
--- build-system-1.8.1/3pp/sources/packages/jsmin/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/jsmin/Makefile	(revision 323)
@@ -0,0 +1,48 @@
+
+COMPONENT_TARGETS = $(HARDWARE_NOARCH)
+
+
+include ../../../../../build-system/constants.mk
+
+
+url         = $(DOWNLOAD_SERVER)/sources/packages/a/jsmin
+
+
+versions    = 0.0.1
+pkgname     = jsmin
+suffix      = tar.gz
+
+tarballs    = $(addsuffix .$(suffix), $(addprefix $(pkgname)-, $(versions)))
+sha1s       = $(addsuffix .sha1sum, $(tarballs))
+
+
+BUILD_TARGETS = $(tarballs) $(sha1s)
+
+
+include ../../../../../build-system/core.mk
+
+
+.PHONY: download_clean
+
+
+$(tarballs):
+	@echo -e "\n======= Downloading source tarballs =======\n" ; \
+	 for tarball in $(tarballs) ; do \
+	   echo "$(url)/$$tarball" | xargs -n 1 -P 100 wget $(WGET_OPTIONS) - & \
+	 done ; wait
+
+$(sha1s): $(tarballs)
+	@for sha in $@ ; do \
+	   echo -e "\n======= Downloading '$$sha' signature =======\n" ; \
+	   echo "$(url)/$$sha" | xargs -n 1 -P 100 wget $(WGET_OPTIONS) - & wait %1 ; \
+	   touch $$sha ; \
+	   echo -e "\n======= Check the '$$sha' sha1sum =======\n" ; \
+	   sha1sum --check $$sha ; ret="$$?" ; \
+	   if [ "$$ret" == "1" ]; then \
+	     echo -e "\n======= ERROR: Bad '$$sha' sha1sum =======\n" ; \
+	     exit 1 ; \
+	   fi ; \
+	 done
+
+download_clean:
+	@rm -f $(tarballs) $(sha1s)
Index: build-system-1.8.1/3pp/sources/packages/jsmin
===================================================================
--- build-system-1.8.1/3pp/sources/packages/jsmin	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/jsmin	(revision 323)

Property changes on: build-system-1.8.1/3pp/sources/packages/jsmin
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,46 ##
+
+# local config & object files
+build-config.mk
+sbin
+usr
+var
+
+# configure targets
+autom4te.cache
+.config
+config.log
+config.status
+configure
+
+# Target build dirs
+.build-machine
+
+# Timestamps
+.makefile
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Object Files
+*.[ao]
+
+# backup copies
+*~
Index: build-system-1.8.1/3pp/sources/packages/perl/Makefile
===================================================================
--- build-system-1.8.1/3pp/sources/packages/perl/Makefile	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/perl/Makefile	(revision 323)
@@ -0,0 +1,59 @@
+
+COMPONENT_TARGETS = $(HARDWARE_NOARCH)
+
+
+include ../../../../../build-system/constants.mk
+
+
+url         = $(DOWNLOAD_SERVER)/sources/packages/d/perl
+
+
+versions    = 5.34.0
+pkgname     = perl
+suffix      = tar.xz
+
+tarballs    = $(addsuffix .$(suffix), $(addprefix $(pkgname)-, $(versions)))
+sha1s       = $(addsuffix .sha1sum, $(tarballs))
+
+patches     = $(CURDIR)/patches/perl-5.34.0-multilib.patch
+patches    += $(CURDIR)/patches/perl-5.34.0-CPAN.patch
+
+.NOTPARALLEL: $(patches)
+
+
+BUILD_TARGETS = $(tarballs) $(sha1s) $(patches)
+
+
+include ../../../../../build-system/core.mk
+
+
+.PHONY: download_clean
+
+
+$(tarballs):
+	@echo -e "\n======= Downloading source tarballs =======\n" ; \
+	 for tarball in $(tarballs) ; do \
+	   echo "$(url)/$$tarball" | xargs -n 1 -P 100 wget $(WGET_OPTIONS) - & \
+	 done ; wait
+
+$(sha1s): $(tarballs)
+	@for sha in $@ ; do \
+	   echo -e "\n======= Downloading '$$sha' signature =======\n" ; \
+	   echo "$(url)/$$sha" | xargs -n 1 -P 100 wget $(WGET_OPTIONS) - & wait %1 ; \
+	   touch $$sha ; \
+	   echo -e "\n======= Check the '$$sha' sha1sum =======\n" ; \
+	   sha1sum --check $$sha ; ret="$$?" ; \
+	   if [ "$$ret" == "1" ]; then \
+	     echo -e "\n======= ERROR: Bad '$$sha' sha1sum =======\n" ; \
+	     exit 1 ; \
+	   fi ; \
+	 done
+
+$(patches): $(sha1s)
+	@echo -e "\n======= Create Patches =======\n" ; \
+	 ( cd create-5.34.0-multilib-patch ; ./create.patch.sh ) ; \
+	 ( cd create-5.34.0-CPAN-patch     ; ./create.patch.sh ) ; \
+	 echo -e "\n"
+
+download_clean:
+	@rm -f $(tarballs) $(sha1s) $(patches)
Index: build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-CPAN-patch/create.patch.sh
===================================================================
--- build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-CPAN-patch/create.patch.sh	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-CPAN-patch/create.patch.sh	(revision 323)
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+VERSION=5.34.0
+
+tar --files-from=file.list -xJvf ../perl-$VERSION.tar.xz
+mv perl-$VERSION perl-$VERSION-orig
+
+cp -rf ./perl-$VERSION-new ./perl-$VERSION
+
+diff -b --unified -Nr  perl-$VERSION-orig  perl-$VERSION > perl-$VERSION-CPAN.patch
+
+mv perl-$VERSION-CPAN.patch ../patches
+
+rm -rf ./perl-$VERSION
+rm -rf ./perl-$VERSION-orig

Property changes on: build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-CPAN-patch/create.patch.sh
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-CPAN-patch/file.list
===================================================================
--- build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-CPAN-patch/file.list	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-CPAN-patch/file.list	(revision 323)
@@ -0,0 +1 @@
+perl-5.34.0/cpan/CPAN/lib/App/Cpan.pm
Index: build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-CPAN-patch/perl-5.34.0-new/cpan/CPAN/lib/App/Cpan.pm
===================================================================
--- build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-CPAN-patch/perl-5.34.0-new/cpan/CPAN/lib/App/Cpan.pm	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-CPAN-patch/perl-5.34.0-new/cpan/CPAN/lib/App/Cpan.pm	(revision 323)
@@ -0,0 +1,1719 @@
+package App::Cpan;
+
+use strict;
+use warnings;
+use vars qw($VERSION);
+
+use if $] < 5.008 => 'IO::Scalar';
+
+$VERSION = '1.676';
+
+=head1 NAME
+
+App::Cpan - easily interact with CPAN from the command line
+
+=head1 SYNOPSIS
+
+	# with arguments and no switches, installs specified modules
+	cpan module_name [ module_name ... ]
+
+	# with switches, installs modules with extra behavior
+	cpan [-cfFimtTw] module_name [ module_name ... ]
+
+	# use local::lib
+	cpan -I module_name [ module_name ... ]
+
+	# one time mirror override for faster mirrors
+	cpan -p ...
+
+	# with just the dot, install from the distribution in the
+	# current directory
+	cpan .
+
+	# without arguments, starts CPAN.pm shell
+	cpan
+
+	# without arguments, but some switches
+	cpan [-ahpruvACDLOPX]
+
+=head1 DESCRIPTION
+
+This script provides a command interface (not a shell) to CPAN. At the
+moment it uses CPAN.pm to do the work, but it is not a one-shot command
+runner for CPAN.pm.
+
+=head2 Options
+
+=over 4
+
+=item -a
+
+Creates a CPAN.pm autobundle with CPAN::Shell->autobundle.
+
+=item -A module [ module ... ]
+
+Shows the primary maintainers for the specified modules.
+
+=item -c module
+
+Runs a `make clean` in the specified module's directories.
+
+=item -C module [ module ... ]
+
+Show the F<Changes> files for the specified modules
+
+=item -D module [ module ... ]
+
+Show the module details. This prints one line for each out-of-date module
+(meaning, modules locally installed but have newer versions on CPAN).
+Each line has three columns: module name, local version, and CPAN
+version.
+
+=item -f
+
+Force the specified action, when it normally would have failed. Use this
+to install a module even if its tests fail. When you use this option,
+-i is not optional for installing a module when you need to force it:
+
+	% cpan -f -i Module::Foo
+
+=item -F
+
+Turn off CPAN.pm's attempts to lock anything. You should be careful with
+this since you might end up with multiple scripts trying to muck in the
+same directory. This isn't so much of a concern if you're loading a special
+config with C<-j>, and that config sets up its own work directories.
+
+=item -g module [ module ... ]
+
+Downloads to the current directory the latest distribution of the module.
+
+=item -G module [ module ... ]
+
+UNIMPLEMENTED
+
+Download to the current directory the latest distribution of the
+modules, unpack each distribution, and create a git repository for each
+distribution.
+
+If you want this feature, check out Yanick Champoux's C<Git::CPAN::Patch>
+distribution.
+
+=item -h
+
+Print a help message and exit. When you specify C<-h>, it ignores all
+of the other options and arguments.
+
+=item -i module [ module ... ]
+
+Install the specified modules. With no other switches, this switch
+is implied.
+
+=item -I
+
+Load C<local::lib> (think like C<-I> for loading lib paths). Too bad
+C<-l> was already taken.
+
+=item -j Config.pm
+
+Load the file that has the CPAN configuration data. This should have the
+same format as the standard F<CPAN/Config.pm> file, which defines
+C<$CPAN::Config> as an anonymous hash.
+
+If the file does not exist, C<cpan> dies.
+
+=item -J
+
+Dump the configuration in the same format that CPAN.pm uses. This is useful
+for checking the configuration as well as using the dump as a starting point
+for a new, custom configuration.
+
+=item -l
+
+List all installed modules with their versions
+
+=item -L author [ author ... ]
+
+List the modules by the specified authors.
+
+=item -m
+
+Make the specified modules.
+
+=item -M mirror1,mirror2,...
+
+A comma-separated list of mirrors to use for just this run. The C<-P>
+option can find them for you automatically.
+
+=item -n
+
+Do a dry run, but don't actually install anything. (unimplemented)
+
+=item -O
+
+Show the out-of-date modules.
+
+=item -p
+
+Ping the configured mirrors and print a report
+
+=item -P
+
+Find the best mirrors you could be using and use them for the current
+session.
+
+=item -r
+
+Recompiles dynamically loaded modules with CPAN::Shell->recompile.
+
+=item -s
+
+Drop in the CPAN.pm shell. This command does this automatically if you don't
+specify any arguments.
+
+=item -t module [ module ... ]
+
+Run a `make test` on the specified modules.
+
+=item -T
+
+Do not test modules. Simply install them.
+
+=item -u
+
+Upgrade all installed modules. Blindly doing this can really break things,
+so keep a backup.
+
+=item -v
+
+Print the script version and CPAN.pm version then exit.
+
+=item -V
+
+Print detailed information about the cpan client.
+
+=item -w
+
+UNIMPLEMENTED
+
+Turn on cpan warnings. This checks various things, like directory permissions,
+and tells you about problems you might have.
+
+=item -x module [ module ... ]
+
+Find close matches to the named modules that you think you might have
+mistyped. This requires the optional installation of Text::Levenshtein or
+Text::Levenshtein::Damerau.
+
+=item -X
+
+Dump all the namespaces to standard output.
+
+=back
+
+=head2 Examples
+
+	# print a help message
+	cpan -h
+
+	# print the version numbers
+	cpan -v
+
+	# create an autobundle
+	cpan -a
+
+	# recompile modules
+	cpan -r
+
+	# upgrade all installed modules
+	cpan -u
+
+	# install modules ( sole -i is optional )
+	cpan -i Netscape::Booksmarks Business::ISBN
+
+	# force install modules ( must use -i )
+	cpan -fi CGI::Minimal URI
+
+	# install modules but without testing them
+	cpan -Ti CGI::Minimal URI
+
+=head2 Environment variables
+
+There are several components in CPAN.pm that use environment variables.
+The build tools, L<ExtUtils::MakeMaker> and L<Module::Build> use some,
+while others matter to the levels above them. Some of these are specified
+by the Perl Toolchain Gang:
+
+Lancaster Concensus: L<https://github.com/Perl-Toolchain-Gang/toolchain-site/blob/master/lancaster-consensus.md>
+
+Oslo Concensus: L<https://github.com/Perl-Toolchain-Gang/toolchain-site/blob/master/oslo-consensus.md>
+
+=over 4
+
+=item NONINTERACTIVE_TESTING
+
+Assume no one is paying attention and skips prompts for distributions
+that do that correctly. C<cpan(1)> sets this to C<1> unless it already
+has a value (even if that value is false).
+
+=item PERL_MM_USE_DEFAULT
+
+Use the default answer for a prompted questions. C<cpan(1)> sets this
+to C<1> unless it already has a value (even if that value is false).
+
+=item CPAN_OPTS
+
+As with C<PERL5OPT>, a string of additional C<cpan(1)> options to
+add to those you specify on the command line.
+
+=item CPANSCRIPT_LOGLEVEL
+
+The log level to use, with either the embedded, minimal logger or
+L<Log::Log4perl> if it is installed. Possible values are the same as
+the C<Log::Log4perl> levels: C<TRACE>, C<DEBUG>, C<INFO>, C<WARN>,
+C<ERROR>, and C<FATAL>. The default is C<INFO>.
+
+=item GIT_COMMAND
+
+The path to the C<git> binary to use for the Git features. The default
+is C</usr/local/bin/git>.
+
+=back
+
+=head2 Methods
+
+=over 4
+
+=cut
+
+use autouse Carp => qw(carp croak cluck);
+use CPAN 1.80 (); # needs no test
+use Config;
+use autouse Cwd => qw(cwd);
+use autouse 'Data::Dumper' => qw(Dumper);
+use File::Spec::Functions qw(catfile file_name_is_absolute rel2abs);
+use File::Basename;
+use Getopt::Std;
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# Internal constants
+use constant TRUE  => 1;
+use constant FALSE => 0;
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# The return values
+use constant HEY_IT_WORKED              =>   0;
+use constant I_DONT_KNOW_WHAT_HAPPENED  =>   1; # 0b0000_0001
+use constant ITS_NOT_MY_FAULT           =>   2;
+use constant THE_PROGRAMMERS_AN_IDIOT   =>   4;
+use constant A_MODULE_FAILED_TO_INSTALL =>   8;
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# set up the order of options that we layer over CPAN::Shell
+BEGIN { # most of this should be in methods
+use vars qw( @META_OPTIONS $Default %CPAN_METHODS @CPAN_OPTIONS  @option_order
+	%Method_table %Method_table_index );
+
+@META_OPTIONS = qw( h v V I g G M: C A D O l L a r p P j: J w x X );
+
+$Default = 'default';
+
+%CPAN_METHODS = ( # map switches to method names in CPAN::Shell
+	$Default => 'install',
+	'c'      => 'clean',
+	'f'      => 'force',
+	'i'      => 'install',
+	'm'      => 'make',
+	't'      => 'test',
+	'u'      => 'upgrade',
+	'T'      => 'notest',
+	's'      => 'shell',
+	);
+@CPAN_OPTIONS = grep { $_ ne $Default } sort keys %CPAN_METHODS;
+
+@option_order = ( @META_OPTIONS, @CPAN_OPTIONS );
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# map switches to the subroutines in this script, along with other information.
+# use this stuff instead of hard-coded indices and values
+sub NO_ARGS   () { 0 }
+sub ARGS      () { 1 }
+sub GOOD_EXIT () { 0 }
+
+%Method_table = (
+# key => [ sub ref, takes args?, exit value, description ]
+
+	# options that do their thing first, then exit
+	h =>  [ \&_print_help,        NO_ARGS, GOOD_EXIT, 'Printing help'                ],
+	v =>  [ \&_print_version,     NO_ARGS, GOOD_EXIT, 'Printing version'             ],
+	V =>  [ \&_print_details,     NO_ARGS, GOOD_EXIT, 'Printing detailed version'    ],
+	X =>  [ \&_list_all_namespaces, NO_ARGS, GOOD_EXIT, 'Listing all namespaces'      ],
+
+	# options that affect other options
+	j =>  [ \&_load_config,          ARGS, GOOD_EXIT, 'Use specified config file'    ],
+	J =>  [ \&_dump_config,       NO_ARGS, GOOD_EXIT, 'Dump configuration to stdout' ],
+	F =>  [ \&_lock_lobotomy,     NO_ARGS, GOOD_EXIT, 'Turn off CPAN.pm lock files'  ],
+	I =>  [ \&_load_local_lib,    NO_ARGS, GOOD_EXIT, 'Loading local::lib'           ],
+	M =>  [ \&_use_these_mirrors,    ARGS, GOOD_EXIT, 'Setting per session mirrors'  ],
+	P =>  [ \&_find_good_mirrors, NO_ARGS, GOOD_EXIT, 'Finding good mirrors'         ],
+    w =>  [ \&_turn_on_warnings,  NO_ARGS, GOOD_EXIT, 'Turning on warnings'          ],
+
+	# options that do their one thing
+	g =>  [ \&_download,             ARGS, GOOD_EXIT, 'Download the latest distro'        ],
+	G =>  [ \&_gitify,               ARGS, GOOD_EXIT, 'Down and gitify the latest distro' ],
+
+	C =>  [ \&_show_Changes,         ARGS, GOOD_EXIT, 'Showing Changes file'         ],
+	A =>  [ \&_show_Author,          ARGS, GOOD_EXIT, 'Showing Author'               ],
+	D =>  [ \&_show_Details,         ARGS, GOOD_EXIT, 'Showing Details'              ],
+	O =>  [ \&_show_out_of_date,  NO_ARGS, GOOD_EXIT, 'Showing Out of date'          ],
+	l =>  [ \&_list_all_mods,     NO_ARGS, GOOD_EXIT, 'Listing all modules'          ],
+
+	L =>  [ \&_show_author_mods,     ARGS, GOOD_EXIT, 'Showing author mods'          ],
+	a =>  [ \&_create_autobundle, NO_ARGS, GOOD_EXIT, 'Creating autobundle'          ],
+	p =>  [ \&_ping_mirrors,      NO_ARGS, GOOD_EXIT, 'Pinging mirrors'              ],
+
+	r =>  [ \&_recompile,         NO_ARGS, GOOD_EXIT, 'Recompiling'                  ],
+	u =>  [ \&_upgrade,           NO_ARGS, GOOD_EXIT, 'Running `make test`'          ],
+   's' => [ \&_shell,            NO_ARGS, GOOD_EXIT, 'Running `make test`'          ],
+
+   'x' => [ \&_guess_namespace,      ARGS, GOOD_EXIT, 'Guessing namespaces'          ],
+	c =>  [ \&_default,              ARGS, GOOD_EXIT, 'Running `make clean`'         ],
+	f =>  [ \&_default,              ARGS, GOOD_EXIT, 'Installing with force'        ],
+	i =>  [ \&_default,              ARGS, GOOD_EXIT, 'Running `make install`'       ],
+   'm' => [ \&_default,              ARGS, GOOD_EXIT, 'Running `make`'               ],
+	t =>  [ \&_default,              ARGS, GOOD_EXIT, 'Running `make test`'          ],
+	T =>  [ \&_default,              ARGS, GOOD_EXIT, 'Installing with notest'       ],
+	);
+
+%Method_table_index = (
+	code        => 0,
+	takes_args  => 1,
+	exit_value  => 2,
+	description => 3,
+	);
+}
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# finally, do some argument processing
+
+sub _stupid_interface_hack_for_non_rtfmers
+	{
+	no warnings 'uninitialized';
+	shift @ARGV if( $ARGV[0] eq 'install' and @ARGV > 1 )
+	}
+
+sub _process_options
+	{
+	my %options;
+
+	push @ARGV, grep $_, split /\s+/, $ENV{CPAN_OPTS} || '';
+
+	# if no arguments, just drop into the shell
+	if( 0 == @ARGV ) { CPAN::shell(); exit 0 }
+	elsif (Getopt::Std::getopts(
+		  join( '', @option_order ), \%options ))
+		{
+		 \%options;
+		}
+	else { exit 1 }
+}
+
+sub _process_setup_options
+	{
+	my( $class, $options ) = @_;
+
+	if( $options->{j} )
+		{
+		$Method_table{j}[ $Method_table_index{code} ]->( $options->{j} );
+		delete $options->{j};
+		}
+	elsif ( ! $options->{h} ) { # h "ignores all of the other options and arguments"
+		# this is what CPAN.pm would do otherwise
+		local $CPAN::Be_Silent = 1;
+		CPAN::HandleConfig->load(
+			# be_silent  => 1, deprecated
+			write_file => 0,
+			);
+		}
+
+	$class->_turn_off_testing if $options->{T};
+
+	foreach my $o ( qw(F I w P M) )
+		{
+		next unless exists $options->{$o};
+		$Method_table{$o}[ $Method_table_index{code} ]->( $options->{$o} );
+		delete $options->{$o};
+		}
+
+	if( $options->{o} )
+		{
+		my @pairs = map { [ split /=/, $_, 2 ] } split /,/, $options->{o};
+		foreach my $pair ( @pairs )
+			{
+			my( $setting, $value ) = @$pair;
+			$CPAN::Config->{$setting} = $value;
+		#	$logger->debug( "Setting [$setting] to [$value]" );
+			}
+		delete $options->{o};
+		}
+
+	my $option_count = grep { $options->{$_} } @option_order;
+	no warnings 'uninitialized';
+
+	# don't count options that imply installation
+	foreach my $opt ( qw(f T) ) { # don't count force or notest
+		$option_count -= $options->{$opt};
+		}
+
+	# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+	# if there are no options, set -i (this line fixes RT ticket 16915)
+	$options->{i}++ unless $option_count;
+	}
+
+sub _setup_environment {
+# should we override or set defaults? If this were a true interactive
+# session, we'd be in the CPAN shell.
+
+# https://github.com/Perl-Toolchain-Gang/toolchain-site/blob/master/lancaster-consensus.md
+	$ENV{NONINTERACTIVE_TESTING} = 1 unless defined $ENV{NONINTERACTIVE_TESTING};
+	$ENV{PERL_MM_USE_DEFAULT}    = 1 unless defined $ENV{PERL_MM_USE_DEFAULT};
+	}
+
+=item run()
+
+Just do it.
+
+The C<run> method returns 0 on success and a positive number on
+failure. See the section on EXIT CODES for details on the values.
+
+=cut
+
+my $logger;
+
+sub run
+	{
+	my $class = shift;
+
+	my $return_value = HEY_IT_WORKED; # assume that things will work
+
+	$logger = $class->_init_logger;
+	$logger->debug( "Using logger from @{[ref $logger]}" );
+
+	$class->_hook_into_CPANpm_report;
+	$logger->debug( "Hooked into output" );
+
+	$class->_stupid_interface_hack_for_non_rtfmers;
+	$logger->debug( "Patched cargo culting" );
+
+	my $options = $class->_process_options;
+	$logger->debug( "Options are @{[Dumper($options)]}" );
+
+	$class->_process_setup_options( $options );
+
+	$class->_setup_environment( $options );
+
+	OPTION: foreach my $option ( @option_order )
+		{
+		next unless $options->{$option};
+
+		my( $sub, $takes_args, $description ) =
+			map { $Method_table{$option}[ $Method_table_index{$_} ] }
+			qw( code takes_args description );
+
+		unless( ref $sub eq ref sub {} )
+			{
+			$return_value = THE_PROGRAMMERS_AN_IDIOT;
+			last OPTION;
+			}
+
+		$logger->info( "[$option] $description -- ignoring other arguments" )
+			if( @ARGV && ! $takes_args );
+
+		$return_value = $sub->( \ @ARGV, $options );
+
+		last;
+		}
+
+	return $return_value;
+	}
+
+my $LEVEL;
+{
+package
+  Local::Null::Logger; # hide from PAUSE
+
+my @LOGLEVELS = qw(TRACE DEBUG INFO WARN ERROR FATAL);
+$LEVEL        = uc($ENV{CPANSCRIPT_LOGLEVEL} || 'INFO');
+my %LL        = map { $LOGLEVELS[$_] => $_ } 0..$#LOGLEVELS;
+unless (defined $LL{$LEVEL}){
+	warn "Unsupported loglevel '$LEVEL', setting to INFO";
+	$LEVEL = 'INFO';
+}
+sub new { bless \ my $x, $_[0] }
+sub AUTOLOAD {
+    my $autoload = our $AUTOLOAD;
+    $autoload =~ s/.*://;
+    return if $LL{uc $autoload} < $LL{$LEVEL};
+    $CPAN::Frontend->mywarn(">($autoload): $_\n")
+        for split /[\r\n]+/, $_[1];
+}
+sub DESTROY { 1 }
+}
+
+# load a module without searching the default entry for the current
+# directory
+sub _safe_load_module {
+    my $name = shift;
+
+    local @INC = @INC;
+    pop @INC if $INC[-1] eq '.';
+
+    eval "require $name; 1";
+}
+
+sub _init_logger
+	{
+	my $log4perl_loaded = _safe_load_module("Log::Log4perl");
+
+    unless( $log4perl_loaded )
+        {
+        print STDOUT "Loading internal logger. Log::Log4perl recommended for better logging\n";
+        $logger = Local::Null::Logger->new;
+        return $logger;
+        }
+
+	Log::Log4perl::init( \ <<"HERE" );
+log4perl.rootLogger=$LEVEL, A1
+log4perl.appender.A1=Log::Log4perl::Appender::Screen
+log4perl.appender.A1.layout=PatternLayout
+log4perl.appender.A1.layout.ConversionPattern=%m%n
+HERE
+
+	$logger = Log::Log4perl->get_logger( 'App::Cpan' );
+	}
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+ # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+sub _default
+	{
+	my( $args, $options ) = @_;
+
+	my $switch = '';
+
+	# choose the option that we're going to use
+	# we'll deal with 'f' (force) later, so skip it
+	foreach my $option ( @CPAN_OPTIONS )
+		{
+		next if ( $option eq 'f' or $option eq 'T' );
+		next unless $options->{$option};
+		$switch = $option;
+		last;
+		}
+
+	# 1. with no switches, but arguments, use the default switch (install)
+	# 2. with no switches and no args, start the shell
+	# 3. With a switch but no args, die! These switches need arguments.
+	   if( not $switch and     @$args ) { $switch = $Default;  }
+	elsif( not $switch and not @$args ) { return CPAN::shell() }
+	elsif(     $switch and not @$args )
+		{ die "Nothing to $CPAN_METHODS{$switch}!\n"; }
+
+	# Get and check the method from CPAN::Shell
+	my $method = $CPAN_METHODS{$switch};
+	die "CPAN.pm cannot $method!\n" unless CPAN::Shell->can( $method );
+
+	# call the CPAN::Shell method, with force or notest if specified
+	my $action = do {
+		   if( $options->{f} ) { sub { CPAN::Shell->force( $method, @_ )  } }
+		elsif( $options->{T} ) { sub { CPAN::Shell->notest( $method, @_ ) } }
+		else                   { sub { CPAN::Shell->$method( @_ )         } }
+		};
+
+	# How do I handle exit codes for multiple arguments?
+	my @errors = ();
+
+	$options->{x} or _disable_guessers();
+
+	foreach my $arg ( @$args )
+		{
+		# check the argument and perhaps capture typos
+		my $module = _expand_module( $arg ) or do {
+			$logger->error( "Skipping $arg because I couldn't find a matching namespace." );
+			next;
+			};
+
+		_clear_cpanpm_output();
+		$action->( $arg );
+
+		my $error = _cpanpm_output_indicates_failure();
+		push @errors, $error if $error;
+		}
+
+	return do {
+		if( @errors ) { $errors[0] }
+		else { HEY_IT_WORKED }
+		};
+
+	}
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+=for comment
+
+CPAN.pm sends all the good stuff either to STDOUT, or to a temp
+file if $CPAN::Be_Silent is set. I have to intercept that output
+so I can find out what happened.
+
+=cut
+
+BEGIN {
+my $scalar = '';
+
+sub _hook_into_CPANpm_report
+	{
+	no warnings 'redefine';
+
+	*CPAN::Shell::myprint = sub {
+		my($self,$what) = @_;
+		$scalar .= $what if defined $what;
+		$self->print_ornamented($what,
+			$CPAN::Config->{colorize_print}||'bold blue on_white',
+			);
+		};
+
+	*CPAN::Shell::mywarn = sub {
+		my($self,$what) = @_;
+		$scalar .= $what if defined $what;
+		$self->print_ornamented($what,
+			$CPAN::Config->{colorize_warn}||'bold red on_white'
+			);
+		};
+
+	}
+
+sub _clear_cpanpm_output { $scalar = '' }
+
+sub _get_cpanpm_output   { $scalar }
+
+# These are lines I don't care about in CPAN.pm output. If I can
+# filter out the informational noise, I have a better chance to
+# catch the error signal
+my @skip_lines = (
+	qr/^\QWarning \(usually harmless\)/,
+	qr/\bwill not store persistent state\b/,
+	qr(//hint//),
+	qr/^\s+reports\s+/,
+	qr/^Try the command/,
+	qr/^\s+$/,
+	qr/^to find objects/,
+	qr/^\s*Database was generated on/,
+	qr/^Going to read/,
+	qr|^\s+i\s+/|,    # the i /Foo::Whatever/ line when it doesn't know
+	);
+
+sub _get_cpanpm_last_line
+	{
+	my $fh;
+
+	if( $] < 5.008 ) {
+		$fh = IO::Scalar->new( \ $scalar );
+		}
+	else {
+		eval q{ open $fh, '<', \\ $scalar; };
+		}
+
+	my @lines = <$fh>;
+
+    # This is a bit ugly. Once we examine a line, we have to
+    # examine the line before it and go through all of the same
+    # regexes. I could do something fancy, but this works.
+    REGEXES: {
+	foreach my $regex ( @skip_lines )
+		{
+		if( $lines[-1] =~ m/$regex/ )
+            {
+            pop @lines;
+            redo REGEXES; # we have to go through all of them for every line!
+            }
+		}
+	}
+
+    $logger->debug( "Last interesting line of CPAN.pm output is:\n\t$lines[-1]" );
+
+	$lines[-1];
+	}
+}
+
+BEGIN {
+my $epic_fail_words = join '|',
+	qw( Error stop(?:ping)? problems force not unsupported
+		fail(?:ed)? Cannot\s+install );
+
+sub _cpanpm_output_indicates_failure
+	{
+	my $last_line = _get_cpanpm_last_line();
+
+	my $result = $last_line =~ /\b(?:$epic_fail_words)\b/i;
+	return A_MODULE_FAILED_TO_INSTALL if $last_line =~ /\b(?:Cannot\s+install)\b/i;
+
+	$result || ();
+	}
+}
+
+sub _cpanpm_output_indicates_success
+	{
+	my $last_line = _get_cpanpm_last_line();
+
+	my $result = $last_line =~ /\b(?:\s+-- OK|PASS)\b/;
+	$result || ();
+	}
+
+sub _cpanpm_output_is_vague
+	{
+	return FALSE if
+		_cpanpm_output_indicates_failure() ||
+		_cpanpm_output_indicates_success();
+
+	return TRUE;
+	}
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+sub _turn_on_warnings {
+	carp "Warnings are implemented yet";
+	return HEY_IT_WORKED;
+	}
+
+sub _turn_off_testing {
+	$logger->debug( 'Trusting test report history' );
+	$CPAN::Config->{trust_test_report_history} = 1;
+	return HEY_IT_WORKED;
+	}
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+sub _print_help
+	{
+	$logger->info( "Use perldoc to read the documentation" );
+	my $HAVE_PERLDOC = eval { require Pod::Perldoc; 1; };
+	if ($HAVE_PERLDOC) {
+		system qq{"$^X" -e "require Pod::Perldoc; Pod::Perldoc->run()" $0};
+		exit;
+	} else {
+		warn "Please install Pod::Perldoc, maybe try 'cpan -i Pod::Perldoc'\n";
+		return HEY_IT_WORKED;
+	}
+	}
+
+sub _print_version # -v
+	{
+	$logger->info(
+		"$0 script version $VERSION, CPAN.pm version " . CPAN->VERSION );
+
+	return HEY_IT_WORKED;
+	}
+
+sub _print_details # -V
+	{
+	_print_version();
+
+	_check_install_dirs();
+
+	$logger->info( '-' x 50 . "\nChecking configured mirrors..." );
+	foreach my $mirror ( @{ $CPAN::Config->{urllist} } ) {
+		_print_ping_report( $mirror );
+		}
+
+	$logger->info( '-' x 50 . "\nChecking for faster mirrors..." );
+
+	{
+	require CPAN::Mirrors;
+
+      if ( $CPAN::Config->{connect_to_internet_ok} ) {
+        $CPAN::Frontend->myprint(qq{Trying to fetch a mirror list from the Internet\n});
+        eval { CPAN::FTP->localize('MIRRORED.BY',File::Spec->catfile($CPAN::Config->{keep_source_where},'MIRRORED.BY'),3,1) }
+          or $CPAN::Frontend->mywarn(<<'HERE');
+We failed to get a copy of the mirror list from the Internet.
+You will need to provide CPAN mirror URLs yourself.
+HERE
+        $CPAN::Frontend->myprint("\n");
+      }
+
+	my $mirrors   = CPAN::Mirrors->new( _mirror_file() );
+	my @continents = $mirrors->find_best_continents;
+
+	my @mirrors   = $mirrors->get_mirrors_by_continents( $continents[0] );
+	my @timings   = $mirrors->get_mirrors_timings( \@mirrors );
+
+	foreach my $timing ( @timings ) {
+		$logger->info( sprintf "%s (%0.2f ms)",
+			$timing->hostname, $timing->rtt );
+		}
+	}
+
+	return HEY_IT_WORKED;
+	}
+
+sub _check_install_dirs
+	{
+	my $makepl_arg   = $CPAN::Config->{makepl_arg};
+	my $mbuildpl_arg = $CPAN::Config->{mbuildpl_arg};
+
+	my @custom_dirs;
+	# PERL_MM_OPT
+	push @custom_dirs,
+		$makepl_arg   =~ m/INSTALL_BASE\s*=\s*(\S+)/g,
+		$mbuildpl_arg =~ m/--install_base\s*=\s*(\S+)/g;
+
+	if( @custom_dirs ) {
+		foreach my $dir ( @custom_dirs ) {
+			_print_inc_dir_report( $dir );
+			}
+		}
+
+	# XXX: also need to check makepl_args, etc
+
+	my @checks = (
+		[ 'core',         [ grep $_, @Config{qw(installprivlib installarchlib)}      ] ],
+		[ 'vendor',       [ grep $_, @Config{qw(installvendorlib installvendorarch)} ] ],
+		[ 'site',         [ grep $_, @Config{qw(installsitelib installsitearch)}     ] ],
+		[ 'PERL5LIB',     _split_paths( $ENV{PERL5LIB} ) ],
+		[ 'PERLLIB',      _split_paths( $ENV{PERLLIB} )  ],
+		);
+
+	$logger->info( '-' x 50 . "\nChecking install dirs..." );
+	foreach my $tuple ( @checks ) {
+		my( $label ) = $tuple->[0];
+
+		$logger->info( "Checking $label" );
+		$logger->info( "\tno directories for $label" ) unless @{ $tuple->[1] };
+		foreach my $dir ( @{ $tuple->[1] } ) {
+			_print_inc_dir_report( $dir );
+			}
+		}
+
+	}
+
+sub _split_paths
+	{
+	[ map { _expand_filename( $_ ) } split /$Config{path_sep}/, $_[0] || '' ];
+	}
+
+
+=pod
+
+Stolen from File::Path::Expand
+
+=cut
+
+sub _expand_filename
+	{
+    my( $path ) = @_;
+    no warnings 'uninitialized';
+    $logger->debug( "Expanding path $path\n" );
+    $path =~ s{\A~([^/]+)?}{
+		_home_of( $1 || $> ) || "~$1"
+    	}e;
+    return $path;
+	}
+
+sub _home_of
+	{
+	require User::pwent;
+    my( $user ) = @_;
+    my $ent = User::pwent::getpw($user) or return;
+    return $ent->dir;
+	}
+
+sub _get_default_inc
+	{
+	require Config;
+
+	[ @Config::Config{ _vars() }, '.' ];
+	}
+
+sub _vars {
+	qw(
+	installarchlib
+	installprivlib
+	installsitearch
+	installsitelib
+	);
+	}
+
+sub _ping_mirrors {
+	my $urls   = $CPAN::Config->{urllist};
+	require URI;
+
+	foreach my $url ( @$urls ) {
+		my( $obj ) = URI->new( $url );
+		next unless _is_pingable_scheme( $obj );
+		my $host = $obj->host;
+		_print_ping_report( $obj );
+		}
+
+	}
+
+sub _is_pingable_scheme {
+	my( $uri ) = @_;
+
+	$uri->scheme eq 'file'
+	}
+
+sub _mirror_file {
+	my $file = do {
+		my $file = 'MIRRORED.BY';
+		my $local_path = File::Spec->catfile(
+			$CPAN::Config->{keep_source_where}, $file );
+
+		if( -e $local_path ) { $local_path }
+		else {
+			require CPAN::FTP;
+			CPAN::FTP->localize( $file, $local_path, 3, 1 );
+			$local_path;
+			}
+		};
+	}
+
+sub _find_good_mirrors {
+	require CPAN::Mirrors;
+
+	my $mirrors = CPAN::Mirrors->new( _mirror_file() );
+
+	my @mirrors = $mirrors->best_mirrors(
+		how_many   => 5,
+		verbose    => 1,
+		);
+
+	foreach my $mirror ( @mirrors ) {
+		next unless eval { $mirror->can( 'http' ) };
+		_print_ping_report( $mirror->http );
+		}
+
+	$CPAN::Config->{urllist} = [
+		map { $_->http } @mirrors
+		];
+	}
+
+sub _print_inc_dir_report
+	{
+	my( $dir ) = shift;
+
+	my $writeable = -w $dir ? '+' : '!!! (not writeable)';
+	$logger->info( "\t$writeable $dir" );
+	return -w $dir;
+	}
+
+sub _print_ping_report
+	{
+	my( $mirror ) = @_;
+
+	my $rtt = eval { _get_ping_report( $mirror ) };
+	my $result = $rtt ? sprintf "+ (%4d ms)", $rtt * 1000 : '!';
+
+	$logger->info(
+		sprintf "\t%s %s", $result, $mirror
+		);
+	}
+
+sub _get_ping_report
+	{
+	require URI;
+	my( $mirror ) = @_;
+	my( $url ) = ref $mirror ? $mirror : URI->new( $mirror ); #XXX
+	require Net::Ping;
+
+	my $ping = Net::Ping->new( 'tcp', 1 );
+
+	if( $url->scheme eq 'file' ) {
+		return -e $url->file;
+		}
+
+    my( $port ) = $url->port;
+
+    return unless $port;
+
+    if ( $ping->can('port_number') ) {
+        $ping->port_number($port);
+    	}
+    else {
+        $ping->{'port_num'} = $port;
+    	}
+
+    $ping->hires(1) if $ping->can( 'hires' );
+    my( $alive, $rtt ) = eval{ $ping->ping( $url->host ) };
+	$alive ? $rtt : undef;
+	}
+
+sub _load_local_lib # -I
+	{
+	$logger->debug( "Loading local::lib" );
+
+	my $rc = _safe_load_module("local::lib");
+	unless( $rc ) {
+		$logger->logdie( "Could not load local::lib" );
+		}
+
+	local::lib->import;
+
+	return HEY_IT_WORKED;
+	}
+
+sub _use_these_mirrors # -M
+	{
+	$logger->debug( "Setting per session mirrors" );
+	unless( $_[0] ) {
+		$logger->logdie( "The -M switch requires a comma-separated list of mirrors" );
+		}
+
+	$CPAN::Config->{urllist} = [ split /,/, $_[0] ];
+
+	$logger->debug( "Mirrors are @{$CPAN::Config->{urllist}}" );
+
+	}
+
+sub _create_autobundle
+	{
+	$logger->info(
+		"Creating autobundle in $CPAN::Config->{cpan_home}/Bundle" );
+
+	CPAN::Shell->autobundle;
+
+	return HEY_IT_WORKED;
+	}
+
+sub _recompile
+	{
+	$logger->info( "Recompiling dynamically-loaded extensions" );
+
+	CPAN::Shell->recompile;
+
+	return HEY_IT_WORKED;
+	}
+
+sub _upgrade
+	{
+	$logger->info( "Upgrading all modules" );
+
+	CPAN::Shell->upgrade();
+
+	return HEY_IT_WORKED;
+	}
+
+sub _shell
+	{
+	$logger->info( "Dropping into shell" );
+
+	CPAN::shell();
+
+	return HEY_IT_WORKED;
+	}
+
+sub _load_config # -j
+	{
+	my $argument = shift;
+
+	my $file = file_name_is_absolute( $argument ) ? $argument : rel2abs( $argument );
+	croak( "cpan config file [$file] for -j does not exist!\n" ) unless -e $file;
+
+	# should I clear out any existing config here?
+	$CPAN::Config = {};
+	delete $INC{'CPAN/Config.pm'};
+
+	my $rc = eval "require '$file'";
+
+	# CPAN::HandleConfig::require_myconfig_or_config looks for this
+	$INC{'CPAN/MyConfig.pm'} = 'fake out!';
+
+	# CPAN::HandleConfig::load looks for this
+	$CPAN::Config_loaded = 'fake out';
+
+	croak( "Could not load [$file]: $@\n") unless $rc;
+
+	return HEY_IT_WORKED;
+	}
+
+sub _dump_config # -J
+	{
+	my $args = shift;
+	require Data::Dumper;
+
+	my $fh = $args->[0] || \*STDOUT;
+
+	local $Data::Dumper::Sortkeys = 1;
+	my $dd = Data::Dumper->new(
+		[$CPAN::Config],
+		['$CPAN::Config']
+		);
+
+	print $fh $dd->Dump, "\n1;\n__END__\n";
+
+	return HEY_IT_WORKED;
+	}
+
+sub _lock_lobotomy # -F
+	{
+	no warnings 'redefine';
+
+	*CPAN::_flock    = sub { 1 };
+	*CPAN::checklock = sub { 1 };
+
+	return HEY_IT_WORKED;
+	}
+
+sub _download
+	{
+	my $args = shift;
+
+	local $CPAN::DEBUG = 1;
+
+	my %paths;
+
+	foreach my $arg ( @$args ) {
+		$logger->info( "Checking $arg" );
+
+		my $module = _expand_module( $arg ) or next;
+		my $path = $module->cpan_file;
+
+		$logger->debug( "Inst file would be $path\n" );
+
+		$paths{$module} = _get_file( _make_path( $path ) );
+
+		$logger->info( "Downloaded [$arg] to [.]" );
+		}
+
+	return \%paths;
+	}
+
+sub _make_path { join "/", qw(authors id), $_[0] }
+
+sub _get_file
+	{
+	my $path = shift;
+
+	my $loaded = _safe_load_module("LWP::Simple");
+	croak "You need LWP::Simple to use features that fetch files from CPAN\n"
+		unless $loaded;
+
+	my $file = substr $path, rindex( $path, '/' ) + 1;
+	my $store_path = catfile( cwd(), $file );
+	$logger->debug( "Store path is $store_path" );
+
+	foreach my $site ( @{ $CPAN::Config->{urllist} } )
+		{
+		my $fetch_path = join "/", $site, $path;
+		$logger->debug( "Trying $fetch_path" );
+		my $status_code = LWP::Simple::getstore( $fetch_path, $store_path );
+		last if( 200 <= $status_code and $status_code <= 300 );
+		$logger->warn( "Could not get [$fetch_path]: Status code $status_code" );
+		}
+
+	return $store_path;
+	}
+
+sub _gitify
+	{
+	my $args = shift;
+
+	my $loaded = _safe_load_module("Archive::Extract");
+	croak "You need Archive::Extract to use features that gitify distributions\n"
+		unless $loaded;
+
+	my $starting_dir = cwd();
+
+	foreach my $arg ( @$args )
+		{
+		$logger->info( "Checking $arg" );
+		my $store_paths = _download( [ $arg ] );
+		$logger->debug( "gitify Store path is $store_paths->{$arg}" );
+		my $dirname = dirname( $store_paths->{$arg} );
+
+		my $ae = Archive::Extract->new( archive => $store_paths->{$arg} );
+		$ae->extract( to => $dirname );
+
+		chdir $ae->extract_path;
+
+		my $git = $ENV{GIT_COMMAND} || '/usr/local/bin/git';
+		croak "Could not find $git"    unless -e $git;
+		croak "$git is not executable" unless -x $git;
+
+		# can we do this in Pure Perl?
+		system( $git, 'init'    );
+		system( $git, qw( add . ) );
+		system( $git, qw( commit -a -m ), 'initial import' );
+		}
+
+	chdir $starting_dir;
+
+	return HEY_IT_WORKED;
+	}
+
+sub _show_Changes
+	{
+	my $args = shift;
+
+	foreach my $arg ( @$args )
+		{
+		$logger->info( "Checking $arg\n" );
+
+		my $module = _expand_module( $arg ) or next;
+
+		my $out = _get_cpanpm_output();
+
+		next unless eval { $module->inst_file };
+		#next if $module->uptodate;
+
+		( my $id = $module->id() ) =~ s/::/\-/;
+
+		my $url = "http://search.cpan.org/~" . lc( $module->userid ) . "/" .
+			$id . "-" . $module->cpan_version() . "/";
+
+		#print "URL: $url\n";
+		_get_changes_file($url);
+		}
+
+	return HEY_IT_WORKED;
+	}
+
+sub _get_changes_file
+	{
+	croak "Reading Changes files requires LWP::Simple and URI\n"
+		unless _safe_load_module("LWP::Simple") && _safe_load_module("URI");
+
+    my $url = shift;
+
+    my $content = LWP::Simple::get( $url );
+    $logger->info( "Got $url ..." ) if defined $content;
+	#print $content;
+
+	my( $change_link ) = $content =~ m|<a href="(.*?)">Changes</a>|gi;
+
+	my $changes_url = URI->new_abs( $change_link, $url );
+ 	$logger->debug( "Change link is: $changes_url" );
+
+	my $changes =  LWP::Simple::get( $changes_url );
+
+	print $changes;
+
+	return HEY_IT_WORKED;
+	}
+
+sub _show_Author
+	{
+	my $args = shift;
+
+	foreach my $arg ( @$args )
+		{
+		my $module = _expand_module( $arg ) or next;
+
+		unless( $module )
+			{
+			$logger->info( "Didn't find a $arg module, so no author!" );
+			next;
+			}
+
+		my $author = CPAN::Shell->expand( "Author", $module->userid );
+
+		next unless $module->userid;
+
+		printf "%-25s %-8s %-25s %s\n",
+			$arg, $module->userid, $author->email, $author->name;
+		}
+
+	return HEY_IT_WORKED;
+	}
+
+sub _show_Details
+	{
+	my $args = shift;
+
+	foreach my $arg ( @$args )
+		{
+		my $module = _expand_module( $arg ) or next;
+		my $author = CPAN::Shell->expand( "Author", $module->userid );
+
+		next unless $module->userid;
+
+		print "$arg\n", "-" x 73, "\n\t";
+		print join "\n\t",
+			$module->description ? $module->description : "(no description)",
+			$module->cpan_file ? $module->cpan_file : "(no cpanfile)",
+			$module->inst_file ? $module->inst_file :"(no installation file)" ,
+			'Installed: ' . ($module->inst_version ? $module->inst_version : "not installed"),
+			'CPAN:      ' . $module->cpan_version . '  ' .
+				($module->uptodate ? "" : "Not ") . "up to date",
+			$author->fullname . " (" . $module->userid . ")",
+			$author->email;
+		print "\n\n";
+
+		}
+
+	return HEY_IT_WORKED;
+	}
+
+BEGIN {
+my $modules;
+sub _get_all_namespaces
+	{
+	return $modules if $modules;
+	$modules = [ map { $_->id } CPAN::Shell->expand( "Module", "/./" ) ];
+	}
+}
+
+sub _show_out_of_date
+	{
+	my $modules = _get_all_namespaces();
+
+	printf "%-40s  %6s  %6s\n", "Module Name", "Local", "CPAN";
+	print "-" x 73, "\n";
+
+	foreach my $module ( @$modules )
+		{
+                next unless $module = _expand_module($module);
+                next unless $module->inst_file;
+		next if $module->uptodate;
+		printf "%-40s  %.4f  %.4f\n",
+			$module->id,
+			$module->inst_version ? $module->inst_version : '',
+			$module->cpan_version;
+		}
+
+	return HEY_IT_WORKED;
+	}
+
+sub _show_author_mods
+	{
+	my $args = shift;
+
+	my %hash = map { lc $_, 1 } @$args;
+
+	my $modules = _get_all_namespaces();
+
+	foreach my $module ( @$modules ) {
+		next unless exists $hash{ lc $module->userid };
+		print $module->id, "\n";
+		}
+
+	return HEY_IT_WORKED;
+	}
+
+sub _list_all_mods # -l
+	{
+	require File::Find;
+
+	my $args = shift;
+
+
+	my $fh = \*STDOUT;
+
+	INC: foreach my $inc ( @INC )
+		{
+		my( $wanted, $reporter ) = _generator();
+		File::Find::find( { wanted => $wanted }, $inc );
+
+		my $count = 0;
+		FILE: foreach my $file ( @{ $reporter->() } )
+			{
+			my $version = _parse_version_safely( $file );
+
+			my $module_name = _path_to_module( $inc, $file );
+			next FILE unless defined $module_name;
+
+			print $fh "$module_name\t$version\n";
+
+			#last if $count++ > 5;
+			}
+		}
+
+	return HEY_IT_WORKED;
+	}
+
+sub _generator
+	{
+	my @files = ();
+
+	sub { push @files,
+		File::Spec->canonpath( $File::Find::name )
+		if m/\A\w+\.pm\z/ },
+	sub { \@files },
+	}
+
+sub _parse_version_safely # stolen from PAUSE's mldistwatch, but refactored
+	{
+	my( $file ) = @_;
+
+	local $/ = "\n";
+	local $_; # don't mess with the $_ in the map calling this
+
+	return unless open FILE, "<$file";
+
+	my $in_pod = 0;
+	my $version;
+	while( <FILE> )
+		{
+		chomp;
+		$in_pod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $in_pod;
+		next if $in_pod || /^\s*#/;
+
+		next unless /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/;
+		my( $sigil, $var ) = ( $1, $2 );
+
+		$version = _eval_version( $_, $sigil, $var );
+		last;
+		}
+	close FILE;
+
+	return 'undef' unless defined $version;
+
+	return $version;
+	}
+
+sub _eval_version
+	{
+	my( $line, $sigil, $var ) = @_;
+
+        # split package line to hide from PAUSE
+	my $eval = qq{
+		package
+                  ExtUtils::MakeMaker::_version;
+
+		local $sigil$var;
+		\$$var=undef; do {
+			$line
+			}; \$$var
+		};
+
+	my $version = do {
+		local $^W = 0;
+		no strict;
+		eval( $eval );
+		};
+
+	return $version;
+	}
+
+sub _path_to_module
+	{
+	my( $inc, $path ) = @_;
+	return if length $path < length $inc;
+
+	my $module_path = substr( $path, length $inc );
+	$module_path =~ s/\.pm\z//;
+
+	# XXX: this is cheating and doesn't handle everything right
+	my @dirs = grep { ! /\W/ } File::Spec->splitdir( $module_path );
+	shift @dirs;
+
+	my $module_name = join "::", @dirs;
+
+	return $module_name;
+	}
+
+
+sub _expand_module
+	{
+	my( $module ) = @_;
+
+	my $expanded = CPAN::Shell->expandany( $module );
+        return $expanded if $expanded;
+        $expanded = CPAN::Shell->expand( "Module", $module );
+	unless( defined $expanded ) {
+		$logger->error( "Could not expand [$module]. Check the module name." );
+		my $threshold = (
+			grep { int }
+			sort { length $a <=> length $b }
+				length($module)/4, 4
+			)[0];
+
+		my $guesses = _guess_at_module_name( $module, $threshold );
+		if( defined $guesses and @$guesses ) {
+			$logger->info( "Perhaps you meant one of these:" );
+			foreach my $guess ( @$guesses ) {
+				$logger->info( "\t$guess" );
+				}
+			}
+		return;
+		}
+
+	return $expanded;
+	}
+
+my $guessers = [
+	[ qw( Text::Levenshtein::XS distance 7 1 ) ],
+	[ qw( Text::Levenshtein::Damerau::XS     xs_edistance 7 1 ) ],
+
+	[ qw( Text::Levenshtein     distance 7 1 ) ],
+	[ qw( Text::Levenshtein::Damerau::PP     pp_edistance 7 1 ) ],
+
+	];
+
+sub _disable_guessers
+	{
+	$_->[-1] = 0 for @$guessers;
+	}
+
+# for -x
+sub _guess_namespace
+	{
+	my $args = shift;
+
+	foreach my $arg ( @$args )
+		{
+		$logger->debug( "Checking $arg" );
+		my $guesses = _guess_at_module_name( $arg );
+
+		foreach my $guess ( @$guesses ) {
+			print $guess, "\n";
+			}
+		}
+
+	return HEY_IT_WORKED;
+	}
+
+sub _list_all_namespaces {
+	my $modules = _get_all_namespaces();
+
+	foreach my $module ( @$modules ) {
+		print $module, "\n";
+		}
+	}
+
+BEGIN {
+my $distance;
+my $_threshold;
+my $can_guess;
+my $shown_help = 0;
+sub _guess_at_module_name
+	{
+	my( $target, $threshold ) = @_;
+
+	unless( defined $distance ) {
+		foreach my $try ( @$guessers ) {
+			$can_guess = eval "require $try->[0]; 1" or next;
+
+			$try->[-1] or next; # disabled
+			no strict 'refs';
+			$distance = \&{ join "::", @$try[0,1] };
+			$threshold ||= $try->[2];
+			}
+		}
+	$_threshold ||= $threshold;
+
+	unless( $distance ) {
+		unless( $shown_help ) {
+			my $modules = join ", ", map { $_->[0] } @$guessers;
+			substr $modules, rindex( $modules, ',' ), 1, ', and';
+
+			# Should this be colorized?
+			if( $can_guess ) {
+				$logger->info( "I can suggest names if you provide the -x option on invocation." );
+				}
+			else {
+				$logger->info( "I can suggest names if you install one of $modules" );
+				$logger->info( "and you provide the -x option on invocation." );
+				}
+			$shown_help++;
+			}
+		return;
+		}
+
+	my $modules = _get_all_namespaces();
+	$logger->info( "Checking " . @$modules . " namespaces for close match suggestions" );
+
+	my %guesses;
+	foreach my $guess ( @$modules ) {
+		my $distance = $distance->( $target, $guess );
+		next if $distance > $_threshold;
+		$guesses{$guess} = $distance;
+		}
+
+	my @guesses = sort { $guesses{$a} <=> $guesses{$b} } keys %guesses;
+	return [ grep { defined } @guesses[0..9] ];
+	}
+}
+
+1;
+
+=back
+
+=head1 EXIT VALUES
+
+The script exits with zero if it thinks that everything worked, or a
+positive number if it thinks that something failed. Note, however, that
+in some cases it has to divine a failure by the output of things it does
+not control. For now, the exit codes are vague:
+
+	1	An unknown error
+
+	2	The was an external problem
+
+	4	There was an internal problem with the script
+
+	8	A module failed to install
+
+=head1 TO DO
+
+* There is initial support for Log4perl if it is available, but I
+haven't gone through everything to make the NullLogger work out
+correctly if Log4perl is not installed.
+
+* When I capture CPAN.pm output, I need to check for errors and
+report them to the user.
+
+* Warnings switch
+
+* Check then exit
+
+=head1 BUGS
+
+* none noted
+
+=head1 SEE ALSO
+
+L<CPAN>, L<App::cpanminus>
+
+=head1 SOURCE AVAILABILITY
+
+This code is in Github in the CPAN.pm repository:
+
+	https://github.com/andk/cpanpm
+
+The source used to be tracked separately in another GitHub repo,
+but the canonical source is now in the above repo.
+
+=head1 CREDITS
+
+Japheth Cleaver added the bits to allow a forced install (C<-f>).
+
+Jim Brandt suggest and provided the initial implementation for the
+up-to-date and Changes features.
+
+Adam Kennedy pointed out that C<exit()> causes problems on Windows
+where this script ends up with a .bat extension
+
+David Golden helps integrate this into the C<CPAN.pm> repos.
+
+Jim Keenan fixed up various issues with _download
+
+=head1 AUTHOR
+
+brian d foy, C<< <bdfoy@cpan.org> >>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001-2018, brian d foy, All Rights Reserved.
+
+You may redistribute this under the same terms as Perl itself.
+
+=cut
+
+# Local Variables:
+# mode: cperl
+# indent-tabs-mode: t
+# cperl-indent-level: 8
+# cperl-continued-statement-offset: 8
+# End:
Index: build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-multilib-patch/create.patch.sh
===================================================================
--- build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-multilib-patch/create.patch.sh	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-multilib-patch/create.patch.sh	(revision 323)
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+VERSION=5.34.0
+
+tar --files-from=file.list -xJvf ../perl-$VERSION.tar.xz
+mv perl-$VERSION perl-$VERSION-orig
+
+cp -rf ./perl-$VERSION-new ./perl-$VERSION
+
+diff -b --unified -Nr  perl-$VERSION-orig  perl-$VERSION > perl-$VERSION-multilib.patch
+
+mv perl-$VERSION-multilib.patch ../patches
+
+rm -rf ./perl-$VERSION
+rm -rf ./perl-$VERSION-orig

Property changes on: build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-multilib-patch/create.patch.sh
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-multilib-patch/file.list
===================================================================
--- build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-multilib-patch/file.list	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-multilib-patch/file.list	(revision 323)
@@ -0,0 +1 @@
+perl-5.34.0/Configure
Index: build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-multilib-patch/perl-5.34.0-new/Configure
===================================================================
--- build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-multilib-patch/perl-5.34.0-new/Configure	(nonexistent)
+++ build-system-1.8.1/3pp/sources/packages/perl/create-5.34.0-multilib-patch/perl-5.34.0-new/Configure	(revision 323)
@@ -0,0 +1,25447 @@
+#! /bin/sh
+#
+# If these # comments don't work, trim them. Don't worry about any other
+# shell scripts, Configure will trim # comments from them for you.
+#
+# (If you are trying to port this package to a machine without sh,
+# I would suggest you have a look at the prototypical config_h.SH file
+# and edit it to reflect your system. Some packages may include samples
+# of config.h for certain machines, so you might look for one of those.)
+#
+# Yes, you may rip this off to use in other distribution packages. This
+# script belongs to the public domain and cannot be copyrighted.
+#
+# Note: this Configure script was generated automatically by the tool
+# called "metaconfig". Rather than working with this copy of Configure,
+# you should use metaconfig. Perl uses a modified version of this
+# tool, and this, together with the metaconfig units, are available
+# in the git repository:
+#    $ git clone https://github.com/Perl/metaconfig metaconfig
+# The original dist package (including metaconfig) is available on github:
+#    $ git clone https://github.com/rmanfredi/dist.git dist-git
+#
+# Though this script was generated by metaconfig from metaunits, it is
+# OK to send patches against Configure itself (but not to commit them
+# to blead). It's up to
+# the Configure maintainers to backport the patch to the metaunits if it
+# is accepted. Exceptions to this rule, and more information, is in
+# Porting/pumpkin.pod.
+
+# Generated using [metaconfig 3.5 PL0]
+# with additional metaconfig patches from https://github.com/Perl/metaconfig
+
+cat >c1$$ <<EOF
+ARGGGHHHH!!!!!
+
+SCO csh still thinks true is false.  Write to SCO today and tell them that next
+year Configure ought to "rm /bin/csh" unless they fix their blasted shell. :-)
+
+(Actually, Configure ought to just patch csh in place.  Hmm.  Hmmmmm.  All
+we'd have to do is go in and swap the && and || tokens, wherever they are.)
+
+[End of diatribe. We now return you to your regularly scheduled programming...]
+EOF
+cat >c2$$ <<EOF
+
+OOPS!  You naughty creature!  You didn't run Configure with sh!
+I will attempt to remedy the situation by running sh for you...
+EOF
+
+true || cat c1$$ c2$$
+true || exec sh $0 $argv:q
+
+(exit $?0) || cat c2$$
+(exit $?0) || exec sh $0 $argv:q
+rm -f c1$$ c2$$
+
+if test -f /dev/cputype -a -f /dev/drivers -a -f /dev/osversion; then
+	cat <<EOF
+***
+*** I'm sorry but this system looks like Plan 9 and Plan 9 doesn't do
+*** Configure that well.  (Plan 9 is close to UNIX but not close enough.)
+*** Please read the README.plan9 for further instructions.
+*** Cannot continue, aborting.
+***
+EOF
+	exit 1
+fi
+
+if test -f /sys/utilities/MultiView ; then
+	# AmigaOS, test -c for /dev/null is not useful
+	:
+elif test ! -c /dev/null ; then
+	cat <<EOF
+***
+*** I'm sorry, but /dev/null appears to be a file rather than a device.
+*** Please consult your operating sytem's notes for making a device
+*** in /dev.
+*** Cannot continue, aborting.
+***
+EOF
+	exit 1
+fi
+
+: compute my invocation name
+me=$0
+case "$0" in
+*/*)
+	me=`echo $0 | sed -e 's!.*/\(.*\)!\1!' 2>/dev/null`
+	test "$me" || me=$0
+	;;
+esac
+
+: Proper separator for the PATH environment variable
+p_=:
+: On OS/2 this directory should exist if this is not floppy only system ":-]"
+if test -d c:/. || ( uname -a | grep -i 'os\(/\|\)2' 2>&1 ) 2>&1 >/dev/null ; then
+	if test -n "$OS2_SHELL"; then
+		p_=\;
+		PATH=`cmd /c "echo %PATH%" | tr '\\\\' / `
+		OS2_SHELL=`cmd /c "echo %OS2_SHELL%" | tr '\\\\' / | tr '[A-Z]' '[a-z]'`
+		is_os2=yes
+	elif test -n "$DJGPP"; then
+		case "X${MACHTYPE:-nonesuchmach}" in
+		*cygwin|*msys) ;;
+		*) p_=\; ;;
+		esac
+	fi
+fi
+
+: Proper PATH setting
+paths='/bin /usr/bin /usr/local/bin /usr/ucb /usr/local /usr/lbin'
+paths="$paths /opt/bin /opt/local/bin /opt/local /opt/lbin"
+paths="$paths /usr/5bin /etc /usr/gnu/bin /usr/new /usr/new/bin /usr/nbin"
+paths="$paths /opt/gnu/bin /opt/new /opt/new/bin /opt/nbin"
+paths="$paths /sys5.3/bin /sys5.3/usr/bin /bsd4.3/bin /bsd4.3/usr/ucb"
+paths="$paths /bsd4.3/usr/bin /usr/bsd /bsd43/bin /opt/ansic/bin /usr/ccs/bin"
+paths="$paths /etc /usr/lib /usr/ucblib /lib /usr/ccs/lib"
+paths="$paths /sbin /usr/sbin /usr/libexec"
+paths="$paths /system/gnu_library/bin"
+
+for p in $paths
+do
+	case "$p_$PATH$p_" in
+	*$p_$p$p_*) ;;
+	*) test -d $p && PATH=$PATH$p_$p ;;
+	esac
+done
+
+PATH=.$p_$PATH
+export PATH
+
+: shall we be using ksh?
+inksh=''
+needksh=''
+avoidksh=''
+newsh=/bin/ksh
+changesh=''
+if (PATH=.; alias -x) >/dev/null 2>&1; then
+		inksh=true
+fi
+if test -f /hp-ux -a -f /bin/ksh; then
+	needksh='to avoid sh bug in "here document" expansion'
+fi
+if test -d /usr/lpp -a -f /usr/bin/bsh -a -f /usr/bin/uname; then
+	if test X`/usr/bin/uname -v` = X4; then
+		avoidksh="to avoid AIX 4's /bin/sh"
+		newsh=/usr/bin/bsh
+	fi
+fi
+if test -f /osf_boot -a -f /usr/sbin/setld; then
+	if test X`/usr/bin/uname -s` = XOSF1; then
+		avoidksh="to avoid Digital UNIX' ksh"
+		newsh=/bin/sh
+		unset BIN_SH
+	fi
+fi
+case "$inksh/$needksh" in
+/[a-z]*)
+		ENV=''
+		changesh=true
+		reason="$needksh"
+	;;
+esac
+case "$inksh/$avoidksh" in
+true/[a-z]*)
+	changesh=true
+	reason="$avoidksh"
+	;;
+esac
+case "$inksh/$needksh-$avoidksh-" in
+true/--)
+		cat <<EOM
+(I see you are using the Korn shell.  Some ksh's blow up on $me,
+mainly on older exotic systems.  If yours does, try the Bourne shell instead.)
+EOM
+	;;
+esac
+case "$changesh" in
+true)
+	export newsh
+	echo "(Feeding myself to $newsh $reason.)"
+	case "$0" in
+	Configure|*/Configure) exec $newsh $0 "$@";;
+	*) exec $newsh Configure "$@";;
+	esac
+	;;
+esac
+test -x "${newsh}" || unset newsh
+
+: if needed, set CDPATH to a harmless value that is not chatty
+: avoid bash 2.02 problems with empty CDPATH.
+case "$CDPATH" in
+'')	;;
+*)	case "$SHELL" in
+	*bash*) CDPATH='.' ;;
+	*) CDPATH='' ;;
+	esac
+	;;
+esac
+
+: Configure runs within the UU subdirectory
+test -d UU || mkdir UU
+cd UU && rm -f ./*
+
+ccname=''
+ccversion=''
+ccsymbols=''
+cppccsymbols=''
+cppsymbols=''
+from=''
+hostgenerate=''
+hostosname=''
+hostperl=''
+run=''
+targetarch=''
+targetdir=''
+targetenv=''
+targethost=''
+targetmkdir=''
+targetport=''
+to=''
+usecrosscompile=''
+extern_C=''
+mistrustnm=''
+usedevel=''
+perllibs=''
+dynamic_ext=''
+extensions=''
+known_extensions=''
+nonxs_ext=''
+static_ext=''
+uselanginfo=''
+useopcode=''
+useposix=''
+extras=''
+d_bsd=''
+d_eunice=''
+d_xenix=''
+eunicefix=''
+ar=''
+awk=''
+bash=''
+bison=''
+byacc=''
+cat=''
+chgrp=''
+chmod=''
+chown=''
+comm=''
+compress=''
+cp=''
+cpio=''
+cpp=''
+csh=''
+date=''
+echo=''
+egrep=''
+emacs=''
+expr=''
+find=''
+flex=''
+gmake=''
+grep=''
+gzip=''
+inews=''
+ksh=''
+less=''
+line=''
+lint=''
+ln=''
+lp=''
+lpr=''
+ls=''
+mail=''
+mailx=''
+make=''
+mkdir=''
+more=''
+mv=''
+nm=''
+nroff=''
+perl=''
+pg=''
+pmake=''
+pr=''
+rm=''
+rmail=''
+sed=''
+sendmail=''
+shar=''
+sleep=''
+smail=''
+sort=''
+submit=''
+tail=''
+tar=''
+tbl=''
+tee=''
+test=''
+touch=''
+tr=''
+troff=''
+uname=''
+uniq=''
+uuname=''
+vi=''
+zcat=''
+zip=''
+full_ar=''
+full_sed=''
+libswanted=''
+hint=''
+myuname=''
+osname=''
+osvers=''
+Author=''
+Date=''
+Header=''
+Id=''
+Locker=''
+Log=''
+RCSfile=''
+Revision=''
+Source=''
+State=''
+sysroot=''
+_a=''
+_exe=''
+_o=''
+archobjs=''
+exe_ext=''
+firstmakefile=''
+lib_ext=''
+obj_ext=''
+path_sep=''
+rm_try=''
+afs=''
+afsroot=''
+alignbytes=''
+archlib=''
+archlibexp=''
+d_archlib=''
+installarchlib=''
+archname=''
+myarchname=''
+useversionedarchname=''
+d_atolf=''
+d_atoll=''
+baserev=''
+bin=''
+binexp=''
+initialinstalllocation=''
+installbin=''
+userelocatableinc=''
+byteorder=''
+cc=''
+ccflags=''
+cppflags=''
+ldflags=''
+lkflags=''
+locincpth=''
+optimize=''
+cf_email=''
+cf_by=''
+cf_time=''
+charbits=''
+charsize=''
+compiler_warning=''
+contains=''
+cpp_stuff=''
+cpplast=''
+cppminus=''
+cpprun=''
+cppstdin=''
+d__fwalk=''
+d_accept4=''
+d_access=''
+d_accessx=''
+d_acosh=''
+d_aintl=''
+d_alarm=''
+asctime_r_proto=''
+d_asctime_r=''
+d_asinh=''
+d_atanh=''
+d_attribute_always_inline=''
+d_attribute_deprecated=''
+d_attribute_format=''
+d_attribute_malloc=''
+d_attribute_nonnull=''
+d_attribute_noreturn=''
+d_attribute_pure=''
+d_attribute_unused=''
+d_attribute_warn_unused_result=''
+d_printf_format_null=''
+d_backtrace=''
+d_builtin_choose_expr=''
+d_builtin_expect=''
+d_builtin_add_overflow=''
+d_builtin_mul_overflow=''
+d_builtin_sub_overflow=''
+d_c99_variadic_macros=''
+d_casti32=''
+castflags=''
+d_castneg=''
+d_cbrt=''
+d_chown=''
+d_chroot=''
+d_chsize=''
+d_class=''
+d_clearenv=''
+d_closedir=''
+d_void_closedir=''
+d_cmsghdr_s=''
+d_copysign=''
+d_copysignl=''
+d_cplusplus=''
+cryptlib=''
+d_crypt=''
+crypt_r_proto=''
+d_crypt_r=''
+d_csh=''
+full_csh=''
+d_ctermid=''
+ctermid_r_proto=''
+d_ctermid_r=''
+ctime_r_proto=''
+d_ctime_r=''
+d_cuserid=''
+d_dbminitproto=''
+d_difftime=''
+d_dir_dd_fd=''
+d_dirfd=''
+d_dladdr=''
+d_dlerror=''
+d_dlopen=''
+d_dlsymun=''
+d_dosuid=''
+d_suidsafe=''
+d_drand48_r=''
+drand48_r_proto=''
+d_drand48proto=''
+d_dup2=''
+d_dup3=''
+d_eaccess=''
+d_endgrent=''
+d_endgrent_r=''
+endgrent_r_proto=''
+d_endhent=''
+d_endhostent_r=''
+endhostent_r_proto=''
+d_endnent=''
+d_endnetent_r=''
+endnetent_r_proto=''
+d_endpent=''
+d_endprotoent_r=''
+endprotoent_r_proto=''
+d_endpwent=''
+d_endpwent_r=''
+endpwent_r_proto=''
+d_endsent=''
+d_endservent_r=''
+endservent_r_proto=''
+d_erf=''
+d_erfc=''
+d_exp2=''
+d_expm1=''
+d_faststdio=''
+d_fchdir=''
+d_fchmod=''
+d_fchown=''
+d_fcntl=''
+d_fcntl_can_lock=''
+d_fd_macros=''
+d_fd_set=''
+d_fds_bits=''
+d_fdclose=''
+d_fdim=''
+d_fegetround=''
+d_fgetpos=''
+d_finite=''
+d_finitel=''
+d_flexfnam=''
+d_flock=''
+d_flockproto=''
+d_fma=''
+d_fmax=''
+d_fmin=''
+d_fork=''
+d_fp_class=''
+d_fp_classl=''
+d_fpclass=''
+d_fp_classify=''
+d_fpclassify=''
+d_fpclassl=''
+d_fpgetround=''
+d_fpos64_t=''
+d_frexpl=''
+d_fs_data_s=''
+d_fchmodat=''
+d_linkat=''
+d_openat=''
+d_renameat=''
+d_unlinkat=''
+d_fseeko=''
+d_fsetpos=''
+d_fstatfs=''
+d_fsync=''
+d_ftello=''
+d_ftime=''
+d_gettimeod=''
+d_futimes=''
+d_gai_strerror=''
+d_Gconvert=''
+d_getaddrinfo=''
+d_getcwd=''
+d_getenv_preserves_other_thread=''
+d_getespwnam=''
+d_getfsstat=''
+d_getgrent=''
+d_getgrent_r=''
+getgrent_r_proto=''
+d_getgrgid_r=''
+getgrgid_r_proto=''
+d_getgrnam_r=''
+getgrnam_r_proto=''
+d_getgrps=''
+d_gethbyaddr=''
+d_gethbyname=''
+d_gethent=''
+aphostname=''
+d_gethname=''
+d_phostname=''
+d_uname=''
+d_gethostbyaddr_r=''
+gethostbyaddr_r_proto=''
+d_gethostbyname_r=''
+gethostbyname_r_proto=''
+d_gethostent_r=''
+gethostent_r_proto=''
+d_gethostprotos=''
+d_getitimer=''
+d_getlogin=''
+d_getlogin_r=''
+getlogin_r_proto=''
+d_getmnt=''
+d_getmntent=''
+d_getnameinfo=''
+d_getnbyaddr=''
+d_getnbyname=''
+d_getnent=''
+d_getnetbyaddr_r=''
+getnetbyaddr_r_proto=''
+d_getnetbyname_r=''
+getnetbyname_r_proto=''
+d_getnetent_r=''
+getnetent_r_proto=''
+d_getnetprotos=''
+d_getpagsz=''
+d_getpent=''
+d_getpgid=''
+d_getpgrp2=''
+d_bsdgetpgrp=''
+d_getpgrp=''
+d_getppid=''
+d_getprior=''
+d_getpbyname=''
+d_getpbynumber=''
+d_getprotobyname_r=''
+getprotobyname_r_proto=''
+d_getprotobynumber_r=''
+getprotobynumber_r_proto=''
+d_getprotoent_r=''
+getprotoent_r_proto=''
+d_getprotoprotos=''
+d_getprpwnam=''
+d_getpwent=''
+d_getpwent_r=''
+getpwent_r_proto=''
+d_getpwnam_r=''
+getpwnam_r_proto=''
+d_getpwuid_r=''
+getpwuid_r_proto=''
+d_getsent=''
+d_getservbyname_r=''
+getservbyname_r_proto=''
+d_getservbyport_r=''
+getservbyport_r_proto=''
+d_getservent_r=''
+getservent_r_proto=''
+d_getservprotos=''
+d_getspnam=''
+d_getspnam_r=''
+getspnam_r_proto=''
+d_getsbyname=''
+d_getsbyport=''
+d_gmtime_r=''
+gmtime_r_proto=''
+d_gnulibc=''
+gnulibc_version=''
+d_hasmntopt=''
+d_htonl=''
+d_hypot=''
+d_ilogb=''
+d_ilogbl=''
+d_inetaton=''
+d_inetntop=''
+d_inetpton=''
+d_int64_t=''
+d_isascii=''
+d_isblank=''
+d_isfinite=''
+d_isfinitel=''
+d_isinf=''
+d_isinfl=''
+d_isless=''
+d_isnan=''
+d_isnanl=''
+d_isnormal=''
+d_j0=''
+d_j0l=''
+d_killpg=''
+d_lc_monetary_2008=''
+d_lchown=''
+d_ldbl_dig=''
+d_lgamma=''
+d_lgamma_r=''
+d_libm_lib_version=''
+d_link=''
+d_llrint=''
+d_llrintl=''
+d_llround=''
+d_llroundl=''
+d_localeconv_l=''
+d_localtime_r=''
+d_localtime_r_needs_tzset=''
+localtime_r_proto=''
+d_locconv=''
+d_lockf=''
+d_log1p=''
+d_log2=''
+d_logb=''
+d_ldexpl=''
+d_long_double_style_ieee=''
+d_long_double_style_ieee_doubledouble=''
+d_long_double_style_ieee_extended=''
+d_long_double_style_ieee_std=''
+d_long_double_style_vax=''
+d_longdbl=''
+longdblkind=''
+longdblsize=''
+d_longlong=''
+longlongsize=''
+d_lrint=''
+d_lrintl=''
+d_lround=''
+d_lroundl=''
+d_lseekproto=''
+d_lstat=''
+d_madvise=''
+d_malloc_good_size=''
+d_malloc_size=''
+d_malloc_usable_size=''
+d_mblen=''
+d_mbrlen=''
+d_mbrtowc=''
+d_mbstowcs=''
+d_mbtowc=''
+d_memmem=''
+d_memrchr=''
+d_mkdir=''
+d_mkdtemp=''
+d_mkfifo=''
+d_mkostemp=''
+d_mkstemp=''
+d_mkstemps=''
+d_mktime=''
+d_mmap=''
+mmaptype=''
+d_modfl=''
+d_modflproto=''
+d_mprotect=''
+d_msg=''
+d_msgctl=''
+d_msgget=''
+d_msghdr_s=''
+d_msgrcv=''
+d_msgsnd=''
+d_msync=''
+d_munmap=''
+d_nan=''
+d_nanosleep=''
+d_nearbyint=''
+d_duplocale=''
+d_freelocale=''
+d_newlocale=''
+d_querylocale=''
+d_uselocale=''
+i_xlocale=''
+d_nextafter=''
+d_nexttoward=''
+d_nice=''
+d_nl_langinfo=''
+d_thread_safe_nl_langinfo_l=''
+d_off64_t=''
+d_open3=''
+d_fpathconf=''
+d_pathconf=''
+d_pause=''
+d_pipe2=''
+d_pipe=''
+d_poll=''
+d_portable=''
+d_prctl=''
+d_prctl_set_name=''
+d_procselfexe=''
+procselfexe=''
+d_old_pthread_create_joinable=''
+old_pthread_create_joinable=''
+d_pthread_atfork=''
+d_pthread_attr_setscope=''
+d_pthread_yield=''
+d_sched_yield=''
+sched_yield=''
+d_ptrdiff_t=''
+d_qgcvt=''
+d_random_r=''
+random_r_proto=''
+d_readdir64_r=''
+readdir64_r_proto=''
+d_readdir=''
+d_rewinddir=''
+d_seekdir=''
+d_telldir=''
+d_readdir_r=''
+readdir_r_proto=''
+d_readlink=''
+d_readv=''
+d_recvmsg=''
+d_re_comp=''
+d_regcmp=''
+d_regcomp=''
+d_remainder=''
+d_remquo=''
+d_rename=''
+d_rint=''
+d_rmdir=''
+d_round=''
+d_sbrkproto=''
+d_scalbn=''
+d_scalbnl=''
+d_select=''
+d_sem=''
+d_semctl=''
+d_semget=''
+d_semop=''
+d_sendmsg=''
+d_setegid=''
+d_seteuid=''
+d_setgrent=''
+d_setgrent_r=''
+setgrent_r_proto=''
+d_setgrps=''
+d_sethent=''
+d_sethostent_r=''
+sethostent_r_proto=''
+d_setitimer=''
+d_setlinebuf=''
+d_has_C_UTF8=''
+d_setlocale=''
+d_setlocale_accepts_any_locale_name=''
+d_setlocale_r=''
+setlocale_r_proto=''
+d_setnent=''
+d_setnetent_r=''
+setnetent_r_proto=''
+d_setpent=''
+d_setpgid=''
+d_setpgrp2=''
+d_bsdsetpgrp=''
+d_setpgrp=''
+d_setprior=''
+d_setproctitle=''
+d_setprotoent_r=''
+setprotoent_r_proto=''
+d_setpwent=''
+d_setpwent_r=''
+setpwent_r_proto=''
+d_setregid=''
+d_setresgid=''
+d_setresuid=''
+d_setreuid=''
+d_setrgid=''
+d_setruid=''
+d_setsent=''
+d_setservent_r=''
+setservent_r_proto=''
+d_setsid=''
+d_setvbuf=''
+d_shm=''
+d_shmat=''
+d_shmatprototype=''
+shmattype=''
+d_shmctl=''
+d_shmdt=''
+d_shmget=''
+d_sigaction=''
+d_siginfo_si_addr=''
+d_siginfo_si_band=''
+d_siginfo_si_errno=''
+d_siginfo_si_fd=''
+d_siginfo_si_pid=''
+d_siginfo_si_status=''
+d_siginfo_si_uid=''
+d_siginfo_si_value=''
+d_signbit=''
+d_sigprocmask=''
+d_sigsetjmp=''
+usesitecustomize=''
+d_snprintf=''
+d_vsnprintf=''
+d_sockatmark=''
+d_sockatmarkproto=''
+d_ip_mreq=''
+d_ip_mreq_source=''
+d_ipv6_mreq=''
+d_ipv6_mreq_source=''
+d_msg_ctrunc=''
+d_msg_dontroute=''
+d_msg_oob=''
+d_msg_peek=''
+d_msg_proxy=''
+d_oldsock=''
+d_scm_rights=''
+d_sin6_scope_id=''
+d_sockaddr_in6=''
+d_sockaddr_sa_len=''
+d_sockaddr_storage=''
+d_socket=''
+d_sockpair=''
+sockethdr=''
+socketlib=''
+d_socklen_t=''
+d_socks5_init=''
+d_sqrtl=''
+d_srand48_r=''
+srand48_r_proto=''
+d_srandom_r=''
+srandom_r_proto=''
+d_sresgproto=''
+d_sresuproto=''
+d_stat=''
+d_statblks=''
+d_statfs_f_flags=''
+d_statfs_s=''
+d_static_inline=''
+perl_static_inline=''
+d_fstatvfs=''
+d_statvfs=''
+d_stdio_cnt_lval=''
+d_stdio_ptr_lval=''
+d_stdio_ptr_lval_nochange_cnt=''
+d_stdio_ptr_lval_sets_cnt=''
+d_stdiobase=''
+d_stdstdio=''
+stdio_base=''
+stdio_bufsiz=''
+stdio_cnt=''
+stdio_filbuf=''
+stdio_ptr=''
+d_strcoll=''
+d_sysernlst=''
+d_syserrlst=''
+d_strerror_l=''
+d_strerror_r=''
+strerror_r_proto=''
+d_strftime=''
+d_strlcat=''
+d_strlcpy=''
+d_strnlen=''
+d_strtod=''
+d_strtod_l=''
+d_strtol=''
+d_strtold=''
+d_strtold_l=''
+d_strtoll=''
+d_strtoq=''
+d_strtoul=''
+d_strtoull=''
+d_strtouq=''
+d_strxfrm=''
+d_symlink=''
+d_syscall=''
+d_syscallproto=''
+d_sysconf=''
+d_system=''
+d_tcgetpgrp=''
+d_tcsetpgrp=''
+d_telldirproto=''
+d_tgamma=''
+d_time=''
+timetype=''
+d_asctime64=''
+d_ctime64=''
+d_difftime64=''
+d_gmtime64=''
+d_localtime64=''
+d_mktime64=''
+d_timegm=''
+clocktype=''
+d_times=''
+d_tmpnam_r=''
+tmpnam_r_proto=''
+d_towlower=''
+d_towupper=''
+d_trunc=''
+d_truncate=''
+d_truncl=''
+d_ttyname_r=''
+ttyname_r_proto=''
+d_tzname=''
+d_u32align=''
+d_ualarm=''
+d_umask=''
+d_semctl_semid_ds=''
+d_semctl_semun=''
+d_union_semun=''
+d_unordered=''
+d_unsetenv=''
+d_usleep=''
+d_usleepproto=''
+d_ustat=''
+d_pseudofork=''
+d_vfork=''
+usevfork=''
+d_voidsig=''
+signal_t=''
+d_wait4=''
+d_waitpid=''
+d_wcrtomb=''
+d_wcscmp=''
+d_wcstombs=''
+d_wcsxfrm=''
+d_wctomb=''
+d_writev=''
+default_inc_excludes_dot=''
+dlext=''
+bin_ELF=''
+cccdlflags=''
+ccdlflags=''
+dlsrc=''
+ld=''
+ld_can_script=''
+lddlflags=''
+usedl=''
+doublesize=''
+dtraceobject=''
+dtracexnolibs=''
+ebcdic=''
+fflushNULL=''
+fflushall=''
+fpossize=''
+fpostype=''
+gccansipedantic=''
+gccosandvers=''
+gccversion=''
+gidformat=''
+gidsign=''
+gidsize=''
+gidtype=''
+groupstype=''
+h_fcntl=''
+h_sysfile=''
+html1dir=''
+html1direxp=''
+installhtml1dir=''
+html3dir=''
+html3direxp=''
+installhtml3dir=''
+i_arpainet=''
+i_bfd=''
+i_crypt=''
+db_hashtype=''
+db_prefixtype=''
+db_version_major=''
+db_version_minor=''
+db_version_patch=''
+i_db=''
+i_dbm=''
+i_rpcsvcdbm=''
+d_dirnamlen=''
+direntrytype=''
+i_dirent=''
+i_dlfcn=''
+i_execinfo=''
+i_fcntl=''
+i_fenv=''
+i_fp=''
+i_fp_class=''
+i_gdbm=''
+d_grpasswd=''
+i_grp=''
+i_ieeefp=''
+i_inttypes=''
+i_langinfo=''
+i_libutil=''
+i_locale=''
+i_machcthr=''
+i_malloc=''
+i_mallocmalloc=''
+i_mntent=''
+d_gdbm_ndbm_h_uses_prototypes=''
+d_gdbmndbm_h_uses_prototypes=''
+d_ndbm=''
+d_ndbm_h_uses_prototypes=''
+i_gdbm_ndbm=''
+i_gdbmndbm=''
+i_ndbm=''
+i_netdb=''
+i_neterrno=''
+i_netinettcp=''
+i_niin=''
+i_sysin=''
+i_poll=''
+i_prot=''
+i_pthread=''
+d_pwage=''
+d_pwchange=''
+d_pwclass=''
+d_pwcomment=''
+d_pwexpire=''
+d_pwgecos=''
+d_pwpasswd=''
+d_pwquota=''
+i_pwd=''
+i_quadmath=''
+i_shadow=''
+i_socks=''
+i_stdbool=''
+i_stdint=''
+i_stdlib=''
+i_sunmath=''
+i_sysaccess=''
+i_sysdir=''
+i_sysfile=''
+d_voidtty=''
+i_bsdioctl=''
+i_sysfilio=''
+i_sysioctl=''
+i_syssockio=''
+i_syslog=''
+i_sysmman=''
+i_sysmode=''
+i_sysmount=''
+i_sysndir=''
+i_sysparam=''
+i_syspoll=''
+i_sysresrc=''
+i_syssecrt=''
+i_sysselct=''
+i_sysstat=''
+i_sysstatfs=''
+i_sysstatvfs=''
+i_systimes=''
+i_systypes=''
+i_sysuio=''
+i_sysun=''
+i_sysutsname=''
+i_sysvfs=''
+i_syswait=''
+i_sgtty=''
+i_termio=''
+i_termios=''
+d_tm_tm_gmtoff=''
+d_tm_tm_zone=''
+i_systime=''
+i_systimek=''
+i_time=''
+timeincl=''
+i_unistd=''
+i_ustat=''
+i_utime=''
+i_vfork=''
+i_wchar=''
+i_wctype=''
+d_inc_version_list=''
+inc_version_list=''
+inc_version_list_init=''
+doubleinfbytes=''
+doublenanbytes=''
+longdblinfbytes=''
+longdblnanbytes=''
+installprefix=''
+installprefixexp=''
+installstyle=''
+installusrbinperl=''
+intsize=''
+longsize=''
+shortsize=''
+issymlink=''
+libc=''
+ldlibpthname=''
+libperl=''
+shrpenv=''
+useshrplib=''
+glibpth=''
+incpth=''
+libpth=''
+loclibpth=''
+plibpth=''
+xlibpth=''
+ignore_versioned_solibs=''
+libs=''
+libsdirs=''
+libsfiles=''
+libsfound=''
+libspath=''
+lns=''
+d_PRIEUldbl=''
+d_PRIFUldbl=''
+d_PRIGUldbl=''
+d_PRIeldbl=''
+d_PRIfldbl=''
+d_PRIgldbl=''
+d_SCNfldbl=''
+d_double_has_inf=''
+d_double_has_nan=''
+d_double_has_negative_zero=''
+d_double_has_subnormals=''
+d_double_style_cray=''
+d_double_style_ibm=''
+d_double_style_ieee=''
+d_double_style_vax=''
+doublekind=''
+sPRIEUldbl=''
+sPRIFUldbl=''
+sPRIGUldbl=''
+sPRIeldbl=''
+sPRIfldbl=''
+sPRIgldbl=''
+sSCNfldbl=''
+lseeksize=''
+lseektype=''
+make_set_make=''
+d_mymalloc=''
+freetype=''
+mallocobj=''
+mallocsrc=''
+malloctype=''
+usemallocwrap=''
+usemymalloc=''
+installman1dir=''
+man1dir=''
+man1direxp=''
+man1ext=''
+installman3dir=''
+man3dir=''
+man3direxp=''
+man3ext=''
+doublemantbits=''
+longdblmantbits=''
+nvmantbits=''
+modetype=''
+multiarch=''
+mydomain=''
+myhostname=''
+phostname=''
+c=''
+n=''
+d_eofnblk=''
+eagain=''
+o_nonblock=''
+rd_nodata=''
+need_va_copy=''
+netdb_hlen_type=''
+netdb_host_type=''
+netdb_name_type=''
+netdb_net_type=''
+groupcat=''
+hostcat=''
+passcat=''
+orderlib=''
+ranlib=''
+d_perl_otherlibdirs=''
+otherlibdirs=''
+package=''
+spackage=''
+pager=''
+api_revision=''
+api_subversion=''
+api_version=''
+api_versionstring=''
+patchlevel=''
+perl_patchlevel=''
+revision=''
+subversion=''
+version=''
+version_patchlevel_string=''
+perl5=''
+perladmin=''
+perlpath=''
+d_nv_preserves_uv=''
+d_nv_zero_is_allbits_zero=''
+i16size=''
+i16type=''
+i32size=''
+i32type=''
+i64size=''
+i64type=''
+i8size=''
+i8type=''
+ivsize=''
+ivtype=''
+nv_overflows_integers_at=''
+nv_preserves_uv_bits=''
+nvsize=''
+nvtype=''
+u16size=''
+u16type=''
+u32size=''
+u32type=''
+u64size=''
+u64type=''
+u8size=''
+u8type=''
+uvsize=''
+uvtype=''
+ivdformat=''
+nvEUformat=''
+nvFUformat=''
+nvGUformat=''
+nveformat=''
+nvfformat=''
+nvgformat=''
+uvXUformat=''
+uvoformat=''
+uvuformat=''
+uvxformat=''
+pidtype=''
+prefix=''
+prefixexp=''
+installprivlib=''
+privlib=''
+privlibexp=''
+ptrsize=''
+d_PRIXU64=''
+d_PRId64=''
+d_PRIi64=''
+d_PRIo64=''
+d_PRIu64=''
+d_PRIx64=''
+sPRIXU64=''
+sPRId64=''
+sPRIi64=''
+sPRIo64=''
+sPRIu64=''
+sPRIx64=''
+d_quad=''
+quadkind=''
+quadtype=''
+uquadtype=''
+drand01=''
+randbits=''
+randfunc=''
+randseedtype=''
+seedfunc=''
+installscript=''
+scriptdir=''
+scriptdirexp=''
+selectminbits=''
+selecttype=''
+sh=''
+targetsh=''
+sig_count=''
+sig_name=''
+sig_name_init=''
+sig_num=''
+sig_num_init=''
+sig_size=''
+d_sitearch=''
+installsitearch=''
+sitearch=''
+sitearchexp=''
+installsitebin=''
+sitebin=''
+sitebinexp=''
+installsitehtml1dir=''
+sitehtml1dir=''
+sitehtml1direxp=''
+installsitehtml3dir=''
+sitehtml3dir=''
+sitehtml3direxp=''
+installsitelib=''
+sitelib=''
+sitelib_stem=''
+sitelibexp=''
+installsiteman1dir=''
+siteman1dir=''
+siteman1direxp=''
+installsiteman3dir=''
+siteman3dir=''
+siteman3direxp=''
+siteprefix=''
+siteprefixexp=''
+installsitescript=''
+sitescript=''
+sitescriptexp=''
+sizesize=''
+sizetype=''
+d_libname_unique=''
+so=''
+socksizetype=''
+sharpbang=''
+shsharp=''
+spitshell=''
+src=''
+ssizetype=''
+st_ino_sign=''
+st_ino_size=''
+startperl=''
+startsh=''
+stdchar=''
+d_stdio_stream_array=''
+stdio_stream_array=''
+sysman=''
+sGMTIME_max=''
+sGMTIME_min=''
+sLOCALTIME_max=''
+sLOCALTIME_min=''
+trnl=''
+uidformat=''
+uidsign=''
+uidsize=''
+uidtype=''
+archname64=''
+use64bitall=''
+use64bitint=''
+usecbacktrace=''
+usedefaultstrict=''
+dtrace=''
+usedtrace=''
+usefaststdio=''
+usekernprocpathname=''
+ccflags_uselargefiles=''
+ldflags_uselargefiles=''
+libswanted_uselargefiles=''
+uselargefiles=''
+uselongdouble=''
+usemorebits=''
+usemultiplicity=''
+nm_opt=''
+nm_so_opt=''
+runnm=''
+usenm=''
+usensgetexecutablepath=''
+useperlio=''
+usequadmath=''
+usesocks=''
+d_oldpthreads=''
+useithreads=''
+usereentrant=''
+usethreads=''
+incpath=''
+mips_type=''
+usrinc=''
+d_vendorarch=''
+installvendorarch=''
+vendorarch=''
+vendorarchexp=''
+d_vendorbin=''
+installvendorbin=''
+vendorbin=''
+vendorbinexp=''
+installvendorhtml1dir=''
+vendorhtml1dir=''
+vendorhtml1direxp=''
+installvendorhtml3dir=''
+vendorhtml3dir=''
+vendorhtml3direxp=''
+d_vendorlib=''
+installvendorlib=''
+vendorlib=''
+vendorlib_stem=''
+vendorlibexp=''
+installvendorman1dir=''
+vendorman1dir=''
+vendorman1direxp=''
+installvendorman3dir=''
+vendorman3dir=''
+vendorman3direxp=''
+usevendorprefix=''
+vendorprefix=''
+vendorprefixexp=''
+d_vendorscript=''
+installvendorscript=''
+vendorscript=''
+vendorscriptexp=''
+versiononly=''
+yacc=''
+yaccflags=''
+CONFIG=''
+
+: Detect odd OSs
+define='define'
+undef='undef'
+smallmach='pdp11 i8086 z8000 i80286 iAPX286'
+rmlist=''
+
+: We must find out about Eunice early
+eunicefix=':'
+if test -f /etc/unixtovms; then
+	eunicefix=/etc/unixtovms
+fi
+if test -f /etc/unixtovms.exe; then
+	eunicefix=/etc/unixtovms.exe
+fi
+
+: Set executable suffix now -- needed before hints available
+if test -f "/libs/version.library"; then
+: Amiga OS
+    _exe=""
+elif test -f "/system/gnu_library/bin/ar.pm"; then
+: Stratus VOS
+    _exe=".pm"
+elif test -n "$DJGPP"; then
+: DOS DJGPP
+    _exe=".exe"
+elif test -f /kern/cookiejar; then
+: MiNT
+    _exe=""
+elif test -d c:/. -o -n "$is_os2" ; then
+: OS/2 or cygwin
+    _exe=".exe"
+fi
+
+groupstype=''
+i_whoami=''
+: Possible local include directories to search.
+: Set locincpth to "" in a hint file to defeat local include searches.
+locincpth="/usr/local/include /opt/local/include /usr/gnu/include"
+locincpth="$locincpth /opt/gnu/include /usr/GNU/include /opt/GNU/include"
+:
+: no include file wanted by default
+inclwanted=''
+
+: Enable -DEBUGGING and -DDEBUGGING from the command line
+EBUGGING=''
+DEBUGGING=''
+
+: Trailing extension.  Override this in a hint file, if needed.
+: Extra object files, if any, needed on this platform.
+archobjs=''
+libnames=''
+: change the next line if compiling for Xenix/286 on Xenix/386
+xlibpth='/usr/lib/386 /lib/386'
+: Possible local library directories to search.
+loclibpth="/usr/local/lib /opt/local/lib /usr/gnu/lib"
+loclibpth="$loclibpth /opt/gnu/lib /usr/GNU/lib /opt/GNU/lib"
+
+: general looking path for locating libraries
+glibpth="/lib /usr/lib $xlibpth"
+glibpth="$glibpth /usr/ccs/lib /usr/ucblib /usr/local/lib"
+test -f /usr/shlib/libc.so && glibpth="/usr/shlib $glibpth"
+test -f /shlib/libc.so     && glibpth="/shlib $glibpth"
+test -d /usr/lib64         && glibpth="$glibpth /lib64 /usr/lib64 /usr/local/lib64"
+
+: Private path used by Configure to find libraries.  Its value
+: is prepended to libpth. This variable takes care of special
+: machines, like the mips.  Usually, it should be empty.
+plibpth=''
+
+: default library list
+libswanted=''
+: some systems want to use only the non-versioned libso:s
+ignore_versioned_solibs=''
+ccname=''
+ccversion=''
+perllibs=''
+: set useposix=false in your hint file to disable the POSIX extension.
+useposix=true
+: set useopcode=false in your hint file to disable the Opcode extension.
+useopcode=true
+: set uselanginfo=false in your hint file to disable the I18N::Langinfo extension.
+uselanginfo=true
+archname64=''
+ccflags_uselargefiles=''
+ldflags_uselargefiles=''
+libswanted_uselargefiles=''
+: set usemultiplicity on the Configure command line to enable multiplicity.
+: set usesocks on the Configure command line to enable socks.
+archname=''
+: set usethreads on the Configure command line to enable threads.
+usereentrant='undef'
+: List of libraries we want.
+: If anyone needs extra -lxxx, put those in a hint file.
+libswanted="cl pthread socket bind inet nsl ndbm gdbm dbm db malloc dl ld"
+libswanted="$libswanted sun m crypt sec util c cposix posix ucb bsd BSD"
+: We probably want to search /usr/shlib before most other libraries.
+: This is only used by the lib/ExtUtils/MakeMaker.pm routine extliblist.
+glibpth=`echo " $glibpth " | sed -e 's! /usr/shlib ! !'`
+glibpth="/usr/shlib $glibpth"
+: Do not use vfork unless overridden by a hint file.
+usevfork=false
+
+: Find the basic shell for Bourne shell scripts
+case "$sh" in
+'')
+	case "$SYSTYPE" in
+	*bsd*|sys5*) xxx="/$SYSTYPE/bin/sh";;
+	*) xxx='/bin/sh';;
+	esac
+	if test -f "$xxx"; then
+		sh="$xxx"
+	else
+		: Build up a list and do a single loop so we can 'break' out.
+		pth=`echo $PATH | sed -e "s/$p_/ /g"`
+		for xxx in sh bash ksh pdksh ash; do
+			for p in $pth; do
+				try="$try ${p}/${xxx}"
+			done
+		done
+		for xxx in $try; do
+			if test -f "$xxx"; then
+				sh="$xxx";
+				break
+			elif test "X$_exe" != X -a -f "$xxx$_exe"; then
+				sh="$xxx";
+				break
+			elif test -f "$xxx.exe"; then
+				sh="$xxx";
+				break
+			fi
+		done
+	fi
+	;;
+esac
+
+case "$sh" in
+'')	cat >&2 <<EOM
+$me:  Fatal Error:  I can't find a Bourne Shell anywhere.
+
+Usually it's in /bin/sh.  How did you even get this far?
+Please report this issue at https://github.com/Perl/perl5/issues
+and we'll try to straighten this all out.
+EOM
+	exit 1
+	;;
+esac
+
+: When cross-compiling we need to separate the sh-to-run-Configure-with from the sh-to-use-in-Perl
+: default both to the same thing, cross-compilers can then set targetsh differently if they like
+targetsh=$sh
+
+: see if sh knows # comments
+if `$sh -c '#' >/dev/null 2>&1`; then
+	shsharp=true
+	spitshell=cat
+	xcat=/bin/cat
+	test -f $xcat$_exe || xcat=/usr/bin/cat
+	if test ! -f $xcat$_exe; then
+		for p in `echo $PATH | sed -e "s/$p_/ /g"` $paths; do
+			if test -f $p/cat$_exe; then
+				xcat=$p/cat
+				break
+			fi
+		done
+		if test ! -f $xcat$_exe; then
+			echo "Can't find cat anywhere!"
+			exit 1
+		fi
+	fi
+	echo "#!$xcat" >sharp
+	$eunicefix sharp
+	chmod +x sharp
+	./sharp > today 2>/dev/null
+	if test -s today; then
+		sharpbang='#!'
+	else
+		echo "#! $xcat" > sharp
+		$eunicefix sharp
+		chmod +x sharp
+		./sharp > today 2>/dev/null
+		if test -s today; then
+			sharpbang='#! '
+		else
+			sharpbang=': use '
+		fi
+	fi
+else
+	echo " "
+	echo "Your $sh doesn't grok # comments--I will strip them later on."
+	shsharp=false
+	cd ..
+	echo "exec grep -v '^[ 	]*#'" >spitshell
+	chmod +x spitshell
+	$eunicefix spitshell
+	spitshell=`pwd`/spitshell
+	cd UU
+	echo "I presume that if # doesn't work, #! won't work either!"
+	sharpbang=': use '
+fi
+rm -f sharp today
+
+: figure out how to guarantee sh startup
+case "$startsh" in
+'') startsh=${sharpbang}${sh} ;;
+*)
+esac
+cat >sharp <<EOSS
+$startsh
+set abc
+test "$?abc" != 1
+EOSS
+
+chmod +x sharp
+$eunicefix sharp
+if ./sharp; then
+	: echo "Yup, it does."
+else
+	echo "Hmm... '$startsh' does not guarantee sh startup..."
+	echo "You may have to fix up the shell scripts to make sure $sh runs them."
+fi
+rm -f sharp
+
+: Save command line options in file UU/cmdline.opt for later use in
+: generating config.sh.
+cat > cmdline.opt <<EOSH
+: Configure command line arguments.
+config_arg0='$0'
+config_args='$*'
+config_argc=$#
+EOSH
+argn=1
+args_exp=''
+args_sep=''
+for arg in "$@"; do
+	cat >>cmdline.opt <<EOSH
+config_arg$argn='$arg'
+EOSH
+	cat <<EOC | sed -e "s/'/'"'"'"'"'"'"'/g" > cmdl.opt
+$arg
+EOC
+	arg_exp=`cat cmdl.opt`
+	args_exp="$args_exp$args_sep'$arg_exp'"
+	argn=`expr $argn + 1`
+	args_sep=' '
+done
+rm -f cmdl.opt
+
+: produce awk script to parse command line options
+cat >options.awk <<'EOF'
+BEGIN {
+	optstr = "A:dD:eEf:hKOrsSU:V";	# getopt-style specification
+
+	len = length(optstr);
+	for (i = 1; i <= len; i++) {
+		c = substr(optstr, i, 1);
+		if (i < len) a = substr(optstr, i + 1, 1); else a = "";
+		if (a == ":") {
+			arg[c] = 1;
+			i++;
+		}
+		opt[c] = 1;
+	}
+}
+{
+	expect = 0;
+	str = $0;
+	if (substr(str, 1, 1) != "-") {
+		printf("'%s'\n", str);
+		next;
+	}
+	len = length($0);
+	for (i = 2; i <= len; i++) {
+		c = substr(str, i, 1);
+		if (!opt[c]) {
+			printf("-%s\n", substr(str, i));
+			next;
+		}
+		printf("-%s\n", c);
+		if (arg[c]) {
+			if (i < len)
+				printf("'%s'\n", substr(str, i + 1));
+			else
+				expect = 1;
+			next;
+		}
+	}
+}
+END {
+	if (expect)
+		print "?";
+}
+EOF
+
+: process the command line options
+set X `for arg in "$@"; do echo "X$arg"; done |
+	sed -e s/X// | awk -f options.awk`
+eval "set $*"
+shift
+rm -f options.awk
+
+: set up default values
+fastread=''
+reuseval=false
+config_sh=''
+alldone=''
+error=''
+silent=''
+extractsh=''
+knowitall=''
+rm -f optdef.sh posthint.sh
+cat >optdef.sh <<EOS
+$startsh
+EOS
+
+
+: option parsing
+while test $# -gt 0; do
+	case "$1" in
+	-d) shift; fastread=yes;;
+	-e) shift; alldone=cont;;
+	-f)
+		shift
+		cd ..
+		if test -r "$1"; then
+			config_sh="$1"
+		else
+			echo "$me: cannot read config file $1." >&2
+			error=true
+		fi
+		cd UU
+		shift;;
+	--help|\
+	-h) shift; error=true;;
+	-r) shift; reuseval=true;;
+	-s) shift; silent=true; realsilent=true;;
+	-E) shift; alldone=exit;;
+	-K) shift; knowitall=true;;
+	-O) shift;;
+	-S) shift; silent=true; extractsh=true;;
+	-D)
+		shift
+		case "$1" in
+		*=)
+			echo "$me: use '-U symbol=', not '-D symbol='." >&2
+			echo "$me: ignoring -D $1" >&2
+			;;
+		*=*) echo "$1" | \
+				sed -e "s/'/'\"'\"'/g" -e "s/=\(.*\)/='\1'/" >> optdef.sh;;
+		*) echo "$1='define'" >> optdef.sh;;
+		esac
+		shift
+		;;
+	-U)
+		shift
+		case "$1" in
+		*=) echo "$1" >> optdef.sh;;
+		*=*)
+			echo "$me: use '-D symbol=val', not '-U symbol=val'." >&2
+			echo "$me: ignoring -U $1" >&2
+			;;
+		*) echo "$1='undef'" >> optdef.sh;;
+		esac
+		shift
+		;;
+	-A)
+	    shift
+	    xxx=''
+	    yyy="$1"
+	    zzz=''
+	    uuu=undef
+	    case "$yyy" in
+            *=*) zzz=`echo "$yyy"|sed 's!=.*!!'`
+                 case "$zzz" in
+                 *:*) zzz='' ;;
+                 *)   xxx=append
+                      zzz=" "`echo "$yyy"|sed 's!^[^=]*=!!'`
+                      yyy=`echo "$yyy"|sed 's!=.*!!'` ;;
+                 esac
+                 ;;
+            esac
+            case "$xxx" in
+            '')  case "$yyy" in
+                 *:*) xxx=`echo "$yyy"|sed 's!:.*!!'`
+                      yyy=`echo "$yyy"|sed 's!^[^:]*:!!'`
+                      zzz=`echo "$yyy"|sed 's!^[^=]*=!!'`
+                      yyy=`echo "$yyy"|sed 's!=.*!!'` ;;
+                 *)   xxx=`echo "$yyy"|sed 's!:.*!!'`
+                      yyy=`echo "$yyy"|sed 's!^[^:]*:!!'` ;;
+                 esac
+                 ;;
+            esac
+	    case "$xxx" in
+	    append)
+		echo "$yyy=\"\${$yyy}$zzz\""	>> posthint.sh ;;
+	    clear)
+		echo "$yyy=''"			>> posthint.sh ;;
+	    define)
+	        case "$zzz" in
+		'') zzz=define ;;
+		esac
+		echo "$yyy='$zzz'"		>> posthint.sh ;;
+	    eval)
+		echo "eval \"$yyy=$zzz\""	>> posthint.sh ;;
+	    prepend)
+		echo "$yyy=\"$zzz\${$yyy}\""	>> posthint.sh ;;
+	    undef)
+	        case "$zzz" in
+		'') zzz="$uuu" ;;
+		esac
+		echo "$yyy=$zzz"		>> posthint.sh ;;
+            *)  echo "$me: unknown -A command '$xxx', ignoring -A $1" >&2 ;;
+	    esac
+	    shift
+	    ;;
+	-V) echo "$me generated by metaconfig 3.5 PL0." >&2
+	    exit 0;;
+	--) break;;
+	-*) echo "$me: unknown option $1" >&2; shift; error=true;;
+	*) break;;
+	esac
+done
+
+case "$error" in
+true)
+	cat >&2 <<EOM
+Usage: $me [-dehrsEKOSV] [-f config.sh] [-D symbol] [-D symbol=value]
+                 [-U symbol] [-U symbol=] [-A command:symbol...]
+  -d : use defaults for all answers.
+  -e : go on without questioning past the production of config.sh.
+  -f : specify an alternate default configuration file.
+  -h : print this help message and exit (with an error status).
+  -r : reuse C symbols value if possible (skips costly nm extraction).
+  -s : silent mode, only echoes questions and essential information.
+  -D : define symbol to have some value:
+         -D symbol                symbol gets the value 'define'
+         -D symbol='some value'   symbol is set to 'some value'
+       common used examples (see INSTALL for more info):
+         -Duse64bitint            use 64bit integers
+         -Duse64bitall            use 64bit integers and pointers
+         -Dusethreads             use thread support
+         -Dinc_version_list=none  do not include older perl trees in @INC
+         -DEBUGGING=none          DEBUGGING options
+         -Dcc=gcc                 choose your compiler
+         -Dprefix=/opt/perl5      choose your destination
+  -E : stop at the end of questions, after having produced config.sh.
+  -K : do not use unless you know what you are doing.
+  -O : ignored for backward compatibility
+  -S : perform variable substitutions on all .SH files (can mix with -f)
+  -U : undefine symbol:
+         -U symbol    symbol gets the value 'undef'
+         -U symbol=   symbol gets completely empty
+       e.g.:  -Uversiononly
+  -A : manipulate symbol after the platform specific hints have been applied:
+         -A append:symbol=value   append value to symbol
+         -A symbol=value          like append:, but with a separating space
+         -A define:symbol=value   define symbol to have value
+         -A clear:symbol          define symbol to be ''
+         -A define:symbol         define symbol to be 'define'
+         -A eval:symbol=value     define symbol to be eval of value
+         -A prepend:symbol=value  prepend value to symbol
+         -A undef:symbol          define symbol to be 'undef'
+         -A undef:symbol=         define symbol to be ''
+       e.g.:  -A prepend:libswanted='cl pthread '
+              -A ccflags=-DSOME_MACRO
+  -V : print version number and exit (with a zero status).
+EOM
+	exit 1
+	;;
+esac
+
+: Sanity checks
+case "$fastread$alldone" in
+yescont|yesexit) ;;
+*)
+	case "$extractsh" in
+	true) ;;
+	*)
+		if test ! -t 0; then
+			echo "Say 'sh Configure', not 'sh <Configure'"
+			exit 1
+		fi
+		;;
+	esac
+	;;
+esac
+
+exec 4>&1
+case "$silent" in
+true) exec 1>/dev/null;;
+esac
+
+: run the defines and the undefines, if any, but leave the file out there...
+touch optdef.sh
+grep '\\' optdef.sh >/dev/null 2>&1
+if test $? = 0; then
+    echo "Configure does not support \\ in -D arguments"
+    exit 1
+fi
+. ./optdef.sh
+: create the posthint manipulation script and leave the file out there...
+touch posthint.sh
+
+: set package name
+package='perl5'
+first=`echo $package | sed -e 's/^\(.\).*/\1/'`
+last=`echo $package | sed -e 's/^.\(.*\)/\1/'`
+case "`echo AbyZ | tr '[:lower:]' '[:upper:]' 2>/dev/null`"-"`echo AbyZ | tr '[:upper:]' '[:lower:]' 2>/dev/null`" in
+ABYZ-abyz) spackage=`echo $first | tr '[:lower:]' '[:upper:]'`$last;;
+*) spackage=`echo $first | tr '[a-z]' '[A-Z]'`$last;;
+esac
+
+: Some greps do not return status, grrr.
+echo "grimblepritz" >grimble
+if grep blurfldyick grimble >/dev/null 2>&1 ; then
+	contains=contains
+elif grep grimblepritz grimble >/dev/null 2>&1 ; then
+	contains=grep
+else
+	contains=contains
+fi
+rm -f grimble
+: the following should work in any shell
+case "$contains" in
+contains*)
+	echo " " >&4
+	echo "AGH!  Grep doesn't return a status.  Attempting remedial action." >&4
+	cat >contains <<'EOSS'
+grep "$1" "$2" >.greptmp && cat .greptmp && test -s .greptmp
+EOSS
+contains=./contains
+chmod +x $contains
+esac
+
+: Find the path to the source tree
+case "$src" in
+'') case "$0" in
+    */*) src=`echo $0 | sed -e 's%/[^/][^/]*$%%'`
+         case "$src" in
+	 /*)	;;
+	 .)	;;
+         *)	src=`cd ../$src && pwd` ;;
+	 esac
+         ;;
+    *)   src='.';;
+    esac;;
+esac
+case "$src" in
+'')	src=/
+	rsrc=/
+	;;
+/*)	rsrc="$src";;
+*)	rsrc="../$src";;
+esac
+if test -f $rsrc/Configure && \
+	$contains "^package='$package'\$" $rsrc/Configure >/dev/null 2>&1
+then
+   : found it, so we are ok.
+else
+	rsrc=''
+	for src in . .. ../.. ../../.. ../../../..; do
+		if test -f ../$src/Configure && \
+			$contains "^package=$package$" ../$src/Configure >/dev/null 2>&1
+		then
+			rsrc=../$src
+			break
+		fi
+	done
+fi
+case "$rsrc" in
+'')
+	cat <<EOM >&4
+
+Sorry, I can't seem to locate the source dir for $package.  Please start
+Configure with an explicit path -- i.e. /some/path/Configure.
+
+EOM
+	exit 1
+	;;
+../.)	rsrc='..';;
+*)
+	echo " "
+	echo "Sources for $package found in \"$src\"." >&4
+	;;
+esac
+
+: script used to extract .SH files with variable substitutions
+cat >extract <<'EOS'
+PERL_CONFIG_SH=true
+echo "Doing variable substitutions on .SH files..."
+if test -f MANIFEST; then
+	set x `awk '{print $1}' < MANIFEST | grep '\.SH$'`
+else
+	echo "(Looking for .SH files under the source directory.)"
+	set x `(cd "$src"; find . -name "*.SH" -print)`
+fi
+shift
+case $# in
+0) set x `(cd "$src"; echo *.SH)`; shift;;
+esac
+if test ! -f "$src/$1"; then
+	shift
+fi
+mkdir_p='
+name=$1;
+create="";
+while test $name; do
+	if test ! -d "$name"; then
+		create="$name $create";
+		name=`echo $name | sed -e "s|^[^/]*$||"`;
+		name=`echo $name | sed -e "s|\(.*\)/.*|\1|"`;
+	else
+		name="";
+	fi;
+done;
+for file in $create; do
+	mkdir $file;
+done
+'
+for file in $*; do
+	case "$src" in
+	".")
+		case "$file" in
+		*/*)
+			dir=`expr X$file : 'X\(.*\)/'`
+			file=`expr X$file : 'X.*/\(.*\)'`
+			(cd "$dir" && . ./$file)
+			;;
+		*)
+			. ./$file
+			;;
+		esac
+		;;
+	*)
+		case "$file" in
+		*/*)
+			dir=`expr X$file : 'X\(.*\)/'`
+			file=`expr X$file : 'X.*/\(.*\)'`
+			(set x $dir; shift; eval $mkdir_p)
+			sh <"$src/$dir/$file"
+			;;
+		*)
+			sh <"$src/$file"
+			;;
+		esac
+		;;
+	esac
+done
+if test -f "$src/config_h.SH"; then
+	if test ! -f config.h; then
+	: oops, they left it out of MANIFEST, probably, so do it anyway.
+	. "$src/config_h.SH"
+	fi
+fi
+EOS
+
+: extract files and exit if asked to do so
+case "$extractsh" in
+true)
+	case "$realsilent" in
+	true) ;;
+	*) exec 1>&4;;
+	esac
+	case "$config_sh" in
+	'') config_sh='config.sh';;
+	esac
+	echo " "
+	echo "Fetching answers from $config_sh..."
+	cd ..
+	. $config_sh
+	. UU/optdef.sh
+	echo " "
+	. UU/extract
+	rm -rf UU
+	echo "Extraction done."
+	exit 0
+	;;
+esac
+
+: Eunice requires " " instead of "", can you believe it
+echo " "
+: Here we go...
+echo "Beginning of configuration questions for $package."
+
+trap 'echo " "; test -d ../UU && rm -rf X $rmlist; exit 1' 1 2 3 15
+
+: first determine how to suppress newline on echo command
+echo " "
+echo "Checking echo to see how to suppress newlines..."
+(echo "hi there\c" ; echo " ") >.echotmp
+if $contains c .echotmp >/dev/null 2>&1 ; then
+	echo "...using -n."
+	n='-n'
+	c=''
+else
+	cat <<'EOM'
+...using \c
+EOM
+	n=''
+	c='\c'
+fi
+echo $n "The star should be here-->$c"
+echo '*'
+rm -f .echotmp
+
+: Now test for existence of everything in MANIFEST
+echo " "
+if test -f "$rsrc/MANIFEST"; then
+	echo "First let's make sure your kit is complete.  Checking..." >&4
+	awk '$1 !~ /PACK[A-Z]+/ {print $1}' "$rsrc/MANIFEST" | \
+		(split -l 50 2>/dev/null || split -50)
+	rm -f missing
+	tmppwd=`pwd`
+	for filelist in x??; do
+		(cd "$rsrc"; ls `cat "$tmppwd/$filelist"` \
+			>/dev/null 2>>"$tmppwd/missing")
+	done
+	if test -s missing; then
+		cat missing >&4
+		cat >&4 <<'EOM'
+
+THIS PACKAGE SEEMS TO BE INCOMPLETE.
+
+You have the option of continuing the configuration process, despite the
+distinct possibility that your kit is damaged, by typing 'y'es.  If you
+do, don't blame me if something goes wrong.  I advise you to type 'n'o
+and contact the author (https://github.com/Perl/perl5/issues).
+
+EOM
+		echo $n "Continue? [n] $c" >&4
+		read ans
+		case "$ans" in
+		y*)
+			echo "Continuing..." >&4
+			rm -f missing
+			;;
+		*)
+			echo "ABORTING..." >&4
+			kill $$
+			;;
+		esac
+	else
+		echo "Looks good..."
+	fi
+else
+	echo "There is no MANIFEST file.  I hope your kit is complete !"
+fi
+rm -f missing x??
+
+: Find the appropriate value for a newline for tr
+if test -n "$DJGPP"; then
+       trnl='\012'
+fi
+if test X"$trnl" = X; then
+	case "`echo foo | tr '\n' x 2>/dev/null`" in
+	foox) trnl='\n' ;;
+	esac
+fi
+if test X"$trnl" = X; then
+	case "`echo foo | tr '\012' x 2>/dev/null`" in
+	foox) trnl='\012' ;;
+	esac
+fi
+if test X"$trnl" = X; then
+       case "`echo foo | tr '\r\n' xy 2>/dev/null`" in
+       fooxy) trnl='\n\r' ;;
+       esac
+fi
+if test X"$trnl" = X; then
+	cat <<EOM >&2
+
+$me: Fatal Error: cannot figure out how to translate newlines with 'tr'.
+
+EOM
+	exit 1
+fi
+
+: compute the number of columns on the terminal for proper question formatting
+case "$COLUMNS" in
+'') COLUMNS='80';;
+esac
+
+: set up the echo used in my read
+myecho="case \"\$xxxm\" in
+'') echo $n \"\$rp $c\" >&4;;
+*) case \"\$rp\" in
+	'') echo $n \"[\$xxxm] $c\";;
+	*)
+		if test \`echo \"\$rp [\$xxxm]  \" | wc -c\` -ge $COLUMNS; then
+			echo \"\$rp\" >&4
+			echo $n \"[\$xxxm] $c\" >&4
+		else
+			echo $n \"\$rp [\$xxxm] $c\" >&4
+		fi
+		;;
+	esac;;
+esac"
+
+: now set up to do reads with possible shell escape and default assignment
+cat <<EOSC >myread
+$startsh
+xxxm=\$dflt
+$myecho
+ans='!'
+case "\$fastread" in
+yes) case "\$dflt" in
+	'') ;;
+	*) ans='';
+		case "\$silent-\$rp" in
+		true-) ;;
+		*) echo " " >&4;;
+		esac;;
+	esac;;
+*) case "\$silent" in
+	true) case "\$rp" in
+		'') ans='';;
+		esac;;
+	esac;;
+esac
+while expr "X\$ans" : "X!" >/dev/null; do
+	read answ
+	set x \$xxxm
+	shift
+	aok=''; eval "ans=\\"\$answ\\"" && aok=y
+	case  "\$answ" in
+	"!")
+		sh 1>&4
+		echo " "
+		$myecho
+		;;
+	!*)
+		set x \`expr "X\$ans" : "X!\(.*\)\$"\`
+		shift
+		sh 1>&4 -c "\$*"
+		echo " "
+		$myecho
+		;;
+	"\$ans")
+		case "\$ans" in
+		\\&*)
+			set x \`expr "X\$ans" : "X&\(.*\)\$"\`
+			shift
+			case "\$1" in
+			-d)
+				fastread=yes
+				echo "(OK, I'll run with -d after this question.)" >&4
+				;;
+			-*)
+				echo "*** Sorry, \$1 not supported yet." >&4
+				;;
+			esac
+			$myecho
+			ans=!
+			;;
+		esac;;
+	*)
+		case "\$aok" in
+		y)
+			echo "*** Substitution done -- please confirm."
+			xxxm="\$ans"
+			ans=\`echo $n "\$ans$c" | tr '$trnl' ' '\`
+			xxxm="\$ans"
+			ans=!
+			;;
+		*)
+			echo "*** Error -- try again."
+			ans=!
+			;;
+		esac
+		$myecho
+		;;
+	esac
+	case "\$ans\$xxxm\$nostick" in
+	'')
+		ans=!
+		$myecho
+		;;
+	esac
+done
+case "\$ans" in
+'') ans="\$xxxm";;
+esac
+EOSC
+
+: create .config dir to save info across Configure sessions
+test -d ../.config || mkdir ../.config
+cat >../.config/README <<EOF
+This directory created by Configure to save information that should
+persist across sessions for $package.
+
+You may safely delete it if you wish.
+EOF
+
+: See if we are using a devel version and want that
+xversion=`awk '/define[ 	]+PERL_VERSION/ {print $3}' $rsrc/patchlevel.h`
+case "$usedevel" in
+$define|true|[yY]*)
+    usedevel="$define" ;;
+*) case "$xversion" in
+   *[13579])
+	cat >&4 <<EOH
+*** WHOA THERE!!! ***
+
+    This is an UNSTABLE DEVELOPMENT release.
+    The version of this $package distribution is $xversion, that is, odd,
+    (as opposed to even) and that signifies a development release.
+    If you want a maintenance release, you want an even-numbered version.
+
+    Do ***NOT*** install this into production use.
+    Data corruption and crashes are possible.
+
+    It is most seriously suggested that you do not continue any further
+    unless you want to help in developing and debugging Perl.
+
+    If you *still* want to build perl, you can answer 'y' now,
+    or pass -Dusedevel to Configure.
+
+EOH
+	rp='Do you really want to continue?'
+	dflt='n'
+	. ./myread
+	case "$ans" in
+	[yY]) echo >&4 "Okay, continuing."
+	      usedevel="$define" ;;
+	*) echo >&4 "Okay, bye."
+	   exit 1
+	   ;;
+	esac
+	;;
+    esac
+    usedevel="$undef"
+    ;;
+esac
+case "$usedevel" in
+$define|true|[yY]*)
+	case "$versiononly" in
+	'') versiononly="$define" ;;
+	esac
+	case "$installusrbinperl" in
+	'') installusrbinperl="$undef" ;;
+	esac
+	;;
+esac
+
+: general instructions
+needman=true
+firsttime=true
+user=`(logname) 2>/dev/null`
+case "$user" in
+'') user=`whoami 2>&1`;;
+esac
+if $contains "^$user\$" ../.config/instruct >/dev/null 2>&1; then
+	firsttime=false
+	echo " "
+	rp='Would you like to see the instructions?'
+	dflt=n
+	. ./myread
+	case "$ans" in
+	[yY]*) ;;
+	*) needman=false;;
+	esac
+fi
+if $needman; then
+	cat <<EOH
+
+This installation shell script will examine your system and ask you questions
+to determine how the perl5 package should be installed. If you get
+stuck on a question, you may use a ! shell escape to start a subshell or
+execute a command.  Many of the questions will have default answers in square
+brackets; typing carriage return will give you the default.
+
+On some of the questions which ask for file or directory names you are allowed
+to use the ~name construct to specify the login directory belonging to "name",
+even if you don't have a shell which knows about that.  Questions where this is
+allowed will be marked "(~name ok)".
+
+EOH
+	rp=''
+	dflt='Type carriage return to continue'
+	. ./myread
+	cat <<'EOH'
+
+The prompter used in this script allows you to use shell variables and
+backticks in your answers.  You may use $1, $2, etc...  to refer to the words
+in the default answer, as if the default line was a set of arguments given to a
+script shell.  This means you may also use $* to repeat the whole default line,
+so you do not have to re-type everything to add something to the default.
+
+Every time there is a substitution, you will have to confirm.  If there is an
+error (e.g. an unmatched backtick), the default answer will remain unchanged
+and you will be prompted again.
+
+If you are in a hurry, you may run 'Configure -d'.  This will bypass nearly all
+the questions and use the computed defaults (or the previous answers if there
+was already a config.sh file). Type 'Configure -h' for a list of options.
+You may also start interactively and then answer '& -d' at any prompt to turn
+on the non-interactive behaviour for the remainder of the execution.
+
+EOH
+	. ./myread
+	cat <<EOH
+
+Much effort has been expended to ensure that this shell script will run on any
+Unix system.  If despite that it blows up on yours, your best bet is to edit
+Configure and run it again.  If you can't run Configure for some reason,
+you'll have to generate a config.sh file by hand.  Whatever problems you
+have, let me (https://github.com/Perl/perl5/issues) know how I blew it.
+
+This installation script affects things in two ways:
+
+1) it may do direct variable substitutions on some of the files included
+   in this kit.
+2) it builds a config.h file for inclusion in C programs.  You may edit
+   any of these files as the need arises after running this script.
+
+If you make a mistake on a question, there is no easy way to back up to it
+currently.  The easiest thing to do is to edit config.sh and rerun all the SH
+files.  Configure will offer to let you do this before it runs the SH files.
+
+EOH
+	dflt='Type carriage return to continue'
+	. ./myread
+	case "$firsttime" in
+	true) echo $user >>../.config/instruct;;
+	esac
+fi
+
+: Set 'sysroot' to change the logical root directory to your headers and libraries see man gcc
+: This is primarily meant for cross-compile environments, and may fail to be useful in other cases
+if test "X$sysroot" = X; then
+    sysroot=""
+else
+    case "$cc" in
+	*gcc*|*g++*)
+	    echo "Using $sysroot to find your headers and libraries, adding to ccflags"
+	    # _sysroot is used in places where we need --sysroot=foo
+	    # but using the rest of the flags could cause issues.
+	    _sysroot="--sysroot=$sysroot";
+	    case "$ccflags" in
+		*sysroot*) ;;
+		'undef'|*)
+		ccflags="$ccflags $_sysroot"
+	    esac
+	    case "$ldflags" in
+		*sysroot*) ;;
+		'undef'|*)
+		ldflags="$ldflags $_sysroot"
+	    esac
+	    case "$cppflags" in
+		*sysroot*) ;;
+		'undef'|*)
+		cppflags="$cppflags $_sysroot"
+	    esac
+	    # lddlflags updated below in lddlflags section;
+	    # same with cccdlflags
+	    ;;
+    esac
+
+    # Adjust some defaults to also use $sysroot
+    for var in xlibpth loclibpth locincpth glibpth; do
+	eval xxx=\$$var
+	eval $var=''
+	for path in $xxx; do
+	    eval $var=\"\$$var $sysroot$path\"
+	done
+    done
+
+fi
+
+: find out where common programs are
+echo " "
+echo "Locating common programs..." >&4
+cat <<EOSC >loc
+$startsh
+case \$# in
+0) exit 1;;
+esac
+thing=\$1
+shift
+dflt=\$1
+shift
+for dir in \$*; do
+	case "\$thing" in
+	.)
+	if test -d \$dir/\$thing; then
+		echo \$dir
+		exit 0
+	fi
+	;;
+	*)
+	for thisthing in \$dir/\$thing; do
+		: just loop through to pick last item
+	done
+	if test -f \$thisthing; then
+		echo \$thisthing
+		exit 0
+	elif test "X$_exe" != X -a -f \$thisthing$_exe; then
+		echo \$thisthing
+		exit 0
+	elif test -f \$dir/\$thing.exe; then
+		if test -n "$DJGPP"; then
+			echo \$dir/\$thing.exe
+		elif test "$eunicefix" != ":"; then
+			: on Eunice apparently
+			echo \$dir/\$thing
+		fi
+		exit 0
+	fi
+	;;
+	esac
+done
+echo \$dflt
+exit 1
+EOSC
+chmod +x loc
+$eunicefix loc
+loclist="
+awk
+cat
+chmod
+comm
+cp
+echo
+expr
+grep
+ls
+mkdir
+rm
+sed
+sort
+touch
+tr
+uniq
+"
+trylist="
+ar
+bison
+byacc
+cpp
+csh
+date
+egrep
+gmake
+gzip
+less
+ln
+make
+more
+nm
+nroff
+perl
+pg
+test
+uname
+zip
+"
+pth=`echo $PATH | sed -e "s/$p_/ /g"`
+pth="$pth $sysroot/lib $sysroot/usr/lib"
+for file in $loclist; do
+	eval xxx=\$$file
+	case "$xxx" in
+	/*|?:[\\/]*)
+		if test -f "$xxx"; then
+			: ok
+		else
+			echo "WARNING: no $xxx -- ignoring your setting for $file." >&4
+			xxx=`./loc $file $file $pth`
+		fi
+		;;
+	'') xxx=`./loc $file $file $pth`;;
+	*) xxx=`./loc $xxx $xxx $pth`;;
+	esac
+	eval $file=$xxx$_exe
+	eval _$file=$xxx
+	case "$xxx" in
+	/*)
+		echo $file is in $xxx.
+		;;
+	?:[\\/]*)
+		echo $file is in $xxx.
+		;;
+	*)
+		echo "I don't know where '$file' is, and my life depends on it." >&4
+		echo "Go find a public domain implementation or fix your PATH setting!" >&4
+		exit 1
+		;;
+	esac
+done
+echo " "
+echo "Don't worry if any of the following aren't found..."
+say=offhand
+for file in $trylist; do
+	eval xxx=\$$file
+	case "$xxx" in
+	/*|?:[\\/]*)
+		if test -f "$xxx"; then
+			: ok
+		else
+			echo "WARNING: no $xxx -- ignoring your setting for $file." >&4
+			xxx=`./loc $file $file $pth`
+		fi
+		;;
+	'') xxx=`./loc $file $file $pth`;;
+	*) xxx=`./loc $xxx $xxx $pth`;;
+	esac
+	eval $file=$xxx$_exe
+	eval _$file=$xxx
+	case "$xxx" in
+	/*)
+		echo $file is in $xxx.
+		;;
+	?:[\\/]*)
+		echo $file is in $xxx.
+		;;
+	*)
+		echo "I don't see $file out there, $say."
+		say=either
+		;;
+	esac
+done
+case "$egrep" in
+egrep)
+	echo "Substituting grep for egrep."
+	egrep=$grep
+	_egrep=$grep
+	;;
+esac
+case "$less" in
+'')	;;
+*)	if $less -R </dev/null >/dev/null 2>&1; then
+	       echo "Substituting less -R for less."
+	       less="$less -R"
+	       _less=$less
+	fi
+	;;
+esac
+case "$ln" in
+ln)
+	echo "Substituting cp for ln."
+	ln=$cp
+	_ln=$cp
+	;;
+esac
+case "$make" in
+make)
+	case "$gmake" in
+	gmake)
+	echo "I can't find make or gmake, and my life depends on it." >&4
+	echo "Go find a public domain implementation or fix your PATH setting!" >&4
+	exit 1
+	;;
+	esac
+	;;
+esac
+case "$gmake" in
+gmake)	;;
+*)	# We can't have osname yet.
+	if test -f "/system/gnu_library/bin/ar.pm"; then # Stratus VOS
+		# Assume that gmake, if found, is definitely GNU make
+		# and prefer it over the system make.
+		echo "Substituting gmake for make."
+		make=$gmake
+		_make=$gmake
+	fi
+	;;
+esac
+case "$test" in
+test)
+	echo "Hopefully test is built into your sh."
+	;;
+*)
+	if `sh -c "PATH= test true" >/dev/null 2>&1`; then
+		echo "Using the test built into your sh."
+		test=test
+		_test=test
+	fi
+	;;
+esac
+case "$echo" in
+echo)
+	echo "Hopefully echo is built into your sh."
+	;;
+'') ;;
+*)
+	echo " "
+echo "Checking compatibility between $echo and builtin echo (if any)..." >&4
+	$echo $n "hi there$c" >foo1
+	echo $n "hi there$c" >foo2
+	if cmp foo1 foo2 >/dev/null 2>&1; then
+		echo "They are compatible.  In fact, they may be identical."
+	else
+		case "$n" in
+		'-n') n='' c='\c';;
+		*) n='-n' c='';;
+		esac
+		cat <<FOO
+They are not compatible!  You are probably running ksh on a non-USG system.
+I'll have to use $echo instead of the builtin, since Bourne shell doesn't
+have echo built in and we may have to run some Bourne shell scripts.  That
+means I'll have to use '$n$c' to suppress newlines now.  Life is ridiculous.
+
+FOO
+		$echo $n "The star should be here-->$c"
+		$echo "*"
+	fi
+	$rm -f foo1 foo2
+	;;
+esac
+
+# This question was auctioned at YAPC::Europe-2007 in Vienna
+# I never promised you could answer it. I only auctioned the question.
+cat <<FOO
+The following message is sponsored by
+
+  Dresden.pm<--The stars should be here.
+
+Dear Perl user, system administrator or package
+maintainer, the Perl community sends greetings to
+you. Do you (emblematical) greet back [Y/n]? n
+
+FOO
+
+: Check what type of C compiler we use
+cat <<EOS >trygcc
+$startsh
+EOS
+cat <<'EOSC' >>trygcc
+case "$cc" in
+'') ;;
+*)  $rm -f try try.*
+    $cat >try.c <<EOM
+int main(int argc, char *argv[]) {
+  return 0;
+}
+EOM
+    if $cc -o try $ccflags $ldflags try.c; then
+       :
+    else
+        echo "Uh-oh, the C compiler '$cc' doesn't seem to be working." >&4
+        despair=yes
+        trygcc=yes
+        case "$cc" in
+        *gcc*) trygcc=no ;;
+        esac
+	# Skip this test because it gives a false match on output like:
+	#    ./trygcc: line 23: cc: command not found
+        # case "`$cc -v -c try.c 2>&1`" in
+        # *gcc*) trygcc=no ;;
+        # esac
+        if $test X"$trygcc" = Xyes; then
+            if gcc -o try -c try.c; then
+                echo " "
+                echo "You seem to have a working gcc, though." >&4
+		# Switching compilers may undo the work of hints files.
+		# The most common problem is -D_REENTRANT for threads.
+		# This heuristic catches that case, but gets false positives
+		# if -Dusethreads was not actually specified.  Better to
+		# bail out here with a useful message than fail
+		# mysteriously later. Should we perhaps just try to
+		# re-invoke Configure -Dcc=gcc config_args ?
+		if $test -f usethreads.cbu; then
+			$cat >&4 <<EOM
+
+*** However, any setting of the C compiler flags (e.g. for thread support)
+*** will be lost.  It may be necessary for you to restart Configure and
+*** add -Dcc=gcc to your Configure command line.
+
+EOM
+			rp="Would you like to go ahead and try gcc anyway?"
+			dflt=n
+		else
+			rp="Would you like to use it?"
+			dflt=y
+		fi
+                if $test -f myread; then
+                    . ./myread
+                else
+                    if $test -f UU/myread; then
+                        . ./UU/myread
+                    else
+                        echo "Cannot find myread, sorry.  Aborting." >&2
+                        exit 1
+                    fi
+                fi
+                case "$ans" in
+                [yY]*) cc=gcc; ccname=gcc; ccflags=''; despair=no;
+                esac
+            fi
+        fi
+    fi
+    $rm -f try try.*
+    ;;
+esac
+EOSC
+
+cat <<EOS >checkcc
+$startsh
+EOS
+cat <<'EOSC' >>checkcc
+case "$cc" in
+'') ;;
+*)  $rm -f try try.*
+    $cat >try.c <<EOM
+int main(int argc, char *argv[]) {
+  return 0;
+}
+EOM
+    if $cc -o try $ccflags $ldflags try.c; then
+       :
+    else
+        if $test X"$despair" = Xyes; then
+           echo "Uh-oh, the C compiler '$cc' doesn't seem to be working." >&4
+        fi
+        $cat >&4 <<EOM
+You need to find a working C compiler.
+Either (purchase and) install the C compiler supplied by your OS vendor,
+or for a free C compiler try http://gcc.gnu.org/
+I cannot continue any further, aborting.
+EOM
+        exit 1
+    fi
+    $rm -f try try.*
+    ;;
+esac
+EOSC
+
+: determine whether symbolic links are supported
+echo " "
+$touch blurfl
+if $ln -s blurfl sym > /dev/null 2>&1 ; then
+	echo "Symbolic links are supported." >&4
+	lns="$ln -s"
+else
+	echo "Symbolic links are NOT supported." >&4
+	lns="$ln"
+fi
+$rm -f blurfl sym
+
+: determine whether symbolic links are supported
+echo " "
+case "$lns" in
+*"ln"*" -s")
+	echo "Checking how to test for symbolic links..." >&4
+	$lns blurfl sym
+	if $test "X$issymlink" = X; then
+		case "$newsh" in
+		'') sh     -c "PATH= test -h sym" >/dev/null 2>&1 ;;
+		*)  $newsh -c "PATH= test -h sym" >/dev/null 2>&1 ;;
+		esac
+		if test $? = 0; then
+			issymlink="test -h"
+		else
+			echo "Your builtin 'test -h' may be broken." >&4
+			case "$test" in
+			/*)	;;
+			*)	pth=`echo $PATH | sed -e "s/$p_/ /g"`
+				for p in $pth
+				do
+					if test -f "$p/$test"; then
+						test="$p/$test"
+						break
+					fi
+				done
+				;;
+			esac
+			case "$test" in
+			/*)
+				echo "Trying external '$test -h'." >&4
+				issymlink="$test -h"
+				if $test ! -h sym >/dev/null 2>&1; then
+					echo "External '$test -h' is broken, too." >&4
+					issymlink=''
+				fi
+				;;
+			*)	issymlink='' ;;
+			esac
+		fi
+	fi
+	if $test "X$issymlink" = X; then
+		if $test -L sym 2>/dev/null; then
+			issymlink="$test -L"
+			echo "The builtin '$test -L' worked." >&4
+		fi
+	fi
+	if $test "X$issymlink" != X; then
+		echo "You can test for symbolic links with '$issymlink'." >&4
+	else
+		echo "I do not know how you can test for symbolic links." >&4
+	fi
+	$rm -f blurfl sym
+	;;
+*)	echo "No symbolic links, so not testing for their testing..." >&4
+	;;
+esac
+
+: Make symlinks util
+case "$mksymlinks" in
+$define|true|[yY]*)
+	case "$src" in
+	''|'.')	echo "Cannot create symlinks in the original directory." >&4
+		exit 1
+		;;
+	*)	case "$lns:$issymlink" in
+		*"ln"*" -s:"*"test -"?)
+			echo "Creating the symbolic links..." >&4
+			cd ..
+			awk '{print $1}' $src/MANIFEST | sed -e 's:/\([^/]*\)$: \1:' |
+			awk 'NF == 1 {
+				dir=".";
+				file=$1 "";
+			     }
+			     NF == 2 {
+				dir=$1 "";
+				file=$2 "";
+			     }
+			     {
+				 print "# dir = ", dir, "file = ", file
+				 mf[dir] = mf[dir]" "source"/"dir"/"file;
+			     } END {
+				 for (d in mf) {
+				     if (d != ".") { print("mkdir -p "d) }
+				     print("ln -sf "mf[d]" "d);
+				 }
+			     }' source="$src" > UU/mksymlinks.$$
+			sh UU/mksymlinks.$$
+			rm UU/mksymlinks.$$
+			# Sanity check 1.
+			if test ! -d t/base; then
+				echo "Failed to create the subdirectories.  Aborting." >&4
+				exit 1
+			fi
+			# Sanity check 2.
+			if test ! -f t/base/lex.t; then
+				echo "Failed to create the symlinks (t/base/lex.t missing).  Aborting." >&4
+				exit 1
+			fi
+			if test ! -f win32/win32.c; then
+				echo "Failed to create the symlinks (win32/win32.c missing).  Aborting." >&4
+				exit 1
+			fi
+			cd UU
+			;;
+		*)	echo "(I cannot figure out how to do symbolic links, ignoring mksymlinks)." >&4
+			;;
+		esac
+		;;
+	esac
+	;;
+esac
+
+: Check for Cross-Compilation
+if $test "X$targethost" = "X"; then
+    targethost=""
+fi
+if $test "X$targetenv" = "X"; then
+    targetenv=""
+fi
+case "$usecrosscompile" in
+$define|true|[yY]*)
+	$echo "Cross-compiling..."
+	croak=''
+	case "$cc" in
+	*-gcc*|*-g++*) # A cross-compiling gcc, probably.
+	    # arm-linux-androideabi-gcc  -> arm-linux-androideabi
+	    # x86_64-w64-mingw32-gcc.exe -> x86_64-w64-mingw32
+	    targetarch=`$echo $cc|$sed 's/-g[c\+][c\+].*$//'`
+	    ar=`$echo $cc|$sed 's/-g[c\+][c\+]/-ar/'`
+	    # leave out ld, choosing it is more complex
+	    nm=`$echo $cc|$sed 's/-g[c\+][c\+]/-nm/'`
+	    ranlib=`$echo $cc|$sed 's/-g[c\+][c\+]/-ranlib/'`
+	    # We are in a weird spot. Just before us, some values
+	    # were 'saved', to be restored after the hints are
+	    # run.  This means that the changes we made to ar,
+	    # nm and ranlib will get reverted.
+	    # To avoid that, we hijack the saving mechanism and
+	    # have it save our new values.
+	    for file in ar nm ranlib; do
+		eval xxx=\$$file
+		eval $file=$xxx$_exe
+		eval _$file=$xxx
+	    done
+	;;
+	esac
+	case "$targetarch" in
+	'') echo "Targetarch not defined." >&4; croak=y ;;
+	*)  echo "Using targetarch $targetarch." >&4 ;;
+	esac
+	case "$targethost" in
+	'') echo "Targethost not defined." >&4; croak=n ;;
+	*)  echo "Using targethost $targethost." >&4
+	esac
+	locincpth=' '
+	loclibpth=' '
+	case "$croak" in
+	y) echo "Cannot continue, aborting." >&4; exit 1 ;;
+	esac
+    : compile a host miniperl and generate_uudmap, unless we got passed them
+    if $test "X$hostperl" = X; then
+      echo "Building host miniperl and generate_uudmap binaries" >&4
+      before_host=`pwd`
+      cd ..
+      cd $src
+      src=`pwd`
+      rm -rf $src/host
+      mkdir $src/host
+      cd $src/host
+      $src/Configure -des -Dusedevel -Dmksymlinks
+      $make miniperl
+      case "$hostgenerate" in
+      '') $make generate_uudmap
+          hostgenerate=$src/host/generate_uudmap
+          ;;
+       "$undef") hostgenerate=''
+          ;;
+      esac
+      hostperl=$src/host/miniperl
+      cd $before_host
+    fi
+    hostosname=`$hostperl -le 'print $^O'`
+    ;;
+*)
+    usecrosscompile="$undef"
+    ;;
+esac
+
+: Define -Dtargethost=somecomputer to run compiled tests on another machine
+case "$targethost" in
+    '') echo "Checking for cross-compile" >&4
+    case "$usecrosscompile$multiarch" in
+       *$define*) echo "Skipping the try tests in the rest of Configure as no targethost was defined when cross-compiling" >&4
+         if [ -f Makefile ]; then
+           echo " "
+           echo "Now you must ensure config.sh, config.h and the generated headers exist and run a $make."
+         else
+           echo "Configure done."
+         fi
+       exit 0
+       ;;
+     *) echo "No targethost for running compiler tests against defined, running locally" >&4
+        run=''
+        to=:
+        from=:
+        ;;
+    esac
+    ;;
+    *) echo "Using targethost $targethost." >&4
+	case "$src" in
+	/*) run=$src/Cross/run
+	    targetmkdir=$src/Cross/mkdir
+	    to=$src/Cross/to
+	    from=$src/Cross/from
+	    ;;
+	*)  pwd=`$test -f ../Configure & cd ..; pwd`
+	    run=$pwd/Cross/run
+	    targetmkdir=$pwd/Cross/mkdir
+	    to=$pwd/Cross/to
+	    from=$pwd/Cross/from
+	    ;;
+	esac
+	case "$targetrun" in
+	'') targetrun=ssh ;;
+	esac
+	case "$targetto" in
+	'') targetto=scp ;;
+	esac
+	case "$targetfrom" in
+	'') targetfrom=scp ;;
+	esac
+	run=$run-$targetrun
+	to=$to-$targetto
+	from=$from-$targetfrom
+	case "$targetdir" in
+	'')  targetdir=/tmp
+	     echo "Guessing targetdir $targetdir." >&4
+	     ;;
+	esac
+	case "$targetuser" in
+	'')  targetuser=root
+	     echo "Guessing targetuser $targetuser." >&4
+	     ;;
+	esac
+	case "$targetport" in
+	'')  targetport=22
+	     echo "Guessing targetport $targetport." >&4
+	     ;;
+	esac
+	case "$targetfrom" in
+	scp)	q=-q ;;
+	*)	q='' ;;
+	esac
+	case "$targetrun" in
+	ssh|rsh)
+	    cat >$run <<EOF
+#!/bin/sh
+env=''
+case "\$1" in
+-cwd)
+  shift
+  cwd=\$1
+  shift
+  ;;
+esac
+case "\$1" in
+-env)
+  shift
+  env=\$1
+  shift
+  ;;
+esac
+case "\$cwd" in
+'') cwd=$targetdir ;;
+esac
+exe=\$1
+shift
+$to \$exe
+$targetrun -p $targetport -l $targetuser $targethost "cd \$cwd && \$env \$exe \$@"
+EOF
+	    ;;
+	adb)
+	    $touch $run
+	    ;;
+	*)  echo "Unknown targetrun '$targetrun'" >&4
+	    exit 1
+	    ;;
+	esac
+	case "$targetmkdir" in
+	*/Cross/mkdir)
+	    cat >$targetmkdir <<EOF
+#!/bin/sh
+$targetrun -p $targetport -l $targetuser $targethost "mkdir -p \$@"
+EOF
+	    $chmod a+rx $targetmkdir
+	    ;;
+	*)  echo "Unknown targetmkdir '$targetmkdir'" >&4
+	    exit 1
+	    ;;
+	esac
+	case "$targetto" in
+	scp|rcp)
+	    cat >$to <<EOF
+#!/bin/sh
+for f in \$@
+do
+  case "\$f" in
+  /*)
+    $targetmkdir \`dirname \$f\`
+    $targetto -P $targetport -r $q \$f $targetuser@$targethost:\$f           2>/dev/null  || exit 1
+    ;;
+  *)
+    $targetmkdir $targetdir/\`dirname \$f\`
+    $targetto -P $targetport -r $q \$f $targetuser@$targethost:$targetdir/\$f 2>/dev/null || exit 1
+    ;;
+  esac
+done
+exit 0
+EOF
+	    ;;
+	cp) cat >$to <<EOF
+#!/bin/sh
+for f in \$@
+do
+  case "\$f" in
+  /*)
+    $mkdir -p $targetdir/\`dirname \$f\`
+    $cp \$f $targetdir/\$f || exit 1
+    ;;
+  *)
+    $targetmkdir $targetdir/\`dirname \$f\`
+    $cp \$f $targetdir/\$f || exit 1
+    ;;
+  esac
+done
+exit 0
+EOF
+	    ;;
+	*)  echo "Unknown targetto '$targetto'" >&4
+	    exit 1
+	    ;;
+	esac
+	case "$targetfrom" in
+	scp|rcp)
+	  cat >$from <<EOF
+#!/bin/sh
+for f in \$@
+do
+  $rm -f \$f
+  $targetfrom -P $targetport $q $targetuser@$targethost:$targetdir/\$f . || exit 1
+done
+exit 0
+EOF
+	    ;;
+	cp) cat >$from <<EOF
+#!/bin/sh
+for f in \$@
+do
+  $rm -f \$f
+  cp $targetdir/\$f . || exit 1
+done
+exit 0
+EOF
+	    ;;
+	*)  echo "Unknown targetfrom '$targetfrom'" >&4
+	    exit 1
+	    ;;
+	esac
+	if $test ! -f $run; then
+	    echo "Target 'run' script '$run' not found." >&4
+	else
+	    $chmod a+rx $run
+	fi
+	if $test ! -f $to; then
+	    echo "Target 'to' script '$to' not found." >&4
+	else
+	    $chmod a+rx $to
+	fi
+	if $test ! -f $from; then
+	    echo "Target 'from' script '$from' not found." >&4
+	else
+	    $chmod a+rx $from
+	fi
+	if $test ! -f $run -o ! -f $to -o ! -f $from; then
+	    exit 1
+	fi
+	cat >&4 <<EOF
+Using '$run' for remote execution,
+and '$from' and '$to'
+for remote file transfer.
+EOF
+	;;
+*)	run=''
+	to=:
+	from=:
+	usecrosscompile="$undef"
+	targetarch=''
+	;;
+esac
+
+: see whether [:lower:] and [:upper:] are supported character classes
+echo " "
+case "`echo AbyZ | $tr '[:lower:]' '[:upper:]' 2>/dev/null`"-"`echo AbyZ | $tr '[:upper:]' '[:lower:]' 2>/dev/null`" in
+ABYZ-abyz)
+	echo "Good, your tr supports [:lower:] and [:upper:] to convert case." >&4
+	up='[:upper:]'
+	low='[:lower:]'
+	;;
+*)	# There is a discontinuity in EBCDIC between 'R' and 'S'
+	# (0xd9 and 0xe2), therefore that is a nice testing point.
+	if test "X$up" = X -o "X$low" = X; then
+	    case "`echo RS | $tr '[R-S]' '[r-s]' 2>/dev/null`" in
+	    rs) up='[A-Z]'
+		low='[a-z]'
+		;;
+	    esac
+	fi
+	if test "X$up" = X -o "X$low" = X; then
+	    case "`echo RS | $tr R-S r-s 2>/dev/null`" in
+	    rs) up='A-Z'
+		low='a-z'
+		;;
+	    esac
+	fi
+	if test "X$up" = X -o "X$low" = X; then
+	    case "`echo RS | od -x 2>/dev/null`" in
+	    *D9E2*|*d9e2*)
+		echo "Hey, this might be EBCDIC." >&4
+		if test "X$up" = X -o "X$low" = X; then
+		    case "`echo RS | $tr '[A-IJ-RS-Z]' '[a-ij-rs-z]' 2>/dev/null`" in
+		    rs) up='[A-IJ-RS-Z]'
+			low='[a-ij-rs-z]'
+			;;
+		    esac
+		fi
+		if test "X$up" = X -o "X$low" = X; then
+		    case "`echo RS | $tr A-IJ-RS-Z a-ij-rs-z 2>/dev/null`" in
+		    rs) up='A-IJ-RS-Z'
+			low='a-ij-rs-z'
+			;;
+		    esac
+		fi
+		;;
+	    esac
+	fi
+esac
+case "`echo RS | $tr \"$up\" \"$low\" 2>/dev/null`" in
+rs)
+    echo "Using $up and $low to convert case." >&4
+    ;;
+*)
+    echo "I don't know how to translate letters from upper to lower case." >&4
+    echo "Your tr is not acting any way I know of." >&4
+    exit 1
+    ;;
+esac
+: set up the translation script tr, must be called with ./tr of course
+cat >tr <<EOSC
+$startsh
+case "\$1\$2" in
+'[A-Z][a-z]') exec $tr '$up' '$low';;
+'[a-z][A-Z]') exec $tr '$low' '$up';;
+esac
+exec $tr "\$@"
+EOSC
+chmod +x tr
+$eunicefix tr
+
+: Try to determine whether config.sh was made on this system
+case "$config_sh" in
+'')
+myuname=`$uname -a 2>/dev/null`
+$test -z "$myuname" && myuname=`hostname 2>/dev/null`
+# Downcase everything to avoid ambiguity.
+# Remove slashes and single quotes so we can use parts of this in
+# directory and file names.
+# Remove newlines so myuname is sane to use elsewhere.
+# tr '[A-Z]' '[a-z]' would not work in EBCDIC
+# because the A-Z/a-z are not consecutive.
+myuname=`echo $myuname | $sed -e "s,['/],,g" | \
+	./tr '[A-Z]' '[a-z]' | $tr $trnl ' '`
+newmyuname="$myuname"
+dflt=n
+case "$knowitall" in
+'')
+	if test -f ../config.sh; then
+		if $contains myuname= ../config.sh >/dev/null 2>&1; then
+			eval "`grep myuname= ../config.sh`"
+		fi
+		if test "X$myuname" = "X$newmyuname"; then
+			dflt=y
+		fi
+	fi
+	;;
+*) dflt=y;;
+esac
+
+: Get old answers from old config file if Configure was run on the
+: same system, otherwise use the hints.
+hint=default
+cd ..
+if test -f config.sh; then
+	echo " "
+	rp="I see a config.sh file.  Shall I use it to set the defaults?"
+	. UU/myread
+	case "$ans" in
+	n*|N*) echo "OK, I'll ignore it."
+		mv config.sh config.sh.old
+		myuname="$newmyuname"
+		;;
+	*)  echo "Fetching default answers from your old config.sh file..." >&4
+		tmp_n="$n"
+		tmp_c="$c"
+		tmp_sh="$sh"
+		. ./config.sh
+		cp config.sh UU
+		n="$tmp_n"
+		c="$tmp_c"
+		: Older versions did not always set $sh.  Catch re-use of such
+		: an old config.sh.
+		case "$sh" in
+		'') sh="$tmp_sh" ;;
+		esac
+		hint=previous
+		;;
+	esac
+fi
+. ./UU/checkcc
+if test ! -f config.sh; then
+	$cat <<EOM
+
+First time through, eh?  I have some defaults handy for some systems
+that need some extra help getting the Configure answers right:
+
+EOM
+	(cd $src/hints; ls -C *.sh) | $sed 's/\.sh/   /g' >&4
+	dflt=''
+	: Half the following guesses are probably wrong... If you have better
+	: tests or hints, please send them to https://github.com/Perl/perl5/issues
+	: The metaconfig authors would also appreciate a copy...
+	$test -f /irix && osname=irix
+	$test -f /xenix && osname=sco_xenix
+	$test -f /dynix && osname=dynix
+	$test -f /dnix && osname=dnix
+	$test -f /lynx.os && osname=lynxos
+	$test -f /unicos && osname=unicos && osvers=`$uname -r`
+	$test -f /unicosmk && osname=unicosmk && osvers=`$uname -r`
+	$test -f /unicosmk.ar && osname=unicosmk && osvers=`$uname -r`
+	$test -f /bin/mips && /bin/mips && osname=mips
+	$test -d /usr/apollo/bin && osname=apollo
+	$test -f /etc/saf/_sactab && osname=svr4
+	$test -d /usr/include/minix && osname=minix && osvers=`$uname -r`
+	$test -f /system/gnu_library/bin/ar.pm && osname=vos
+	$test -f /sys/utilities/MultiView && osname=amigaos
+	if $test -d /MachTen -o -d /MachTen_Folder; then
+		osname=machten
+		if $test -x /sbin/version; then
+			osvers=`/sbin/version | $awk '{print $2}' |
+			$sed -e 's/[A-Za-z]$//'`
+		elif $test -x /usr/etc/version; then
+			osvers=`/usr/etc/version | $awk '{print $2}' |
+			$sed -e 's/[A-Za-z]$//'`
+		else
+			osvers="$2.$3"
+		fi
+	fi
+
+	$test -f /sys/posix.dll &&
+		$test -f /usr/bin/what &&
+		set X `/usr/bin/what /sys/posix.dll` &&
+		$test "$3" = UWIN &&
+		osname=uwin &&
+		osvers="$5"
+
+	if $test -f $uname; then
+		set X $myuname
+		shift
+
+		case "$5" in
+		fps*) osname=fps ;;
+		mips*)
+			case "$4" in
+			umips) osname=umips ;;
+			*) osname=mips ;;
+			esac;;
+		[23]100) osname=mips ;;
+		i386*)
+			tmp=`/bin/uname -X 2>/dev/null|awk '/3\.2v[45]/{ print $(NF) }'`
+			if $test "$tmp" != "" -a "$3" = "3.2" -a -f '/etc/systemid'; then
+				osname='sco'
+				osvers=$tmp
+			elif $test -f /etc/kconfig; then
+				osname=isc
+				if test "$lns" = "$ln -s"; then
+					osvers=4
+				elif $contains _SYSV3 /usr/include/stdio.h > /dev/null 2>&1 ; then
+					osvers=3
+				elif $contains _POSIX_SOURCE /usr/include/stdio.h > /dev/null 2>&1 ; then
+					osvers=2
+				fi
+			fi
+			tmp=''
+			;;
+		pc*)
+			if test -n "$DJGPP"; then
+				osname=dos
+				osvers=djgpp
+			fi
+			;;
+		esac
+
+		case "$1" in
+		aix) osname=aix
+			tmp=`( (oslevel) 2>/dev/null || echo "not found") 2>&1`
+			case "$tmp" in
+			# oslevel can fail with:
+			# oslevel: Unable to acquire lock.
+			*not\ found) osvers="$4"."$3" ;;
+			'<3240'|'<>3240') osvers=3.2.0 ;;
+			'=3240'|'>3240'|'<3250'|'<>3250') osvers=3.2.4 ;;
+			'=3250'|'>3250') osvers=3.2.5 ;;
+			*) osvers=$tmp;;
+			esac
+			;;
+		bitrig) osname=bitrig
+			osvers="$3"
+			;;
+		bsd386) osname=bsd386
+			osvers=`$uname -r`
+			;;
+		cygwin*) osname=cygwin
+			osvers="$3"
+			;;
+		*dc.osx) osname=dcosx
+			osvers="$3"
+			;;
+		dnix) osname=dnix
+			osvers="$3"
+			;;
+		domainos) osname=apollo
+			osvers="$3"
+			;;
+		dgux)	osname=dgux
+			osvers="$3"
+			;;
+		dragonfly) osname=dragonfly
+			osvers="$3"
+			;;
+		dynixptx*) osname=dynixptx
+			osvers=`echo "$4"|sed 's/^v//'`
+			;;
+		freebsd) osname=freebsd
+			osvers="$3" ;;
+		genix)	osname=genix ;;
+		gnu)	osname=gnu
+			osvers="$3" ;;
+		hp*)	osname=hpux
+			osvers=`echo "$3" | $sed 's,.*\.\([0-9]*\.[0-9]*\),\1,'`
+			;;
+		irix*)	osname=irix
+			case "$3" in
+			4*) osvers=4 ;;
+			5*) osvers=5 ;;
+			*)	osvers="$3" ;;
+			esac
+			;;
+		linux)	osname=linux
+			case "$3" in
+			*)	osvers="$3" ;;
+			esac
+			$test -f /system/lib/libandroid.so && osname=linux-android
+			;;
+		MiNT)	osname=mint
+			;;
+		minix)	osname=minix
+			osvers=`$uname -r`
+			;;
+		netbsd*) osname=netbsd
+			osvers="$3"
+			;;
+		news-os) osvers="$3"
+			case "$3" in
+			4*) osname=newsos4 ;;
+			*) osname=newsos ;;
+			esac
+			;;
+		nonstop-ux) osname=nonstopux ;;
+		openbsd) osname=openbsd
+			osvers="$3"
+			;;
+		os2)	osname=os2
+			osvers="$4"
+			;;
+		POSIX-BC | posix-bc ) osname=posix-bc
+			osvers="$3"
+			;;
+		powerux | power_ux | powermax_os | powermaxos | \
+		powerunix | power_unix) osname=powerux
+			osvers="$3"
+			;;
+		qnx) osname=qnx
+			osvers="$4"
+			;;
+		solaris) osname=solaris
+			case "$3" in
+			5*) osvers=`echo $3 | $sed 's/^5/2/g'` ;;
+			*)	osvers="$3" ;;
+			esac
+			;;
+		sunos) osname=sunos
+			case "$3" in
+			5*) osname=solaris
+				osvers=`echo $3 | $sed 's/^5/2/g'` ;;
+			*)	osvers="$3" ;;
+			esac
+			;;
+		titanos) osname=titanos
+			case "$3" in
+			1*) osvers=1 ;;
+			2*) osvers=2 ;;
+			3*) osvers=3 ;;
+			4*) osvers=4 ;;
+			*)	osvers="$3" ;;
+			esac
+			;;
+		ultrix) osname=ultrix
+			osvers="$3"
+			;;
+		osf1|mls+)	case "$5" in
+				alpha)
+					osname=dec_osf
+					osvers=`sizer -v | awk -FUNIX '{print $2}' | awk '{print $1}' |  tr '[A-Z]' '[a-z]' | sed 's/^[xvt]//'`
+					case "$osvers" in
+					[1-9].[0-9]*) ;;
+					*) osvers=`echo "$3" | sed 's/^[xvt]//'` ;;
+					esac
+					;;
+			hp*)	osname=hp_osf1	;;
+			mips)	osname=mips_osf1 ;;
+			esac
+			;;
+		# UnixWare 7.1.2 is known as Open UNIX 8
+		openunix|unixware) osname=svr5
+			osvers="$4"
+			;;
+		uts)	osname=uts
+			osvers="$3"
+			;;
+		vos) osvers="$3"
+			;;
+		$2) case "$osname" in
+			*isc*) ;;
+			*freebsd*) ;;
+			svr*)
+				: svr4.x or possibly later
+				case "svr$3" in
+				${osname}*)
+					osname=svr$3
+					osvers=$4
+					;;
+				esac
+				case "$osname" in
+				svr4.0)
+					: Check for ESIX
+					if test -f /stand/boot ; then
+						eval `grep '^INITPROG=[a-z/0-9]*$' /stand/boot`
+						if test -n "$INITPROG" -a -f "$INITPROG"; then
+			isesix=`strings -a $INITPROG|grep 'ESIX SYSTEM V/386 Release 4.0'`
+							if test -n "$isesix"; then
+								osname=esix4
+							fi
+						fi
+					fi
+					;;
+				esac
+				;;
+			*)	if test -f /etc/systemid; then
+					osname=sco
+					set `echo $3 | $sed 's/\./ /g'` $4
+					if $test -f $src/hints/sco_$1_$2_$3.sh; then
+						osvers=$1.$2.$3
+					elif $test -f $src/hints/sco_$1_$2.sh; then
+						osvers=$1.$2
+					elif $test -f $src/hints/sco_$1.sh; then
+						osvers=$1
+					fi
+				else
+					case "$osname" in
+					'') : Still unknown.  Probably a generic Sys V.
+						osname="sysv"
+						osvers="$3"
+						;;
+					esac
+				fi
+				;;
+			esac
+			;;
+		*)	case "$osname" in
+			'') : Still unknown.  Probably a generic BSD.
+				osname="$1"
+				osvers="$3"
+				;;
+			esac
+			;;
+		esac
+	else
+		if test -f /vmunix -a -f $src/hints/news_os.sh; then
+			(what /vmunix | UU/tr '[A-Z]' '[a-z]') > UU/kernel.what 2>&1
+			if $contains news-os UU/kernel.what >/dev/null 2>&1; then
+				osname=news_os
+			fi
+			$rm -f UU/kernel.what
+		elif test -d c:/. -o -n "$is_os2" ; then
+			set X $myuname
+			osname=os2
+			osvers="$5"
+		fi
+	fi
+
+        case "$targetarch" in
+        '') ;;
+        *)  hostarch=$osname
+            case "$targetarch" in
+                nto*|*-nto-*)
+                    # Will load qnx.sh, which should change osname to nto
+                    osname=qnx
+                    osvers=''
+                    ;;
+                *linux-android*)
+                    # Catch arm-linux-androideabi, mipsel-linux-android,
+                    # and i686-linux-android
+                    osname=linux-android
+                    osvers=''
+                    ;;
+                *linux*)
+                    # Something like arm-linux-gnueabihf is really just
+                    # plain linux.
+                    osname=linux
+                    osvers=''
+                    ;;
+                *solaris*|*sunos*)
+                    osname=solaris
+                    # XXX perhaps we should just assume
+                    # osvers to be 2, or maybe take the value
+                    # from targetarch. Using $run before the
+                    # hints are run is somewhat icky.
+                    set X `$run $uname -a 2>/dev/null`
+                    shift
+                    case "$3" in
+                        5*) osvers=`echo $3 | $sed 's/^5/2/g'` ;;
+                        *)  osvers="$3" ;;
+                    esac
+                    ;;
+                *)
+		    osname=`echo $targetarch|sed 's,^[^-]*-,,'`
+		    osvers=''
+                ;;
+            esac
+            ;;
+        esac
+
+	: Now look for a hint file osname_osvers, unless one has been
+	: specified already.
+	case "$hintfile" in
+	''|' ')
+		file=`echo "${osname}_${osvers}" | $sed -e 's%\.%_%g' -e 's%_$%%'`
+		: Also try without trailing minor version numbers.
+		xfile=`echo $file | $sed -e 's%_[^_]*$%%'`
+		xxfile=`echo $xfile | $sed -e 's%_[^_]*$%%'`
+		xxxfile=`echo $xxfile | $sed -e 's%_[^_]*$%%'`
+		xxxxfile=`echo $xxxfile | $sed -e 's%_[^_]*$%%'`
+		case "$file" in
+		'') dflt=none ;;
+		*)  case "$osvers" in
+			'') dflt=$file
+				;;
+			*)  if $test -f $src/hints/$file.sh ; then
+					dflt=$file
+				elif $test -f $src/hints/$xfile.sh ; then
+					dflt=$xfile
+				elif $test -f $src/hints/$xxfile.sh ; then
+					dflt=$xxfile
+				elif $test -f $src/hints/$xxxfile.sh ; then
+					dflt=$xxxfile
+				elif $test -f $src/hints/$xxxxfile.sh ; then
+					dflt=$xxxxfile
+				elif $test -f "$src/hints/${osname}.sh" ; then
+					dflt="${osname}"
+				else
+					dflt=none
+				fi
+				;;
+			esac
+			;;
+		esac
+		if $test -f Policy.sh ; then
+			case "$dflt" in
+			*Policy*) ;;
+			none) dflt="Policy" ;;
+			*) dflt="Policy $dflt" ;;
+			esac
+		fi
+		;;
+	*)
+		dflt=`echo $hintfile | $sed 's/\.sh$//'`
+		;;
+	esac
+
+	if $test -f Policy.sh ; then
+		$cat <<EOM
+
+There's also a Policy hint file available, which should make the
+site-specific (policy) questions easier to answer.
+EOM
+
+	fi
+
+	$cat <<EOM
+
+You may give one or more space-separated answers, or "none" if appropriate.
+If you have a handcrafted Policy.sh file or a Policy.sh file generated by a
+previous run of Configure, you may specify it as well as or instead of
+OS-specific hints.  If hints are provided for your OS, you should use them:
+although Perl can probably be built without hints on many platforms, using
+hints often improve performance and may enable features that Configure can't
+set up on its own. If there are no hints that match your OS, specify "none";
+DO NOT give a wrong version or a wrong OS.
+
+EOM
+
+	rp="Which of these apply, if any?"
+	. UU/myread
+	tans=$ans
+	for file in $tans; do
+		if $test X$file = XPolicy -a -f Policy.sh; then
+			. Policy.sh
+			$cat Policy.sh >> UU/config.sh
+		elif $test -f $src/hints/$file.sh; then
+			. $src/hints/$file.sh
+			$cat $src/hints/$file.sh >> UU/config.sh
+		elif $test X"$tans" = X -o X"$tans" = Xnone ; then
+			: nothing
+		else
+			: Give one chance to correct a possible typo.
+			echo "$file.sh does not exist"
+			dflt=$file
+			rp="hint to use instead?"
+			. UU/myread
+			for file in $ans; do
+				if $test -f "$src/hints/$file.sh"; then
+					. $src/hints/$file.sh
+					$cat $src/hints/$file.sh >> UU/config.sh
+				elif $test X$ans = X -o X$ans = Xnone ; then
+					: nothing
+				else
+					echo "$file.sh does not exist -- ignored."
+				fi
+			done
+		fi
+	done
+
+	hint=recommended
+	: Remember our hint file for later.
+	if $test -f "$src/hints/$file.sh" ; then
+		hintfile="$file"
+	else
+		hintfile=''
+	fi
+fi
+cd UU
+;;
+*)
+	echo " "
+	echo "Fetching default answers from $config_sh..." >&4
+	tmp_n="$n"
+	tmp_c="$c"
+	cd ..
+	cp $config_sh config.sh 2>/dev/null
+	chmod +w config.sh
+	. ./config.sh
+	cd UU
+	cp ../config.sh .
+	n="$tmp_n"
+	c="$tmp_c"
+	hint=previous
+	;;
+esac
+. ./optdef.sh
+
+: Restore computed paths
+for file in $loclist $trylist; do
+	eval $file="\$_$file"
+done
+
+cat << EOM
+
+Configure uses the operating system name and version to set some defaults.
+The default value is probably right if the name rings a bell. Otherwise,
+since spelling matters for me, either accept the default or answer "none"
+to leave it blank.
+
+EOM
+case "$osname" in
+	''|' ')
+		case "$hintfile" in
+		''|' '|none) dflt=none ;;
+		*)  dflt=`echo $hintfile | $sed -e 's/\.sh$//' -e 's/_.*$//'` ;;
+		esac
+		;;
+	*) dflt="$osname" ;;
+esac
+rp="Operating system name?"
+. ./myread
+case "$ans" in
+none)  osname='' ;;
+*) osname=`echo "$ans" | $sed -e 's/[ 	][	]*/_/g' | ./tr '[A-Z]' '[a-z]'`;;
+esac
+echo " "
+case "$osvers" in
+	''|' ')
+		case "$hintfile" in
+		''|' '|none) dflt=none ;;
+		*)	dflt=`echo $hintfile | $sed -e 's/\.sh$//' -e 's/^[^_]*//'`
+			dflt=`echo $dflt | $sed -e 's/^_//' -e 's/_/./g'`
+			case "$dflt" in
+			''|' ') dflt=none ;;
+			esac
+			;;
+		esac
+		;;
+	*) dflt="$osvers" ;;
+esac
+rp="Operating system version?"
+. ./myread
+case "$ans" in
+none)  osvers='' ;;
+*) osvers="$ans" ;;
+esac
+
+
+. ./posthint.sh
+
+: who configured the system
+cf_time=`LC_ALL=C; LANGUAGE=C; export LC_ALL; export LANGUAGE; $date 2>&1`
+case "$cf_by" in
+"")
+	cf_by=`(logname) 2>/dev/null`
+	case "$cf_by" in
+	"")
+		cf_by=`(whoami) 2>/dev/null`
+		case "$cf_by" in
+		"") cf_by=unknown ;;
+		esac ;;
+	esac ;;
+esac
+
+: decide how portable to be.  Allow command line overrides.
+case "$d_portable" in
+"$undef") ;;
+*)	d_portable="$define" ;;
+esac
+
+: set up shell script to do ~ expansion
+cat >filexp <<EOSS
+$startsh
+: expand filename
+case "\$1" in
+ \~/*|\~)
+	echo \$1 | $sed "s|~|\${HOME-\$LOGDIR}|"
+	;;
+ \~*)
+	if $test -f /bin/csh; then
+		/bin/csh -f -c "glob \$1"
+		failed=\$?
+		echo ""
+		exit \$failed
+	else
+		name=\`$expr x\$1 : '..\([^/]*\)'\`
+		dir=\`$sed -n -e "/^\${name}:/{s/^[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:\([^:]*\).*"'\$'"/\1/" -e p -e q -e '}' </etc/passwd\`
+		if $test ! -d "\$dir"; then
+			me=\`basename \$0\`
+			echo "\$me: can't locate home directory for: \$name" >&2
+			exit 1
+		fi
+		case "\$1" in
+		*/*)
+			echo \$dir/\`$expr x\$1 : '..[^/]*/\(.*\)'\`
+			;;
+		*)
+			echo \$dir
+			;;
+		esac
+	fi
+	;;
+*)
+	echo \$1
+	;;
+esac
+EOSS
+chmod +x filexp
+$eunicefix filexp
+
+: now set up to get a file name
+cat <<EOS >getfile
+$startsh
+EOS
+cat <<'EOSC' >>getfile
+tilde=''
+fullpath=''
+already=''
+skip=''
+none_ok=''
+exp_file=''
+nopath_ok=''
+orig_rp="$rp"
+orig_dflt="$dflt"
+case "$gfpth" in
+'') gfpth='.' ;;
+esac
+
+case "$fn" in
+*\(*)
+	: getfile will accept an answer from the comma-separated list
+	: enclosed in parentheses even if it does not meet other criteria.
+	expr "$fn" : '.*(\(.*\)).*' | $tr ',' $trnl >getfile.ok
+	fn=`echo $fn | sed 's/(.*)//'`
+	;;
+esac
+
+case "$fn" in
+*:*)
+	loc_file=`expr $fn : '.*:\(.*\)'`
+	fn=`expr $fn : '\(.*\):.*'`
+	;;
+esac
+
+case "$fn" in
+*~*) tilde=true;;
+esac
+case "$fn" in
+*/*) fullpath=true;;
+esac
+case "$fn" in
+*+*) skip=true;;
+esac
+case "$fn" in
+*n*) none_ok=true;;
+esac
+case "$fn" in
+*e*) exp_file=true;;
+esac
+case "$fn" in
+*p*) nopath_ok=true;;
+esac
+
+case "$fn" in
+*f*) type='File';;
+*d*) type='Directory';;
+*l*) type='Locate';;
+esac
+
+what="$type"
+case "$what" in
+Locate) what='File';;
+esac
+
+case "$exp_file" in
+'')
+	case "$d_portable" in
+	"$define") ;;
+	*) exp_file=true;;
+	esac
+	;;
+esac
+
+cd ..
+while test "$type"; do
+	redo=''
+	rp="$orig_rp"
+	dflt="$orig_dflt"
+	case "$tilde" in
+	true) rp="$rp (~name ok)";;
+	esac
+	. UU/myread
+	if test -f UU/getfile.ok && \
+		$contains "^$ans\$" UU/getfile.ok >/dev/null 2>&1
+	then
+		value="$ans"
+		ansexp="$ans"
+		break
+	fi
+	case "$ans" in
+	none)
+		value=''
+		ansexp=''
+		case "$none_ok" in
+		true) type='';;
+		esac
+		;;
+	*)
+		case "$tilde" in
+		'') value="$ans"
+			ansexp="$ans";;
+		*)
+			value=`UU/filexp $ans`
+			case $? in
+			0)
+				if test "$ans" != "$value"; then
+					echo "(That expands to $value on this system.)"
+				fi
+				;;
+			*) value="$ans";;
+			esac
+			ansexp="$value"
+			case "$exp_file" in
+			'') value="$ans";;
+			esac
+			;;
+		esac
+		case "$fullpath" in
+		true)
+			case "$ansexp" in
+			/*) value="$ansexp" ;;
+			[a-zA-Z]:/*) value="$ansexp" ;;
+			*)
+				redo=true
+				case "$already" in
+				true)
+				echo "I shall only accept a full path name, as in /bin/ls." >&4
+				echo "Use a ! shell escape if you wish to check pathnames." >&4
+					;;
+				*)
+				echo "Please give a full path name, starting with slash." >&4
+					case "$tilde" in
+					true)
+				echo "Note that using ~name is ok provided it expands well." >&4
+						already=true
+						;;
+					esac
+				esac
+				;;
+			esac
+			;;
+		esac
+		case "$redo" in
+		'')
+			case "$type" in
+			File)
+				for fp in $gfpth; do
+					if test "X$fp" = X.; then
+					    pf="$ansexp"
+					else    
+					    pf="$fp/$ansexp"
+					fi
+					if test -f "$pf"; then
+						type=''
+					elif test -r "$pf" || (test -h "$pf") >/dev/null 2>&1
+					then
+						echo "($value is not a plain file, but that's ok.)"
+						type=''
+					fi
+					if test X"$type" = X; then
+					    value="$pf"
+					    break
+					fi
+				done
+				;;
+			Directory)
+				for fp in $gfpth; do
+					if test "X$fp" = X.; then
+					    dir="$ans"
+					    direxp="$ansexp"
+					else    
+					    dir="$fp/$ansexp"
+					    direxp="$fp/$ansexp"
+					fi
+					if test -d "$direxp"; then
+						type=''
+						value="$dir"
+						break
+					fi
+				done
+				;;
+			Locate)
+				if test -d "$ansexp"; then
+					echo "(Looking for $loc_file in directory $value.)"
+					value="$value/$loc_file"
+					ansexp="$ansexp/$loc_file"
+				fi
+				if test -f "$ansexp"; then
+					type=''
+				fi
+				case "$nopath_ok" in
+				true)	case "$value" in
+					*/*) ;;
+					*)	echo "Assuming $value will be in people's path."
+						type=''
+						;;
+					esac
+					;;
+				esac
+				;;
+			esac
+
+			case "$skip" in
+			true) type='';
+			esac
+
+			case "$type" in
+			'') ;;
+			*)
+				if test "$fastread" = yes; then
+					dflt=y
+				else
+					dflt=n
+				fi
+				rp="$what $value doesn't exist.  Use that name anyway?"
+				. UU/myread
+				dflt=''
+				case "$ans" in
+				y*) type='';;
+				*) echo " ";;
+				esac
+				;;
+			esac
+			;;
+		esac
+		;;
+	esac
+done
+cd UU
+ans="$value"
+rp="$orig_rp"
+dflt="$orig_dflt"
+rm -f getfile.ok
+test "X$gfpthkeep" != Xy && gfpth=""
+EOSC
+
+: determine root of directory hierarchy where package will be installed.
+case "$prefix" in
+'')	dflt=`./loc . /usr/local /usr/local /local /opt /usr`
+	;;
+*)	dflt="$prefix"
+	;;
+esac
+$cat <<EOM
+
+By default, $package will be installed in $dflt/bin, manual pages
+under $dflt/man, etc..., i.e. with $dflt as prefix for all
+installation directories. Typically this is something like /usr/local.
+If you wish to have binaries under /usr/bin but other parts of the
+installation under /usr/local, that's ok: you will be prompted
+separately for each of the installation directories, the prefix being
+only used to set the defaults.
+
+EOM
+fn=d~
+rp='Installation prefix to use?'
+. ./getfile
+oldprefix=''
+case "$prefix" in
+'')	;;
+*)	case "$ans" in
+	"$prefix") ;;
+	*) oldprefix="$prefix";;
+	esac
+	;;
+esac
+
+case "$ans" in
+*?/)	prefix=`echo "$ans" | sed 's/.$//'`
+	;;
+*)	prefix="$ans"
+esac
+
+case "$ansexp" in
+*?/)	prefixexp=`echo "$ansexp" | sed 's/.$//'`
+	;;
+*)	prefixexp="$ansexp"
+esac
+
+: allow them to override the AFS root
+case "$afsroot" in
+'')	afsroot=/afs ;;
+*)	afsroot=$afsroot ;;
+esac
+
+: is AFS running?
+echo " "
+case "$afs" in
+$define|true)	afs=true ;;
+$undef|false)	afs=false ;;
+*)	if $test -d $afsroot; then
+		afs=true
+	else
+		afs=false
+	fi
+	;;
+esac
+if $afs; then
+	echo "AFS may be running... I'll be extra cautious then..." >&4
+else
+	echo "AFS does not seem to be running..." >&4
+fi
+
+: determine installation prefix for where package is to be installed.
+if $afs; then
+$cat <<EOM
+
+Since you are running AFS, I need to distinguish the directory in which
+files will reside from the directory in which they are installed (and from
+which they are presumably copied to the former directory by occult means).
+
+EOM
+	case "$installprefix" in
+	'') dflt=`echo $prefix | sed 's#^/afs/#/afs/.#'`;;
+	*) dflt="$installprefix";;
+	esac
+else
+$cat <<EOM
+
+In some special cases, particularly when building $package for distribution,
+it is convenient to distinguish the directory in which files should be
+installed from the directory ($prefix) in which they will
+eventually reside.  For most users, these two directories are the same.
+
+EOM
+	case "$installprefix" in
+	'') dflt=$prefix ;;
+	*) dflt=$installprefix;;
+	esac
+fi
+fn=d~
+rp='What installation prefix should I use for installing files?'
+. ./getfile
+installprefix="$ans"
+installprefixexp="$ansexp"
+
+: Perform the prefixexp/installprefixexp correction if necessary
+cat <<EOS >installprefix
+$startsh
+EOS
+cat <<'EOSC' >>installprefix
+: Change installation prefix, if necessary.
+if $test X"$prefix" != X"$installprefix"; then
+    eval "install${prefixvar}=\`echo \$${prefixvar}exp | sed \"s#^\$prefixexp#\$installprefixexp#\"\`"
+else
+    eval "install${prefixvar}=\"\$${prefixvar}exp\""
+fi
+EOSC
+chmod +x installprefix
+$eunicefix installprefix
+
+: Set variables such as privlib and privlibexp from the output of ./getfile
+: performing the prefixexp/installprefixexp correction if necessary.
+cat <<EOS >setprefixvar
+$startsh
+EOS
+cat <<'EOSC' >>setprefixvar
+eval "${prefixvar}=\"\$ans\""
+eval "${prefixvar}exp=\"\$ansexp\""
+. ./installprefix
+EOSC
+chmod +x setprefixvar
+$eunicefix setprefixvar
+
+: set up the script used to warn in case of inconsistency
+cat <<EOS >whoa
+$startsh
+EOS
+cat <<'EOSC' >>whoa
+dflt=y
+case "$hint" in
+    recommended)
+	case "$hintfile" in
+	'')	echo "The $hint value for \$$var on this machine was \"$was\"!" >&4
+		;;
+	*)	echo "Hmm.  Based on the hints in hints/$hintfile.sh, " >&4
+		echo "the $hint value for \$$var on this machine was \"$was\"!" >&4
+		;;
+	esac
+	;;
+    *)	echo " "
+	echo "*** WHOA THERE!!! ***" >&4
+	echo "    The $hint value for \$$var on this machine was \"$was\"!" >&4
+	;;
+esac
+rp="    Keep the $hint value?"
+. ./myread
+case "$ans" in
+y) td=$was; tu=$was;;
+esac
+EOSC
+
+: function used to set '$1' to '$val'
+setvar='var=$1; eval "was=\$$1"; td=$define; tu=$undef;
+case "$val$was" in
+$define$undef) . ./whoa; eval "$var=\$td";;
+$undef$define) . ./whoa; eval "$var=\$tu";;
+*) eval "$var=$val";;
+esac'
+
+: Do we want threads support and if so, what type
+case "$usethreads" in
+$define|true|[yY]*)     dflt='y';;
+*)     # Catch case where user specified ithreads but
+       # forgot -Dusethreads (A.D. 4/2002)
+       case "$useithreads" in
+       *$define*)	dflt='y';;
+       *)		dflt='n';;
+       esac
+       ;;
+esac
+cat <<EOM
+
+Perl can be built to offer a form of threading support on some systems
+To do so, Configure can be run with -Dusethreads.
+
+Note that Perl built with threading support runs slightly slower
+and uses slightly more memory than plain Perl.
+
+If this doesn't make any sense to you, just accept the default '$dflt'.
+EOM
+rp='Build a threading Perl?'
+. ./myread
+case "$ans" in
+y|Y)    val="$define" ;;
+*)      val="$undef" ;;
+esac
+set usethreads
+eval $setvar
+
+useithreads="$usethreads"
+
+case "$d_oldpthreads" in
+'')	: Configure tests would be welcome here.  For now, assume undef.
+	val="$undef" ;;
+*)	val="$d_oldpthreads" ;;
+esac
+set d_oldpthreads
+eval $setvar
+
+
+: Look for a hint-file generated 'call-back-unit'.  If the
+: user has specified that a threading perl is to be built,
+: we may need to set or change some other defaults.
+if $test -f usethreads.cbu; then
+    echo "Your platform has some specific hints regarding threaded builds, using them..."
+    . ./usethreads.cbu
+else
+    case "$usethreads" in
+	"$define"|true|[yY]*)
+		$cat <<EOM
+(Your platform does not have any specific hints for threaded builds.
+ Assuming POSIX threads, then.)
+EOM
+	;;
+    esac
+fi
+
+: Check if multiplicity is required
+cat <<EOM
+
+Perl can be built so that multiple Perl interpreters can coexist
+within the same Perl executable.
+EOM
+
+case "$useithreads" in
+$define)
+	cat <<EOM
+This multiple interpreter support is required for interpreter-based threads.
+EOM
+	val="$define"
+	;;
+*)	case "$usemultiplicity" in
+	$define|true|[yY]*)	dflt='y';;
+	*) dflt='n';;
+	esac
+	echo " "
+	echo "If this doesn't make any sense to you, just accept the default '$dflt'."
+	rp='Build Perl for multiplicity?'
+	. ./myread
+	case "$ans" in
+	y|Y)	val="$define" ;;
+	*)      val="$undef" ;;
+	esac
+	;;
+esac
+set usemultiplicity
+eval $setvar
+
+: Check if morebits is requested
+case "$usemorebits" in
+"$define"|true|[yY]*)
+	use64bitint="$define"
+	uselongdouble="$define"
+	usemorebits="$define"
+	;;
+*)	usemorebits="$undef"
+	;;
+esac
+
+: Determine the C compiler to be used
+echo " "
+case "$cc" in
+'') dflt=cc;;
+*) dflt="$cc";;
+esac
+rp="Use which C compiler?"
+. ./myread
+cc="$ans"
+
+: See whether they have no cc but they do have gcc
+. ./trygcc
+if $test -f cc.cbu; then
+    . ./cc.cbu
+fi
+. ./checkcc
+
+: make some quick guesses about what we are up against
+echo " "
+$echo $n "Hmm...  $c"
+echo exit 1 >bsd
+echo exit 1 >usg
+echo exit 1 >v7
+echo exit 1 >osf1
+echo exit 1 >eunice
+echo exit 1 >xenix
+echo exit 1 >venix
+echo exit 1 >os2
+d_bsd="$undef"
+$cat $sysroot/usr/include/signal.h $sysroot/usr/include/sys/signal.h >foo 2>/dev/null
+if test -f /osf_boot || $contains 'OSF/1' $sysroot/usr/include/ctype.h >/dev/null 2>&1
+then
+	echo "Looks kind of like an OSF/1 system, but we'll see..."
+	echo exit 0 >osf1
+elif test `echo abc | $tr a-z A-Z` = Abc ; then
+	xxx=`./loc addbib blurfl $pth`
+	if $test -f $xxx; then
+	echo "Looks kind of like a USG system with BSD features, but we'll see..."
+		echo exit 0 >bsd
+		echo exit 0 >usg
+	else
+		if $contains SIGTSTP foo >/dev/null 2>&1 ; then
+			echo "Looks kind of like an extended USG system, but we'll see..."
+		else
+			echo "Looks kind of like a USG system, but we'll see..."
+		fi
+		echo exit 0 >usg
+	fi
+elif $contains SIGTSTP foo >/dev/null 2>&1 ; then
+	echo "Looks kind of like a BSD system, but we'll see..."
+	d_bsd="$define"
+	echo exit 0 >bsd
+else
+	echo "Looks kind of like a Version 7 system, but we'll see..."
+	echo exit 0 >v7
+fi
+case "$eunicefix" in
+*unixtovms*)
+	$cat <<'EOI'
+There is, however, a strange, musty smell in the air that reminds me of
+something...hmm...yes...I've got it...there's a VMS nearby, or I'm a Blit.
+EOI
+	echo exit 0 >eunice
+	d_eunice="$define"
+: it so happens the Eunice I know will not run shell scripts in Unix format
+	;;
+*)
+	echo " "
+	echo "Congratulations.  You aren't running Eunice."
+	d_eunice="$undef"
+	;;
+esac
+: Detect OS2.  The p_ variable is set above in the Head.U unit.
+: Note that this also -- wrongly -- detects e.g. dos-djgpp, which also uses
+: semicolon as a patch separator
+case "$p_" in
+:) ;;
+*)
+	$cat <<'EOI'
+I have the feeling something is not exactly right, however...don't tell me...
+lemme think...does HAL ring a bell?...no, of course, you're only running OS/2!
+(Or you may be running DOS with DJGPP.)
+EOI
+	echo exit 0 >os2
+	;;
+esac
+if test -f /xenix; then
+	echo "Actually, this looks more like a XENIX system..."
+	echo exit 0 >xenix
+	d_xenix="$define"
+else
+	echo " "
+	echo "It's not Xenix..."
+	d_xenix="$undef"
+fi
+chmod +x xenix
+$eunicefix xenix
+if test -f /venix; then
+	echo "Actually, this looks more like a VENIX system..."
+	echo exit 0 >venix
+else
+	echo " "
+	if ./xenix; then
+		: null
+	else
+		echo "Nor is it Venix..."
+	fi
+fi
+chmod +x bsd usg v7 osf1 eunice xenix venix os2
+$eunicefix bsd usg v7 osf1 eunice xenix venix os2
+$rm -f foo
+
+: Check if we are using GNU gcc and what its version is
+echo " "
+echo "Checking for GNU cc in disguise and/or its version number..." >&4
+$cat >try.c <<EOM
+#include <stdio.h>
+int main() {
+#if defined(__GNUC__) && !defined(__INTEL_COMPILER)
+#ifdef __VERSION__
+	printf("%s\n", __VERSION__);
+#else
+	printf("%s\n", "1");
+#endif
+#endif
+	return(0);
+}
+EOM
+if $cc -o try $ccflags $ldflags try.c; then
+	gccversion=`$run ./try`
+	case "$gccversion" in
+	'') echo "You are not using GNU cc." ;;
+	*)  echo "You are using GNU cc $gccversion."
+	    ccname=gcc
+	    ;;
+	esac
+else
+	echo " "
+	echo "*** WHOA THERE!!! ***" >&4
+	echo "    Your C compiler \"$cc\" doesn't seem to be working!" >&4
+	case "$knowitall" in
+	'')
+	echo "    You'd better start hunting for one and let me know about it." >&4
+		exit 1
+		;;
+	esac
+fi
+$rm -f try try.*
+case "$gccversion" in
+1.*) cpp=`./loc gcc-cpp $cpp $pth` ;;
+esac
+case "$gccversion" in
+'') gccosandvers='' ;;
+*) gccshortvers=`echo "$gccversion"|sed 's/ .*//'`
+   gccosandvers=`$cc -v 2>&1|grep '/specs$'|sed "s!.*/[^-/]*-[^-/]*-\([^-/]*\)/$gccshortvers/specs!\1!"`
+   gccshortvers=''
+   case "$gccosandvers" in
+   $osname) gccosandvers='' ;; # linux gccs seem to have no linux osvers, grr
+   $osname$osvers) ;; # looking good
+   $osname*) cat <<EOM >&4
+
+*** WHOA THERE!!! ***
+
+    Your gcc has not been compiled for the exact release of
+    your operating system ($gccosandvers versus $osname$osvers).
+
+    In general it is a good idea to keep gcc synchronized with
+    the operating system because otherwise serious problems
+    may ensue when trying to compile software, like Perl.
+
+    I'm trying to be optimistic here, though, and will continue.
+    If later during the configuration and build icky compilation
+    problems appear (headerfile conflicts being the most common
+    manifestation), I suggest reinstalling the gcc to match
+    your operating system release.
+
+EOM
+      ;;
+   *) gccosandvers='' ;; # failed to parse, better be silent
+   esac
+   ;;
+esac
+case "$ccname" in
+'') ccname="$cc" ;;
+esac
+
+# gcc 3.* complain about adding -Idirectories that they already know about,
+# so we will take those off from locincpth.
+case "$gccversion" in
+3.*)
+    echo "main(){}">try.c
+    for incdir in $locincpth; do
+       warn=`$cc $ccflags -I$incdir -c try.c 2>&1 | \
+	     grep '^c[cp]p*[01]: warning: changing search order '`
+       if test "X$warn" != X; then
+	   locincpth=`echo " $locincpth " | sed "s! $incdir ! !"`
+       fi
+    done
+    $rm -f try try.*
+esac
+
+# gcc 4.9 by default does some optimizations that break perl.
+# see ticket 121505.
+#
+# The -fwrapv disables those optimizations (and probably others,) so
+# for gcc 4.9 (and later, since the optimizations probably won't go
+# away), add -fwrapv unless the user requests -fno-wrapv, which
+# disables -fwrapv, or if the user requests -fsanitize=undefined,
+# which turns the overflows -fwrapv ignores into runtime errors.
+case "$gccversion" in
+4.[3-9].*|4.[1-9][0-9]*|[5-9].*|[1-9][0-9]*)
+    case "$ccflags" in
+    *-fno-wrapv*|*-fsanitize=undefined*|*-fwrapv*) ;;
+    *) ccflags="$ccflags -fwrapv" ;;
+    esac
+esac
+
+: What should the include directory be ?
+: Use sysroot if set, so findhdr looks in the right place.
+echo " "
+$echo $n "Hmm...  $c"
+dflt="$sysroot/usr/include"
+incpath=''
+mips_type=''
+if $test -f /bin/mips && /bin/mips; then
+	echo "Looks like a MIPS system..."
+	$cat >usr.c <<'EOCP'
+#ifdef SYSTYPE_BSD43
+/bsd43
+#endif
+EOCP
+	if $cc $cppflags -E usr.c > usr.out && $contains / usr.out >/dev/null 2>&1; then
+		dflt='/bsd43/usr/include'
+		incpath='/bsd43'
+		mips_type='BSD 4.3'
+	else
+		mips_type='System V'
+	fi
+	$rm -f usr.c usr.out
+	echo "and you're compiling with the $mips_type compiler and libraries."
+	xxx_prompt=y
+	echo "exit 0" >mips
+else
+	echo "Doesn't look like a MIPS system."
+	xxx_prompt=n
+	echo "exit 1" >mips
+fi
+chmod +x mips
+$eunicefix mips
+case "$usrinc" in
+'') ;;
+*) dflt="$usrinc";;
+esac
+case "$xxx_prompt" in
+y)	fn=d/
+	echo " "
+	rp='Where are the include files you want to use?'
+	. ./getfile
+	usrinc="$ans"
+	;;
+*)	usrinc="$dflt"
+	;;
+esac
+
+: see how we invoke the C preprocessor
+echo " "
+echo "Now, how can we feed standard input to your C preprocessor..." >&4
+cat <<'EOT' >testcpp.c
+#define ABC abc
+#define XYZ xyz
+ABC.XYZ
+EOT
+cd ..
+if test ! -f cppstdin; then
+	if test "X$osname" = "Xaix" -a "X$gccversion" = X; then
+		# AIX cc -E doesn't show the absolute headerfile
+		# locations but we'll cheat by using the -M flag.
+		echo 'cat >.$$.c; rm -f .$$.u; '"$cc"' ${1+"$@"} -M -c .$$.c 2>/dev/null; test -s .$$.u && awk '"'"'$2 ~ /\.h$/ { print "# 0 \""$2"\"" }'"'"' .$$.u; rm -f .$$.o .$$.u; '"$cc"' -E ${1+"$@"} .$$.c; rm .$$.c' > cppstdin
+	else
+		echo 'cat >.$$.c; '"$cc $cppflags"' -E ${1+"$@"} .$$.c; rm .$$.c' >cppstdin
+	fi
+else
+	echo "Keeping your $hint cppstdin wrapper."
+fi
+chmod 755 cppstdin
+wrapper=`pwd`/cppstdin
+ok='false'
+cd UU
+
+if $test "X$cppstdin" != "X" && \
+	$cppstdin $cppminus <testcpp.c >testcpp.out 2>&1 && \
+	$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1
+then
+	echo "You used to use $cppstdin $cppminus so we'll use that again."
+	case "$cpprun" in
+	'') echo "But let's see if we can live without a wrapper..." ;;
+	*)
+		if $cpprun $cpplast <testcpp.c >testcpp.out 2>&1 && \
+			$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1
+		then
+			echo "(And we'll use $cpprun $cpplast to preprocess directly.)"
+			ok='true'
+		else
+			echo "(However, $cpprun $cpplast does not work, let's see...)"
+		fi
+		;;
+	esac
+else
+	case "$cppstdin" in
+	'') ;;
+	*)
+		echo "Good old $cppstdin $cppminus does not seem to be of any help..."
+		;;
+	esac
+fi
+
+if $ok; then
+	: nothing
+elif echo 'Maybe "'"$cc"' -E" will work...'; \
+	$cc -E <testcpp.c >testcpp.out 2>&1; \
+	$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
+	echo "Yup, it does."
+	x_cpp="$cc $cppflags -E"
+	x_minus='';
+elif echo 'Nope...maybe "'"$cc"' -E -" will work...'; \
+	$cc -E - <testcpp.c >testcpp.out 2>&1; \
+	$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
+	echo "Yup, it does."
+	x_cpp="$cc $cppflags -E"
+	x_minus='-';
+elif echo 'Nope...maybe "'"$cc"' -P" will work...'; \
+	$cc -P <testcpp.c >testcpp.out 2>&1; \
+	$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
+	echo "Yipee, that works!"
+	x_cpp="$cc $cppflags -P"
+	x_minus='';
+elif echo 'Nope...maybe "'"$cc"' -P -" will work...'; \
+	$cc -P - <testcpp.c >testcpp.out 2>&1; \
+	$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
+	echo "At long last!"
+	x_cpp="$cc $cppflags -P"
+	x_minus='-';
+elif echo 'No such luck, maybe "'$cpp'" will work...'; \
+	$cpp <testcpp.c >testcpp.out 2>&1; \
+	$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
+	echo "It works!"
+	x_cpp="$cpp $cppflags"
+	x_minus='';
+elif echo 'Nixed again...maybe "'$cpp' -" will work...'; \
+	$cpp - <testcpp.c >testcpp.out 2>&1; \
+	$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
+	echo "Hooray, it works!  I was beginning to wonder."
+	x_cpp="$cpp $cppflags"
+	x_minus='-';
+elif echo 'Uh-uh.  Time to get fancy.  Trying a wrapper...'; \
+	$wrapper <testcpp.c >testcpp.out 2>&1; \
+	$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
+	x_cpp="$wrapper"
+	x_minus=''
+	echo "Eureka!"
+else
+	dflt=''
+	rp="No dice.  I can't find a C preprocessor.  Name one:"
+	. ./myread
+	x_cpp="$ans"
+	x_minus=''
+	$x_cpp <testcpp.c >testcpp.out 2>&1
+	if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
+		echo "OK, that will do." >&4
+	else
+echo "Sorry, I can't get that to work.  Go find one and rerun Configure." >&4
+		exit 1
+	fi
+fi
+
+case "$ok" in
+false)
+	cppstdin="$x_cpp"
+	cppminus="$x_minus"
+	cpprun="$x_cpp"
+	cpplast="$x_minus"
+	set X $x_cpp
+	shift
+	case "$1" in
+	"$cpp")
+		echo "Perhaps can we force $cc -E using a wrapper..."
+		if $wrapper <testcpp.c >testcpp.out 2>&1; \
+			$contains 'abc.*xyz' testcpp.out >/dev/null 2>&1
+		then
+			echo "Yup, we can."
+			cppstdin="$wrapper"
+			cppminus='';
+		else
+			echo "Nope, we'll have to live without it..."
+		fi
+		;;
+	esac
+	case "$cpprun" in
+	"$wrapper")
+		cpprun=''
+		cpplast=''
+		;;
+	esac
+	;;
+esac
+
+case "$cppstdin" in
+"$wrapper"|'cppstdin') ;;
+*) $rm -f $wrapper;;
+esac
+$rm -f testcpp.c testcpp.out
+
+: Adjust cppfilter for path component separator
+case "$osname" in
+vos) cppfilter="tr '\\\\>' '/' |" ;; # path component separator is >
+os2) cppfilter="sed -e 's|\\\\\\\\|/|g' |" ;; # path component separator is \
+*)   cppfilter='' ;;
+esac
+
+: Use gcc to determine libpth and incpth
+# If using gcc or clang, we can get better values for libpth, incpth
+# and usrinc directly from the compiler.
+# Note that ccname for clang is also gcc.
+case "$ccname" in
+    gcc)
+	realpath=`which realpath 2>/dev/null | sed 's/no realpath in.*//'`
+	$echo 'extern int foo;' > try.c
+	set X `$cppstdin -v try.c 2>&1 | $awk '/^#include </,/^End of search /'|$cppfilter $grep '/include'`
+	shift
+	inclinpth=""
+	if $test $# -gt 0; then
+	    for i in $*; do
+		case $realpath in
+		    */realpath) i=`$realpath $i` ;;
+		esac
+		incpth="$incpth $i"
+		j="`$echo $i | $sed 's,/include[^/]*,/lib,'`"
+		if $test -d $j; then
+		    inclibpth="$inclibpth $j"
+		fi
+	    done
+	    incpth="`$echo $incpth | $sed 's/^ //'`"
+	    for xxx in $inclibpth $loclibpth $plibpth $glibpth; do
+		if $test -d $xxx; then
+		    case $realpath in
+			*/realpath) xxx=`$realpath $xxx` ;;
+		    esac
+		    case " $libpth " in
+		    *" $xxx "*) ;;
+		    *) libpth="$libpth $xxx";;
+		    esac
+		fi
+	    done
+	    libpth="`$echo $libpth | $sed 's/^ //'`"
+	fi
+	$rm -f try.c
+	case "$usrinc" in
+	'') for i in $incpth; do
+		if $test -f $i/errno.h -a -f $i/stdio.h -a -f $i/time.h; then
+		    usrinc="$i"
+		    break
+		fi
+	    done
+	    ;;
+	esac
+
+	case "$usecrosscompile" in
+	$define|true|[yY]*)
+	    case "$incpth" in
+		'') echo "Incpth not defined." >&4; croak=y ;;
+		*)  echo "Using incpth '$incpth'." >&4 ;;
+	    esac
+	    case "$libpth" in
+		'') echo "Libpth not defined." >&4; croak=y ;;
+		*)  echo "Using libpth '$libpth'." >&4 ;;
+	    esac
+	    case "$usrinc" in
+		'') echo "Usrinc not defined." >&4; croak=y ;;
+		*)  echo "Using usrinc $usrinc." >&4 ;;
+	    esac
+	    case "$croak" in
+		y)
+		if test "X$sysroot" = X; then
+		    echo "Cannot continue, aborting." >&4; exit 1
+		else
+		    echo "Cross-compiling using sysroot $sysroot, failing to guess inc/lib paths is not fatal" >&4
+		fi
+		;;
+	    esac
+	    ;;
+	esac
+    ;;
+esac
+
+: Default value for incpth is just usrinc
+case "$incpth" in
+'') incpth="$usrinc";;
+esac
+
+: Set private lib path
+case "$plibpth" in
+'') if ./mips; then
+	plibpth="$incpath/usr/lib $sysroot/usr/local/lib $sysroot/usr/ccs/lib"
+    fi;;
+esac
+case "$libpth" in
+' ') dlist='';;
+'') dlist="$loclibpth $plibpth $glibpth";;
+*) dlist="$libpth";;
+esac
+
+: Now check and see which directories actually exist, avoiding duplicates
+for xxx in $dlist
+do
+    if $test -d $xxx; then
+		case " $libpth " in
+		*" $xxx "*) ;;
+		*) libpth="$libpth $xxx";;
+		esac
+    fi
+done
+$cat <<'EOM'
+
+Some systems have incompatible or broken versions of libraries.  Among
+the directories listed in the question below, please remove any you
+know not to be holding relevant libraries, and add any that are needed.
+Say "none" for none.
+
+EOM
+
+if test "X$sysroot" != X; then
+    $cat <<EOM
+You have set sysroot to $sysroot, please supply the directories excluding sysroot
+
+EOM
+fi
+
+case "$libpth" in
+'') dflt='none';;
+*)
+	set X $libpth
+	shift
+	dflt=${1+"$@"}
+	;;
+esac
+rp="Directories to use for library searches?"
+. ./myread
+case "$ans" in
+none) libpth=' ';;
+*) libpth="$ans";;
+esac
+
+: compute shared library extension
+case "$so" in
+'')
+	if xxx=`./loc libc.sl X $libpth`; $test -f "$xxx"; then
+		dflt='sl'
+	else
+		dflt='so'
+	fi
+	;;
+*) dflt="$so";;
+esac
+$cat <<EOM
+
+On some systems, shared libraries may be available.  Answer 'none' if
+you want to suppress searching of shared libraries for the remainder
+of this configuration.
+
+EOM
+rp='What is the file extension used for shared libraries?'
+. ./myread
+so="$ans"
+
+: Does target system insist that shared library basenames are unique
+$cat << EOM
+
+Some dynamic loaders assume that the *basename* of shared library filenames
+are globally unique.  We'll default this to undef as we assume your system
+is not this weird. Set to defined if you're on one of them.
+
+EOM
+
+dflt='n'
+rp='Make shared library basenames unique?'
+. ./myread
+case "$ans" in
+y|Y) val="$define" ;;
+*)   val="$undef"  ;;
+esac
+set d_libname_unique
+eval $setvar
+
+: Define several unixisms.
+: Hints files or command line option can be used to override them.
+: The convoluted testing is in case hints files set either the old
+: or the new name.
+case "$_exe" in
+'')	case "$exe_ext" in
+	'')	;;
+	*)	_exe="$exe_ext" ;;
+	esac
+	;;
+esac
+case "$_a" in
+'')	case "$lib_ext" in
+    '')	_a='.a';;
+	*)	_a="$lib_ext" ;;
+	esac
+	;;
+esac
+case "$_o" in
+'') case "$obj_ext" in
+	'')	_o='.o';;
+	*)	_o="$obj_ext";;
+	esac
+	;;
+esac
+case "$p_" in
+'') case "$path_sep" in
+	'')	p_=':';;
+	*)	p_="$path_sep";;
+	esac
+	;;
+esac
+exe_ext=$_exe
+lib_ext=$_a
+obj_ext=$_o
+path_sep=$p_
+
+rm_try="$rm -f try try$_exe a.out .out try.[cho] try.$_o core core.try* try.core*"
+
+: Which makefile gets called first.  This is used by make depend.
+case "$firstmakefile" in
+'') firstmakefile='makefile';;
+esac
+
+: Check is we will use socks
+case "$usesocks" in
+$define|true|[yY]*)	dflt='y';;
+*) dflt='n';;
+esac
+cat <<EOM
+
+Perl can be built to use the SOCKS proxy protocol library.  To do so,
+Configure must be run with -Dusesocks.  If you use SOCKS you also need
+to use the PerlIO abstraction layer, this will be implicitly selected.
+
+If this doesn't make any sense to you, just accept the default '$dflt'.
+EOM
+rp='Build Perl for SOCKS?'
+. ./myread
+case "$ans" in
+y|Y)	val="$define" ;;
+*)      val="$undef" ;;
+esac
+set usesocks
+eval $setvar
+
+: Check for uselongdouble support
+case "$ccflags" in
+*-DUSE_LONG_DOUBLE*|*-DUSE_MORE_BITS*) uselongdouble="$define" ;;
+esac
+
+case "$uselongdouble" in
+$define|true|[yY]*)	dflt='y';;
+*) dflt='n';;
+esac
+cat <<EOM
+
+Perl can be built to take advantage of long doubles which
+(if available) may give more accuracy and range for floating point numbers.
+
+If this doesn't make any sense to you, just accept the default '$dflt'.
+EOM
+rp='Try to use long doubles if available?'
+. ./myread
+case "$ans" in
+y|Y)	val="$define"	;;
+*)      val="$undef"	;;
+esac
+set uselongdouble
+eval $setvar
+
+case "$uselongdouble" in
+true|[yY]*) uselongdouble="$define" ;;
+esac
+
+: Look for a hint-file generated 'call-back-unit'.  If the
+: user has specified that long doubles should be used,
+: we may need to set or change some other defaults.
+if $test -f uselongdouble.cbu; then
+    echo "Your platform has some specific hints regarding long doubles, using them..."
+    . ./uselongdouble.cbu
+else
+    case "$uselongdouble" in
+	$define)
+		$cat <<EOM
+(Your platform does not have any specific hints for long doubles.)
+EOM
+	;;
+    esac
+fi
+
+: Check if quadmath is requested
+case "$usequadmath" in
+"$define"|true|[yY]*) usequadmath="$define" ;;
+*)                    usequadmath="$undef"  ;;
+esac
+
+: Fail if both uselongdouble and usequadmath are requested
+case "$usequadmath:$uselongdouble" in
+define:define)
+	$cat <<EOM >&4
+
+*** You requested the use of the quadmath library and use
+*** of long doubles.
+***
+*** Please select one or the other.
+EOM
+	exit 1
+	;;
+esac
+
+: Looking for optional libraries
+echo " "
+echo "Checking for optional libraries..." >&4
+case "$libs" in
+' '|'') dflt='';;
+*) dflt="$libs";;
+esac
+case "$libswanted" in
+'') libswanted='c_s';;
+esac
+case "$usesocks" in
+"$define") libswanted="$libswanted socks5 socks5_sh" ;;
+esac
+case "$usecbacktrace" in
+"$define") libswanted="$libswanted bfd" ;;
+esac
+case "$usequadmath" in
+"$define") libswanted="$libswanted quadmath" ;;
+esac
+libsfound=''
+libsfiles=''
+libsdirs=''
+libspath=''
+for thisdir in $libpth $xlibpth; do
+  test -d $thisdir && libspath="$libspath $thisdir"
+done
+for thislib in $libswanted; do
+	for thisdir in $libspath; do
+	    xxx=''
+	    if $test ! -f "$xxx" -a "X$ignore_versioned_solibs" = "X"; then
+		xxx=`ls $thisdir/lib$thislib.$so.[0-9] 2>/dev/null|sed -n '$p'`
+	        $test -f "$xxx" && eval $libscheck
+		$test -f "$xxx" && libstyle=shared
+		xxx=`ls $thisdir/lib$thislib.[0-9].$so 2>/dev/null|sed -n '$p'`
+	        $test -f "$xxx" && eval $libscheck
+		$test -f "$xxx" && libstyle=shared
+	    fi
+	    if test ! -f "$xxx"; then
+		xxx=$thisdir/lib$thislib.$so
+	        $test -f "$xxx" && eval $libscheck
+		$test -f "$xxx" && libstyle=shared
+	    fi
+	    if test ! -f "$xxx"; then
+		xxx=$thisdir/lib$thislib$_a
+	        $test -f "$xxx" && eval $libscheck
+		$test -f "$xxx" && libstyle=static
+	    fi
+	    if test ! -f "$xxx"; then
+		xxx=$thisdir/$thislib$_a
+	        $test -f "$xxx" && eval $libscheck
+		$test -f "$xxx" && libstyle=static
+	    fi
+	    if test ! -f "$xxx"; then
+		xxx=$thisdir/lib${thislib}_s$_a
+	        $test -f "$xxx" && eval $libscheck
+		$test -f "$xxx" && libstyle=static
+		$test -f "$xxx" && thislib=${thislib}_s
+	    fi
+	    if test ! -f "$xxx"; then
+		xxx=$thisdir/Slib$thislib$_a
+	        $test -f "$xxx" && eval $libscheck
+		$test -f "$xxx" && libstyle=static
+	    fi
+	    if $test -f "$xxx"; then
+		case "$libstyle" in
+		shared) echo "Found -l$thislib (shared)." ;;
+		static) echo "Found -l$thislib." ;;
+		*)      echo "Found -l$thislib ($libstyle)." ;;
+		esac
+		case " $dflt " in
+		*"-l$thislib "*);;
+		*) dflt="$dflt -l$thislib"
+                   libsfound="$libsfound $xxx"
+                   yyy=`basename $xxx`
+                   libsfiles="$libsfiles $yyy"
+                   yyy=`echo $xxx|$sed -e "s%/$yyy\\$%%"`
+                   case " $libsdirs " in
+                   *" $yyy "*) ;;
+                   *) libsdirs="$libsdirs $yyy" ;;
+                   esac
+		   ;;
+		esac
+		break
+	    fi
+	done
+	if $test ! -f "$xxx"; then
+	    echo "No -l$thislib."
+	fi
+done
+set X $dflt
+shift
+dflt="$*"
+case "$libs" in
+'') dflt="$dflt";;
+*) dflt="$libs";;
+esac
+case "$dflt" in
+' '|'') dflt='none';;
+esac
+
+$cat <<EOM
+
+In order to compile $package on your machine, a number of libraries
+are usually needed.  Include any other special libraries here as well.
+Say "none" for none.  The default list is almost always right.
+EOM
+
+echo " "
+rp="What libraries to use?"
+. ./myread
+case "$ans" in
+none) libs=' ';;
+*) libs="$ans";;
+esac
+
+: determine optimization, if desired, or use for debug flag also
+case "$optimize" in
+' '|$undef) dflt='none';;
+'') dflt='-O';;
+*) dflt="$optimize";;
+esac
+$cat <<EOH
+
+By default, $package compiles with the -O flag to use the optimizer.
+Alternately, you might want to use the symbolic debugger, which uses
+the -g flag (on traditional Unix systems).  Either flag can be
+specified here.  To use neither flag, specify the word "none".
+
+EOH
+rp="What optimizer/debugger flag should be used?"
+. ./myread
+optimize="$ans"
+case "$optimize" in
+'none') optimize=" ";;
+esac
+
+: Check what DEBUGGING is required from the command line
+: -DEBUGGING      or -DDEBUGGING or
+: -DEBUGGING=both			= -g + -DDEBUGGING
+: -DEBUGGING=-g   or -Doptimize=-g	= -g
+: -DEBUGGING=none or -UDEBUGGING	=
+: -DEBUGGING=old  or -DEBUGGING=default	= ? $optimize
+case "$EBUGGING" in
+'')	;;
+*)	DEBUGGING=$EBUGGING ;;
+esac
+
+case "$DEBUGGING" in
+-g|both|$define)
+    case "$optimize" in
+	*-g*) ;;
+	*)    optimize="$optimize -g" ;;
+    esac ;;
+none|$undef)
+    case "$optimize" in
+	*-g*)	set `echo "X $optimize " | sed 's/ -g / /'`
+		shift
+		optimize="$*"
+		;;
+    esac ;;
+esac
+
+dflt=''
+case "$DEBUGGING" in
+both|$define) dflt='-DDEBUGGING'
+esac
+
+: argument order is deliberate, as the flag will start with - which set could
+: think is an option
+checkccflag='check=$1; flag=$2; callback=$3;
+echo " ";
+echo "Checking if your compiler accepts $flag" 2>&1;
+[ "X$sysroot" != "X" ] && echo "For sysroot = $sysroot";
+echo "int main(void) { return 0; }" > gcctest.c;
+if $cc $_sysroot -O2 $flag -o gcctest gcctest.c 2>gcctest.out && $run ./gcctest; then
+    echo "Yes, it does." 2>&1;
+    if $test -s gcctest.out ; then
+        echo "But your platform does not like it:";
+        cat gcctest.out;
+    else
+	case "$ccflags" in
+	*$check*)
+	    echo "Leaving current flags $ccflags alone." 2>&1
+	    ;;
+	*) dflt="$dflt $flag";
+	    eval $callback
+	    ;;
+	esac
+    fi
+else
+    echo "Nope, it does not, but that is ok." 2>&1;
+fi
+'
+
+: We will not override a previous value, but we might want to
+: augment a hint file
+case "$hint" in
+default|recommended)
+	case "$gccversion" in
+	1.*) dflt="$dflt -fpcc-struct-return" ;;
+	esac
+	case "$optimize:$DEBUGGING" in
+	*-g*:old) dflt="$dflt -DDEBUGGING";;
+	esac
+	case "$gccversion" in
+	2.*) if $test -d /etc/conf/kconfig.d &&
+			$contains _POSIX_VERSION $usrinc/sys/unistd.h >/dev/null 2>&1
+		then
+			# Interactive Systems (ISC) POSIX mode.
+			dflt="$dflt -posix"
+		fi
+		;;
+	esac
+	case "$gccversion" in
+	1.*) ;;
+	2.[0-8]*) ;;
+	?*)	set strict-aliasing -fno-strict-aliasing
+		eval $checkccflag
+		;;
+	esac
+	# For gcc, adding -pipe speeds up compilations for some, but apparently
+	# some assemblers can't read from stdin.  (It also slows down compilations
+	# in other cases, but those are apparently rarer these days.)  AD 5/2004.
+	case "$gccversion" in
+	?*)	set pipe -pipe
+		eval $checkccflag
+		;;
+	esac
+
+	# on x86_64 (at least) we require an extra library (libssp) in the
+	# link command line. This library is not named, so I infer that it is
+	# an implementation detail that may change. Hence the safest approach
+	# is to add the flag to the flags passed to the compiler at link time,
+	# as that way the compiler can do the right implementation dependant
+	# thing. (NWC)
+	case "$ccflags" in
+	*-fno-stack-protector*)
+	    echo "Do not add -fstack-protector nor -fstack-protector-strong" 2>&1
+	    ;;
+	*) case "$gccversion" in
+	   ?*)	set stack-protector-strong -fstack-protector-strong
+		eval $checkccflag
+		case "$dflt" in
+		*-fstack-protector-strong*) ;; # It got added.
+		*) # Try the plain/older -fstack-protector.
+		   set stack-protector -fstack-protector
+		   eval $checkccflag
+		   ;;
+		esac
+		;;
+	    esac
+	    ;;
+	esac
+esac
+
+case "$mips_type" in
+*BSD*|'') inclwanted="$locincpth $usrinc";;
+*) inclwanted="$locincpth $inclwanted $usrinc/bsd";;
+esac
+for thisincl in $inclwanted; do
+	if $test -d $thisincl; then
+		if $test x$thisincl != x$usrinc; then
+			case "$dflt" in
+			*" -I$thisincl "*);;
+			*) dflt="$dflt -I$thisincl ";;
+			esac
+		fi
+	fi
+done
+
+inctest='if $contains $2 $usrinc/$1 >/dev/null 2>&1; then
+	xxx=true;
+elif $contains $2 $usrinc/sys/$1 >/dev/null 2>&1; then
+	xxx=true;
+else
+	xxx=false;
+fi;
+if $xxx; then
+	case "$dflt" in
+	*$2*);;
+	*) dflt="$dflt -D$2";;
+	esac;
+fi'
+
+set signal.h LANGUAGE_C; eval $inctest
+
+case "$usesocks" in
+$define)
+	ccflags="$ccflags -DSOCKS"
+	;;
+esac
+
+case "$hint" in
+default|recommended) dflt="$ccflags $dflt" ;;
+*) dflt="$ccflags";;
+esac
+
+case "$dflt" in
+''|' ') dflt=none;;
+esac
+
+$cat <<EOH
+
+Your C compiler may want other flags.  For this question you should include
+-I/whatever and -DWHATEVER flags and any other flags used by the C compiler,
+but you should NOT include libraries or ld flags like -lwhatever.  If you
+want $package to honor its debug switch, you should include -DDEBUGGING here.
+Your C compiler might also need additional flags, such as -D_POSIX_SOURCE.
+
+To use no flags, specify the word "none".
+
+EOH
+set X $dflt
+shift
+dflt=${1+"$@"}
+rp="Any additional cc flags?"
+. ./myread
+case "$ans" in
+none) ccflags='';;
+*) ccflags="$ans";;
+esac
+
+: the following weeds options from ccflags that are of no interest to cpp
+case "$cppflags" in
+'') cppflags="$ccflags" ;;
+*)  set X $ccflags; shift
+    case " $cppflags " in
+    *" $1 "*) ;;  # Try to avoid doubling the cppflags.
+    *) cppflags="$cppflags $ccflags" ;;
+    esac
+    ;;
+esac
+case "$gccversion" in
+1.*) cppflags="$cppflags -D__GNUC__"
+esac
+case "$mips_type" in
+'');;
+*BSD*) cppflags="$cppflags -DSYSTYPE_BSD43";;
+esac
+case "$cppflags" in
+'');;
+*)
+	echo " "
+	echo "Let me guess what the preprocessor flags are..." >&4
+	set X $cppflags
+	shift
+	cppflags=''
+	$cat >cpp.c <<'EOM'
+#define BLURFL foo
+
+BLURFL xx LFRULB
+EOM
+	previous=''
+	for flag in $*
+	do
+		case "$flag" in
+		-*) ftry="$flag";;
+		*) ftry="$previous $flag";;
+		esac
+		if $cppstdin -DLFRULB=bar $cppflags $ftry $cppminus <cpp.c \
+			>cpp1.out 2>/dev/null && \
+			$cpprun -DLFRULB=bar $cppflags $ftry $cpplast <cpp.c \
+			>cpp2.out 2>/dev/null && \
+			$contains 'foo.*xx.*bar' cpp1.out >/dev/null 2>&1 && \
+			$contains 'foo.*xx.*bar' cpp2.out >/dev/null 2>&1
+		then
+			cppflags="$cppflags $ftry"
+			previous=''
+		else
+			previous="$flag"
+		fi
+	done
+	set X $cppflags
+	shift
+	cppflags=${1+"$@"}
+	case "$cppflags" in
+	*-*)  echo "They appear to be: $cppflags";;
+	esac
+	$rm -f cpp.c cpp?.out
+	;;
+esac
+
+: flags used in final linking phase
+case "$ldflags" in
+'') if ./venix; then
+		dflt='-i -z'
+	else
+		dflt=''
+	fi
+	case "$ccflags" in
+	*-posix*) dflt="$dflt -posix" ;;
+	esac
+	;;
+*) dflt="$ldflags";;
+esac
+# See note above about -fstack-protector
+case "$ccflags" in
+*-fstack-protector-strong*)
+	case "$dflt" in
+	*-fstack-protector-strong*) ;; # Don't add it again
+	*) dflt="$dflt -fstack-protector-strong" ;;
+	esac
+	;;
+*-fstack-protector*)
+	case "$dflt" in
+	*-fstack-protector*) ;; # Don't add it again
+	*) dflt="$dflt -fstack-protector" ;;
+	esac
+	;;
+esac
+
+: Try to guess additional flags to pick up local libraries.
+for thislibdir in $libpth; do
+	case " $loclibpth " in
+	*" $thislibdir "*)
+		case "$dflt " in
+		*"-L$thislibdir "*) ;;
+		*)  dflt="$dflt -L$thislibdir" ;;
+		esac
+		;;
+	esac
+done
+
+case "$dflt" in
+'') dflt='none' ;;
+esac
+
+$cat <<EOH
+
+Your C linker may need flags.  For this question you should
+include -L/whatever and any other flags used by the C linker, but you
+should NOT include libraries like -lwhatever.
+
+Make sure you include the appropriate -L/path flags if your C linker
+does not normally search all of the directories you specified above,
+namely
+	$libpth
+To use no flags, specify the word "none".
+
+EOH
+
+rp="Any additional ld flags (NOT including libraries)?"
+. ./myread
+case "$ans" in
+none) ldflags='';;
+*) ldflags="$ans";;
+esac
+rmlist="$rmlist pdp11"
+
+: coherency check
+echo " "
+echo "Checking your choice of C compiler and flags for coherency..." >&4
+$cat > try.c <<'EOF'
+#include <stdio.h>
+int main() { printf("Ok\n"); return(0); }
+EOF
+set X $cc -o try $optimize $ccflags $ldflags try.c $libs
+shift
+$cat >try.msg <<'EOM'
+I've tried to compile and run the following simple program:
+
+EOM
+$cat try.c >> try.msg
+
+$cat >> try.msg <<EOM
+
+I used the command:
+
+	$*
+	$run ./try
+
+and I got the following output:
+
+EOM
+dflt=y
+if $sh -c "$cc -o try $optimize $ccflags $ldflags try.c $libs" >>try.msg 2>&1; then
+	if $sh -c "$run ./try " >>try.msg 2>&1; then
+		xxx=`$run ./try`
+		case "$xxx" in
+		"Ok") dflt=n ;;
+		*)    echo 'The program compiled OK, but produced no output.' >> try.msg ;;
+		esac
+	else
+		echo "The program compiled OK, but exited with status $?." >>try.msg
+		rp="You have a problem.  Shall I abort Configure"
+		dflt=y
+	fi
+else
+	echo "I can't compile the test program." >>try.msg
+	rp="You have a BIG problem.  Shall I abort Configure"
+	dflt=y
+fi
+case "$dflt" in
+y)
+	$cat try.msg >&4
+	case "$knowitall" in
+	'')
+		echo "(The supplied flags or libraries might be incorrect.)"
+		;;
+	*) dflt=n;;
+	esac
+	echo " "
+	. ./myread
+	case "$ans" in
+	n*|N*) ;;
+	*)	echo "Ok.  Stopping Configure." >&4
+		exit 1
+		;;
+	esac
+	;;
+n) echo "OK, that should do.";;
+esac
+$rm_try gcctest gcctest.out
+
+: define a shorthand compile call
+compile='
+mc_file=$1;
+shift;
+case "$usedevel" in $define|true|[yY]*) if $test ! -f "${mc_file}.c"; then
+echo "Internal Configure script bug - compiler test file ${mc_file}.c is missing. Please report this to https://github.com/Perl/perl5/issues" >&4;
+exit 1;
+fi;
+esac;
+$cc -o ${mc_file} $optimize $ccflags $ldflags $* ${mc_file}.c $libs > /dev/null 2>&1;'
+: define a shorthand compile call for compilations that should be ok.
+compile_ok='
+mc_file=$1;
+shift;
+$cc -o ${mc_file} $optimize $ccflags $ldflags $* ${mc_file}.c $libs > /dev/null 2>&1;'
+
+: stub, used only to satisfy other units
+i_stdlib='define'
+
+: check for lengths of integral types
+echo " "
+case "$intsize" in
+'')
+	echo "Checking to see how big your integers are..." >&4
+	$cat >try.c <<EOCP
+#include <stdio.h>
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+int main()
+{
+	printf("intsize=%d;\n", (int)sizeof(int));
+	printf("longsize=%d;\n", (int)sizeof(long));
+	printf("shortsize=%d;\n", (int)sizeof(short));
+	exit(0);
+}
+EOCP
+	set try
+	if eval $compile_ok && $run ./try > /dev/null; then
+		eval `$run ./try`
+		echo "Your integers are $intsize bytes long."
+		echo "Your long integers are $longsize bytes long."
+		echo "Your short integers are $shortsize bytes long."
+	else
+		$cat >&4 <<EOM
+!
+Help! I can't compile and run the intsize test program: please enlighten me!
+(This is probably a misconfiguration in your system or libraries, and
+you really ought to fix it.  Still, I'll try anyway.)
+!
+EOM
+		dflt=4
+		rp="What is the size of an integer (in bytes)?"
+		. ./myread
+		intsize="$ans"
+		dflt=$intsize
+		rp="What is the size of a long integer (in bytes)?"
+		. ./myread
+		longsize="$ans"
+		dflt=2
+		rp="What is the size of a short integer (in bytes)?"
+		. ./myread
+		shortsize="$ans"
+	fi
+	;;
+esac
+$rm_try
+
+: check for long long
+echo " "
+echo "Checking to see if you have long long..." >&4
+echo 'int main() { long long x = 7; return 0; }' > try.c
+set try
+if eval $compile; then
+	val="$define"
+	echo "You have long long."
+else
+	val="$undef"
+	echo "You do not have long long."
+fi
+$rm_try
+set d_longlong
+eval $setvar
+
+: check for length of long long
+case "${d_longlong}${longlongsize}" in
+$define)
+	echo " "
+	echo "Checking to see how big your long longs are..." >&4
+	$cat >try.c <<'EOCP'
+#include <stdio.h>
+int main()
+{
+    printf("%d\n", (int)sizeof(long long));
+    return(0);
+}
+EOCP
+	set try
+	if eval $compile_ok; then
+		longlongsize=`$run ./try`
+		echo "Your long longs are $longlongsize bytes long."
+	else
+		dflt='8'
+		echo " "
+		echo "(I can't seem to compile the test program.  Guessing...)"
+		rp="What is the size of a long long (in bytes)?"
+		. ./myread
+		longlongsize="$ans"
+	fi
+	if $test "X$longsize" = "X$longlongsize"; then
+		echo "(That isn't any different from an ordinary long.)"
+	fi
+	;;
+esac
+$rm_try
+
+: determine filename position in cpp output
+echo " "
+echo "Computing filename position in cpp output for #include directives..." >&4
+case "$osname" in
+amigaos) fieldn=3 ;;  # Workaround for a bug in abc (pdksh).
+esac
+case "$fieldn" in
+'')
+case "$osname" in
+vos) testaccess=-e ;;
+*)   testaccess=-r ;;
+esac
+echo '#include <stdio.h>' > foo.c
+$cat >fieldn <<EOF
+$startsh
+$cppstdin $cppflags $cppminus <foo.c 2>/dev/null | \
+$grep '^[ 	]*#.*stdio\.h' | \
+while read cline; do
+	pos=1
+	set \$cline
+	while $test \$# -gt 0; do
+		if $test $testaccess \`echo \$1 | $tr -d '"'\`; then
+			echo "\$pos"
+			exit 0
+		fi
+		shift
+		pos=\`expr \$pos + 1\`
+	done
+done
+EOF
+chmod +x fieldn
+fieldn=`./fieldn`
+$rm -f foo.c fieldn
+;;
+esac
+case $fieldn in
+'') pos='???';;
+1) pos=first;;
+2) pos=second;;
+3) pos=third;;
+*) pos="${fieldn}th";;
+esac
+echo "Your cpp writes the filename in the $pos field of the line."
+
+: locate header file
+$cat >findhdr <<EOF
+$startsh
+wanted=\$1
+name=''
+for usrincdir in $incpth
+do
+	if test -f \$usrincdir/\$wanted; then
+		echo "\$usrincdir/\$wanted"
+		exit 0
+	fi
+done
+awkprg='{ print \$$fieldn }'
+echo "#include <\$wanted>" > foo\$\$.c
+$cppstdin $cppminus $cppflags < foo\$\$.c 2>/dev/null | \
+$cppfilter $grep "^[ 	]*#.*\$wanted" | \
+while read cline; do
+	name=\`echo \$cline | $awk "\$awkprg" | $tr -d '"'\`
+	case "\$name" in
+	*[/\\\\]\$wanted) echo "\$name"; exit 1;;
+	*[\\\\/]\$wanted) echo "\$name"; exit 1;;
+	*) exit 2;;
+	esac;
+done;
+#
+# status = 0: grep returned 0 lines, case statement not executed
+# status = 1: headerfile found
+# status = 2: while loop executed, no headerfile found
+#
+status=\$?
+$rm -f foo\$\$.c;
+if test \$status -eq 1; then
+	exit 0;
+fi
+exit 1
+EOF
+chmod +x findhdr
+
+: define an alternate in-header-list? function
+inhdr='echo " "; td=$define; tu=$undef; yyy=$@;
+cont=true; xxf="echo \"<\$1> found.\" >&4";
+case $# in 2) xxnf="echo \"<\$1> NOT found.\" >&4";;
+*) xxnf="echo \"<\$1> NOT found, ...\" >&4";;
+esac;
+case $# in 4) instead=instead;; *) instead="at last";; esac;
+while $test "$cont"; do
+	xxx=`./findhdr $1`
+	var=$2; eval "was=\$$2";
+	if $test "$xxx" && $test -r "$xxx";
+	then eval $xxf;
+	eval "case \"\$$var\" in $undef) . ./whoa; esac"; eval "$var=\$td";
+		cont="";
+	else eval $xxnf;
+	eval "case \"\$$var\" in $define) . ./whoa; esac"; eval "$var=\$tu"; fi;
+	set $yyy; shift; shift; yyy=$@;
+	case $# in 0) cont="";;
+	2) xxf="echo \"but I found <\$1> $instead.\" >&4";
+		xxnf="echo \"and I did not find <\$1> either.\" >&4";;
+	*) xxf="echo \"but I found <\$1\> instead.\" >&4";
+		xxnf="echo \"there is no <\$1>, ...\" >&4";;
+	esac;
+done;
+while $test "$yyy";
+do set $yyy; var=$2; eval "was=\$$2";
+	eval "case \"\$$var\" in $define) . ./whoa; esac"; eval "$var=\$tu";
+	set $yyy; shift; shift; yyy=$@;
+done'
+
+: see if inttypes.h is available
+: we want a real compile instead of Inhdr because some systems
+: have an inttypes.h which includes non-existent headers
+echo " "
+$cat >try.c <<EOCP
+#include <inttypes.h>
+int main() {
+	static int32_t foo32 = 0x12345678;
+}
+EOCP
+set try
+if eval $compile; then
+	echo "<inttypes.h> found." >&4
+	val="$define"
+else
+	echo "<inttypes.h> NOT found." >&4
+	val="$undef"
+fi
+$rm_try
+set i_inttypes
+eval $setvar
+
+: check for int64_t
+echo " "
+echo "Checking to see if you have int64_t..." >&4
+$cat >try.c <<EOCP
+#include <sys/types.h>
+#$i_inttypes I_INTTYPES
+#ifdef I_INTTYPES
+#include <inttypes.h>
+#endif
+int main() { int64_t x = 7; }
+EOCP
+set try
+if eval $compile; then
+	val="$define"
+	echo "You have int64_t."
+else
+	val="$undef"
+	echo "You do not have int64_t."
+fi
+$rm_try
+set d_int64_t
+eval $setvar
+
+: Check if 64bit ints have a quad type
+echo " "
+echo "Checking which 64-bit integer type we could use..." >&4
+
+case "$intsize" in
+8) val=int
+   set quadtype
+   eval $setvar
+   val='"unsigned int"'
+   set uquadtype
+   eval $setvar
+   quadkind=1
+   ;;
+*) case "$longsize" in
+   8) val=long
+      set quadtype
+      eval $setvar
+      val='"unsigned long"'
+      set uquadtype
+      eval $setvar
+      quadkind=2
+      ;;
+   *) case "$d_longlong:$longlongsize" in
+      define:8)
+        val='"long long"'
+        set quadtype
+        eval $setvar
+        val='"unsigned long long"'
+        set uquadtype
+        eval $setvar
+        quadkind=3
+        ;;
+      *) case "$d_int64_t" in
+         define)
+           val=int64_t
+           set quadtype
+           eval $setvar
+           val=uint64_t
+           set uquadtype
+           eval $setvar
+           quadkind=4
+           ;;
+         esac
+         ;;
+      esac
+      ;;
+   esac
+   ;;
+esac
+
+case "$quadtype" in
+'')	echo "Alas, no 64-bit integer types in sight." >&4
+	d_quad="$undef"
+	;;
+*)	echo "We could use '$quadtype' for 64-bit integers." >&4
+	d_quad="$define"
+	;;
+esac
+
+: Do we want 64bit support
+case "$uselonglong" in
+"$define"|true|[yY]*)
+	cat <<EOM >&4
+
+*** Configure -Duselonglong is deprecated, using -Duse64bitint instead.
+EOM
+	use64bitint="$define"
+	;;
+esac
+case "$use64bits" in
+"$define"|true|[yY]*)
+	cat <<EOM >&4
+
+*** Configure -Duse64bits is deprecated, using -Duse64bitint instead.
+EOM
+	use64bitint="$define"
+	;;
+esac
+case "$use64bitints" in
+"$define"|true|[yY]*)
+	cat <<EOM >&4
+
+*** There is no Configure -Duse64bitints, using -Duse64bitint instead.
+EOM
+	use64bitint="$define"
+	;;
+esac
+case "$use64bitsint" in
+"$define"|true|[yY]*)
+	cat <<EOM >&4
+
+*** There is no Configure -Duse64bitsint, using -Duse64bitint instead.
+EOM
+	use64bitint="$define"
+	;;
+esac
+case "$uselonglongs" in
+"$define"|true|[yY]*)
+	cat <<EOM >&4
+
+*** There is no Configure -Duselonglongs, using -Duse64bitint instead.
+EOM
+	use64bitint="$define"
+	;;
+esac
+case "$use64bitsall" in
+"$define"|true|[yY]*)
+	cat <<EOM >&4
+
+*** There is no Configure -Duse64bitsall, using -Duse64bitall instead.
+EOM
+	use64bitall="$define"
+	;;
+esac
+
+case "$ccflags" in
+*-DUSE_LONG_LONG*|*-DUSE_64_BIT_INT*|*-DUSE_64_BIT_ALL*) use64bitint="$define";;
+esac
+case "$use64bitall" in
+"$define"|true|[yY]*) use64bitint="$define" ;;
+esac
+
+case "$longsize" in
+8) cat <<EOM
+
+You have natively 64-bit long integers.
+EOM
+   val="$define"
+   ;;
+*) case "$use64bitint" in
+   "$define"|true|[yY]*) dflt='y';;
+   *) dflt='n';;
+   esac
+   case "$d_quad" in
+   "$define") ;;
+   *) dflt='n' ;;
+   esac
+   cat <<EOM
+
+Perl can be built to take advantage of 64-bit integer types
+on some systems.  To do so, Configure can be run with -Duse64bitint.
+Choosing this option will most probably introduce binary incompatibilities.
+
+If this doesn't make any sense to you, just accept the default '$dflt'.
+(The default has been chosen based on your configuration.)
+EOM
+   rp='Try to use 64-bit integers, if available?'
+   . ./myread
+   case "$ans" in
+   [yY]*) val="$define" ;;
+   *)     val="$undef"  ;;
+   esac
+   ;;
+esac
+set use64bitint
+eval $setvar
+
+case "$use64bitall" in
+"$define"|true|[yY]*) dflt='y' ;;
+*) case "$longsize" in
+   8) dflt='y' ;;
+   *) dflt='n' ;;
+   esac
+   ;;
+esac
+cat <<EOM
+
+You may also choose to try maximal 64-bitness.  It means using as much
+64-bitness as possible on the platform.  This in turn means even more
+binary incompatibilities.  On the other hand, your platform may not
+have any more 64-bitness available than what you already have chosen.
+
+If this doesn't make any sense to you, just accept the default '$dflt'.
+(The default has been chosen based on your configuration.)
+EOM
+rp='Try to use maximal 64-bit support, if available?'
+. ./myread
+case "$ans" in
+[yY]*) val="$define" ;;
+*)     val="$undef"  ;;
+esac
+set use64bitall
+eval $setvar
+case "$use64bitall" in
+"$define")
+	case "$use64bitint" in
+	"$undef")
+		cat <<EOM
+
+Since you have chosen a maximally 64-bit build, I'm also turning on
+the use of 64-bit integers.
+EOM
+		use64bitint="$define" ;;
+	esac
+	;;
+esac
+
+: Look for a hint-file generated 'call-back-unit'.  If the
+: user has specified that a 64-bit perl is to be built,
+: we may need to set or change some other defaults.
+if $test -f use64bitint.cbu; then
+	echo "Your platform has some specific hints regarding 64-bit integers, using them..."
+	. ./use64bitint.cbu
+fi
+case "$use64bitint" in
+"$define"|true|[yY]*)
+	: This test was common to all the OpenBSD forks, and seems harmless for
+	: other platforms:
+	echo " "
+	echo "Checking if your C library has broken 64-bit functions..." >&4
+	cat >try.c <<EOCP
+#include <stdio.h>
+typedef $uquadtype myULL;
+int main (void)
+{
+    struct {
+	double d;
+	myULL  u;
+    } *p, test[] = {
+	{4294967303.15, 4294967303ULL},
+	{4294967294.2,  4294967294ULL},
+	{4294967295.7,  4294967295ULL},
+	{0.0, 0ULL}
+    };
+    for (p = test; p->u; p++) {
+	myULL x = (myULL)p->d;
+	if (x != p->u) {
+	    printf("buggy\n");
+	    return 0;
+	}
+    }
+    printf("ok\n");
+    return 0;
+}
+EOCP
+	set try
+	if eval $compile_ok; then
+	    libcquad=`$run ./try`
+	    echo "Your C library's 64-bit functions are $libcquad."
+	else
+	    echo "(I can't seem to compile the test program.)"
+	    echo "Assuming that your C library's 64-bit functions are ok."
+	    libcquad="ok"
+	fi
+	$rm_try
+
+	case "$libcquad" in
+	    buggy*)
+		cat >&4 <<EOM
+
+*** You have a C library with broken 64-bit functions.
+*** 64-bit support does not work reliably in this configuration.
+*** Please rerun Configure without -Duse64bitint and/or -Dusemorebits.
+*** Cannot continue, aborting.
+
+EOM
+		exit 1
+		;;
+	esac
+	case "$longsize" in
+	4) case "$archname64" in
+	   '') archname64=64int ;;
+	   esac
+	   ;;
+	esac
+	;;
+esac
+
+: Look for a hint-file generated 'call-back-unit'.  If the
+: user has specified that a maximally 64-bit perl is to be built,
+: we may need to set or change some other defaults.
+if $test -f use64bitall.cbu; then
+	echo "Your platform has some specific hints regarding 64-bit builds, using them..."
+	. ./use64bitall.cbu
+fi
+case "$use64bitall" in
+"$define"|true|[yY]*)
+	case "$longsize" in
+	4) case "$archname64" in
+	   ''|64int) archname64=64all ;;
+	   esac
+	   ;;
+	esac
+	;;
+esac
+
+case "$d_quad:$use64bitint" in
+$undef:$define)
+	cat >&4 <<EOF
+
+*** You have chosen to use 64-bit integers,
+*** but none can be found.
+*** Please rerun Configure without -Duse64bitint and/or -Dusemorebits.
+*** Cannot continue, aborting.
+
+EOF
+	exit 1
+	;;
+esac
+
+: Check if we are using the GNU C library
+echo " "
+echo "Checking for GNU C Library..." >&4
+cat >try.c <<'EOCP'
+/* Find out version of GNU C library.  __GLIBC__ and __GLIBC_MINOR__
+   alone are insufficient to distinguish different versions, such as
+   2.0.6 and 2.0.7.  The function gnu_get_libc_version() appeared in
+   libc version 2.1.0.      A. Dougherty,  June 3, 2002.
+*/
+#include <stdio.h>
+int main(void)
+{
+#ifdef __GLIBC__
+#   ifdef __GLIBC_MINOR__
+#       if __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1 && !defined(__cplusplus)
+#           include <gnu/libc-version.h>
+	    printf("%s\n",  gnu_get_libc_version());
+#       else
+	    printf("%d.%d\n",  __GLIBC__, __GLIBC_MINOR__);
+#       endif
+#   else
+	printf("%d\n",  __GLIBC__);
+#   endif
+    return 0;
+#else
+    return 1;
+#endif
+}
+EOCP
+set try
+if eval $compile_ok && $run ./try > glibc.ver; then
+	val="$define"
+	gnulibc_version=`$cat glibc.ver`
+	echo "You are using the GNU C Library version $gnulibc_version"
+else
+	val="$undef"
+	gnulibc_version=''
+	echo "You are not using the GNU C Library"
+fi
+$rm_try glibc.ver
+set d_gnulibc
+eval $setvar
+
+: see if nm is to be used to determine whether a symbol is defined or not
+case "$usenm" in
+'')
+	dflt=''
+	case "$d_gnulibc" in
+	"$define")
+		echo " "
+		echo "nm probably won't work on the GNU C Library." >&4
+		dflt=n
+		;;
+	esac
+	case "$dflt" in
+	'')
+		if $test "$osname" = aix -a "X$PASE" != "Xdefine" -a ! -f /lib/syscalls.exp; then
+			echo " "
+			echo "Whoops!  This is an AIX system without /lib/syscalls.exp!" >&4
+			echo "'nm' won't be sufficient on this system." >&4
+			dflt=n
+		fi
+		;;
+	esac
+	case "$dflt" in
+	'') dflt=`$egrep 'inlibc|csym' $rsrc/Configure | wc -l 2>/dev/null`
+		if $test $dflt -gt 20; then
+			dflt=y
+		else
+			dflt=n
+		fi
+		;;
+	esac
+	;;
+*)
+	case "$usenm" in
+	true|$define) dflt=y;;
+	*) dflt=n;;
+	esac
+	;;
+esac
+$cat <<EOM
+
+I can use $nm to extract the symbols from your C libraries. This
+is a time consuming task which may generate huge output on the disk (up
+to 3 megabytes) but that should make the symbols extraction faster. The
+alternative is to skip the 'nm' extraction part and to compile a small
+test program instead to determine whether each symbol is present. If
+you have a fast C compiler and/or if your 'nm' output cannot be parsed,
+this may be the best solution.
+
+You probably shouldn't let me use 'nm' if you are using the GNU C Library.
+
+EOM
+rp="Shall I use $nm to extract C symbols from the libraries?"
+. ./myread
+case "$ans" in
+[Nn]*) usenm=false;;
+*) usenm=true;;
+esac
+
+runnm=$usenm
+case "$reuseval" in
+true) runnm=false;;
+esac
+
+: nm options which may be necessary
+case "$nm_opt" in
+'') if $test -f /mach_boot; then
+		nm_opt=''	# Mach
+	elif $test -d /usr/ccs/lib; then
+		nm_opt='-p'	# Solaris (and SunOS?)
+	elif $test -f /dgux; then
+		nm_opt='-p'	# DG-UX
+	elif $test -f /lib64/rld; then
+		nm_opt='-p'	# 64-bit Irix
+	else
+		nm_opt=''
+	fi;;
+esac
+
+: nm options which may be necessary for shared libraries but illegal
+: for archive libraries.  Thank you, Linux.
+case "$nm_so_opt" in
+'')	case "$myuname" in
+	*linux*|gnu*)
+		if $nm --help | $grep 'dynamic' > /dev/null 2>&1; then
+			nm_so_opt='--dynamic'
+		fi
+		;;
+	esac
+	;;
+esac
+
+: Figure out where the libc is located
+case "$runnm" in
+true)
+: get list of predefined functions in a handy place
+echo " "
+case "$libc" in
+'') libc=unknown
+	case "$libs" in
+	*-lc_s*) libc=`./loc libc_s$_a $libc $libpth`
+	esac
+	;;
+esac
+case "$libs" in
+'') ;;
+*)  for thislib in $libs; do
+	case "$thislib" in
+	-lc|-lc_s)
+		: Handle C library specially below.
+		;;
+	-l*)
+		thislib=`echo $thislib | $sed -e 's/^-l//'`
+		if try=`./loc lib$thislib.$so.'*' X $libpth`; $test -f "$try"; then
+			:
+		elif try=`./loc lib$thislib.$so X $libpth`; $test -f "$try"; then
+			:
+		elif try=`./loc lib$thislib$_a X $libpth`; $test -f "$try"; then
+			:
+		elif try=`./loc $thislib$_a X $libpth`; $test -f "$try"; then
+			:
+		elif try=`./loc lib$thislib X $libpth`; $test -f "$try"; then
+			:
+		elif try=`./loc $thislib X $libpth`; $test -f "$try"; then
+			:
+		elif try=`./loc Slib$thislib$_a X $xlibpth`; $test -f "$try"; then
+			:
+		else
+			try=''
+		fi
+		libnames="$libnames $try"
+		;;
+	*) libnames="$libnames $thislib" ;;
+	esac
+	done
+	;;
+esac
+xxx=normal
+case "$libc" in
+unknown)
+	set /lib/libc.$so
+	for xxx in $libpth; do
+		$test -r $1 || set $xxx/libc.$so
+		: The messy sed command sorts on library version numbers.
+		$test -r $1 || \
+			set `echo blurfl; echo $xxx/libc.$so.[0-9]* | \
+			tr ' ' $trnl | egrep -v '\.[A-Za-z]*$' | $sed -e '
+				h
+				s/[0-9][0-9]*/0000&/g
+				s/0*\([0-9][0-9][0-9][0-9][0-9]\)/\1/g
+				G
+				s/\n/ /' | \
+			 $sort | $sed -e 's/^.* //'`
+		eval set \$$#
+	done
+	$test -r $1 || set $sysroot/usr/ccs/lib/libc.$so
+	$test -r $1 || set $sysroot/lib/libsys_s$_a
+	;;
+*)
+	set blurfl
+	;;
+esac
+if $test -r "$1"; then
+	echo "Your (shared) C library seems to be in $1."
+	libc="$1"
+elif $test -r /lib/libc && $test -r /lib/clib; then
+	echo "Your C library seems to be in both /lib/clib and /lib/libc."
+	xxx=apollo
+	libc='/lib/clib /lib/libc'
+	if $test -r /lib/syslib; then
+		echo "(Your math library is in /lib/syslib.)"
+		libc="$libc /lib/syslib"
+	fi
+elif $test -r "$libc" || (test -h "$libc") >/dev/null 2>&1; then
+	echo "Your C library seems to be in $libc, as you said before."
+elif $test -r $incpath/usr/lib/libc$_a; then
+	libc=$incpath/usr/lib/libc$_a;
+	echo "Your C library seems to be in $libc.  That's fine."
+elif $test -r /lib/libc$_a; then
+	libc=/lib/libc$_a;
+	echo "Your C library seems to be in $libc.  You're normal."
+else
+	if tans=`./loc libc$_a blurfl/dyick $libpth`; $test -r "$tans"; then
+		:
+	elif tans=`./loc libc blurfl/dyick $libpth`; $test -r "$tans"; then
+		libnames="$libnames "`./loc clib blurfl/dyick $libpth`
+	elif tans=`./loc clib blurfl/dyick $libpth`; $test -r "$tans"; then
+		:
+	elif tans=`./loc Slibc$_a blurfl/dyick $xlibpth`; $test -r "$tans"; then
+		:
+	elif tans=`./loc Mlibc$_a blurfl/dyick $xlibpth`; $test -r "$tans"; then
+		:
+	else
+		tans=`./loc Llibc$_a blurfl/dyick $xlibpth`
+	fi
+	if $test -r "$tans"; then
+		echo "Your C library seems to be in $tans, of all places."
+		libc=$tans
+	else
+		libc='blurfl'
+	fi
+fi
+if $test $xxx = apollo -o -r "$libc" || (test -h "$libc") >/dev/null 2>&1; then
+	dflt="$libc"
+	cat <<EOM
+
+If the guess above is wrong (which it might be if you're using a strange
+compiler, or your machine supports multiple models), you can override it here.
+
+EOM
+else
+	dflt=''
+	echo $libpth | $tr ' ' $trnl | $sort | $uniq > libpath
+	cat >&4 <<EOM
+I can't seem to find your C library.  I've looked in the following places:
+
+EOM
+	$sed 's/^/	/' libpath
+	cat <<EOM
+
+None of these seems to contain your C library. I need to get its name...
+
+EOM
+fi
+fn=f
+rp='Where is your C library?'
+. ./getfile
+libc="$ans"
+
+echo " "
+echo $libc $libnames | $tr ' ' $trnl | $sort | $uniq > libnames
+set X `cat libnames`
+shift
+xxx=files
+case $# in 1) xxx=file; esac
+echo "Extracting names from the following $xxx for later perusal:" >&4
+echo " "
+$sed 's/^/	/' libnames >&4
+echo " "
+$echo $n "This may take a while...$c" >&4
+
+for file in $*; do
+	case $file in
+	*$so*) $nm $nm_so_opt $nm_opt $file 2>/dev/null;;
+	*) $nm $nm_opt $file 2>/dev/null;;
+	esac
+done >libc.tmp
+
+$echo $n ".$c"
+$grep fprintf libc.tmp > libc.ptf
+xscan='eval "<libc.ptf $com >libc.list"; $echo $n ".$c" >&4'
+xrun='eval "<libc.tmp $com >libc.list"; echo "done." >&4'
+xxx='[ADTSIWi]'
+if com="$sed -n -e 's/__IO//' -e 's/^.* $xxx  *//p'";\
+	eval $xscan;\
+	$contains '^fprintf$' libc.list >/dev/null 2>&1; then
+		eval $xrun
+elif com="$sed -n -e 's/^__*//' -e 's/^\([a-zA-Z_0-9$]*\).*xtern.*/\1/p'";\
+	eval $xscan;\
+	$contains '^fprintf$' libc.list >/dev/null 2>&1; then
+		eval $xrun
+elif com="$sed -n -e '/|UNDEF/d' -e '/FUNC..GL/s/^.*|__*//p'";\
+	eval $xscan;\
+	$contains '^fprintf$' libc.list >/dev/null 2>&1; then
+		eval $xrun
+elif com="$sed -n -e 's/^.* D __*//p' -e 's/^.* D //p'";\
+	eval $xscan;\
+	$contains '^fprintf$' libc.list >/dev/null 2>&1; then
+		eval $xrun
+elif com="$sed -n -e 's/^_//' -e 's/^\([a-zA-Z_0-9]*\).*xtern.*text.*/\1/p'";\
+	eval $xscan;\
+	$contains '^fprintf$' libc.list >/dev/null 2>&1; then
+		eval $xrun
+elif com="$sed -n -e 's/^.*|FUNC |GLOB .*|//p'";\
+	eval $xscan;\
+	$contains '^fprintf$' libc.list >/dev/null 2>&1; then
+		eval $xrun
+elif com="$grep '|' | $sed -n -e '/|COMMON/d' -e '/|DATA/d' \
+				-e '/ file/d' -e 's/^\([^ 	]*\).*/\1/p'";\
+	eval $xscan;\
+	$contains '^fprintf$' libc.list >/dev/null 2>&1; then
+		eval $xrun
+elif com="$sed -n -e 's/^.*|FUNC |GLOB .*|//p' -e 's/^.*|FUNC |WEAK .*|//p'";\
+	eval $xscan;\
+	$contains '^fprintf$' libc.list >/dev/null 2>&1; then
+		eval $xrun
+elif com="$sed -n -e 's/^__//' -e '/|Undef/d' -e '/|Proc/s/ .*//p'";\
+	eval $xscan;\
+	$contains '^fprintf$' libc.list >/dev/null 2>&1; then
+		eval $xrun
+elif com="$sed -n -e 's/^.*|Proc .*|Text *| *//p'";\
+	eval $xscan;\
+	$contains '^fprintf$' libc.list >/dev/null 2>&1; then
+		eval $xrun
+elif com="$sed -n -e '/Def. Text/s/.* \([^ ]*\)\$/\1/p'";\
+	eval $xscan;\
+	$contains '^fprintf$' libc.list >/dev/null 2>&1; then
+		eval $xrun
+elif com="$sed -n -e 's/^[-0-9a-f ]*_\(.*\)=.*/\1/p'";\
+	eval $xscan;\
+	$contains '^fprintf$' libc.list >/dev/null 2>&1; then
+		eval $xrun
+elif com="$sed -n -e 's/.*\.text n\ \ \ \.//p'";\
+	eval $xscan;\
+	$contains '^fprintf$' libc.list >/dev/null 2>&1; then
+		eval $xrun
+elif com="sed -n -e 's/^__.*//' -e 's/[       ]*D[    ]*[0-9]*.*//p'";\
+	eval $xscan;\
+	$contains '^fprintf$' libc.list >/dev/null 2>&1; then
+		eval $xrun
+else
+	$nm -p $* 2>/dev/null >libc.tmp
+	$grep fprintf libc.tmp > libc.ptf
+	if com="$sed -n -e 's/^.* [ADTSIW]  *_[_.]*//p' -e 's/^.* [ADTSIW] //p'";\
+		eval $xscan; $contains '^fprintf$' libc.list >/dev/null 2>&1
+	then
+		nm_opt='-p'
+		eval $xrun
+	else
+		echo " "
+		echo "$nm didn't seem to work right. Trying $ar instead..." >&4
+		com=''
+		if $ar t $libc > libc.tmp && \
+			$contains '^fprintf$' libc.tmp >/dev/null 2>&1
+		then
+			for thisname in $libnames $libc; do
+				$ar t $thisname >>libc.tmp
+			done
+			$sed -e "s/\\$_o\$//" < libc.tmp > libc.list
+			echo "Ok." >&4
+		elif test "X$osname" = "Xos2" && $ar tv $libc > libc.tmp; then
+			for thisname in $libnames $libc; do
+				$ar tv $thisname >>libc.tmp
+				emximp -o tmp.imp $thisname \
+				    2>/dev/null && \
+				    $sed -e 's/^\([_a-zA-Z0-9]*\) .*$/\1/p' \
+				    < tmp.imp >>libc.tmp
+				$rm -f tmp.imp
+			done
+			$sed -e "s/\\$_o\$//" -e 's/^ \+//' < libc.tmp > libc.list
+			echo "Ok." >&4
+		else
+			echo "$ar didn't seem to work right." >&4
+			echo "Maybe this is a Cray...trying bld instead..." >&4
+			if  bld t $libc | \
+				$sed -e 's/.*\///' -e "s/\\$_o:.*\$//" > libc.list &&
+				$test -s libc.list
+			then
+				for thisname in $libnames; do
+					bld t $libnames | \
+					$sed -e 's/.*\///' -e "s/\\$_o:.*\$//" >>libc.list
+					$ar t $thisname >>libc.tmp
+				done
+				echo "Ok." >&4
+			else
+				echo "That didn't work either.  Giving up." >&4
+				exit 1
+			fi
+		fi
+	fi
+fi
+nm_extract="$com"
+case "$PASE" in
+define)
+    echo " "
+    echo "Since you are compiling for PASE, extracting more symbols from libc.a ...">&4
+    dump -Tv /lib/libc.a | awk '$7 == "/unix" {print $5 " " $8}' | grep "^SV" | awk '{print $2}' >> libc.list
+    ;;
+*)  if $test -f /lib/syscalls.exp; then
+	echo " "
+	echo "Also extracting names from /lib/syscalls.exp for good ole AIX..." >&4
+	$sed -n 's/^\([^ 	]*\)[ 	]*syscall[0-9]*[ 	]*$/\1/p' \
+		/lib/syscalls.exp >>libc.list
+    fi
+    ;;
+esac
+;;
+esac
+$rm -f libnames libpath
+
+: Check if we are using C++
+echo " "
+echo "Checking for C++..." >&4
+$cat >try.c <<'EOCP'
+#include <stdio.h>
+int main(void)
+{
+#ifdef __cplusplus
+    return 0;
+#else
+    return 1;
+#endif
+}
+EOCP
+set try
+if eval $compile_ok && $run ./try; then
+	val="$define"
+	echo "You are using a C++ compiler."
+else
+	val="$undef"
+	echo "You are not using a C++ compiler."
+fi
+$rm_try cplusplus$$
+set d_cplusplus
+eval $setvar
+
+: is a C symbol defined?
+csym='tlook=$1;
+case "$3" in
+-v) tf=libc.tmp; tdc="";;
+-a) tf=libc.tmp; tdc="[]";;
+*) tlook="^$1\$"; tf=libc.list; tdc="()";;
+esac;
+case "$d_cplusplus" in
+    $define)	extern_C="extern \"C\""	;;
+    *)		extern_C="extern"	;;
+esac;
+tx=yes;
+case "$reuseval-$4" in
+true-) ;;
+true-*) tx=no; eval "tval=\$$4"; case "$tval" in "") tx=yes;; esac;;
+esac;
+case "$tx" in
+yes)
+	tval=false;
+	if $test "$runnm" = true; then
+		if $contains $tlook $tf >/dev/null 2>&1; then
+			tval=true;
+		elif $test "$mistrustnm" = compile -o "$mistrustnm" = run; then
+			echo "$extern_C void *$1$tdc; void *(*(p()))$tdc { return &$1; } int main(int argc, char **argv) { if(p() && p() != (void *)argv[0]) return(0); else return(1); }"> try.c;
+			$cc -o try $optimize $ccflags $ldflags try.c >/dev/null 2>&1 $libs && tval=true;
+			$test "$mistrustnm" = run -a -x try && { $run ./try$_exe >/dev/null 2>&1 || tval=false; };
+			$rm_try;
+		fi;
+	else
+		echo "$extern_C void *$1$tdc; void *(*(p()))$tdc { return &$1; } int main(int argc, char **argv) { if(p() && p() != (void *)argv[0]) return(0); else return(1); }"> try.c;
+		$cc -o try $optimize $ccflags $ldflags try.c $libs >/dev/null 2>&1 && tval=true;
+		$rm_try;
+	fi;
+	;;
+*)
+	case "$tval" in
+	$define) tval=true;;
+	*) tval=false;;
+	esac;
+	;;
+esac;
+eval "$2=$tval"'
+
+: define an is-in-libc? function
+inlibc='echo " "; td=$define; tu=$undef;
+sym=$1; var=$2; eval "was=\$$2";
+tx=yes;
+case "$reuseval$was" in
+true) ;;
+true*) tx=no;;
+esac;
+case "$tx" in
+yes)
+	set $sym tres -f;
+	eval $csym;
+	case "$tres" in
+	true)
+		echo "$sym() found." >&4;
+		case "$was" in $undef) . ./whoa; esac; eval "$var=\$td";;
+	*)
+		echo "$sym() NOT found." >&4;
+		case "$was" in $define) . ./whoa; esac; eval "$var=\$tu";;
+	esac;;
+*)
+	case "$was" in
+	$define) echo "$sym() found." >&4;;
+	*) echo "$sym() NOT found." >&4;;
+	esac;;
+esac'
+
+: check for length of double
+echo " "
+case "$doublesize" in
+'')
+	echo "Checking to see how big your double precision numbers are..." >&4
+	$cat >try.c <<EOCP
+#include <stdio.h>
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+int main()
+{
+    printf("%d\n", (int)sizeof(double));
+    exit(0);
+}
+EOCP
+	set try
+	if eval $compile_ok; then
+		doublesize=`$run ./try`
+		echo "Your double is $doublesize bytes long."
+	else
+		dflt='8'
+		echo "(I can't seem to compile the test program.  Guessing...)"
+		rp="What is the size of a double precision number (in bytes)?"
+		. ./myread
+		doublesize="$ans"
+	fi
+	;;
+esac
+$rm_try
+
+: check for long doubles
+echo " " >&4
+echo "Checking to see if you have long double..." >&4
+echo 'int main() { long double x = 7.0; }' > try.c
+set try
+if eval $compile; then
+	val="$define"
+	echo "You have long double." >&4
+else
+	val="$undef"
+	echo "You do not have long double." >&4
+fi
+$rm_try
+set d_longdbl
+eval $setvar
+
+: see if ldexpl exists
+set ldexpl d_ldexpl
+eval $inlibc
+
+: check for length of long double
+case "${d_longdbl}${longdblsize}" in
+$define)
+	echo " " >&4
+	echo "Checking to see how big your long doubles are..." >&4
+	$cat >try.c <<'EOCP'
+#include <stdio.h>
+int main()
+{
+	printf("%d\n", sizeof(long double));
+}
+EOCP
+	set try
+	set try
+	if eval $compile; then
+		longdblsize=`$run ./try`
+		echo "Your long doubles are $longdblsize bytes long." >&4
+	else
+		dflt='8'
+		echo " " >&4
+		echo "(I can't seem to compile the test program.  Guessing...)" >&4
+		rp="What is the size of a long double (in bytes)?"
+		. ./myread
+		longdblsize="$ans"
+	fi
+	if $test "X$doublesize" = "X$longdblsize"; then
+		echo "That isn't any different from an ordinary double." >&4
+		echo "I'll keep your setting anyway, but you may see some" >&4
+		echo "harmless compilation warnings." >&4
+	fi
+	;;
+esac
+$rm_try
+
+$echo "Checking the kind of long doubles you have..." >&4
+case "$d_longdbl" in
+define)
+$cat <<EOP >try.c
+#$i_stdlib I_STDLIB
+#define LONGDBLSIZE $longdblsize
+#define DOUBLESIZE $doublesize
+#include <float.h>
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#include <stdio.h>
+static const long double d = -0.1L;
+int main() {
+  unsigned const char* b = (unsigned const char*)(&d);
+#if DOUBLESIZE == LONGDBLSIZE
+  printf("0\n"); /* if it floats like double */
+  exit(0);
+#endif
+#if (LDBL_MANT_DIG == 113 || FLT128_MANT_DIG == 113) && LONGDBLSIZE == 16
+  if (b[0] == 0x9A && b[1] == 0x99 && b[15] == 0xBF) {
+    /* IEEE 754 128-bit little-endian */
+    printf("1\n");
+    exit(0);
+  }
+  if (b[0] == 0xBF && b[14] == 0x99 && b[15] == 0x9A) {
+    /* IEEE 128-bit big-endian, e.g. solaris sparc */
+    printf("2\n");
+    exit(0);
+  }
+#endif
+/* For alignment 32-bit platforms have the 80 bits in 12 bytes,
+ * while 64-bits platforms have it in 16 bytes.  The trailing bytes
+ * cannot be trusted. */
+#if LDBL_MANT_DIG == 64 && (LONGDBLSIZE == 16 || LONGDBLSIZE == 12)
+  if (b[0] == 0xCD && b[9] == 0xBF) {
+    /* x86 80-bit little-endian, sizeof 12 (ILP32, Solaris x86)
+     * or 16 (LP64, Linux and OS X), 4 or 6 bytes of padding.
+     * Also known as "extended precision". */
+    printf("3\n");
+    exit(0);
+  }
+  if (b[0] == 0xBF && b[9] == 0xCD) {
+    /* Is there ever big-endian 80-bit, really?
+     *
+     * The Motorola 68881 had another "extended precision" format:
+     * sign:1 exp:15 zero:16 integer:1 mantissa:63
+     * for total of 96 bits of bytes.  The zero bits were unused.
+     * See "M68000 FAMILY PROGRAMMER'S REFERENCE MANUAL" for more details.
+     * If it ever becomes relevant, this format should be allocated a
+     * new doublekind code since it is quite different from the Intel x87.
+     */
+    printf("4\n");
+    exit(0);
+  }
+#endif
+#if (LDBL_MANT_DIG == 106 || LDBL_MANT_DIG == 107) && LONGDBLSIZE == 16
+  /* software "double double", the 106 is 53+53.
+   * but irix thinks it is 107. */
+  if (b[0] == 0x9A && b[7] == 0x3C && b[8] == 0x9A && b[15] == 0xBF) {
+    /* double double 128-bit fully little-endian,
+     * little-endian doubles in little-endian order,
+     * 9a 99 99 99 99 99 59 3c 9a 99 99 99 99 99 b9 bf */
+    printf("5\n");
+    exit(0);
+  }
+  if (b[0] == 0xBF && b[7] == 0x9A && b[8] == 0x3C && b[15] == 0x9A) {
+    /* double double 128-bit fully big-endian,
+     * big-endian doubles in big-endian order,
+     * e.g. PPC/Power and MIPS:
+     * bf b9 99 99 99 99 99 9a 3c 59 99 99 99 99 99 9a */
+    printf("6\n");
+    exit(0);
+  }
+  if (b[0] == 0x9A && b[7] == 0xBF && b[8] == 0x9A && b[15] == 0x3C) {
+    /* double double 128-bit mixed endian.
+     * little-endian doubles in big-endian order,
+     * e.g. ppc64el,
+     * 9a 99 99 99 99 99 b9 bf 9a 99 99 99 99 99 59 3c */
+    printf("7\n");
+    exit(0);
+  }
+  if (b[0] == 0x3C && b[7] == 0x9A && b[8] == 0xBF && b[15] == 0x9A) {
+    /* double double 128-bit mixed endian,
+     * big-endian doubles in little-endian order,
+     * 3c 59 99 99 99 99 99 9a bf b9 99 99 99 99 99 9a */
+    printf("8\n");
+    exit(0);
+  }
+#endif
+/* We are largely making this up because it may well be
+ * that the VAX format H was never made available to C,
+ * only to Fortran. */
+#if LONGDBLSIZE == 16 && defined(__vax__)
+  if (b[0] == 0xFD && b[15] == 0x99) {
+    /* VAX format H, PDP-11 mixed endian. */
+    printf("9\n");
+    exit(0);
+  }
+#endif
+  printf("-1\n"); /* unknown */
+  exit(0);
+}
+EOP
+set try
+if eval $compile; then
+    longdblkind=`$run ./try`
+else
+    longdblkind=-1
+fi
+;;
+*) longdblkind=0 ;;
+esac
+case "$longdblkind" in
+0) echo "Your long doubles are doubles." >&4 ;;
+1) echo "You have IEEE 754 128-bit little endian long doubles." >&4 ;;
+2) echo "You have IEEE 754 128-bit big endian long doubles." >&4 ;;
+3) echo "You have x86 80-bit little endian long doubles." >&4 ;;
+4) echo "You have x86 80-bit big endian long doubles." >&4 ;;
+5) echo "You have 128-bit fully little-endian double-double long doubles (64-bit LEs in LE)." >&4 ;;
+6) echo "You have 128-bit fully big-endian double-double long doubles (64-bit BEs in BE)." >&4 ;;
+7) echo "You have 128-bit mixed-endian double-double long doubles (64-bit LEs in BE)." >&4 ;;
+8) echo "You have 128-bit mixed-endian double-double long doubles (64-bit BEs in LE)." >&4 ;;
+9) echo "You have 128-bit PDP-style mixed-endian long doubles (VAX format H)." >&4 ;;
+*) echo "Cannot figure out your long double." >&4 ;;
+esac
+d_long_double_style_ieee=$undef
+d_long_double_style_ieee_std=$undef
+d_long_double_style_ieee_extended=$undef
+d_long_double_style_ieee_doubledouble=$undef
+d_long_double_style_vax=$undef
+case "$longdblkind" in
+1|2|3|4|5|6|7|8) d_long_double_style_ieee=$define ;;
+esac
+case "$longdblkind" in
+1|2) d_long_double_style_ieee_std=$define ;;
+esac
+case "$longdblkind" in
+3|4) d_long_double_style_ieee_extended=$define ;;
+esac
+case "$longdblkind" in
+5|6|7|8) d_long_double_style_ieee_doubledouble=$define ;;
+esac
+case "$longdblkind" in
+9) d_long_double_style_vax=$define ;;
+esac
+$rm_try
+
+: get the patchlevel
+echo " "
+echo "Getting the current patchlevel..." >&4
+if $test -r $rsrc/patchlevel.h;then
+	revision=`awk '/define[ 	]+PERL_REVISION/ {print $3}' $rsrc/patchlevel.h`
+	patchlevel=`awk '/define[ 	]+PERL_VERSION/ {print $3}' $rsrc/patchlevel.h`
+	subversion=`awk '/define[ 	]+PERL_SUBVERSION/ {print $3}' $rsrc/patchlevel.h`
+	api_revision=`awk '/define[ 	]+PERL_API_REVISION/ {print $3}' $rsrc/patchlevel.h`
+	api_version=`awk '/define[ 	]+PERL_API_VERSION/ {print $3}' $rsrc/patchlevel.h`
+	api_subversion=`awk '/define[ 	]+PERL_API_SUBVERSION/ {print $3}' $rsrc/patchlevel.h`
+	perl_patchlevel=`egrep ',"(MAINT|SMOKE)[0-9][0-9]*"' $rsrc/patchlevel.h|tail -1|sed 's/[^0-9]//g'`
+else
+	revision=0
+	patchlevel=0
+	subversion=0
+	api_revision=0
+	api_version=0
+	api_subversion=0
+	perl_patchlevel=0
+	$echo "(You do not have patchlevel.h.  Eek.)"
+fi
+: Define a handy string here to avoid duplication in myconfig.SH and configpm.
+version_patchlevel_string="version $patchlevel subversion $subversion"
+case "$perl_patchlevel" in
+0|'') ;;
+*)  perl_patchlevel=`echo $perl_patchlevel | sed 's/.* //'`
+    version_patchlevel_string="$version_patchlevel_string patch $perl_patchlevel"
+    ;;
+esac
+
+$echo "(You have $package $version_patchlevel_string.)"
+
+case "$osname" in
+dos|vms)
+	: XXX Should be a Configure test for double-dots in filenames.
+	version=`echo $revision $patchlevel $subversion | \
+		 $awk '{ printf "%d_%d_%d", $1, $2, $3 }'`
+	api_versionstring=`echo $api_revision $api_version $api_subversion | \
+		 $awk '{ printf "%d_%d_%d", $1, $2, $3 }'`
+	;;
+*)
+	version=`echo $revision $patchlevel $subversion | \
+		 $awk '{ printf "%d.%d.%d", $1, $2, $3 }'`
+	api_versionstring=`echo $api_revision $api_version $api_subversion | \
+		 $awk '{ printf "%d.%d.%d", $1, $2, $3 }'`
+	;;
+esac
+: Special case the 5.005_xx maintenance series, which used 5.005
+: without any subversion label as a subdirectory in $sitelib
+if test "${api_revision}${api_version}${api_subversion}" = "550"; then
+	api_versionstring='5.005'
+fi
+
+: determine the architecture name
+echo " "
+if xxx=`./loc arch blurfl $pth`; $test -f "$xxx"; then
+	tarch=`arch`"-$osname"
+elif xxx=`./loc uname blurfl $pth`; $test -f "$xxx" ; then
+	if uname -m > tmparch 2>&1 ; then
+		tarch=`$sed -e 's/ *$//' -e 's/ /_/g' \
+			-e 's/$/'"-$osname/" tmparch`
+	else
+		tarch="$osname"
+	fi
+	$rm -f tmparch
+else
+	tarch="$osname"
+fi
+case "$myarchname" in
+''|"$tarch") ;;
+*)
+	echo "(Your architecture name used to be $myarchname.)"
+	archname=''
+	;;
+esac
+case "$targetarch" in
+'') ;;
+*)  archname=`echo $targetarch|sed 's,^[^-]*-,,'` ;;
+esac
+myarchname="$tarch"
+case "$archname" in
+'') dflt="$tarch";;
+*) dflt="$archname";;
+esac
+rp='What is your architecture name'
+. ./myread
+archname="$ans"
+
+: optionally add API version to the architecture for versioned archlibs
+case "$useversionedarchname" in
+$define|true|[yY]*) dflt='y';;
+*)                  dflt='n';;
+esac
+rp='Add the Perl API version to your archname?'
+. ./myread
+case "$ans" in
+y|Y)	useversionedarchname="$define" ;;
+*)      useversionedarchname="$undef" ;;
+esac
+case "$useversionedarchname" in
+$define)
+	case "$archname" in
+	*-$api_versionstring)
+		echo "...and architecture name already has -$api_versionstring" >&4
+		;;
+	*)
+		archname="$archname-$api_versionstring"
+		echo "...setting architecture name to $archname." >&4
+		;;
+	esac
+	;;
+esac
+
+case "$usethreads" in
+$define)
+	echo "Threads selected." >&4
+	case "$archname" in
+	*-thread*) echo "...and architecture name already has -thread." >&4
+		;;
+	*)      archname="$archname-thread"
+		echo "...setting architecture name to $archname." >&4
+		;;
+	esac
+	;;
+esac
+case "$usemultiplicity" in
+$define)
+	echo "Multiplicity selected." >&4
+	case "$archname" in
+	*-multi*) echo "...and architecture name already has -multi." >&4
+		;;
+	*)      archname="$archname-multi"
+		echo "...setting architecture name to $archname." >&4
+		;;
+	esac
+	;;
+esac
+case "$use64bitint$use64bitall" in
+*"$define"*)
+	case "$archname64" in
+	'')
+		echo "This architecture is naturally 64-bit, not changing architecture name." >&4
+		;;
+	*)
+		case "$use64bitint" in
+		"$define") echo "64 bit integers selected." >&4 ;;
+		esac
+		case "$use64bitall" in
+		"$define") echo "Maximal 64 bitness selected." >&4 ;;
+		esac
+		case "$archname" in
+		*-$archname64*) echo "...and architecture name already has $archname64." >&4
+			;;
+		*)      archname="$archname-$archname64"
+			echo "...setting architecture name to $archname." >&4
+			;;
+		esac
+		;;
+	esac
+esac
+case "$uselongdouble" in
+$define)
+	echo "Long doubles selected." >&4
+	case "$longdblsize" in
+	$doublesize)
+		echo "...but long doubles are equal to doubles, not changing architecture name." >&4
+		;;
+	*)
+		case "$archname" in
+		*-ld*) echo "...and architecture name already has -ld." >&4
+			;;
+		*)      archname="$archname-ld"
+			echo "...setting architecture name to $archname." >&4
+			;;
+		esac
+		;;
+	esac
+	;;
+esac
+case "$usequadmath" in
+$define)
+	echo "quadmath selected." >&4
+	case "$archname" in
+	*-quadmath*) echo "...and architecture name already has -quadmath." >&4
+		;;
+	*)      archname="$archname-quadmath"
+		echo "...setting architecture name to $archname." >&4
+		;;
+	esac
+	;;
+esac
+if $test -f archname.cbu; then
+	echo "Your platform has some specific hints for architecture name, using them..."
+	. ./archname.cbu
+fi
+
+: set the prefixit variable, to compute a suitable default value
+prefixit='case "$3" in
+""|none)
+	case "$oldprefix" in
+	"") eval "$1=\"\$$2\"";;
+	*)
+		case "$3" in
+		"") eval "$1=";;
+		none)
+			eval "tp=\"\$$2\"";
+			case "$tp" in
+			""|" "|none) eval "$1=\"\$$2\"";;
+			*) eval "$1=";;
+			esac;;
+		esac;;
+	esac;;
+*)
+	eval "tp=\"$oldprefix-\$$2-\""; eval "tp=\"$tp\"";
+	case "$tp" in
+	--|/*--|\~*--) eval "$1=\"$prefix/$3\"";;
+	/*-$oldprefix/*|\~*-$oldprefix/*)
+		eval "$1=\`echo \$$2 | sed \"s,^$oldprefix,$prefix,\"\`";;
+	*) eval "$1=\"\$$2\"";;
+	esac;;
+esac'
+
+: determine installation style
+: For now, try to deduce it from prefix unless it is already set.
+: Reproduce behavior of 5.005 and earlier, maybe drop that in 5.7.
+case "$installstyle" in
+'')	case "$prefix" in
+		*perl*) dflt='lib';;
+		*) dflt='lib/perl5' ;;
+	esac
+	;;
+*)	dflt="$installstyle" ;;
+esac
+: Probably not worth prompting for this since we prompt for all
+: the directories individually, and the prompt would be too long and
+: confusing anyway.
+installstyle=$dflt
+
+: determine where public executables go
+echo " "
+set dflt bin bin
+eval $prefixit
+fn=d~
+rp='Pathname where the public executables will reside?'
+. ./getfile
+if $test "X$ansexp" != "X$binexp"; then
+	installbin=''
+fi
+prefixvar=bin
+: XXX Bug? -- ignores Configure -Dinstallprefix setting.
+: XXX If this is fixed, also fix the "start perl" hunk below, which relies on
+:     this via initialinstalllocation
+. ./setprefixvar
+
+case "$userelocatableinc" in
+$define|true|[yY]*)	dflt='y' ;;
+*)			dflt='n' ;;
+esac
+cat <<EOM
+
+Would you like to build Perl so that the installation is relocatable, so that
+library paths in @INC are determined relative to the path of the perl binary?
+This is not advised for system Perl installs, or if you need to run setid
+scripts or scripts under taint mode.
+
+If this doesn't make any sense to you, just accept the default '$dflt'.
+EOM
+rp='Use relocatable @INC?'
+. ./myread
+case "$ans" in
+y|Y)	val="$define" ;;
+*)	val="$undef"  ;;
+esac
+set userelocatableinc
+eval $setvar
+
+initialinstalllocation="$binexp"
+: Default prefix is now "up one level from where the binaries are"
+case "$userelocatableinc" in
+$define|true|[yY]*)
+    bin=".../"
+    binexp=".../"
+    prefix=".../.."
+    prefixexp=".../.."
+    installprefixexp=".../.."
+    ;;
+esac
+
+: determine where private library files go
+: Usual default is /usr/local/lib/perl5/$version.
+: Also allow things like /opt/perl/lib/$version, since
+: /opt/perl/lib/perl5... would be redundant.
+: The default "style" setting is made in installstyle.U
+case "$installstyle" in
+*lib/perl5*) set dflt privlib lib/$package/$version ;;
+*lib32/perl5*) set dflt privlib lib32/$package/$version ;;
+*lib64/perl5*) set dflt privlib lib64/$package/$version ;;
+*)	 set dflt privlib lib/$version ;;
+esac
+eval $prefixit
+$cat <<EOM
+
+There are some auxiliary files for $package that need to be put into a
+private library directory that is accessible by everyone.
+
+EOM
+fn=$binexp
+fn=d~+
+rp='Pathname where the private library files will reside?'
+. ./getfile
+prefixvar=privlib
+. ./setprefixvar
+
+: set the prefixup variable, to restore leading tilda escape
+prefixup='case "$prefixexp" in
+"$prefix") ;;
+*) eval "$1=\`echo \$$1 | sed \"s,^$prefixexp,$prefix,\"\`";;
+esac'
+
+: determine where public architecture dependent libraries go
+set archlib archlib
+eval $prefixit
+: privlib default is /usr/local/lib/$package/$version
+: archlib default is /usr/local/lib/$package/$version/$archname
+: privlib may have an optional trailing /share.
+tdflt=`echo $privlib | $sed 's,/share$,,'`
+tdflt=$tdflt/$archname
+case "$archlib" in
+'')	dflt=$tdflt
+	;;
+*)	dflt="$archlib"
+    ;;
+esac
+$cat <<EOM
+
+$spackage contains architecture-dependent library files.  If you are
+sharing libraries in a heterogeneous environment, you might store
+these files in a separate location.  Otherwise, you can just include
+them with the rest of the public library files.
+
+EOM
+fn=$binexp
+fn=d+~
+rp='Where do you want to put the public architecture-dependent libraries?'
+. ./getfile
+prefixvar=archlib
+. ./setprefixvar
+if $test X"$archlib" = X"$privlib"; then
+	d_archlib="$undef"
+else
+	d_archlib="$define"
+fi
+
+: see if setuid scripts can be secure
+$cat <<EOM
+
+Some kernels have a bug that prevents setuid #! scripts from being
+secure.  Some sites have disabled setuid #! scripts because of this.
+
+First let's decide if your kernel supports secure setuid #! scripts.
+(If setuid #! scripts would be secure but have been disabled anyway,
+don't say that they are secure if asked.)
+
+EOM
+
+val="$undef"
+if $test -d /dev/fd; then
+	echo "#!$ls" >reflect
+	chmod +x,u+s reflect
+	./reflect >flect 2>&1
+	if $contains "/dev/fd" flect >/dev/null; then
+		echo "Congratulations, your kernel has secure setuid scripts!" >&4
+		val="$define"
+	else
+		$cat <<EOM
+If you are not sure if they are secure, I can check but I'll need a
+username and password different from the one you are using right now.
+If you don't have such a username or don't want me to test, simply
+enter 'none'.
+
+EOM
+		rp='Other username to test security of setuid scripts with?'
+		dflt='none'
+		. ./myread
+		case "$ans" in
+		n|none)
+			case "$d_suidsafe" in
+			'')	echo "I'll assume setuid scripts are *not* secure." >&4
+				dflt=n;;
+			"$undef")
+				echo "Well, the $hint value is *not* secure." >&4
+				dflt=n;;
+			*)	echo "Well, the $hint value *is* secure." >&4
+				dflt=y;;
+			esac
+			;;
+		*)
+			$rm -f reflect flect
+			echo "#!$ls" >reflect
+			chmod +x,u+s reflect
+			echo >flect
+			chmod a+w flect
+			echo '"su" will (probably) prompt you for '"$ans's password."
+			su $ans -c './reflect >flect'
+			if $contains "/dev/fd" flect >/dev/null; then
+				echo "Okay, it looks like setuid scripts are secure." >&4
+				dflt=y
+			else
+				echo "I don't think setuid scripts are secure." >&4
+				dflt=n
+			fi
+			;;
+		esac
+		rp='Does your kernel have *secure* setuid scripts?'
+		. ./myread
+		case "$ans" in
+		[yY]*)	val="$define";;
+		*)	val="$undef";;
+		esac
+	fi
+else
+	echo "I don't think setuid scripts are secure (no /dev/fd directory)." >&4
+	echo "(That's for file descriptors, not floppy disks.)"
+	val="$undef"
+fi
+set d_suidsafe
+eval $setvar
+
+$rm -f reflect flect
+
+: now see if they want to do setuid emulation
+if $test $patchlevel -lt 11; then
+echo " "
+val="$undef"
+case "$d_suidsafe" in
+"$define")
+	val="$undef"
+	echo "No need to emulate SUID scripts since they are secure here." >&4
+	;;
+*)
+	$cat <<EOM
+Some systems have disabled setuid scripts, especially systems where
+setuid scripts cannot be secure.  On systems where setuid scripts have
+been disabled, the setuid/setgid bits on scripts are currently
+useless.  It is possible for $package to detect those bits and emulate
+setuid/setgid in a secure fashion.  This emulation will only work if
+setuid scripts have been disabled in your kernel.
+
+EOM
+	case "$d_dosuid" in
+	"$define") dflt=y ;;
+	*) dflt=n ;;
+	esac
+	rp="Do you want to do setuid/setgid emulation?"
+	. ./myread
+	case "$ans" in
+	[yY]*)	val="$define";;
+	*)	val="$undef";;
+	esac
+	;;
+esac
+set d_dosuid
+eval $setvar
+else
+    case "$d_dosuid" in
+	"$define")
+	cat >&4 <<EOH
+
+SUID emulation has been removed for 5.12
+Please re-run Configure without -Dd_dosuid
+
+EOH
+	exit 1;
+	;;
+    esac
+    d_dosuid=undef
+fi
+
+: Find perl5.005 or later.
+echo "Looking for a previously installed perl5.005 or later... "
+case "$perl5" in
+'')	for tdir in `echo "$binexp$path_sep$PATH" | $sed "s/$path_sep/ /g"`; do
+		: Check if this perl is recent and can load a simple module
+		if $test -x $tdir/perl$exe_ext && $tdir/perl -Mless -e 'use 5.005;' >/dev/null 2>&1; then
+			perl5=$tdir/perl
+			break;
+		elif $test -x $tdir/perl5$exe_ext && $tdir/perl5 -Mless -e 'use 5.005;' >/dev/null 2>&1; then
+			perl5=$tdir/perl5
+			break;
+		fi
+	done
+	;;
+*)	perl5="$perl5"
+	;;
+esac
+case "$perl5" in
+'')	echo "None found.  That's ok.";;
+*)	echo "Using $perl5." ;;
+esac
+
+: Set the siteprefix variables
+$cat <<EOM
+
+After $package is installed, you may wish to install various
+add-on modules and utilities.  Typically, these add-ons will
+be installed under $prefix with the rest
+of this package.  However, you may wish to install such add-ons
+elsewhere under a different prefix.
+
+If you do not wish to put everything under a single prefix, that's
+ok.  You will be prompted for the individual locations; this siteprefix
+is only used to suggest the defaults.
+
+The default should be fine for most people.
+
+EOM
+fn=d~+
+rp='Installation prefix to use for add-on modules and utilities?'
+: XXX Here might be another good place for an installstyle setting.
+case "$siteprefix" in
+'') dflt=$prefix ;;
+*)  dflt=$siteprefix ;;
+esac
+. ./getfile
+: XXX Prefixit unit does not yet support siteprefix and vendorprefix
+oldsiteprefix=''
+case "$siteprefix" in
+'') ;;
+*)	case "$ans" in
+	"$prefix") ;;
+	*) oldsiteprefix="$prefix";;
+	esac
+	;;
+esac
+siteprefix="$ans"
+siteprefixexp="$ansexp"
+
+: determine where site specific libraries go.
+: Usual default is /usr/local/lib/perl5/site_perl/$version
+: The default "style" setting is made in installstyle.U
+: XXX No longer works with Prefixit stuff.
+prog=`echo $package | $sed 's/-*[0-9.]*$//'`
+case "$sitelib" in
+'') case "$installstyle" in
+	*lib/perl5*) dflt=$siteprefix/lib/$package/site_$prog/$version ;;
+	*lib32/perl5*) dflt=$siteprefix/lib32/$package/site_$prog/$version ;;
+	*lib64/perl5*) dflt=$siteprefix/lib64/$package/site_$prog/$version ;;
+	*)	 dflt=$siteprefix/lib/site_$prog/$version ;;
+	esac
+	;;
+*)	dflt="$sitelib"
+	;;
+esac
+$cat <<EOM
+
+The installation process will create a directory for
+site-specific extensions and modules.  Most users find it convenient
+to place all site-specific files in this directory rather than in the
+main distribution directory.
+
+EOM
+fn=d~+
+rp='Pathname for the site-specific library files?'
+. ./getfile
+prefixvar=sitelib
+. ./setprefixvar
+sitelib_stem=`echo "$sitelibexp" | sed "s,/$version$,,"`
+
+: Determine list of previous versions to include in @INC
+$cat > getverlist <<EOPL
+#!$perl5
+use strict;
+use warnings;
+use File::Basename;
+my \$api_versionstring = "$api_versionstring";
+my \$version = "$version";
+my \$stem = "$sitelib_stem";
+my \$archname = "$archname";
+EOPL
+	$cat >> getverlist <<'EOPL'
+# The list found is stored twice for each entry: the original name, and
+# the binary broken down version into pack "s>s>s>", so sorting is easy
+# and unambiguous.  This will work for all versions that have a maximum
+# of three digit per group separate by '.'s or '_'s. Names are extended
+# with ".0.0" to ensure at least three elements for the pack.
+#                                   -- H.Merijn Brand (m)'06 23-10-2006
+
+my @inc_version_list;
+my @candidates;
+# XXX Redo to do opendir/readdir?
+if (-d $stem) {
+    chdir($stem);
+    ;@candidates = map {
+	[ $_, pack "s>s>s>", split m/[._]/, "$_.0.0" ] } glob("5.*");
+    ;@candidates = sort { $a->[1] cmp $b->[1]} @candidates;
+}
+else {
+    ;@candidates = ();
+}
+
+my ($pversion, $aversion, $vsn5005) = map {
+    pack "s>s>s>", split m/[._]/, "$_.0.0" } $version, $api_versionstring, "5.005";
+foreach my $d (@candidates) {
+    if ($d->[1] lt $pversion) {
+	if ($d->[1] ge $aversion) {
+	    unshift(@inc_version_list, grep { -d } $d->[0]."/$archname", $d->[0]);
+	}
+	elsif ($d->[1] ge $vsn5005) {
+	    unshift(@inc_version_list, grep { -d } $d->[0]);
+	}
+    }
+    else {
+	# Skip newer version.  I.e. don't look in
+	# 5.7.0 if we're installing 5.6.1.
+    }
+}
+
+if (@inc_version_list) {
+    print join(' ', @inc_version_list);
+}
+else {
+    # Blank space to preserve value for next Configure run.
+    print " ";
+}
+EOPL
+chmod +x getverlist
+case "$inc_version_list" in
+'')	if test -x "$perl5$exe_ext"; then
+		dflt=`$perl5 getverlist`
+	else
+		dflt='none'
+	fi
+	;;
+$undef) dflt='none' ;;
+*)  eval dflt=\"$inc_version_list\" ;;
+esac
+case "$dflt" in
+''|' ') dflt=none ;;
+esac
+case "$dflt" in
+5.005) dflt=none ;;
+esac
+$cat <<EOM
+
+In order to ease the process of upgrading, this version of perl
+can be configured to use modules built and installed with earlier
+versions of perl that were installed under $prefix.  Specify here
+the list of earlier versions that this version of perl should check.
+If Configure detected no earlier versions of perl installed under
+$prefix, then the list will be empty.  Answer 'none' to tell perl
+to not search earlier versions.
+
+The default should almost always be sensible, so if you're not sure,
+just accept the default.
+EOM
+
+rp='List of earlier versions to include in @INC?'
+. ./myread
+case "$ans" in
+[Nn]one|''|' '|$undef) inc_version_list=' ' ;;
+*) inc_version_list="$ans" ;;
+esac
+case "$inc_version_list" in
+''|' ')
+	inc_version_list_init='0'
+	d_inc_version_list="$undef"
+	;;
+*)	inc_version_list_init=`echo $inc_version_list |
+		$sed -e 's/^/"/' -e 's/ /","/g' -e 's/$/",0/'`
+	d_inc_version_list="$define"
+	;;
+esac
+$rm -f getverlist
+
+: see if malloc/malloc.h has to be included
+set malloc/malloc.h i_mallocmalloc
+eval $inhdr
+
+: see if this is a malloc.h system
+: we want a real compile instead of Inhdr because some systems have a
+: malloc.h that just gives a compile error saying to use stdlib.h instead
+echo " "
+$cat >try.c <<EOCP
+#include <stdlib.h>
+#include <malloc.h>
+#$i_mallocmalloc I_MALLOCMALLOC
+#ifdef I_MALLOCMALLOC
+# include <malloc/malloc.h>
+#endif
+
+int main () { return 0; }
+EOCP
+set try
+if eval $compile; then
+    echo "<malloc.h> found." >&4
+    val="$define"
+else
+    echo "<malloc.h> NOT found." >&4
+    val="$undef"
+fi
+$rm_try
+set i_malloc
+eval $setvar
+
+: check for length of pointer
+echo " "
+case "$ptrsize" in
+'')
+	echo "Checking to see how big your pointers are..." >&4
+	$cat >try.c <<EOCP
+#include <stdio.h>
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+int main()
+{
+    printf("%d\n", (int)sizeof(void *));
+    exit(0);
+}
+EOCP
+	set try
+	if eval $compile_ok; then
+		ptrsize=`$run ./try`
+		echo "Your pointers are $ptrsize bytes long."
+	else
+		dflt='4'
+		echo "(I can't seem to compile the test program.  Guessing...)" >&4
+		rp="What is the size of a pointer (in bytes)?"
+		. ./myread
+		ptrsize="$ans"
+	fi
+	;;
+esac
+$rm_try
+case "$use64bitall" in
+"$define"|true|[yY]*)
+	case "$ptrsize" in
+	4)	cat <<EOM >&4
+
+*** You have chosen a maximally 64-bit build,
+*** but your pointers are only 4 bytes wide.
+*** Please rerun Configure without -Duse64bitall.
+EOM
+		case "$d_quad" in
+		define)
+			cat <<EOM >&4
+*** Since you have quads, you could possibly try with -Duse64bitint.
+EOM
+			;;
+		esac
+		cat <<EOM >&4
+*** Cannot continue, aborting.
+
+EOM
+
+		exit 1
+		;;
+	esac
+	;;
+esac
+
+: determine whether to use malloc wrapping
+echo " "
+case "$usemallocwrap" in
+[yY]*|true|$define)	dflt='y' ;;
+[nN]*|false|$undef)	dflt='n' ;;
+*)	case "$usedevel" in
+	[yY]*|true|$define)	dflt='y' ;;
+	*) dflt='n' ;;
+	esac
+	;;
+esac
+rp="Do you wish to wrap malloc calls to protect against potential overflows?"
+. ./myread
+usemallocwrap="$ans"
+case "$ans" in
+y*|true)
+	usemallocwrap="$define" ;;
+*)
+	usemallocwrap="$undef" ;;
+esac
+
+: determine which malloc to compile in
+echo " "
+case "$usemymalloc" in
+[yY]*|true|$define)	dflt='y' ;;
+[nN]*|false|$undef)	dflt='n' ;;
+*)	case "$ptrsize" in
+	4) dflt='y' ;;
+	*) dflt='n' ;;
+	esac
+	if test "$useithreads" = "$define"; then dflt='n'; fi
+	;;
+esac
+rp="Do you wish to attempt to use the malloc that comes with $package?"
+. ./myread
+usemymalloc="$ans"
+case "$ans" in
+y*|true)
+	usemymalloc='y'
+	mallocsrc='malloc.c'
+	mallocobj="malloc$_o"
+	d_mymalloc="$define"
+	case "$libs" in
+	*-lmalloc*)
+		: Remove malloc from list of libraries to use
+		echo "Removing unneeded -lmalloc from library list" >&4
+		set `echo X $libs | $sed -e 's/-lmalloc / /' -e 's/-lmalloc$//'`
+		shift
+		libs="$*"
+		echo "libs = $libs" >&4
+		;;
+	esac
+	;;
+*)
+	usemymalloc='n'
+	mallocsrc=''
+	mallocobj=''
+	d_mymalloc="$undef"
+	;;
+esac
+
+: compute the return types of malloc and free
+echo " "
+$cat >malloc.c <<END
+#$i_malloc I_MALLOC
+#$i_stdlib I_STDLIB
+#include <stdio.h>
+#include <sys/types.h>
+#ifdef I_MALLOC
+#include <malloc.h>
+#endif
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#ifdef TRY_MALLOC
+void *malloc();
+#endif
+#ifdef TRY_FREE
+void free();
+#endif
+END
+case "$malloctype" in
+'')
+	if $cc $ccflags -c -DTRY_MALLOC malloc.c >/dev/null 2>&1; then
+		malloctype='void *'
+	else
+		malloctype='char *'
+	fi
+	;;
+esac
+echo "Your system wants malloc to return '$malloctype', it would seem." >&4
+
+case "$freetype" in
+'')
+	if $cc $ccflags -c -DTRY_FREE malloc.c >/dev/null 2>&1; then
+		freetype='void'
+	else
+		freetype='int'
+	fi
+	;;
+esac
+echo "Your system uses $freetype free(), it would seem." >&4
+$rm -f malloc.[co]
+: determine where site specific architecture-dependent libraries go.
+: sitelib  default is /usr/local/lib/perl5/site_perl/$version
+: sitearch default is /usr/local/lib/perl5/site_perl/$version/$archname
+: sitelib may have an optional trailing /share.
+case "$sitearch" in
+'')	dflt=`echo $sitelib | $sed 's,/share$,,'`
+	dflt="$dflt/$archname"
+	;;
+*)	dflt="$sitearch"
+	;;
+esac
+set sitearch sitearch none
+eval $prefixit
+$cat <<EOM
+
+The installation process will also create a directory for
+architecture-dependent site-specific extensions and modules.
+
+EOM
+fn=d~+
+rp='Pathname for the site-specific architecture-dependent library files?'
+. ./getfile
+prefixvar=sitearch
+. ./setprefixvar
+if $test X"$sitearch" = X"$sitelib"; then
+	d_sitearch="$undef"
+else
+	d_sitearch="$define"
+fi
+
+: Set the vendorprefix variables
+$cat <<EOM
+
+The installation process will also create a directory for
+vendor-supplied add-ons.  Vendors who supply perl with their system
+may find it convenient to place all vendor-supplied files in this
+directory rather than in the main distribution directory.  This will
+ease upgrades between binary-compatible maintenance versions of perl.
+
+Of course you may also use these directories in whatever way you see
+fit.  For example, you might use them to access modules shared over a
+company-wide network.
+
+The default answer should be fine for most people.
+This causes further questions about vendor add-ons to be skipped
+and no vendor-specific directories will be configured for perl.
+
+EOM
+rp='Do you want to configure vendor-specific add-on directories?'
+case "$usevendorprefix" in
+define|true|[yY]*) dflt=y ;;
+*)	: User may have set vendorprefix directly on Configure command line.
+	case "$vendorprefix" in
+	''|' ') dflt=n ;;
+	*)	dflt=y ;;
+	esac
+	;;
+esac
+. ./myread
+case "$ans" in
+[yY]*)	fn=d~+
+	rp='Installation prefix to use for vendor-supplied add-ons?'
+	case "$vendorprefix" in
+	'') dflt="$prefix" ;;
+	*)  dflt=$vendorprefix ;;
+	esac
+	. ./getfile
+	: XXX Prefixit unit does not yet support siteprefix and vendorprefix
+	oldvendorprefix=''
+	case "$vendorprefix" in
+	'') ;;
+	*)	case "$ans" in
+		"$prefix") ;;
+		*) oldvendorprefix="$prefix";;
+		esac
+		;;
+	esac
+	usevendorprefix="$define"
+	vendorprefix="$ans"
+	vendorprefixexp="$ansexp"
+	;;
+*)	usevendorprefix="$undef"
+	vendorprefix=''
+	vendorprefixexp=''
+	;;
+esac
+
+: Set the vendorlib variables
+case "$vendorprefix" in
+'')	d_vendorlib="$undef"
+	vendorlib=''
+	vendorlibexp=''
+	;;
+*)	d_vendorlib="$define"
+	: determine where vendor-supplied modules go.
+	: Usual default is /usr/local/lib/perl5/vendor_perl/$version
+	case "$vendorlib" in
+	'')
+		prog=`echo $package | $sed 's/-*[0-9.]*$//'`
+		case "$installstyle" in
+		*lib/perl5*) dflt=$vendorprefix/lib/$package/vendor_$prog/$version ;;
+		*lib32/perl5*) dflt=$vendorprefix/lib32/$package/vendor_$prog/$version ;;
+		*lib64/perl5*) dflt=$vendorprefix/lib64/$package/vendor_$prog/$version ;;
+		*)	     dflt=$vendorprefix/lib/vendor_$prog/$version ;;
+		esac
+		;;
+	*)	dflt="$vendorlib"
+		;;
+	esac
+	fn=d~+
+	rp='Pathname for the vendor-supplied library files?'
+	. ./getfile
+	vendorlib="$ans"
+	vendorlibexp="$ansexp"
+	;;
+esac
+vendorlib_stem=`echo "$vendorlibexp" | sed "s,/$version$,,"`
+prefixvar=vendorlib
+. ./installprefix
+
+: Set the vendorarch variables
+case "$vendorprefix" in
+'')	d_vendorarch="$undef"
+	vendorarch=''
+	vendorarchexp=''
+	;;
+*)	d_vendorarch="$define"
+	: determine where vendor-supplied architecture-dependent libraries go.
+	: vendorlib  default is /usr/local/lib/perl5/vendor_perl/$version
+	: vendorarch default is /usr/local/lib/perl5/vendor_perl/$version/$archname
+	: vendorlib may have an optional trailing /share.
+	case "$vendorarch" in
+	'')	dflt=`echo $vendorlib | $sed 's,/share$,,'`
+		dflt="$dflt/$archname"
+		;;
+	*)	dflt="$vendorarch" ;;
+	esac
+	fn=d~+
+	rp='Pathname for vendor-supplied architecture-dependent files?'
+	. ./getfile
+	vendorarch="$ans"
+	vendorarchexp="$ansexp"
+	;;
+esac
+prefixvar=vendorarch
+. ./installprefix
+if $test X"$vendorarch" = X"$vendorlib"; then
+	d_vendorarch="$undef"
+else
+	d_vendorarch="$define"
+fi
+
+: Final catch-all directories to search
+$cat <<EOM
+
+Lastly, you can have perl look in other directories for extensions and
+modules in addition to those already specified.
+These directories will be searched after
+	$sitearch
+	$sitelib
+EOM
+test X"$vendorlib" != "X" && echo '	' $vendorlib
+test X"$vendorarch" != "X" && echo '	' $vendorarch
+echo ' '
+case "$otherlibdirs" in
+''|' ') dflt='none' ;;
+*)	dflt="$otherlibdirs" ;;
+esac
+$cat <<EOM
+Enter a colon-separated set of extra paths to include in perl's @INC
+search path, or enter 'none' for no extra paths.
+
+EOM
+
+rp='Colon-separated list of additional directories for perl to search?'
+. ./myread
+case "$ans" in
+' '|''|none)	otherlibdirs=' ' ;;
+*)	otherlibdirs="$ans" ;;
+esac
+case "$otherlibdirs" in
+' ') val=$undef ;;
+*)	val=$define ;;
+esac
+set d_perl_otherlibdirs
+eval $setvar
+
+: DTrace support
+dflt_dtrace='/usr/sbin/dtrace'
+$test -x /usr/bin/dtrace && dflt_dtrace='/usr/bin/dtrace'
+
+cat <<EOM
+
+Perl can be built to support DTrace on platforms that support it.
+DTrace is a diagnosis and performance analysis tool from Sun.
+
+If this doesn't make any sense to you, just accept the default.
+EOM
+
+while $test 1 ; do
+	case "$usedtrace" in
+	$define|true|[yY]*)
+		dflt='y'
+		;;
+	$undef|false|[nN]*)
+		dflt='n'
+		dflt_dtrace=""
+		;;
+	?*)
+		dflt='y'
+		dflt_dtrace=$usedtrace
+		;;
+	*)
+		dflt='n'
+		;;
+	esac
+
+	rp='Support DTrace if available?'
+	. ./myread
+	case "$ans" in
+	y|Y)	val="$define" ;;
+	*)      val="$undef" ;;
+	esac
+	set usedtrace
+	eval $setvar
+
+	test "X$usedtrace" != "X$define" && break
+
+	echo " "
+	rp='Where is the dtrace executable?'
+	dflt=$dflt_dtrace
+	. ./getfile
+	val="$ans"
+	set dtrace
+	eval $setvar
+
+	if $test -f $dtrace
+	then
+		if $dtrace -h -s ../perldtrace.d \
+			-o perldtrace.tmp >/dev/null 2>&1 \
+			&& rm -f perldtrace.tmp
+		then
+			echo " "
+			echo "Good: your $dtrace knows about the -h flag."
+		else
+			cat >&2 <<EOM
+
+*** $me:  Fatal Error:  $dtrace doesn't support -h flag
+***
+*** Your installed dtrace doesn't support the -h switch to compile a D
+*** program into a C header. Can't continue.
+
+EOM
+			exit 1
+		fi
+		break;
+	fi
+
+	case "$fastread" in
+	yes)
+		cat >&2 <<EOM
+
+*** $me:  Fatal Error:  $dtrace not found.
+*** Can't continue.
+
+EOM
+		exit 1
+		;;
+	*)
+		echo "*** $dtrace was not found."
+		echo " "
+		;;
+	esac
+done
+
+: See if we want extra modules installed
+echo " "
+case "$extras" in
+'') dflt='n';;
+*) dflt='y';;
+esac
+cat <<EOM
+Perl can be built with extra modules or bundles of modules which
+will be fetched from the CPAN and installed alongside Perl.
+
+Notice that you will need access to the CPAN; either via the Internet,
+or a local copy, for example a CD-ROM or a local CPAN mirror.  (You will
+be asked later to configure the CPAN.pm module which will in turn do
+the installation of the rest of the extra modules or bundles.)
+
+Notice also that if the modules require any external software such as
+libraries and headers (the libz library and the zlib.h header for the
+Compress::Zlib module, for example) you MUST have any such software
+already installed, this configuration process will NOT install such
+things for you.
+
+If this doesn't make any sense to you, just accept the default '$dflt'.
+EOM
+rp='Install any extra modules (y or n)?'
+. ./myread
+case "$ans" in
+y|Y)
+	cat <<EOM
+
+Please list any extra modules or bundles to be installed from CPAN,
+with spaces between the names.  The names can be in any format the
+'install' command of CPAN.pm will understand.  (Answer 'none',
+without the quotes, to install no extra modules or bundles.)
+EOM
+	rp='Extras?'
+	dflt="$extras"
+	. ./myread
+	extras="$ans"
+esac
+case "$extras" in
+''|'none')
+	val=''
+	$rm -f ../extras.lst
+	;;
+*)	echo "(Saving the list of extras for later...)"
+	echo "$extras" > ../extras.lst
+	val="'$extras'"
+	;;
+esac
+set extras
+eval $setvar
+echo " "
+
+: determine where html pages for programs go
+set html1dir html1dir none
+eval $prefixit
+$cat <<EOM
+
+If you wish to install html files for programs in $spackage, indicate
+the appropriate directory here.  To skip installing html files,
+answer "none".
+EOM
+case "$html1dir" in
+''|none|$undef|' ') dflt=none ;;
+*) dflt=$html1dir ;;
+esac
+fn=dn+~
+rp="Directory for the main $spackage html pages?"
+. ./getfile
+prefixvar=html1dir
+. ./setprefixvar
+: Use ' ' for none so value is preserved next time through Configure
+$test X"$html1dir" = "X" && html1dir=' '
+
+: determine where html pages for libraries and modules go
+set html3dir html3dir none
+eval $prefixit
+$cat <<EOM
+
+If you wish to install html files for modules associated with $spackage,
+indicate the appropriate directory here.  To skip installing html files,
+answer "none".
+EOM
+: There is no obvious default.  If they have specified html1dir, then
+: try to key off that, possibly changing .../html1 into .../html3.
+case "$html3dir" in
+'') html3dir=`echo "$html1dir" | $sed 's/1$/3$/'` ;;
+*) dflt=$html3dir ;;
+esac
+fn=dn+~
+rp="Directory for the $spackage module html pages?"
+. ./getfile
+prefixvar=html3dir
+. ./setprefixvar
+: Use ' ' for none so value is preserved next time through Configure
+$test X"$html3dir" = "X" && html3dir=' '
+
+: determine whether to install perl also as /usr/bin/perl
+
+echo " "
+if $test -d /usr/bin -a "X$installbin" != X/usr/bin; then
+	$cat <<EOM
+Many scripts expect perl to be installed as /usr/bin/perl.
+
+If you want to, I can install the perl you are about to compile
+as /usr/bin/perl (in addition to $bin/perl).
+EOM
+	if test -f /usr/bin/perl; then
+	    $cat <<EOM
+
+However, please note that because you already have a /usr/bin/perl,
+overwriting that with a new Perl would very probably cause problems.
+Therefore I'm assuming you don't want to do that (unless you insist).
+
+EOM
+	    case "$installusrbinperl" in
+	    "$define"|[yY]*)	dflt='y';;
+	    *)			dflt='n';;
+	    esac
+	else
+	    $cat <<EOM
+
+Since you don't have a /usr/bin/perl I'm assuming creating one is okay.
+
+EOM
+	    case "$installusrbinperl" in
+	    "$undef"|[nN]*)	dflt='n';;
+	    *)			dflt='y';;
+	    esac
+	fi
+	rp="Do you want to install perl as /usr/bin/perl?"
+	. ./myread
+	case "$ans" in
+	[yY]*)	val="$define";;
+	*)	val="$undef" ;;
+	esac
+else
+	val="$undef"
+fi
+set installusrbinperl
+eval $setvar
+
+: see if dlopen exists
+xxx_runnm="$runnm"
+xxx_ccflags="$ccflags"
+runnm=false
+: with g++ one needs -shared to get is-in-libc to work for dlopen
+case "$gccversion" in
+'')	;;
+*Clang*)	;;
+*)	case "$d_cplusplus" in
+	"$define") ccflags="$ccflags -shared" ;;
+	esac
+	;;
+esac
+set dlopen d_dlopen
+eval $inlibc
+runnm="$xxx_runnm"
+ccflags="$xxx_ccflags"
+
+: see if this is a unistd.h system
+set unistd.h i_unistd
+eval $inhdr
+
+: determine which dynamic loading, if any, to compile in
+echo " "
+dldir="ext/DynaLoader"
+case "$usedl" in
+    $define|y|true)
+	dflt='y'
+	usedl="$define"
+	;;
+    $undef|n|false)
+	dflt='n'
+	usedl="$undef"
+	;;
+    *)
+	dflt='n'
+	case "$d_dlopen" in
+	    $define) dflt='y' ;;
+	esac
+	: Does a dl_xxx.xs file exist for this operating system
+	$test -f $rsrc/$dldir/dl_${osname}.xs && dflt='y'
+	;;
+esac
+rp="Do you wish to use dynamic loading?"
+. ./myread
+usedl="$ans"
+bin_ELF="$undef"
+case "$ans" in
+    y*) usedl="$define"
+	case "$dlsrc" in
+	    '') if $test -f $rsrc/$dldir/dl_${osname}.xs ; then
+		    dflt="$dldir/dl_${osname}.xs"
+		elif $test "$d_dlopen" = "$define" ; then
+		    dflt="$dldir/dl_dlopen.xs"
+		else
+		    dflt=''
+		fi
+		;;
+	    *)  dflt="$dldir/$dlsrc"
+		;;
+	esac
+	echo "The following dynamic loading files are available:"
+	: Can not go over to $dldir because getfile has path hard-coded in.
+	tdir=`pwd`; cd "$rsrc"; $ls -C $dldir/dl*.xs; cd "$tdir"
+	rp="Source file to use for dynamic loading"
+	fn="fne"
+	gfpth="$src"
+	. ./getfile
+	usedl="$define"
+	: emulate basename
+	dlsrc=`echo $ans | $sed -e 's%.*/\([^/]*\)$%\1%'`
+
+	$cat << EOM
+
+Some systems may require passing special flags to $cc -c to
+compile modules that will be used to create a shared library.
+To use no flags, say "none".
+
+EOM
+	case "$cccdlflags" in
+	    '') case "$gccversion" in
+		'') case "$osname" in
+			hpux)	dflt='+z' ;;
+			irix*)	dflt='-KPIC' ;;
+			svr4*|esix*|solaris|nonstopux) dflt='-KPIC' ;;
+			sunos)	dflt='-pic' ;;
+			*)	dflt='none' ;;
+		    esac
+		    ;;
+		*)  case "$osname" in
+			darwin) dflt='none' ;;
+			*linux*|svr4*|esix*|solaris|nonstopux) dflt='-fPIC' ;;
+			*)	dflt='-fpic' ;;
+		    esac ;;
+		esac ;;
+	    ' ') dflt='none' ;;
+	    *)   dflt="$cccdlflags" ;;
+	esac
+
+	case "$dflt" in
+	    none) dflt='' ;;
+	esac
+
+	# If -Dsysroot was specified, now's the time to add it
+	# to cccdlflags
+	if test "X$sysroot" != X; then
+	    case "$gccversion" in
+		'') ;;
+		*)  case "$dflt" in
+			*sysroot*) ;;
+			'undef'|*)
+			    dflt="$dflt --sysroot=$sysroot" ;;
+		    esac
+		    ;;
+	    esac
+	fi
+
+	case "$dflt" in
+	    '') dflt='none';;
+	esac
+
+	rp="Any special flags to pass to $cc -c to compile shared library modules?"
+	. ./myread
+	case "$ans" in
+	    none) cccdlflags=' ' ;;
+	    *)    cccdlflags="$ans" ;;
+	esac
+
+	cat << EOM
+
+Some systems use ld to create libraries that can be dynamically loaded,
+while other systems (such as those using ELF) use $cc.
+
+EOM
+
+: Determine if this is ELF
+	$cat >try.c <<EOM
+/* Test for whether ELF binaries are produced */
+#include <fcntl.h>
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#$i_unistd I_UNISTD
+#ifdef I_UNISTD
+#include <unistd.h>
+#endif
+int main() {
+    char b[4];
+    int i = open("a.out",O_RDONLY);
+    if(i == -1)
+	exit(1); /* fail */
+    if(read(i,b,4)==4 && b[0]==127 && b[1]=='E' && b[2]=='L' && b[3]=='F')
+	exit(0); /* succeed (yes, it is ELF) */
+    exit(1); /* fail */
+}
+EOM
+	if $cc $ccflags $ldflags -o a.out try.c >/dev/null 2>&1 && $run ./a.out; then
+	    bin_ELF="$define"
+	fi
+	$rm_try
+
+	case "$ld" in
+	    '') if $test $bin_ELF = "$define"; then
+		    cat <<EOM
+You appear to have ELF support.  I'll use $cc to build dynamic libraries.
+EOM
+		    dflt="$cc"
+		else
+		    echo "I'll use ld to build dynamic libraries."
+		    dflt='ld'
+		fi
+		;;
+	    *)  dflt="$ld"
+		;;
+	esac
+
+	rp="What command should be used to create dynamic libraries?"
+	. ./myread
+	ld="$ans"
+
+	cat << EOM
+
+Some systems may require passing special flags to $ld to create a
+library that can be dynamically loaded.  If your ld flags include
+-L/other/path options to locate libraries outside your loader's normal
+search path, you may need to specify those -L options here as well.  To
+use no flags, say "none".
+
+EOM
+	case "$lddlflags" in
+	    '') case "$osname" in
+		    haiku) dflt='-shared' ;;
+		    hpux) dflt='-b';
+			  case "$gccversion" in
+			      '') dflt="$dflt +vnocompatwarnings" ;;
+			  esac
+			  ;;
+		    *linux*|irix*|gnu*)  dflt="-shared $optimize" ;;
+		    solaris) # See [perl #66604].
+			    # On Solaris 11, gcc -m64 on amd64
+			    # appears not to understand -G.  gcc versions at
+			    # least as old as 3.4.3 support -shared, so just
+			    # use that with Solaris 11 and later, but keep
+			    # the old behavior for older Solaris versions.
+			    case "$gccversion" in
+				'') dflt='-G' ;;
+				*)  case "$osvers" in
+					2.?|2.10) dflt='-G' ;;
+					*) dflt='-shared' ;;
+				    esac
+				    ;;
+			    esac
+			    ;;
+		    sunos) dflt='-assert nodefinitions' ;;
+		    svr4*|esix*|nonstopux) dflt="-G $ldflags" ;;
+		    *)     dflt='none' ;;
+		esac
+		;;
+	    *) dflt="$lddlflags" ;;
+	esac
+
+	: Only do this for gcc, since, for example, qcc has no concept
+	: of --sysroot.
+	if $test "X$sysroot" != X; then
+	    case "$gccversion" in
+		'') ;;
+		*)  dflt="$dflt --sysroot=$sysroot" ;;
+	    esac
+	fi
+
+	: Try to guess additional flags to pick up local libraries.
+	: Be careful not to append to a plain 'none'
+	case "$dflt" in
+	    none) dflt='' ;;
+	esac
+	for thisflag in $ldflags; do
+	    case "$thisflag" in
+		-L*|-R*|-Wl,-R*)
+		    case " $dflt " in
+			*" $thisflag "*) ;;
+			*) dflt="$dflt $thisflag" ;;
+		    esac
+		    ;;
+	    esac
+	done
+
+	case "$dflt" in
+	    ''|' ') dflt='none' ;;
+	esac
+
+	case "$ldflags" in
+	    *-fstack-protector-strong*)
+		case "$dflt" in
+		    *-fstack-protector-strong*) ;; # Don't add it again
+		    *) dflt="$dflt -fstack-protector-strong" ;;
+		esac
+		;;
+	    *-fstack-protector*)
+		case "$dflt" in
+		    *-fstack-protector*) ;; # Don't add it again
+		    *) dflt="$dflt -fstack-protector" ;;
+		esac
+		;;
+	esac
+
+	rp="Any special flags to pass to $ld to create a dynamically loaded library?"
+	. ./myread
+	case "$ans" in
+	    none) lddlflags=' ' ;;
+	    *) lddlflags="$ans" ;;
+	esac
+
+	cat <<EOM
+
+Some systems may require passing special flags to $cc to indicate that
+the resulting executable will use dynamic linking.  To use no flags,
+say "none".
+
+EOM
+	case "$ccdlflags" in
+	    '') case "$osname" in
+		    *linux*|hpux|gnu*) dflt='-Wl,-E' ;;
+		    sunos)             dflt='none'   ;;
+		    *)                 dflt='none'   ;;
+		esac ;;
+	    ' ') dflt='none' ;;
+	    *)   dflt="$ccdlflags" ;;
+	esac
+	rp="Any special flags to pass to $cc to use dynamic linking?"
+	. ./myread
+	case "$ans" in
+	    none) ccdlflags=' ' ;;
+	    *)    ccdlflags="$ans" ;;
+	esac
+	;;
+
+    *)  usedl="$undef"
+	ld='ld'
+	dlsrc='dl_none.xs'
+	lddlflags=''
+	ccdlflags=''
+	;;
+esac
+
+ld_can_script="$undef"
+case "$bin_ELF$usedl" in
+    $define$define)
+	# Abuse try.h and a.out names for neat cleanup
+	$cat >try.c <<EOM
+void foo() {}
+void bar() {}
+EOM
+	$cat >try.h <<EOM
+LIBTEST_42 {
+ global:
+  foo;
+ local: *;
+ };
+EOM
+	if $cc $cccdlflags $ccdlflags $ccflags \
+	       $ldflags $lddlflags -o a.out try.c \
+	       -Wl,--version-script=try.h >/dev/null 2>&1 \
+	   &&  $test -s a.out ; then
+	    echo "ld supports scripting" >&4
+	    ld_can_script="$define"
+	else
+	    echo "ld does not support scripting" >&4
+	fi
+	$rm_try
+	;;
+esac
+
+: Do we want a shared libperl?
+also=''
+case "$usedl" in
+$undef)
+	# No dynamic loading being used, so don't bother even to prompt.
+	useshrplib='false'
+	;;
+*)	case "$useshrplib" in
+	'')	case "$osname" in
+		svr4*|nonstopux|dgux|dynixptx|esix|powerux|haiku|cygwin*)
+			dflt=y
+			also='Building a shared libperl is required for dynamic loading to work on your system.'
+			;;
+		*)	dflt=n
+			;;
+		esac
+		;;
+	$define|true|[Yy]*)
+		dflt=y
+		;;
+	*)	dflt=n
+		;;
+	esac
+	$cat << EOM
+
+The perl executable is normally obtained by linking perlmain.c with
+libperl${_a}, any static extensions (usually just DynaLoader), and
+any other libraries needed on this system (such as -lm, etc.).  Since
+your system supports dynamic loading, it is probably possible to build
+a shared libperl.$so.  If you will have more than one executable linked
+to libperl.$so, this will significantly reduce the size of each
+executable, but it may have a noticeable effect on performance.  The
+default is probably sensible for your system.
+$also
+
+EOM
+	rp="Build a shared libperl.$so (y/n)"
+	. ./myread
+	case "$ans" in
+	true|$define|[Yy]*)
+		useshrplib='true'  ;;
+	*)	useshrplib='false' ;;
+	esac
+	;;
+esac
+
+case "$useshrplib" in
+true)
+	case "$userelocatableinc" in
+	true|define)
+		echo "Cannot build with both -Duserelocatableinc and -Duseshrplib" >&4
+		echo "See INSTALL for an explanation why that won't work." >&4
+		exit 4
+		;;
+	esac
+	case "$libperl" in
+	'')
+		# Figure out a good name for libperl.so.  Since it gets stored in
+		# a version-specific architecture-dependent library, the version
+		# number isn't really that important, except for making cc/ld happy.
+		#
+		# A name such as libperl.so.10.1
+		majmin="libperl.$so.$patchlevel.$subversion"
+		# A name such as libperl.so.100
+		majonly=`echo $patchlevel $subversion |
+			$awk '{printf "%d%02d", $1, $2}'`
+		majonly=libperl.$so.$majonly
+		# I'd prefer to keep the os-specific stuff here to a minimum, and
+		# rely on figuring it out from the naming of libc.
+		case "${osname}${osvers}" in
+		*linux*|gnu*)  # ld won't link with a bare -lperl otherwise.
+			dflt=libperl.$so
+			;;
+		cygwin*) # ld links now against the dll directly
+			majmin="cygperl5_${patchlevel}_${subversion}.${so}"
+			majonly=`echo $patchlevel $subversion |
+				$awk '{printf "%03d%03d", $1, $2}'`
+			majonly=cygperl5.$majonly.$so
+			dflt=$majmin
+			;;
+		*)	# Try to guess based on whether libc has major.minor.
+			case "$libc" in
+			*libc.$so.[0-9]*.[0-9]*) dflt=$majmin ;;
+			*libc.$so.[0-9]*) dflt=$majonly ;;
+			*)	dflt=libperl.$so ;;
+			esac
+			;;
+		esac
+		;;
+	*)	dflt=$libperl
+		;;
+	esac
+	cat << EOM
+
+I need to select a good name for the shared libperl.  If your system uses
+library names with major and minor numbers, then you might want something
+like $majmin.  Alternatively, if your system uses a single version
+number for shared libraries, then you might want to use $majonly.
+Or, your system might be quite happy with a simple libperl.$so.
+
+Since the shared libperl will get installed into a version-specific
+architecture-dependent directory, the version number of the shared perl
+library probably isn't important, so the default should be o.k.
+
+EOM
+	rp='What name do you want to give to the shared libperl?'
+	. ./myread
+	libperl=$ans
+	echo "Ok, I'll use $libperl"
+	;;
+*)
+	libperl="libperl${_a}"
+	;;
+esac
+
+# Detect old use of shrpdir via undocumented Configure -Dshrpdir
+case "$shrpdir" in
+'') ;;
+*)	$cat >&4 <<EOM
+WARNING:  Use of the shrpdir variable for the installation location of
+the shared $libperl is not supported.  It was never documented and
+will not work in this version.  Let me (https://github.com/Perl/perl5/issues)
+know of any problems this may cause.
+
+EOM
+	case "$shrpdir" in
+	"$archlibexp/CORE")
+		$cat >&4 <<EOM
+But your current setting of $shrpdir is
+the default anyway, so it's harmless.
+EOM
+		;;
+	*)
+		$cat >&4 <<EOM
+Further, your current attempted setting of $shrpdir
+conflicts with the value of $archlibexp/CORE
+that installperl will use.
+EOM
+		;;
+	esac
+	;;
+esac
+
+# How will the perl executable find the installed shared $libperl?
+# Add $xxx to ccdlflags.
+# If we can't figure out a command-line option, use $shrpenv to
+# set env LD_RUN_PATH.  The main perl makefile uses this.
+shrpdir=$archlibexp/CORE
+xxx=''
+tmp_shrpenv=''
+if "$useshrplib"; then
+    case "$osname" in
+	aix)
+		# We'll set it in Makefile.SH...
+		;;
+	solaris)
+		xxx="-R $shrpdir"
+		;;
+	freebsd|minix|mirbsd|netbsd|openbsd|interix|dragonfly|bitrig)
+		xxx="-Wl,-R$shrpdir"
+		;;
+	bsdos|linux|irix*|dec_osf|gnu*|haiku)
+		xxx="-Wl,-rpath,$shrpdir"
+		;;
+	hpux*)
+		# hpux doesn't like the default, either.
+		tmp_shrpenv="env LDOPTS=\"+s +b${shrpdir}\""
+		;;
+	cygwin)
+		# cygwin needs only ldlibpth
+		;;
+	*)
+		tmp_shrpenv="env LD_RUN_PATH=$shrpdir"
+		;;
+	esac
+	case "$xxx" in
+	'') ;;
+	*)
+		# Only add $xxx if it isn't already in ccdlflags.
+		case " $ccdlflags " in
+		*" $xxx "*)	;;
+		*)	ccdlflags="$ccdlflags $xxx"
+			cat <<EOM >&4
+
+Adding $xxx to the flags
+passed to $ld so that the perl executable will find the
+installed shared $libperl.
+
+EOM
+			;;
+		esac
+		;;
+	esac
+fi
+# Fix ccdlflags in AIX for building external extensions.
+# (For building Perl itself bare -bE:perl.exp is needed,
+#  Makefile.SH takes care of this.)
+case "$osname" in
+aix) ccdlflags="$ccdlflags -bE:$installarchlib/CORE/perl.exp" ;;
+esac
+# Respect a hint or command-line value.
+case "$shrpenv" in
+'') shrpenv="$tmp_shrpenv" ;;
+esac
+case "$ldlibpthname" in
+'')	ldlibpthname=LD_LIBRARY_PATH ;;
+none)	ldlibpthname='' ;;
+esac
+
+: determine where manual pages are on this system
+echo " "
+case "$sysman" in
+'')
+	syspath='/usr/share/man/man1 /usr/man/man1'
+	syspath="$syspath /usr/man/mann /usr/man/manl /usr/man/local/man1"
+	syspath="$syspath /usr/man/u_man/man1"
+	syspath="$syspath /usr/catman/u_man/man1 /usr/man/l_man/man1"
+	syspath="$syspath /usr/local/man/u_man/man1 /usr/local/man/l_man/man1"
+	syspath="$syspath /usr/man/man.L /local/man/man1 /usr/local/man/man1"
+	sysman=`./loc . /usr/man/man1 $syspath`
+	;;
+esac
+if $test -d "$sysman"; then
+	echo "System manual is in $sysman." >&4
+else
+	echo "Could not find manual pages in source form." >&4
+fi
+
+: determine where manual pages go
+set man1dir man1dir none
+eval $prefixit
+$cat <<EOM
+
+$spackage has manual pages available in source form.
+EOM
+case "$nroff" in
+nroff)
+	echo "However, you don't have nroff, so they're probably useless to you."
+	case "$man1dir" in
+	'') man1dir="none";;
+	esac;;
+esac
+echo "If you don't want the manual sources installed, answer 'none'."
+case "$man1dir" in
+' ') dflt=none
+	;;
+'')
+	lookpath="$prefixexp/share/man/man1"
+	lookpath="$lookpath $prefixexp/man/man1 $prefixexp/man/l_man/man1"
+	lookpath="$lookpath $prefixexp/man/p_man/man1"
+	lookpath="$lookpath $prefixexp/man/u_man/man1"
+	lookpath="$lookpath $prefixexp/man/man.1"
+	case "$sysman" in
+	*/?_man*)	dflt=`./loc . $prefixexp/l_man/man1 $lookpath` ;;
+	*)	dflt=`./loc . $prefixexp/man/man1 $lookpath` ;;
+	esac
+	set dflt
+	eval $prefixup
+	;;
+*)  dflt="$man1dir"
+	;;
+esac
+echo " "
+fn=dn+~
+rp="Where do the main $spackage manual pages (source) go?"
+. ./getfile
+if $test "X$man1direxp" != "X$ansexp"; then
+	installman1dir=''
+fi
+prefixvar=man1dir
+. ./setprefixvar
+
+case "$man1dir" in
+'')	man1dir=' '
+	installman1dir='';;
+esac
+
+: What suffix to use on installed man pages
+
+case "$man1dir" in
+' ')
+	man1ext='0'
+	;;
+*)
+	rp="What suffix should be used for the main $spackage man pages?"
+	case "$man1ext" in
+	'')	case "$man1dir" in
+		*1)  dflt=1 ;;
+		*1p) dflt=1p ;;
+		*1pm) dflt=1pm ;;
+		*l) dflt=l;;
+		*n) dflt=n;;
+		*o) dflt=o;;
+		*p) dflt=p;;
+		*C) dflt=C;;
+		*L) dflt=L;;
+		*L1) dflt=L1;;
+		*) dflt=1;;
+		esac
+		;;
+	*)	dflt="$man1ext";;
+	esac
+	. ./myread
+	man1ext="$ans"
+	;;
+esac
+
+: see if we can have long filenames
+echo " "
+first=123456789abcdef
+$rm -f $first
+if (echo hi >$first) 2>/dev/null; then
+	if $test -f 123456789abcde; then
+		echo 'You cannot have filenames longer than 14 characters.  Sigh.' >&4
+		val="$undef"
+	else
+		echo 'You can have filenames longer than 14 characters.'>&4
+		val="$define"
+	fi
+else
+	$cat <<'EOM'
+You can't have filenames longer than 14 chars.
+You can't even think about them!
+EOM
+	val="$undef"
+fi
+set d_flexfnam
+eval $setvar
+$rm -rf 123456789abcde*
+
+: determine where library module manual pages go
+set man3dir man3dir none
+eval $prefixit
+$cat <<EOM
+
+$spackage has manual pages for many of the library modules.
+EOM
+
+case "$nroff" in
+nroff)
+	$cat <<'EOM'
+However, you don't have nroff, so they're probably useless to you.
+EOM
+	case "$man3dir" in
+	'') man3dir="none";;
+	esac;;
+esac
+
+case "$d_flexfnam" in
+undef)
+	$cat <<'EOM'
+However, your system can't handle the long file names like File::Basename.3.
+EOM
+	case "$man3dir" in
+	'') man3dir="none";;
+	esac;;
+esac
+
+echo "If you don't want the manual sources installed, answer 'none'."
+prog=`echo $package | $sed 's/-*[0-9.]*$//'`
+case "$man3dir" in
+'')	dflt=`echo "$man1dir" | $sed -e 's/man1/man3/g' -e 's/man\.1/man\.3/g'`
+	if $test -d "$privlib/man/man3"; then
+		cat <<EOM >&4
+
+WARNING:  Previous versions of perl installed man3 pages into
+$privlib/man/man3.  This version will suggest a
+new default of $dflt.
+EOM
+		tdflt=$dflt
+		dflt='n'
+		rp='Do you wish to preserve the old behavior?(y/n)'
+		. ./myread
+		case "$ans" in
+		y*) dflt="$privlib/man/man3" ;;
+		*)  dflt=$tdflt ;;
+		esac
+    fi
+	;;
+*)	dflt="$man3dir" ;;
+esac
+case "$dflt" in
+' ') dflt=none ;;
+esac
+echo " "
+fn=dn+~
+rp="Where do the $package library man pages (source) go?"
+. ./getfile
+prefixvar=man3dir
+. ./setprefixvar
+
+case "$man3dir" in
+'')	man3dir=' '
+	installman3dir='';;
+esac
+
+: What suffix to use on installed man pages
+case "$man3dir" in
+' ')
+	man3ext='0'
+	;;
+*)
+	rp="What suffix should be used for the $package library man pages?"
+	case "$man3ext" in
+	'')	case "$man3dir" in
+		*3)  dflt=3 ;;
+		*3p) dflt=3p ;;
+		*3pm) dflt=3pm ;;
+		*l) dflt=l;;
+		*n) dflt=n;;
+		*o) dflt=o;;
+		*p) dflt=p;;
+		*C) dflt=C;;
+		*L) dflt=L;;
+		*L3) dflt=L3;;
+		*) dflt=3;;
+		esac
+		;;
+	*)	dflt="$man3ext";;
+	esac
+	. ./myread
+	man3ext="$ans"
+	;;
+esac
+
+: see if we have to deal with yellow pages, now NIS.
+if $test -d /usr/etc/yp || $test -d /etc/yp || $test -d /usr/lib/yp; then
+	case "$hostcat" in
+	nidump*) ;;
+	*)
+		case "$hostcat" in
+		*ypcat*) dflt=y;;
+		'') if $contains '^\+' /etc/passwd >/dev/null 2>&1; then
+				dflt=y
+			else
+				dflt=n
+			fi;;
+		*) dflt=n;;
+		esac
+		echo " "
+		rp='Are you getting the hosts file via yellow pages?'
+		. ./myread
+		case "$ans" in
+		y*) hostcat='ypcat hosts';;
+		*) hostcat='cat /etc/hosts';;
+		esac
+		;;
+	esac
+fi
+case "$hostcat" in
+'') test -f /etc/hosts && hostcat='cat /etc/hosts';;
+esac
+case "$groupcat" in
+'') test -f /etc/group && groupcat='cat /etc/group';;
+esac
+case "$passcat" in
+'') test -f /etc/passwd && passcat='cat /etc/passwd';;
+esac
+
+: now get the host name
+echo " "
+echo "Figuring out host name..." >&4
+case "$myhostname" in
+'') cont=true
+	echo 'Maybe "hostname" will work...'
+	if tans=`sh -c hostname 2>&1` ; then
+		myhostname=$tans
+		phostname=hostname
+		cont=''
+	fi
+	;;
+*) cont='';;
+esac
+if $test "$cont"; then
+	if ./xenix; then
+		echo 'Oh, dear.  Maybe "/etc/systemid" is the key...'
+		if tans=`cat /etc/systemid 2>&1` ; then
+			myhostname=$tans
+			phostname='cat /etc/systemid'
+			echo "Whadyaknow.  Xenix always was a bit strange..."
+			cont=''
+		fi
+	elif $test -r /etc/systemid; then
+		echo "(What is a non-Xenix system doing with /etc/systemid?)"
+	fi
+fi
+if $test "$cont"; then
+	echo 'No, maybe "uuname -l" will work...'
+	if tans=`sh -c 'uuname -l' 2>&1` ; then
+		myhostname=$tans
+		phostname='uuname -l'
+	else
+		echo 'Strange.  Maybe "uname -n" will work...'
+		if tans=`sh -c 'uname -n' 2>&1` ; then
+			myhostname=$tans
+			phostname='uname -n'
+		else
+			echo 'Oh well, maybe I can mine it out of whoami.h...'
+			if tans=`sh -c $contains' sysname $usrinc/whoami.h' 2>&1` ; then
+				myhostname=`echo "$tans" | $sed 's/^.*"\(.*\)"/\1/'`
+				phostname="sed -n -e '"'/sysname/s/^.*\"\\(.*\\)\"/\1/{'"' -e p -e q -e '}' <$usrinc/whoami.h"
+			else
+				case "$myhostname" in
+				'') echo "Does this machine have an identity crisis or something?"
+					phostname='';;
+				*)
+					echo "Well, you said $myhostname before..."
+					phostname='echo $myhostname';;
+				esac
+			fi
+		fi
+	fi
+fi
+case "$myhostname" in
+'') myhostname=noname ;;
+esac
+: you do not want to know about this
+set $myhostname
+myhostname=$1
+
+: verify guess
+if $test "$myhostname" ; then
+	dflt=y
+	rp='Your host name appears to be "'$myhostname'".'" Right?"
+	. ./myread
+	case "$ans" in
+	y*) ;;
+	*) myhostname='';;
+	esac
+fi
+
+: bad guess or no guess
+while $test "X$myhostname" = X ; do
+	dflt=''
+	rp="Please type the (one word) name of your host:"
+	. ./myread
+	myhostname="$ans"
+done
+
+: translate upper to lower if necessary
+case "$myhostname" in
+*[A-Z]*)
+	echo "(Normalizing case in your host name)"
+	myhostname=`echo $myhostname | ./tr '[A-Z]' '[a-z]'`
+	;;
+esac
+
+case "$myhostname" in
+*.*)
+	dflt=`expr "X$myhostname" : "X[^.]*\(\..*\)"`
+	myhostname=`expr "X$myhostname" : "X\([^.]*\)\."`
+	echo "(Trimming domain name from host name--host name is now $myhostname)"
+	;;
+*) case "$mydomain" in
+	'')
+		{
+			test "X$hostcat" = "Xypcat hosts" &&
+			ypmatch "$myhostname" hosts 2>/dev/null |\
+				$sed -e 's/[	 ]*#.*//; s/$/ /' > hosts && \
+			$test -s hosts
+		} || {
+			test "X$hostcat" != "X" &&
+			$hostcat | $sed -n -e "s/[	 ]*#.*//; s/\$/ /
+					/[	 ]$myhostname[	. ]/p" > hosts
+		}
+		tmp_re="[	. ]"
+		if $test -f hosts; then
+			$test x`$awk "/[0-9].*[	 ]$myhostname$tmp_re/ { sum++ }
+			     END { print sum }" hosts` = x1 || tmp_re="[	 ]"
+			dflt=.`$awk "/[0-9].*[	 ]$myhostname$tmp_re/ {for(i=2; i<=NF;i++) print \\\$i}" \
+				hosts | $sort | $uniq | \
+				$sed -n -e "s/$myhostname\.\([-a-zA-Z0-9_.]\)/\1/p"`
+			case `$echo X$dflt` in
+			X*\ *)	echo "(Several hosts in the database matched hostname)"
+				dflt=.
+				;;
+			X.) echo "(You do not have fully-qualified names in the hosts database)"
+				;;
+			esac
+		else
+			echo "(I cannot locate a hosts database anywhere)"
+			dflt=.
+		fi
+		case "$dflt" in
+		.)
+			tans=`./loc resolv.conf X /etc /usr/etc`
+			if $test -f "$tans"; then
+				echo "(Attempting domain name extraction from $tans)"
+				dflt=.`$sed -n -e 's/	/ /g' \
+				  -e 's/^search  *\([^ ]*\).*/\1/p' $tans \
+				  -e 1q 2>/dev/null`
+				case "$dflt" in
+				.) dflt=.`$sed -n -e 's/	/ /g' \
+				     -e 's/^domain  *\([^ ]*\).*/\1/p' $tans \
+				     -e 1q 2>/dev/null`
+					;;
+				esac
+			fi
+			;;
+		esac
+		case "$dflt" in
+		.) echo "(No help from resolv.conf either -- attempting clever guess)"
+			dflt=.`sh -c domainname 2>/dev/null`
+			case "$dflt" in
+			'') dflt='.';;
+			.nis.*|.yp.*|.main.*) dflt=`echo $dflt | $sed -e 's/^\.[^.]*//'`;;
+			esac
+			;;
+		esac
+		case "$dflt$osname" in
+		.os390) echo "(Attempting domain name extraction from //'SYS1.TCPPARMS(TCPDATA)')"
+			dflt=.`awk '/^DOMAINORIGIN/ {print $2}' "//'SYS1.TCPPARMS(TCPDATA)'" 2>/dev/null`
+			;;
+		esac
+		case "$dflt" in
+		.) echo "(Lost all hope -- silly guess then)"
+			dflt='.nonet'
+			;;
+		esac
+		$rm -f hosts
+		;;
+	*) dflt="$mydomain";;
+	esac;;
+esac
+echo " "
+rp="What is your domain name?"
+. ./myread
+tans="$ans"
+case "$ans" in
+'') ;;
+.*) ;;
+*) tans=".$tans";;
+esac
+mydomain="$tans"
+
+: translate upper to lower if necessary
+case "$mydomain" in
+*[A-Z]*)
+	echo "(Normalizing case in your domain name)"
+	mydomain=`echo $mydomain | ./tr '[A-Z]' '[a-z]'`
+	;;
+esac
+
+: a little sanity check here
+case "$phostname" in
+'') ;;
+*)
+	case `$phostname | ./tr '[A-Z]' '[a-z]'` in
+	$myhostname$mydomain|$myhostname) ;;
+	*)
+		case "$phostname" in
+		sed*)
+			echo "(That doesn't agree with your whoami.h file, by the way.)"
+			;;
+		*)
+			echo "(That doesn't agree with your $phostname command, by the way.)"
+			;;
+		esac
+	;;
+	esac
+	;;
+esac
+
+: determine the e-mail address of the user who is running us
+$cat <<EOM
+
+I need to get your e-mail address in Internet format if possible, i.e.
+something like user@host.domain. Please answer accurately since I have
+no easy means to double check it. The default value provided below
+is most probably close to reality but may not be valid from outside
+your organization...
+
+EOM
+cont=x
+while test "$cont"; do
+	case "$MAILDOMAIN" in
+	'')
+		if $test -s /etc/mailname; then
+			maildomain=`$cat /etc/mailname`
+		else
+			maildomain="$myhostname$mydomain"
+		fi
+		;;
+	*)  maildomain="$MAILDOMAIN";;
+	esac
+	case "$cf_email" in
+	'') dflt="$cf_by@$maildomain";;
+	*)  dflt="$cf_email";;
+	esac
+	rp='What is your e-mail address?'
+	. ./myread
+	cf_email="$ans"
+	case "$cf_email" in
+	*@*.*) cont='' ;;
+	*)
+		rp='Address does not look like an Internet one.  Use it anyway?'
+		case "$fastread" in
+		yes) dflt=y ;;
+		*) dflt=n ;;
+		esac
+		. ./myread
+		case "$ans" in
+		y*) cont='' ;;
+		*) echo " " ;;
+		esac
+		;;
+	esac
+done
+
+: Ask e-mail of administrator
+$cat <<EOM
+
+If you or somebody else will be maintaining perl at your site, please
+fill in the correct e-mail address here so that they may be contacted
+if necessary. Currently, the "perlbug" program included with perl
+will send mail to this address in addition to perlbug@perl.org. You may
+enter "none" for no administrator.
+
+EOM
+case "$perladmin" in
+'') dflt="$cf_email";;
+*) dflt="$perladmin";;
+esac
+rp='Perl administrator e-mail address'
+. ./myread
+perladmin="$ans"
+
+: determine whether to use a version number suffix for installed binaries
+echo " "
+$cat <<EOM
+Do you want to use a version number suffix for installed binaries? This
+will install 'perl$version' instead of 'perl', and likewise for other
+binaries like 'perldoc' and 'cpan'. This allows many versions of perl
+to be installed side-by-side. Unless you are a developer, you probably
+do *not* want to do this.
+EOM
+case "$versiononly" in
+"$define"|[Yy]*|true) dflt='y' ;;
+*) dflt='n';
+esac
+rp="Do you want to use a version number suffix for installed binaries?"
+. ./myread
+case "$ans" in
+[yY]*)	val="$define";;
+*)	val="$undef" ;;
+esac
+set versiononly
+eval $setvar
+
+case "$versiononly" in
+"$define") inc_version_list=''
+           inc_version_list_init=0
+           ;;
+esac
+
+: figure out how to guarantee perl startup
+: XXX Note that this currently takes advantage of the bug that binexp ignores
+:     the Configure -Dinstallprefix setting, which in turn means that under
+:     relocatable @INC, initialinstalllocation is what binexp started as.
+case "$startperl" in
+'')
+	case "$sharpbang" in
+	*!)
+		$cat <<EOH
+
+I can use the #! construct to start perl on your system. This will
+make startup of perl scripts faster, but may cause problems if you
+want to share those scripts and perl is not in a standard place
+($initialinstalllocation/perl) on all your platforms. The alternative
+is to force a shell by starting the script with a single ':' character.
+
+EOH
+		case "$versiononly" in
+		"$define")      dflt="$initialinstalllocation/perl$version";;
+		*)              dflt="$initialinstalllocation/perl";;
+		esac
+		rp='What shall I put after the #! to start up perl ("none" to not use #!)?'
+		. ./myread
+		case "$ans" in
+		none)	startperl=": # use perl";;
+		*)	startperl="#!$ans"
+			if $test 30 -lt `echo "$ans" | wc -c`; then
+				$cat >&4 <<EOM
+
+WARNING:  Some systems limit the #! command to 32 characters.
+If you experience difficulty running Perl scripts with #!, try
+installing Perl in a directory with a shorter pathname.
+
+EOM
+			fi ;;
+		esac
+		;;
+	*) startperl=": # use perl"
+		;;
+	esac
+	;;
+esac
+echo "I'll use $startperl to start perl scripts."
+
+: figure best path for perl in scripts
+case "$perlpath" in
+'')
+	case "$versiononly" in
+	"$define")	perlpath="$initialinstalllocation/perl$version";;
+	*)		perlpath="$initialinstalllocation/perl";;
+	esac
+	case "$startperl" in
+	*!*) ;;
+	*)
+		$cat <<EOH
+
+I will use the "eval 'exec'" idiom to start Perl on your system.
+I can use the full path of your Perl binary for this purpose, but
+doing so may cause problems if you want to share those scripts and
+Perl is not always in a standard place ($initialinstalllocation/perl).
+
+EOH
+		dflt="$initialinstalllocation/perl"
+		rp="What path shall I use in \"eval 'exec'\"?"
+		. ./myread
+		perlpath="$ans"
+		;;
+	esac
+	;;
+esac
+case "$startperl" in
+*!*)	;;
+*)	echo "I'll use $perlpath in \"eval 'exec'\"" ;;
+esac
+
+: determine where public executable scripts go
+set scriptdir scriptdir
+eval $prefixit
+case "$scriptdir" in
+'')
+	dflt="$bin"
+	: guess some guesses
+	$test -d /usr/share/scripts && dflt=/usr/share/scripts
+	$test -d /usr/share/bin     && dflt=/usr/share/bin
+	$test -d /usr/local/script  && dflt=/usr/local/script
+	$test -d /usr/local/scripts && dflt=/usr/local/scripts
+	$test -d $prefixexp/script  && dflt=$prefixexp/script
+	set dflt
+	eval $prefixup
+	;;
+*)  dflt="$scriptdir"
+	;;
+esac
+$cat <<EOM
+
+Some installations have a separate directory just for executable scripts so
+that they can mount it across multiple architectures but keep the scripts in
+one spot.  You might, for example, have a subdirectory of /usr/share for this.
+Or you might just lump your scripts in with all your other executables.
+
+EOM
+fn=d~
+rp='Where do you keep publicly executable scripts?'
+. ./getfile
+if $test "X$ansexp" != "X$scriptdirexp"; then
+	installscript=''
+fi
+installscriptdir=''
+prefixvar=scriptdir
+. ./setprefixvar
+: A little fix up for an irregularly named variable.
+installscript="$installscriptdir"
+
+: determine where add-on public executables go
+case "$sitebin" in
+'')	dflt=$siteprefix/bin ;;
+*)	dflt=$sitebin ;;
+esac
+fn=d~
+rp='Pathname where the add-on public executables should be installed?'
+. ./getfile
+prefixvar=sitebin
+. ./setprefixvar
+
+: determine where add-on html pages go
+: There is no standard location, so try to copy the previously-selected
+: directory structure for the core html pages.
+case "$sitehtml1dir" in
+'')    dflt=`echo "$html1dir" | $sed "s#^$prefix#$siteprefix#"` ;;
+*)     dflt=$sitehtml1dir ;;
+esac
+case "$dflt" in
+''|' ') dflt=none ;;
+esac
+fn=dn+~
+rp='Pathname where the site-specific html pages should be installed?'
+. ./getfile
+prefixvar=sitehtml1dir
+. ./setprefixvar
+
+: determine where add-on library html pages go
+: There is no standard location, so try to copy the previously-selected
+: directory structure for the core html pages.
+case "$sitehtml3dir" in
+'')    dflt=`echo "$html3dir" | $sed "s#^$prefix#$siteprefix#"` ;;
+*)     dflt=$sitehtml3dir ;;
+esac
+case "$dflt" in
+''|' ') dflt=none ;;
+esac
+fn=dn+~
+rp='Pathname where the site-specific library html pages should be installed?'
+. ./getfile
+prefixvar=sitehtml3dir
+. ./setprefixvar
+
+: determine where add-on manual pages go
+case "$siteman1dir" in
+'')	dflt=`echo $man1dir | $sed "s#^$prefix#$siteprefix#"` ;;
+*)	dflt=$siteman1dir ;;
+esac
+case "$dflt" in
+''|' ') dflt=none ;;
+esac
+fn=dn+~
+rp='Pathname where the site-specific manual pages should be installed?'
+. ./getfile
+prefixvar=siteman1dir
+. ./setprefixvar
+
+: determine where add-on library man pages go
+case "$siteman3dir" in
+'')	dflt=`echo $man3dir | $sed "s#^$prefix#$siteprefix#"` ;;
+*)	dflt=$siteman3dir ;;
+esac
+case "$dflt" in
+''|' ') dflt=none ;;
+esac
+fn=dn+~
+rp='Pathname where the site-specific library manual pages should be installed?'
+. ./getfile
+prefixvar=siteman3dir
+. ./setprefixvar
+
+: determine where add-on public executable scripts go
+case "$sitescript" in
+'')	dflt=$siteprefix/script
+	$test -d $dflt || dflt=$sitebin ;;
+*)  dflt="$sitescript" ;;
+esac
+fn=d~+
+rp='Pathname where add-on public executable scripts should be installed?'
+. ./getfile
+prefixvar=sitescript
+. ./setprefixvar
+
+: see if backtrace exists
+set backtrace d_backtrace
+eval $inlibc
+
+: Check if C backtrace is actually supported.
+case "$usecbacktrace" in
+  "") usecbacktrace=$undef ;;
+  [yY]*|true|$define)
+    case "$d_backtrace" in
+      [yY]*|true|$define)
+        ;;
+      *)
+        echo "This system does not support backtrace" >&4
+        usecbacktrace=$undef
+        ;;
+      esac
+    ;;
+  esac
+
+: Check if faststdio is requested and available
+case "$usefaststdio" in
+$define|true|[yY]*|'')
+	xversion=`awk '/define[ 	]+PERL_VERSION/ {print $3}' $rsrc/patchlevel.h`
+	case "$xversion" in
+	[68])	dflt='y' ;;
+	*)	dflt='n' ;;
+	esac
+	;;
+*) dflt='n';;
+esac
+cat <<EOM
+
+Perl can be built to use 'fast stdio', which means using the stdio
+library but also directly manipulating the stdio buffers to enable
+faster I/O.  Using stdio is better for backward compatibility (especially
+for Perl extensions), but on the other hand since Perl 5.8 the 'perlio'
+interface has been preferred instead of stdio.
+
+If this doesn't make any sense to you, just accept the default '$dflt'.
+EOM
+rp='Use the "fast stdio" if available?'
+. ./myread
+case "$ans" in
+y|Y)	val="$define" ;;
+*)      val="$undef" ;;
+esac
+set usefaststdio
+eval $setvar
+
+: define an is-a-typedef? function
+typedef='type=$1; var=$2; def=$3; shift; shift; shift; inclist=$@;
+case "$inclist" in
+"") inclist="sys/types.h";;
+esac;
+eval "varval=\$$var";
+case "$varval" in
+"")
+	$rm -f temp.c;
+	for inc in $inclist; do
+		echo "#include <$inc>" >>temp.c;
+	done;
+	echo "#ifdef $type" >> temp.c;
+	echo "printf(\"We have $type\");" >> temp.c;
+	echo "#endif" >> temp.c;
+	$cppstdin $cppflags $cppminus < temp.c >temp.E 2>/dev/null;
+	if $contains $type temp.E >/dev/null 2>&1; then
+		eval "$var=\$type";
+	else
+		eval "$var=\$def";
+	fi;
+	$rm -f temp.?;;
+*) eval "$var=\$varval";;
+esac'
+
+: define an is-a-typedef? function that prompts if the type is not available.
+typedef_ask='type=$1; var=$2; def=$3; shift; shift; shift; inclist=$@;
+case "$inclist" in
+"") inclist="sys/types.h";;
+esac;
+eval "varval=\$$var";
+case "$varval" in
+"")
+	$rm -f temp.c;
+	for inc in $inclist; do
+		echo "#include <$inc>" >>temp.c;
+	done;
+	echo "#ifdef $type" >> temp.c;
+	echo "printf(\"We have $type\");" >> temp.c;
+	echo "#endif" >> temp.c;
+	$cppstdin $cppflags $cppminus < temp.c >temp.E 2>/dev/null;
+	echo " " ;
+	echo "$rp" | $sed -e "s/What is/Looking for/" -e "s/?/./";
+	if $contains $type temp.E >/dev/null 2>&1; then
+		echo "$type found." >&4;
+		eval "$var=\$type";
+	else
+		echo "$type NOT found." >&4;
+		dflt="$def";
+		. ./myread ;
+		eval "$var=\$ans";
+	fi;
+	$rm -f temp.?;;
+*) eval "$var=\$varval";;
+esac'
+
+: see what type lseek is declared as in the kernel
+rp="What is the type used for lseek's offset on this system?"
+set off_t lseektype long stdio.h sys/types.h
+eval $typedef_ask
+
+echo " "
+echo "Checking to see how big your file offsets are..." >&4
+$cat >try.c <<EOCP
+#include <sys/types.h>
+#include <stdio.h>
+int main()
+{
+    printf("%d\n", (int)sizeof($lseektype));
+    return(0);
+}
+EOCP
+set try
+if eval $compile_ok; then
+	lseeksize=`$run ./try`
+	echo "Your file offsets are $lseeksize bytes long."
+else
+	dflt=$longsize
+	echo " "
+	echo "(I can't seem to compile the test program.  Guessing...)"
+	rp="What is the size of your file offsets (in bytes)?"
+	. ./myread
+	lseeksize="$ans"
+fi
+$rm_try
+
+: see what type file positions are declared as in the library
+rp="What is the type for file position used by fsetpos()?"
+set fpos_t fpostype long stdio.h sys/types.h
+eval $typedef_ask
+
+: Check size for Fpos_t
+echo " "
+case "$fpostype" in
+*_t) zzz="$fpostype"	;;
+*)   zzz="fpos_t"	;;
+esac
+echo "Checking the size of $zzz..." >&4
+cat > try.c <<EOCP
+#include <sys/types.h>
+#include <stdio.h>
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+int main() {
+    printf("%d\n", (int)sizeof($fpostype));
+    exit(0);
+}
+EOCP
+set try
+if eval $compile_ok; then
+	yyy=`$run ./try`
+	case "$yyy" in
+	'')	fpossize=4
+		echo "(I can't execute the test program--guessing $fpossize.)" >&4
+		;;
+	*)	fpossize=$yyy
+		echo "Your $zzz is $fpossize bytes long."
+		;;
+	esac
+else
+	dflt="$longsize"
+	echo " " >&4
+	echo "(I can't compile the test program.  Guessing...)" >&4
+	rp="What is the size of your file positions (in bytes)?"
+	. ./myread
+	fpossize="$ans"
+fi
+
+: Check for large file support
+# Backward compatibility (uselfs is deprecated).
+case "$uselfs" in
+"$define"|true|[yY]*)
+	cat <<EOM >&4
+
+*** Configure -Duselfs is deprecated, using -Duselargefiles instead.
+EOM
+	uselargefiles="$define"
+	;;
+esac
+
+case "$lseeksize:$fpossize" in
+8:8) cat <<EOM
+
+You can have files larger than 2 gigabytes.
+EOM
+   val="$define" ;;
+*)    case "$uselargefiles" in
+   "$undef"|false|[nN]*) dflt='n' ;;
+   *)	dflt='y' ;;
+   esac
+   cat <<EOM
+
+Perl can be built to understand large files (files larger than 2 gigabytes)
+on some systems.  To do so, Configure can be run with -Duselargefiles.
+
+If this doesn't make any sense to you, just accept the default '$dflt'.
+EOM
+   rp='Try to understand large files, if available?'
+   . ./myread
+   case "$ans" in
+   y|Y)	val="$define" ;;
+   *)	val="$undef"  ;;
+   esac
+   ;;
+esac
+set uselargefiles
+eval $setvar
+: Look for a hint-file generated 'call-back-unit'.  If the
+: user has specified that a large files perl is to be built,
+: we may need to set or change some other defaults.
+if $test -f uselargefiles.cbu; then
+	echo "Your platform has some specific hints regarding large file builds, using them..."
+	. ./uselargefiles.cbu
+fi
+case "$uselargefiles" in
+"$define")
+	if $test -f uselargefiles.cbu; then
+		echo " "
+		echo "Rechecking to see how big your file offsets are..." >&4
+		$cat >try.c <<EOCP
+#include <sys/types.h>
+#include <stdio.h>
+int main()
+{
+    printf("%d\n", (int)sizeof($lseektype));
+    return(0);
+}
+EOCP
+		set try
+		if eval $compile_ok; then
+			lseeksize=`$run ./try`
+			$echo "Your file offsets are now $lseeksize bytes long."
+		else
+			dflt="$lseeksize"
+			echo " "
+			echo "(I can't seem to compile the test program.  Guessing...)"
+			rp="What is the size of your file offsets (in bytes)?"
+			. ./myread
+			lseeksize="$ans"
+		fi
+		case "$fpostype" in
+		*_t) zzz="$fpostype"	;;
+		*)   zzz="fpos_t"	;;
+		esac
+		$echo $n "Rechecking the size of $zzz...$c" >&4
+		$cat > try.c <<EOCP
+#include <sys/types.h>
+#include <stdio.h>
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+int main() {
+    printf("%d\n", (int)sizeof($fpostype));
+    return(0);
+}
+EOCP
+		set try
+		if eval $compile_ok; then
+			yyy=`$run ./try`
+			dflt="$lseeksize"
+			case "$yyy" in
+			'')	echo " "
+				echo "(I can't execute the test program--guessing $fpossize.)" >&4
+				;;
+			*)	fpossize=$yyy
+				echo " $fpossize bytes." >&4
+				;;
+			esac
+		else
+			dflt="$fpossize"
+			echo " "
+			echo "(I can't compile the test program.  Guessing...)" >&4
+			rp="What is the size of your file positions (in bytes)?"
+			. ./myread
+			fpossize="$ans"
+		fi
+		$rm_try
+	fi
+	;;
+esac
+
+: Check if we want perlio
+useperlio="$define"
+
+: Set the vendorbin variables
+case "$vendorprefix" in
+'')	d_vendorbin="$undef"
+	vendorbin=''
+	vendorbinexp=''
+	;;
+*)	d_vendorbin="$define"
+	: determine where vendor-supplied executables go.
+	case "$vendorbin" in
+	'') dflt=$vendorprefix/bin ;;
+	*)	dflt="$vendorbin" ;;
+	esac
+	fn=d~+
+	rp='Pathname for the vendor-supplied executables directory?'
+	. ./getfile
+	vendorbin="$ans"
+	vendorbinexp="$ansexp"
+	;;
+esac
+prefixvar=vendorbin
+. ./installprefix
+
+: Set the vendorhtml1dir variables
+case "$vendorprefix" in
+'')	vendorhtml1dir=''
+	vendorhtml1direxp=''
+	;;
+*)	: determine where vendor-supplied html pages go.
+	: There is no standard location, so try to copy the previously-selected
+	: directory structure for the core html pages.
+	: XXX Better default suggestions would be welcome.
+	case "$vendorhtml1dir" in
+	'')	dflt=`echo "$html1dir" | $sed "s#^$prefix#$vendorprefix#"` ;;
+	*)	dflt=$vendorhtml1dir ;;
+	esac
+	case "$dflt" in
+	''|' ') dflt=none ;;
+	esac
+	fn=dn+~
+	rp='Pathname for the vendor-supplied html pages?'
+	. ./getfile
+	vendorhtml1dir="$ans"
+	vendorhtml1direxp="$ansexp"
+	;;
+esac
+: Use ' ' for none so value is preserved next time through Configure
+$test X"$vendorhtml1dir" = "X" && vendorhtml1dir=' '
+prefixvar=vendorhtml1dir
+. ./installprefix
+
+: Set the vendorhtml3dir variables
+case "$vendorprefix" in
+'')	vendorhtml3dir=''
+	vendorhtml3direxp=''
+	;;
+*)	: determine where vendor-supplied module html pages go.
+	: There is no standard location, so try to copy the previously-selected
+	: directory structure for the core html pages.
+	: XXX Better default suggestions would be welcome.
+	case "$vendorhtml3dir" in
+	'')	dflt=`echo "$html3dir" | $sed "s#^$prefix#$vendorprefix#"` ;;
+	*)	dflt=$vendorhtml3dir ;;
+	esac
+	case "$dflt" in
+	''|' ') dflt=none ;;
+	esac
+	fn=dn+~
+	rp='Pathname for the vendor-supplied html pages?'
+	. ./getfile
+	vendorhtml3dir="$ans"
+	vendorhtml3direxp="$ansexp"
+	;;
+esac
+: Use ' ' for none so value is preserved next time through Configure
+$test X"$vendorhtml3dir" = "X" && vendorhtml3dir=' '
+prefixvar=vendorhtml3dir
+. ./installprefix
+
+: Set the vendorman1dir variables
+case "$vendorprefix" in
+'')	vendorman1dir=''
+	vendorman1direxp=''
+	;;
+*)	: determine where vendor-supplied manual pages go.
+	case "$vendorman1dir" in
+	'') dflt=`echo "$man1dir" | $sed "s#^$prefix#$vendorprefix#"` ;;
+	*)	dflt=$vendorman1dir ;;
+	esac
+	case "$dflt" in
+	''|' ') dflt=none ;;
+	esac
+	fn=nd~+
+	rp='Pathname for the vendor-supplied manual section 1 pages?'
+	. ./getfile
+	vendorman1dir="$ans"
+	vendorman1direxp="$ansexp"
+	;;
+esac
+: Use ' ' for none so value is preserved next time through Configure
+$test X"$vendorman1dir" = "X" && vendorman1dir=' '
+prefixvar=vendorman1dir
+. ./installprefix
+
+: Set the vendorman3dir variables
+case "$vendorprefix" in
+'')	vendorman3dir=''
+	vendorman3direxp=''
+	;;
+*)	: determine where vendor-supplied module manual pages go.
+	case "$vendorman3dir" in
+	'') dflt=`echo "$man3dir" | $sed "s#^$prefix#$vendorprefix#"` ;;
+	*)	dflt=$vendorman3dir ;;
+	esac
+	case "$dflt" in
+	''|' ') dflt=none ;;
+	esac
+	fn=nd~+
+	rp='Pathname for the vendor-supplied manual section 3 pages?'
+	. ./getfile
+	vendorman3dir="$ans"
+	vendorman3direxp="$ansexp"
+	;;
+esac
+: Use ' ' for none so value is preserved next time through Configure
+$test X"$vendorman3dir" = "X" && vendorman3dir=' '
+prefixvar=vendorman3dir
+. ./installprefix
+
+: Set the vendorscript variables
+case "$vendorprefix" in
+'')	d_vendorscript="$undef"
+	vendorscript=''
+	vendorscriptexp=''
+	;;
+*)	d_vendorscript="$define"
+	: determine where vendor-supplied scripts go.
+	case "$vendorscript" in
+	'')	dflt=$vendorprefix/script
+		$test -d $dflt || dflt=$vendorbin ;;
+	*)  dflt="$vendorscript" ;;
+	esac
+	$cat <<EOM
+
+The installation process will create a directory for
+vendor-supplied scripts.
+
+EOM
+	fn=d~+
+	rp='Pathname for the vendor-supplied scripts directory?'
+	. ./getfile
+	vendorscript="$ans"
+	vendorscriptexp="$ansexp"
+	;;
+esac
+prefixvar=vendorscript
+. ./installprefix
+
+: see if qgcvt exists
+set qgcvt d_qgcvt
+eval $inlibc
+
+: Check what kind of doubles your system has
+$echo "Checking the kind of doubles you have..." >&4
+$cat >try.c <<EOP
+#$i_stdlib I_STDLIB
+#define DOUBLESIZE $doublesize
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#include <stdio.h>
+static const double d = -0.1;
+int main() {
+  unsigned const char* b = (unsigned const char*)(&d);
+#if DOUBLESIZE == 4
+  if (b[0] == 0xCD && b[3] == 0xBD) {
+    /* IEEE 754 32-bit little-endian */
+    printf("1\n");
+    exit(0);
+  }
+  if (b[0] == 0xBD && b[3] == 0xCD) {
+    /* IEEE 754 32-bit big-endian */
+    printf("2\n");
+    exit(0);
+  }
+  if (b[0] == 0xCC && b[3] == 0xCC) {
+    /* VAX format F, 32-bit PDP-style mixed endian. */
+    printf("9\n");
+    exit(0);
+  }
+  if (b[0] == 0xC0 && b[3] == 0x9A) {
+    /* IBM single 32-bit */
+    printf("12\n");
+    exit(0);
+  }
+#endif
+#if DOUBLESIZE == 8
+  if (b[0] == 0x9A && b[7] == 0xBF) {
+    /* IEEE 754 64-bit little-endian */
+    printf("3\n");
+    exit(0);
+  }
+  if (b[0] == 0xBF && b[7] == 0x9A) {
+    /* IEEE 754 64-bit big-endian */
+    printf("4\n");
+    exit(0);
+  }
+  if (b[0] == 0x99 && b[3] == 0xBF && b[4] == 0x9A && b[7] == 0x99) {
+   /* ARM mixed endian: two little-endian 32-bit floats, in big endian order:
+    * 4 5 6 7 0 1 2 3 (MSB = 7, LSB = 0)
+    * 99 99 b9 bf 9a 99 99 99 */
+    printf("7\n");
+    exit(0);
+  }
+  if (b[0] == 0x99 && b[3] == 0x9A && b[4] == 0xBF && b[7] == 0x99) {
+   /* The opposite of case 7, mixed endian: two big-endian 32-bit floats,
+    * in little endian order: 3 2 1 0 7 6 5 4 (MSB = 7, LSB = 0)
+    * 99 99 99 9a bf b9 99 99 */
+    printf("8\n");
+    exit(0);
+  }
+  if (b[0] == 0xCC && b[7] == 0xCC) {
+   /* VAX format D, 64-bit PDP-style mixed endian. */
+    printf("10\n");
+    exit(0);
+  }
+  if (b[0] == 0xD9 && b[7] == 0x99) {
+   /* VAX format G, 64-bit PDP-style mixed endian. */
+    printf("11\n");
+    exit(0);
+  }
+  if (b[0] == 0xC0 && b[7] == 0x9A) {
+    /* IBM double 64-bit */
+    printf("13\n");
+    exit(0);
+  }
+  if (b[0] == 0xBF && b[7] == 0xCD) {
+    /* CRAY single 64-bit */
+    printf("14\n");
+    exit(0);
+  }
+#endif
+#if DOUBLESIZE == 16
+  if (b[0] == 0x9A && b[15] == 0xBF) {
+    /* IEEE 754 128-bit little-endian */
+    printf("5\n");
+    exit(0);
+  }
+  if (b[0] == 0xBF && b[15] == 0x9A) {
+    /* IEEE 754 128-bit big-endian */
+    printf("6\n");
+    exit(0);
+  }
+#endif
+  /* Then there are old mainframe/miniframe formats like IBM and CRAY.
+   * Whether those environments can still build Perl is debatable. */
+  printf("-1\n"); /* unknown */
+  exit(0);
+}
+EOP
+set try
+if eval $compile; then
+    doublekind=`$run ./try`
+else
+    doublekind=-1
+fi
+case "$doublekind" in
+1) echo "You have IEEE 754 32-bit little endian doubles." >&4 ;;
+2) echo "You have IEEE 754 32-bit big endian doubles." >&4 ;;
+3) echo "You have IEEE 754 64-bit little endian doubles." >&4 ;;
+4) echo "You have IEEE 754 64-bit big endian doubles." >&4 ;;
+5) echo "You have IEEE 754 128-bit little endian doubles." >&4 ;;
+6) echo "You have IEEE 754 128-bit big endian doubles." >&4 ;;
+7) echo "You have IEEE 754 64-bit mixed endian doubles (32-bit LEs in BE)." >&4 ;;
+8) echo "You have IEEE 754 64-bit mixed endian doubles (32-bit BEs in LE)." >&4 ;;
+9) echo "You have VAX format F 32-bit PDP-style mixed endian doubles." >&4 ;;
+10) echo "You have VAX format D 64-bit PDP-style mixed endian doubles." >&4 ;;
+11) echo "You have VAX format G 64-bit PDP-style mixed endian doubles." >&4 ;;
+12) echo "You have IBM short 32-bit doubles." >&4 ;;
+13) echo "You have IBM long 64-bit doubles." >&4 ;;
+14) echo "You have Cray single 64-bit doubles." >&4 ;;
+*) echo "Cannot figure out your double.  You Cyber, or something?" >&4 ;;
+esac
+d_double_style_ieee=$undef
+d_double_style_vax=$undef
+d_double_style_ibm=$undef
+d_double_style_cray=$undef
+case "$doublekind" in
+1|2|3|4|5|6|7|8) d_double_style_ieee=$define ;;
+9|10|11) d_double_style_vax=$define ;;
+12|13) d_double_style_ibm=$define ;;
+14) d_double_style_cray=$define ;;
+esac
+case "$d_double_style_ieee" in
+$define)
+    d_double_has_inf=$define
+    d_double_has_nan=$define
+    d_double_has_negative_zero=$define
+    d_double_has_subnormals=$define
+    ;;
+*)
+    d_double_has_inf=$undef
+    d_double_has_nan=$undef
+    d_double_has_negative_zero=$undef
+    d_double_has_subnormals=$undef
+    ;;
+esac
+$rm_try
+
+: Check print/scan long double stuff
+echo " "
+
+if $test X"$d_longdbl" = X"$define"; then
+
+echo "Checking how to print long doubles..." >&4
+
+if $test X"$sPRIfldbl" = X -a X"$doublesize" = X"$longdblsize"; then
+	$cat >try.c <<'EOCP'
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+  double d = 123.456;
+  printf("%.3f\n", d);
+}
+EOCP
+	set try
+	if eval $compile; then
+		yyy=`$run ./try`
+		case "$yyy" in
+		123.456)
+			sPRIfldbl='"f"'; sPRIgldbl='"g"'; sPRIeldbl='"e"';
+			sPRIFUldbl='"F"'; sPRIGUldbl='"G"'; sPRIEUldbl='"E"';
+			echo "We will use %f."
+			;;
+		esac
+	fi
+fi
+
+if $test X"$sPRIfldbl" = X; then
+	$cat >try.c <<'EOCP'
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+  long double d = 123.456;
+  printf("%.3Lf\n", d);
+}
+EOCP
+	set try
+	if eval $compile; then
+		yyy=`$run ./try`
+		case "$yyy" in
+		123.456)
+			sPRIfldbl='"Lf"'; sPRIgldbl='"Lg"'; sPRIeldbl='"Le"';
+			sPRIFUldbl='"LF"'; sPRIGUldbl='"LG"'; sPRIEUldbl='"LE"';
+			echo "We will use %Lf."
+			;;
+		esac
+	fi
+fi
+
+if $test X"$sPRIfldbl" = X; then
+	$cat >try.c <<'EOCP'
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+  long double d = 123.456;
+  printf("%.3llf\n", d);
+}
+EOCP
+	set try
+	if eval $compile; then
+		yyy=`$run ./try`
+		case "$yyy" in
+		123.456)
+			sPRIfldbl='"llf"'; sPRIgldbl='"llg"'; sPRIeldbl='"lle"';
+			sPRIFUldbl='"llF"'; sPRIGUldbl='"llG"'; sPRIEUldbl='"llE"';
+			echo "We will use %llf."
+			;;
+		esac
+	fi
+fi
+
+if $test X"$sPRIfldbl" = X; then
+	$cat >try.c <<'EOCP'
+#include <sys/types.h>
+#include <stdio.h>
+int main() {
+  long double d = 123.456;
+  printf("%.3lf\n", d);
+}
+EOCP
+	set try
+	if eval $compile; then
+		yyy=`$run ./try`
+		case "$yyy" in
+		123.456)
+			sPRIfldbl='"lf"'; sPRIgldbl='"lg"'; sPRIeldbl='"le"';
+			sPRIFUldbl='"lF"'; sPRIGUldbl='"lG"'; sPRIEUldbl='"lE"';
+			echo "We will use %lf."
+			;;
+		esac
+	fi
+fi
+
+if $test X"$sPRIfldbl" = X; then
+	echo "Cannot figure out how to print long doubles." >&4
+else
+	sSCNfldbl=$sPRIfldbl	# expect consistency
+fi
+
+$rm_try
+
+fi # d_longdbl
+
+case "$sPRIfldbl" in
+'')	d_PRIfldbl="$undef"; d_PRIgldbl="$undef"; d_PRIeldbl="$undef";
+	d_PRIFUldbl="$undef"; d_PRIGUldbl="$undef"; d_PRIEUldbl="$undef";
+	d_SCNfldbl="$undef";
+	;;
+*)	d_PRIfldbl="$define"; d_PRIgldbl="$define"; d_PRIeldbl="$define";
+	d_PRIFUldbl="$define"; d_PRIGUldbl="$define"; d_PRIEUldbl="$define";
+	d_SCNfldbl="$define";
+	;;
+esac
+
+: Before committing on uselongdouble, see whether that looks sane.
+if $test "$uselongdouble" = "$define"; then
+    message=""
+    echo " "
+    echo "Checking if your long double math functions work right..." >&4
+    $cat > try.c <<EOF
+#include <math.h>
+#include <stdio.h>
+int main() {
+  printf("%"$sPRIgldbl"\n", sqrtl(logl(expl(cosl(sinl(0.0L))))+powl(2.0L, 3.0L)));
+}
+EOF
+    case "$osname:$gccversion" in
+    aix:)	saveccflags="$ccflags"
+		ccflags="$ccflags -qlongdouble" ;; # to avoid core dump
+    esac
+    set try
+    if eval $compile_ok; then
+      yyy=`$run ./try`
+    fi
+    case "$yyy" in
+    3) echo "Your long double math functions are working correctly." >&4 ;;
+    *) echo "Your long double math functions are broken, not using long doubles." >&4
+       uselongdouble=$undef
+       ;;
+    esac
+    $rm_try
+    case "$osname:$gccversion" in
+    aix:)	ccflags="$saveccflags" ;; # restore
+    esac
+fi
+
+: Check how to convert floats to strings.
+
+if test "X$d_Gconvert" = X; then
+
+echo " "
+echo "Checking for an efficient way to convert floats to strings."
+echo " " > try.c
+case "$uselongdouble" in
+"$define") echo "#define USE_LONG_DOUBLE" >>try.c ;;
+esac
+case "$d_longdbl" in
+"$define") echo "#define HAS_LONG_DOUBLE" >>try.c ;;
+esac
+case "$d_PRIgldbl" in
+"$define") echo "#define HAS_PRIgldbl"    >>try.c ;;
+esac
+$cat >>try.c <<EOP
+#ifdef TRY_gconvert
+#define Gconvert(x,n,t,b) gconvert((x),(n),(t),(b))
+const char *myname = "gconvert";
+#endif
+#ifdef TRY_gcvt
+#define Gconvert(x,n,t,b) gcvt((x),(n),(b))
+const char *myname = "gcvt";
+#endif
+#ifdef TRY_qgcvt
+#define Gconvert(x,n,t,b) qgcvt((x),(n),(b))
+const char *myname = "qgcvt";
+#define DOUBLETYPE long double
+#endif
+#ifdef TRY_sprintf
+#if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
+#ifdef HAS_PRIgldbl
+#define Gconvert(x,n,t,b) sprintf((b),"%.*"$sPRIgldbl,(n),(x))
+#else
+#define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(double)(x))
+#endif
+#else
+#define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x))
+#endif
+const char *myname = "sprintf";
+#endif
+
+#ifndef DOUBLETYPE
+#if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
+#define DOUBLETYPE long double
+#else
+#define DOUBLETYPE double
+#endif
+#endif
+
+#include <stdio.h>
+
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#include <string.h>
+
+void checkit(const char *expect, char *got)
+{
+    if (strcmp(expect, got)) {
+		printf("%s oddity:  Expected %s, got %s\n",
+			myname, expect, got);
+		exit(1);
+	}
+}
+
+void lencheck(int expect, int got)
+{
+    if (expect != got) {
+		printf("%s length mismatch:  Expected %d, got %d\n",
+			myname, expect, got);
+		exit(1);
+	}
+}
+
+int main()
+{
+	char buf[64];
+	buf[63] = '\0';
+
+	/* This must be 1st test on (which?) platform */
+	/* Alan Burlison <AlanBurlsin@unn.unisys.com> */
+	Gconvert((DOUBLETYPE)0.1, 8, 0, buf);
+	checkit("0.1", buf);
+
+	Gconvert((DOUBLETYPE)0.01, 8, 0, buf);
+	checkit("0.01", buf);
+
+	Gconvert((DOUBLETYPE)0.001, 8, 0, buf);
+	checkit("0.001", buf);
+
+	Gconvert((DOUBLETYPE)0.0001, 8, 0, buf);
+	checkit("0.0001", buf);
+
+	Gconvert((DOUBLETYPE)0.00009, 8, 0, buf);
+	if (strlen(buf) > 5)
+	    checkit("9e-005", buf); /* for Microsoft ?? */
+	else
+	    checkit("9e-05", buf);
+
+	Gconvert((DOUBLETYPE)1.0, 8, 0, buf);
+	checkit("1", buf);
+
+	Gconvert((DOUBLETYPE)1.1, 8, 0, buf);
+	checkit("1.1", buf);
+
+	Gconvert((DOUBLETYPE)1.01, 8, 0, buf);
+	checkit("1.01", buf);
+
+	Gconvert((DOUBLETYPE)1.001, 8, 0, buf);
+	checkit("1.001", buf);
+
+	Gconvert((DOUBLETYPE)1.0001, 8, 0, buf);
+	checkit("1.0001", buf);
+
+	Gconvert((DOUBLETYPE)1.00001, 8, 0, buf);
+	checkit("1.00001", buf);
+
+	Gconvert((DOUBLETYPE)1.000001, 8, 0, buf);
+	checkit("1.000001", buf);
+
+	Gconvert((DOUBLETYPE)0.0, 8, 0, buf);
+	checkit("0", buf);
+
+	Gconvert((DOUBLETYPE)-1.0, 8, 0, buf);
+	checkit("-1", buf);
+
+	/* Some Linux gcvt's give 1.e+5 here. */
+	Gconvert((DOUBLETYPE)100000.0, 8, 0, buf);
+	checkit("100000", buf);
+
+	/* Some Linux gcvt's give -1.e+5 here. */
+	Gconvert((DOUBLETYPE)-100000.0, 8, 0, buf);
+	checkit("-100000", buf);
+
+	Gconvert((DOUBLETYPE)123.456, 8, 0, buf);
+	checkit("123.456", buf);
+
+	/* Testing of 1e+129 in bigintpm.t must not get extra '.' here. */
+	Gconvert((DOUBLETYPE)1e34, 8, 0, buf);
+	/* 34 should be enough to scare even long double
+	 * places into using the e notation. */
+	if (strlen(buf) > 5)
+	    checkit("1e+034", buf); /* for Microsoft */
+	else
+	    checkit("1e+34", buf);
+
+	/* Test for an Ubuntu/Debian bug in gcvt and qgcvt. See:        *
+	 * https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1899553 */
+
+	Gconvert((DOUBLETYPE)0.4, 53, 0, buf);
+	lencheck(55, (int)strlen(buf));
+
+	/* For Perl, if you add additional tests here, also add them to
+	 * t/base/num.t for benefit of platforms not using Configure or
+	 * overriding d_Gconvert */
+
+	exit(0);
+}
+EOP
+: first add preferred functions to our list
+xxx_list=""
+for xxx_convert in $gconvert_preference; do
+    case $xxx_convert in
+    gcvt|gconvert|sprintf) xxx_list="$xxx_list $xxx_convert" ;;
+    *) echo "Discarding unrecognized gconvert_preference $xxx_convert" >&4 ;;
+    esac
+done
+: then add any others
+for xxx_convert in gconvert gcvt sprintf; do
+    case "$xxx_list" in
+    *$xxx_convert*) ;;
+    *) xxx_list="$xxx_list $xxx_convert" ;;
+    esac
+done
+
+case "$d_longdbl$uselongdouble" in
+"$define$define")
+    : again, add preferred functions to our list first
+    xxx_ld_list=""
+    for xxx_convert in $gconvert_ld_preference; do
+        case $xxx_convert in
+        qgcvt|gcvt|gconvert|sprintf) xxx_ld_list="$xxx_ld_list $xxx_convert" ;;
+        *) echo "Discarding unrecognized gconvert_ld_preference $xxx_convert" ;;
+        esac
+    done
+    : then add qgcvt, sprintf--then, in xxx_list order, gconvert and gcvt
+    for xxx_convert in qgcvt sprintf $xxx_list; do
+        case "$xxx_ld_list" in
+        $xxx_convert*|*" $xxx_convert"*) ;;
+        *) xxx_ld_list="$xxx_ld_list $xxx_convert" ;;
+        esac
+    done
+    : if sprintf cannot do long doubles, move it to the end
+    if test "$d_PRIgldbl" != "$define"; then
+        xxx_ld_list="`echo $xxx_ld_list|sed s/sprintf//` sprintf"
+    fi
+    : if no qgcvt, remove it
+    if test "$d_qgcvt" != "$define"; then
+        xxx_ld_list="`echo $xxx_ld_list|sed s/qgcvt//`"
+    fi
+    : use the ld_list
+    xxx_list="$xxx_ld_list"
+    ;;
+esac
+
+for xxx_convert in $xxx_list; do
+	echo "Trying $xxx_convert..."
+	$rm -f try try$_o core
+	set try -DTRY_$xxx_convert
+	if eval $compile; then
+		echo "$xxx_convert() found." >&4
+		if $run ./try; then
+			echo "I'll use $xxx_convert to convert floats into a string." >&4
+			break;
+		else
+			echo "...But $xxx_convert didn't work as I expected."
+			xxx_convert=''
+		fi
+	else
+		echo "$xxx_convert NOT found." >&4
+		xxx_convert=''
+	fi
+done
+
+if test X$xxx_convert = X; then
+    echo "*** WHOA THERE!!! ***" >&4
+    echo "None of ($xxx_list)  seemed to work properly.  I'll use sprintf." >&4
+    xxx_convert=sprintf
+fi
+
+case "$xxx_convert" in
+gconvert) d_Gconvert='gconvert((x),(n),(t),(b))' ;;
+gcvt) d_Gconvert='gcvt((x),(n),(b))' ;;
+qgcvt) d_Gconvert='qgcvt((x),(n),(b))' ;;
+*) case "$uselongdouble$d_longdbl$d_PRIgldbl" in
+   "$define$define$define")
+      d_Gconvert="sprintf((b),\"%.*\"$sPRIgldbl,(n),(x))" ;;
+   "$define$define$undef")
+      d_Gconvert='sprintf((b),"%.*g",(n),(double)(x))' ;;
+   *) d_Gconvert='sprintf((b),"%.*g",(n),(x))' ;;
+   esac
+   ;;
+esac
+
+fi
+$rm_try
+
+: see if _fwalk exists
+set fwalk d__fwalk
+eval $inlibc
+
+: see if accept4 exists
+set accept4 d_accept4
+eval $inlibc
+
+: Initialize h_fcntl
+h_fcntl=false
+
+: Initialize h_sysfile
+h_sysfile=false
+
+: access call always available on UNIX
+set access d_access
+eval $inlibc
+
+: locate the flags for 'access()'
+case "$d_access" in
+"$define")
+	echo " "
+	$cat >access.c <<EOCP
+#include <sys/types.h>
+#ifdef I_FCNTL
+#include <fcntl.h>
+#endif
+#ifdef I_SYS_FILE
+#include <sys/file.h>
+#endif
+#ifdef I_UNISTD
+#include <unistd.h>
+#endif
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+int main() {
+	exit(R_OK);
+}
+EOCP
+	: check sys/file.h first, no particular reason here
+	if $test `./findhdr sys/file.h` && \
+		$cc -o access $cppflags -DI_SYS_FILE access.c >/dev/null 2>&1 ; then
+		h_sysfile=true;
+		echo "<sys/file.h> defines the *_OK access constants." >&4
+	elif $test `./findhdr fcntl.h` && \
+		$cc -o access $cppflags -DI_FCNTL access.c >/dev/null 2>&1 ; then
+		h_fcntl=true;
+		echo "<fcntl.h> defines the *_OK access constants." >&4
+	elif $test `./findhdr unistd.h` && \
+		$cc -o access $cppflags -DI_UNISTD access.c >/dev/null 2>&1 ; then
+		echo "<unistd.h> defines the *_OK access constants." >&4
+	else
+		echo "I can't find the four *_OK access constants--I'll use mine." >&4
+	fi
+	;;
+esac
+$rm -f access*
+
+: see if accessx exists
+set accessx d_accessx
+eval $inlibc
+
+: see if acosh exists
+set acosh d_acosh
+eval $inlibc
+
+: see if aintl exists
+set aintl d_aintl
+eval $inlibc
+
+: see if alarm exists
+set alarm d_alarm
+eval $inlibc
+
+: see if 64bit time functions exists
+
+set ctime64 d_ctime64
+eval $inlibc
+
+set localtime64 d_localtime64
+eval $inlibc
+
+set gmtime64 d_gmtime64
+eval $inlibc
+
+set mktime64 d_mktime64
+eval $inlibc
+
+set difftime64 d_difftime64
+eval $inlibc
+
+set asctime64 d_asctime64
+eval $inlibc
+
+: see if POSIX threads are available
+set pthread.h i_pthread
+eval $inhdr
+
+: define a function to check prototypes
+$cat > protochk <<EOSH
+$startsh
+cc="$cc"
+optimize="$optimize"
+ccflags="$ccflags"
+define="$define"
+rm_try="$rm_try"
+usethreads=$usethreads
+i_pthread=$i_pthread
+pthread_h_first=$pthread_h_first
+EOSH
+
+$cat >> protochk <<'EOSH'
+
+$rm_try
+foo="$1"
+shift
+while test $# -ge 2; do
+	case "$1" in
+		$define) echo "#include <$2>" >> try.c ;;
+		literal) echo "$2" >> try.c ;;
+	esac
+    # Extra magic for the benefit of systems that need pthread.h
+    # to be included early to correctly detect threadsafe functions.
+    # Such functions must guarantee themselves, though, that the usethreads
+    # and i_pthread have been defined, before calling protochk.
+    if test "$usethreads" = "$define" -a "$i_pthread" = "$define" -a "$pthread_h_first" = "$define" -a "$pthread_h_done" = ""; then
+	echo "#include <pthread.h>" >> try.c
+	pthread_h_done=yes
+    fi
+    shift 2
+done
+cat >> try.c <<'EOCP'
+#define	_(args) args
+EOCP
+echo "$foo" >> try.c
+echo 'int no_real_function_has_this_name _((void)) { return 0; }' >> try.c
+$cc $optimize $ccflags -c try.c > /dev/null 2>&1
+status=$?
+$rm_try
+exit $status
+EOSH
+chmod +x protochk
+$eunicefix protochk
+
+: Define hasproto macro for Configure internal use
+hasproto='varname=$1; func=$2; shift; shift;
+while $test $# -ge 2; do
+	case "$1" in
+	$define) echo "#include <$2>";;
+	literal) echo "$2" ;;
+	esac ;
+    shift 2;
+done > try.c;
+$cppstdin $cppflags $cppminus < try.c > tryout.c 2>/dev/null;
+if $contains "$func.*(" tryout.c >/dev/null 2>&1; then
+	echo "$func() prototype found.";
+	val="$define";
+else
+	echo "$func() prototype NOT found.";
+	val="$undef";
+fi;
+set $varname;
+eval $setvar;
+$rm_try tryout.c'
+
+: see if sys/types.h has to be included
+set sys/types.h i_systypes
+eval $inhdr
+
+: see if sys/select.h has to be included
+set sys/select.h i_sysselct
+eval $inhdr
+
+: Define hasfield macro for Configure internal use
+hasfield='varname=$1; struct=$2; field=$3; shift; shift; shift;
+while $test $# -ge 2; do
+	case "$1" in
+	$define) echo "#include <$2>";;
+	esac ;
+    shift 2;
+done > try.c;
+echo "int main () { struct $struct foo; char* bar; bar = (char*)foo.$field; }" >> try.c;
+set try;
+if eval $compile; then
+	val="$define";
+else
+	val="$undef";
+fi;
+set $varname;
+eval $setvar;
+$rm_try'
+
+: see if we should include sys/time.h
+echo " "
+i_time='define'
+if test "X$timeincl" = X; then
+	echo "Testing to see if we should include <sys/time.h>." >&4
+	$echo $n "I'm now running the test program...$c"
+	$cat >try.c <<EOCP
+#include <sys/types.h>
+#include <time.h>
+#ifdef I_SYSTIME
+#ifdef SYSTIMEKERNEL
+#define KERNEL
+#endif
+#include <sys/time.h>
+#endif
+#ifdef I_SYSSELECT
+#include <sys/select.h>
+#endif
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+int main()
+{
+	struct tm foo;
+#ifdef S_TIMEVAL
+	struct timeval bar;
+#endif
+#ifdef S_TIMEZONE
+	struct timezone tzp;
+#endif
+	if (foo.tm_sec == foo.tm_sec)
+		exit(0);
+#ifdef S_TIMEVAL
+	if (bar.tv_sec == bar.tv_sec)
+		exit(0);
+#endif
+	exit(1);
+}
+EOCP
+	flags=''
+	for s_timezone in '-DS_TIMEZONE' ''; do
+	sysselect=''
+	for s_timeval in '-DS_TIMEVAL' ''; do
+	for i_systimek in '' '-DSYSTIMEKERNEL'; do
+	for i_systime in '-DI_SYSTIME' ''; do
+		case "$flags" in
+		'') $echo $n ".$c"
+			set try $i_systime $i_systimek $sysselect $s_timeval $s_timezone
+			if eval $compile; then
+				set X $i_systime $i_systimek $sysselect $s_timeval
+				shift
+				flags="$*"
+				echo " "
+				$echo $n "Succeeded with $flags$c"
+			fi
+			;;
+		esac
+	done
+	done
+	done
+	done
+	timeincl=''
+	echo " "
+	case "$flags" in
+	*SYSTIMEKERNEL*) i_systimek="$define"
+		timeincl=`./findhdr sys/time.h`
+		echo "We'll include <sys/time.h> with KERNEL defined." >&4;;
+	*) i_systimek="$undef";;
+	esac
+	case "$flags" in
+	*I_SYSTIME*) i_systime="$define"
+		timeincl=`./findhdr sys/time.h`" $timeincl"
+		echo "We'll include <sys/time.h>." >&4;;
+	*) i_systime="$undef";;
+	esac
+	$rm_try
+fi
+: see if struct tm knows about tm_zone
+case "$i_systime$i_time" in
+*$define*)
+        echo " "
+        echo "Checking to see if your struct tm has tm_zone field..." >&4
+        set d_tm_tm_zone tm tm_zone $i_systime sys/time.h $i_time time.h
+        eval $hasfield
+        ;;
+*)      val="$undef"
+        set d_tm_tm_zone
+        eval $setvar
+        ;;
+esac
+case "$d_tm_tm_zone" in
+"$define")      echo "Yes, it does."   ;;
+*)              echo "No, it doesn't." ;;
+esac
+: see if struct tm knows about tm_gmtoff
+case "$i_systime$i_time" in
+*$define*)
+        echo " "
+        echo "Checking to see if your struct tm has tm_gmtoff field..." >&4
+        set d_tm_tm_gmtoff tm tm_gmtoff $i_systime sys/time.h $i_time time.h
+        eval $hasfield
+        ;;
+*)      val="$undef"
+        set d_tm_tm_gmtoff
+        eval $setvar
+        ;;
+esac
+case "$d_tm_tm_gmtoff" in
+"$define")      echo "Yes, it does."   ;;
+*)              echo "No, it doesn't." ;;
+esac
+
+: see if asctime_r exists
+set asctime_r d_asctime_r
+eval $inlibc
+case "$d_asctime_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_time time.h $i_systime sys/time.h"
+	case "$d_asctime_r_proto:$usethreads" in
+	":define")	d_asctime_r_proto=define
+		set d_asctime_r_proto asctime_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_asctime_r_proto" in
+	define)
+	case "$asctime_r_proto" in
+	''|0) try='char* asctime_r(const struct tm*, char*);'
+	./protochk "$extern_C $try" $hdrs && asctime_r_proto=B_SB ;;
+	esac
+	case "$asctime_r_proto" in
+	''|0) try='char* asctime_r(const struct tm*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && asctime_r_proto=B_SBI ;;
+	esac
+	case "$asctime_r_proto" in
+	''|0) try='int asctime_r(const struct tm*, char*);'
+	./protochk "$extern_C $try" $hdrs && asctime_r_proto=I_SB ;;
+	esac
+	case "$asctime_r_proto" in
+	''|0) try='int asctime_r(const struct tm*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && asctime_r_proto=I_SBI ;;
+	esac
+	case "$asctime_r_proto" in
+	''|0)	d_asctime_r=undef
+		asctime_r_proto=0
+		echo "Disabling asctime_r, cannot determine prototype." >&4 ;;
+	* )	case "$asctime_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) asctime_r_proto="REENTRANT_PROTO_$asctime_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "asctime_r has no prototype, not using it." >&4 ;;
+		esac
+		d_asctime_r=undef
+		asctime_r_proto=0
+		;;
+	esac
+	;;
+*)	asctime_r_proto=0
+	;;
+esac
+
+: see if asinh exists
+set asinh d_asinh
+eval $inlibc
+
+: see if atanh exists
+set atanh d_atanh
+eval $inlibc
+
+: see if atolf exists
+set atolf d_atolf
+eval $inlibc
+
+: see if atoll exists
+set atoll d_atoll
+eval $inlibc
+
+: See if a file contains compiler warnings
+: See if a file contains compiler warnings
+case "$osname" in
+  'aix')
+	cat >compiler_warning <<EOSS
+# Sample for aix ('.5' indicates the column number in the line):
+#    "op.h", line 203.5: 1506-159 (E) Bit field type specified for op_type
+# Since the word 'warning' isn't present, use a fairly rigorous match of what
+# warning messages look like
+#            "    o        p        .  h   ", line    203      .   5        :   1506     -    159      (  E  )
+$grep -E "^\\"[A-Za-z][A-Za-z0-9_]*\.[ch]\\", line [1-9][0-9]*[.][1-9][0-9]*: [1-9][0-9]*-[1-9][0-9]* \([EW][)] " "\$1"
+EOSS
+        compiler_warning=./compiler_warning
+        chmod +x $compiler_warning
+    ;;
+     # Maybe a colon after the 'warning' would be appropriate
+  *) compiler_warning="$contains -i warning"
+    ;;
+esac
+
+: Look for GCC-style attribute format
+case "$d_attribute_format" in
+'')
+echo " "
+echo "Checking whether your compiler can handle __attribute__((format)) ..." >&4
+$cat >attrib.c <<'EOCP'
+#include <stdio.h>
+void my_special_printf(char* pat,...) __attribute__((__format__(__printf__,1,2)));
+EOCP
+if $cc $ccflags -c attrib.c >attrib.out 2>&1 ; then
+	if $compiler_warning attrib.out >/dev/null 2>&1; then
+		echo "Your C compiler doesn't support __attribute__((format))."
+		val="$undef"
+	else
+		echo "Your C compiler supports __attribute__((format))."
+		val="$define"
+	fi
+else
+	echo "Your C compiler doesn't seem to understand __attribute__ at all."
+	val="$undef"
+fi
+;;
+*) val="$d_attribute_format" ;;
+esac
+set d_attribute_format
+eval $setvar
+$rm -f attrib*
+
+: Look for GCC-style attribute format with null format allowed
+case "$d_printf_format_null" in
+'') case "$d_attribute_format" in
+    $define)
+	echo " "
+	echo "Checking whether your compiler allows __printf__ format to be null ..." >&4
+$cat >attrib.c <<EOCP
+#include <stdio.h>
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#$i_inttypes I_INTTYPES
+#ifdef I_INTTYPES
+#include <inttypes.h>
+#endif
+#ifndef INTPTR_MAX
+#define intptr_t int
+#endif
+int null_printf (char* pat,...) __attribute__((__format__(__printf__,1,2)));
+int null_printf (char* pat,...) { return (int)(intptr_t)pat; }
+int main () { exit(null_printf(NULL)); }
+EOCP
+	if $cc $ccflags -o attrib attrib.c >attrib.out 2>&1 ; then
+	    : run the executable in case it produces a run-time warning
+	    if $run ./attrib >>attrib.out 2>&1; then
+		if $compiler_warning attrib.out >/dev/null 2>&1; then
+		    echo "Your C compiler doesn't allow __printf__ format to be null."
+		    val="$undef"
+		else
+		    echo "Your C compiler allows __printf__ format to be null."
+		    val="$define"
+		fi
+	    else
+	    echo "Your C compiler executable failed with __printf__ format null."
+	    val="$undef"
+	fi
+    else
+	echo "Your C compiler fails with __printf__ format null."
+	val="$undef"
+    fi
+    ;;
+    *)  val="$undef" ;;
+    esac
+;;
+*)  val="$d_printf_format_null" ;;
+esac
+set d_printf_format_null
+eval $setvar
+$rm -f attrib*
+
+: Look for GCC-style attribute malloc
+case "$d_attribute_malloc" in
+'')
+echo " "
+echo "Checking whether your compiler can handle __attribute__((malloc)) ..." >&4
+$cat >attrib.c <<'EOCP'
+#include <stdio.h>
+char *go_get_some_memory( int how_many_bytes ) __attribute__((malloc));
+EOCP
+if $cc $ccflags -c attrib.c >attrib.out 2>&1 ; then
+	if $compiler_warning attrib.out >/dev/null 2>&1; then
+		echo "Your C compiler doesn't support __attribute__((malloc))."
+		val="$undef"
+	else
+		echo "Your C compiler supports __attribute__((malloc))."
+		val="$define"
+	fi
+else
+	echo "Your C compiler doesn't seem to understand __attribute__ at all."
+	val="$undef"
+fi
+;;
+*) val="$d_attribute_malloc" ;;
+esac
+set d_attribute_malloc
+eval $setvar
+$rm -f attrib*
+
+: Look for GCC-style attribute nonnull
+case "$d_attribute_nonnull" in
+'')
+echo " "
+echo "Checking whether your compiler can handle __attribute__((nonnull(1))) ..." >&4
+$cat >attrib.c <<'EOCP'
+#include <stdio.h>
+void do_something (char *some_pointer,...) __attribute__((nonnull(1)));
+EOCP
+if $cc $ccflags -c attrib.c >attrib.out 2>&1 ; then
+	if $compiler_warning attrib.out >/dev/null 2>&1; then
+		echo "Your C compiler doesn't support __attribute__((nonnull))."
+		val="$undef"
+	else
+		echo "Your C compiler supports __attribute__((nonnull))."
+		val="$define"
+	fi
+else
+	echo "Your C compiler doesn't seem to understand __attribute__ at all."
+	val="$undef"
+fi
+;;
+*) val="$d_attribute_nonnull" ;;
+esac
+set d_attribute_nonnull
+eval $setvar
+$rm -f attrib*
+
+: Look for GCC-style attribute noreturn
+case "$d_attribute_noreturn" in
+'')
+echo " "
+echo "Checking whether your compiler can handle __attribute__((noreturn)) ..." >&4
+$cat >attrib.c <<'EOCP'
+#include <stdio.h>
+void fall_over_dead( void ) __attribute__((noreturn));
+EOCP
+if $cc $ccflags -c attrib.c >attrib.out 2>&1 ; then
+	if $compiler_warning attrib.out >/dev/null 2>&1; then
+		echo "Your C compiler doesn't support __attribute__((noreturn))."
+		val="$undef"
+	else
+		echo "Your C compiler supports __attribute__((noreturn))."
+		val="$define"
+	fi
+else
+	echo "Your C compiler doesn't seem to understand __attribute__ at all."
+	val="$undef"
+fi
+;;
+*) val="$d_attribute_noreturn" ;;
+esac
+set d_attribute_noreturn
+eval $setvar
+$rm -f attrib*
+
+: Look for GCC-style attribute pure
+case "$d_attribute_pure" in
+'')
+echo " "
+echo "Checking whether your compiler can handle __attribute__((pure)) ..." >&4
+$cat >attrib.c <<'EOCP'
+#include <stdio.h>
+int square( int n ) __attribute__((pure));
+EOCP
+if $cc $ccflags -c attrib.c >attrib.out 2>&1 ; then
+	if $compiler_warning attrib.out >/dev/null 2>&1; then
+		echo "Your C compiler doesn't support __attribute__((pure))."
+		val="$undef"
+	else
+		echo "Your C compiler supports __attribute__((pure))."
+		val="$define"
+	fi
+else
+	echo "Your C compiler doesn't seem to understand __attribute__ at all."
+	val="$undef"
+fi
+;;
+*) val="$d_attribute_pure" ;;
+esac
+set d_attribute_pure
+eval $setvar
+$rm -f attrib*
+
+: Look for GCC-style attribute unused
+case "$d_attribute_unused" in
+'')
+echo " "
+echo "Checking whether your compiler can handle __attribute__((unused)) ..." >&4
+$cat >attrib.c <<'EOCP'
+#include <stdio.h>
+int do_something( int dummy __attribute__((unused)), int n );
+EOCP
+if $cc $ccflags -c attrib.c >attrib.out 2>&1 ; then
+	if $compiler_warning attrib.out >/dev/null 2>&1; then
+		echo "Your C compiler doesn't support __attribute__((unused))."
+		val="$undef"
+	else
+		echo "Your C compiler supports __attribute__((unused))."
+		val="$define"
+	fi
+else
+	echo "Your C compiler doesn't seem to understand __attribute__ at all."
+	val="$undef"
+fi
+;;
+*) val="$d_attribute_unused" ;;
+esac
+set d_attribute_unused
+eval $setvar
+$rm -f attrib*
+
+: Look for GCC-style attribute deprecated
+case "$d_attribute_deprecated" in
+'')
+echo " "
+echo "Checking whether your compiler can handle __attribute__((deprecated)) ..." >&4
+$cat >attrib.c <<'EOCP'
+#include <stdio.h>
+int I_am_deprecated(void) __attribute__((deprecated));
+EOCP
+if $cc $ccflags -c attrib.c >attrib.out 2>&1 ; then
+	if $compiler_warning attrib.out >/dev/null 2>&1; then
+		echo "Your C compiler doesn't support __attribute__((deprecated))."
+		val="$undef"
+	else
+		echo "Your C compiler supports __attribute__((deprecated))."
+		val="$define"
+	fi
+else
+	echo "Your C compiler doesn't seem to understand __attribute__ at all."
+	val="$undef"
+fi
+;;
+*) val="$d_attribute_deprecated" ;;
+esac
+set d_attribute_deprecated
+eval $setvar
+$rm -f attrib*
+
+: Look for GCC-style attribute warn_unused_result
+case "$d_attribute_warn_unused_result" in
+'')
+echo " "
+echo "Checking whether your compiler can handle __attribute__((warn_unused_result)) ..." >&4
+$cat >attrib.c <<'EOCP'
+#include <stdio.h>
+int I_will_not_be_ignored(void) __attribute__((warn_unused_result));
+EOCP
+if $cc $ccflags -c attrib.c >attrib.out 2>&1 ; then
+	if $compiler_warning attrib.out >/dev/null 2>&1; then
+		echo "Your C compiler doesn't support __attribute__((warn_unused_result))."
+		val="$undef"
+	else
+		echo "Your C compiler supports __attribute__((warn_unused_result))."
+		val="$define"
+	fi
+else
+	echo "Your C compiler doesn't seem to understand __attribute__ at all."
+	val="$undef"
+fi
+;;
+*) val="$d_attribute_warn_unused_result" ;;
+esac
+set d_attribute_warn_unused_result
+eval $setvar
+$rm -f attrib*
+
+: Look for GCC-style attribute always_inline
+case "$d_attribute_always_inline" in
+'')
+echo " "
+echo "Checking whether your compiler can handle __attribute__((always_inline)) ..." >&4
+$cat >attrib.c <<'EOCP'
+#include <stdio.h>
+static __inline__ __attribute__((always_inline)) int I_will_always_be_inlined(void);
+EOCP
+if $cc $ccflags -c attrib.c >attrib.out 2>&1 ; then
+	if $compiler_warning attrib.out >/dev/null 2>&1; then
+		echo "Your C compiler doesn't support __attribute__((always_inline))."
+		val="$undef"
+	else
+		echo "Your C compiler supports __attribute__((always_inline))."
+		val="$define"
+	fi
+else
+	echo "Your C compiler doesn't seem to understand __attribute__ at all."
+	val="$undef"
+fi
+;;
+*) val="$d_attribute_always_inline" ;;
+esac
+set d_attribute_always_inline
+eval $setvar
+$rm -f attrib*
+
+: see if getpgrp exists
+set getpgrp d_getpgrp
+eval $inlibc
+
+case "$d_getpgrp" in
+"$define")
+	echo " "
+	echo "Checking to see which flavor of getpgrp is in use..."
+	$cat >try.c <<EOP
+#include <stdio.h>
+#$i_unistd I_UNISTD
+#include <sys/types.h>
+#ifdef I_UNISTD
+#  include <unistd.h>
+#endif
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+int main()
+{
+	if (getuid() == 0) {
+		printf("(I see you are running Configure as super-user...)\n");
+		setuid(1);
+	}
+#ifdef TRY_BSD_PGRP
+	if (getpgrp(1) == 0)
+		exit(0);
+#else
+	if (getpgrp() > 0)
+		exit(0);
+#endif
+	exit(1);
+}
+EOP
+	if $cc -o try -DTRY_BSD_PGRP $ccflags $ldflags try.c $libs >/dev/null 2>&1 && $run ./try; then
+		echo "You have to use getpgrp(pid) instead of getpgrp()." >&4
+		val="$define"
+	elif $cc -o try $ccflags $ldflags try.c $libs >/dev/null 2>&1 && $run ./try; then
+		echo "You have to use getpgrp() instead of getpgrp(pid)." >&4
+		val="$undef"
+	else
+		echo "I can't seem to compile and run the test program."
+		if ./usg; then
+			xxx="a USG one, i.e. you use getpgrp()."
+		else
+			# SVR4 systems can appear rather BSD-ish.
+			case "$i_unistd" in
+			$undef)
+				xxx="a BSD one, i.e. you use getpgrp(pid)."
+				val="$define"
+				;;
+			$define)
+				xxx="probably a USG one, i.e. you use getpgrp()."
+				val="$undef"
+				;;
+			esac
+		fi
+		echo "Assuming your getpgrp is $xxx" >&4
+	fi
+	;;
+*) val="$undef";;
+esac
+set d_bsdgetpgrp
+eval $setvar
+$rm_try
+
+: see if setpgrp exists
+set setpgrp d_setpgrp
+eval $inlibc
+
+case "$d_setpgrp" in
+"$define")
+	echo " "
+	echo "Checking to see which flavor of setpgrp is in use..."
+	$cat >try.c <<EOP
+#include <stdio.h>
+#$i_unistd I_UNISTD
+#include <sys/types.h>
+#ifdef I_UNISTD
+#  include <unistd.h>
+#endif
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+int main()
+{
+	if (getuid() == 0) {
+		printf("(I see you are running Configure as super-user...)\n");
+		setuid(1);
+	}
+#ifdef TRY_BSD_PGRP
+	if (-1 == setpgrp(1, 1))
+		exit(0);
+#else
+	if (setpgrp() != -1)
+		exit(0);
+#endif
+	exit(1);
+}
+EOP
+	if $cc -o try -DTRY_BSD_PGRP $ccflags $ldflags try.c $libs >/dev/null 2>&1 && $run ./try; then
+		echo 'You have to use setpgrp(pid,pgrp) instead of setpgrp().' >&4
+		val="$define"
+	elif $cc -o try $ccflags $ldflags try.c $libs >/dev/null 2>&1 && $run ./try; then
+		echo 'You have to use setpgrp() instead of setpgrp(pid,pgrp).' >&4
+		val="$undef"
+	else
+		echo "(I can't seem to compile and run the test program.)"
+		if ./usg; then
+			xxx="a USG one, i.e. you use setpgrp()."
+		else
+			# SVR4 systems can appear rather BSD-ish.
+			case "$i_unistd" in
+			$undef)
+				xxx="a BSD one, i.e. you use setpgrp(pid,pgrp)."
+				val="$define"
+				;;
+			$define)
+				xxx="probably a USG one, i.e. you use setpgrp()."
+				val="$undef"
+				;;
+			esac
+		fi
+		echo "Assuming your setpgrp is $xxx" >&4
+	fi
+	;;
+*) val="$undef";;
+esac
+set d_bsdsetpgrp
+eval $setvar
+$rm_try
+
+: Look for GCC-style __builtin_add_overflow
+case "$d_builtin_add_overflow" in
+'')
+    echo " "
+    echo "Checking whether your compiler can handle __builtin_add_overflow ..." >&4
+    $cat >try.c <<'EOCP'
+int main(void) {
+    const unsigned int uint_max = ~0u;
+    int target_int = 0;
+    if (__builtin_add_overflow(1, 2, &target_int) || target_int != 3) {
+        return 1;
+    }
+    if (!__builtin_add_overflow((int)(uint_max >> 1), 1, &target_int)) {
+        return 1;
+    }
+    if (!__builtin_add_overflow(uint_max, -1, &target_int)) {
+        return 1;
+    }
+    return 0;
+}
+EOCP
+    set try
+    if eval $compile && $run ./try; then
+        echo "Your C compiler supports __builtin_add_overflow."
+        val="$define"
+    else
+        echo "Your C compiler doesn't seem to understand __builtin_add_overflow."
+        val="$undef"
+    fi
+    ;;
+*) val="$d_builtin_add_overflow" ;;
+esac
+
+set d_builtin_add_overflow
+eval $setvar
+$rm_try
+
+: Look for GCC-style __builtin_sub_overflow
+case "$d_builtin_sub_overflow" in
+'')
+    echo " "
+    echo "Checking whether your compiler can handle __builtin_sub_overflow ..." >&4
+    $cat >try.c <<'EOCP'
+int main(void) {
+    const unsigned int uint_max = ~0u;
+    int target_int = 0;
+    if (__builtin_sub_overflow(1, -2, &target_int) || target_int != 3) {
+        return 1;
+    }
+    if (!__builtin_sub_overflow(-(int)(uint_max >> 1), 2, &target_int)) {
+        return 1;
+    }
+    if (!__builtin_sub_overflow(uint_max, 1, &target_int)) {
+        return 1;
+    }
+    return 0;
+}
+EOCP
+    set try
+    if eval $compile && $run ./try; then
+        echo "Your C compiler supports __builtin_sub_overflow."
+        val="$define"
+    else
+        echo "Your C compiler doesn't seem to understand __builtin_sub_overflow."
+        val="$undef"
+    fi
+    ;;
+*) val="$d_builtin_sub_overflow" ;;
+esac
+
+set d_builtin_sub_overflow
+eval $setvar
+$rm_try
+
+: Look for GCC-style __builtin_mul_overflow
+case "$d_builtin_mul_overflow" in
+'')
+    echo " "
+    echo "Checking whether your compiler can handle __builtin_mul_overflow ..." >&4
+    $cat >try.c <<'EOCP'
+int main(void) {
+    const unsigned int uint_max = ~0u;
+    int target_int = 0;
+    if (__builtin_mul_overflow(2, 3, &target_int) || target_int != 6) {
+        return 1;
+    }
+    if (!__builtin_mul_overflow((int)(uint_max >> 1), 2, &target_int)) {
+        return 1;
+    }
+    if (!__builtin_mul_overflow(uint_max, 1, &target_int)) {
+        return 1;
+    }
+    return 0;
+}
+EOCP
+    set try
+    if eval $compile && $run ./try; then
+        echo "Your C compiler supports __builtin_mul_overflow."
+        val="$define"
+    else
+        echo "Your C compiler doesn't seem to understand __builtin_mul_overflow."
+        val="$undef"
+    fi
+    ;;
+*) val="$d_builtin_mul_overflow" ;;
+esac
+
+set d_builtin_mul_overflow
+eval $setvar
+$rm_try
+
+: Look for GCC-style __builtin_choose_expr
+case "$d_builtin_choose_expr" in
+'')
+    echo " "
+    echo "Checking whether your compiler can handle __builtin_choose_expr ..." >&4
+    $cat >try.c <<'EOCP'
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#define SYRINX(x) __builtin_choose_expr( x, (1056*2), (103*50) )
+
+int main(void) {
+    assert( SYRINX(1) == 2112 );
+    assert( SYRINX(1) != 5150 );
+    assert( SYRINX(0) == 5150 );
+    assert( SYRINX(0) != 2112 );
+    puts( "All good!" );
+    exit(0);
+}
+
+EOCP
+    set try
+    if eval $compile && $run ./try; then
+	echo "Your C compiler supports __builtin_choose_expr."
+	val="$define"
+    else
+	echo "Your C compiler doesn't seem to understand __builtin_choose_expr."
+	val="$undef"
+    fi
+;;
+*) val="$d_builtin_choose_expr" ;;
+esac
+
+set d_builtin_choose_expr
+eval $setvar
+$rm_try
+
+: Look for GCC-style __builtin_expect
+case "$d_builtin_expect" in
+'')
+    echo " "
+    echo "Checking whether your compiler can handle __builtin_expect ..." >&4
+    $cat >try.c <<'EOCP'
+int main(void) {
+    int n = 50;
+    if ( __builtin_expect(n, 0) ) n = 1;
+    /* Remember shell exit code truth is 0, C truth is non-zero */
+    return !(n == 1);
+}
+EOCP
+    set try
+    if eval $compile && $run ./try; then
+	echo "Your C compiler supports __builtin_expect."
+	val="$define"
+    else
+	echo "Your C compiler doesn't seem to understand __builtin_expect."
+	val="$undef"
+    fi
+    ;;
+*) val="$d_builtin_expect" ;;
+esac
+
+set d_builtin_expect
+eval $setvar
+$rm_try
+
+: see if the Compiler supports C99 variadic macros
+echo "Checking for C99 variadic macros." >&4
+$cat >try.c <<EOCP
+#include <stdio.h>
+#include <stdarg.h>
+
+#define foo(buffer, format, ...) sprintf(buffer, format, __VA_ARGS__)
+
+int main() {
+  char buf[20];
+  foo(buf, "%d %g %.*s", 123, 456.0, (int)3, "789fail");
+  puts(buf);
+  return 0;
+}
+EOCP
+set try
+if eval $compile && $run ./try 2>&1 >/dev/null; then
+    case "`$run ./try`" in
+	"123 456 789")
+	echo "You have C99 variadic macros." >&4
+	d_c99_variadic_macros="$define"
+	;;
+	*)
+	echo "You don't have functional C99 variadic macros." >&4
+	d_c99_variadic_macros="$undef"
+	;;
+    esac
+else
+    echo "I couldn't compile and run the test program, so I assume that you don't have functional C99 variadic macros." >&4
+    d_c99_variadic_macros="$undef"
+fi
+$rm_try
+
+: see if signal is declared as pointer to function returning int or void
+echo " "
+xxx=`./findhdr signal.h`
+$test "$xxx" && $cppstdin $cppminus $cppflags < $xxx >$$.tmp 2>/dev/null
+if $contains 'int.*\*[ 	]*signal' $$.tmp >/dev/null 2>&1 ; then
+	echo "You have int (*signal())() instead of void." >&4
+	val="$undef"
+elif $contains 'void.*\*[ 	]*signal' $$.tmp >/dev/null 2>&1 ; then
+	echo "You have void (*signal())()." >&4
+	val="$define"
+elif $contains 'extern[ 	]*[(\*]*signal' $$.tmp >/dev/null 2>&1 ; then
+	echo "You have int (*signal())() instead of void." >&4
+	val="$undef"
+elif $contains 'void.*\*.*sig' $$.tmp >/dev/null 2>&1 ; then
+	echo "You have void (*signal())()." >&4
+	val="$define"
+else
+	case "$d_voidsig" in
+	'')
+	echo "I can't determine whether signal handler returns void or int..." >&4
+		dflt=void
+		rp="What type does your signal handler return?"
+		. ./myread
+		case "$ans" in
+		v*) val="$define";;
+		*) val="$undef";;
+		esac;;
+	"$define")
+		echo "As you already told me, signal handler returns void." >&4
+		val="$define"
+		;;
+	*)	echo "As you already told me, signal handler returns int." >&4
+		val="$undef"
+		;;
+	esac
+fi
+set d_voidsig
+eval $setvar
+case "$d_voidsig" in
+"$define") signal_t="void";;
+*) signal_t="int";;
+esac
+$rm -f $$.tmp
+
+: check for ability to cast large floats to 32-bit ints.
+echo " "
+echo 'Checking whether your C compiler can cast large floats to int32.' >&4
+if $test "$intsize" -ge 4; then
+	xxx=int
+else
+	xxx=long
+fi
+$cat >try.c <<EOCP
+#include <stdio.h>
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#include <sys/types.h>
+#include <signal.h>
+$signal_t blech(int s) { exit(3); }
+int main()
+{
+	$xxx i32;
+	double f, g;
+	int result = 0;
+	char str[16];
+	signal(SIGFPE, blech);
+
+	/* Don't let compiler optimize the test away.  Store the number
+	   in a writable string for gcc to pass to sscanf under HP-UX.
+	*/
+	sprintf(str, "2147483647");
+	sscanf(str, "%lf", &f); /* f = (double) 0x7fffffff; */
+	g = 10 * f;
+	i32  = ($xxx) g;
+
+	/* x86 processors will probably give 0x8000 0000, which is a
+	   sign change.  We don't want that.  We want to mimic SPARC
+	   behavior here, which is to preserve the sign and give
+	   back 0x7fff ffff.
+	*/
+	if (i32 != ($xxx) f)
+		result |= 1;
+	exit(result);
+}
+EOCP
+set try
+if eval $compile_ok; then
+	$run ./try 2>/dev/null
+	yyy=$?
+else
+	echo "(I can't seem to compile the test program--assuming it can't)"
+	yyy=1
+fi
+case "$yyy" in
+0)	val="$define"
+	echo "Yup, it can."
+	;;
+*)	val="$undef"
+	echo "Nope, it can't."
+	;;
+esac
+set d_casti32
+eval $setvar
+$rm_try
+
+: check for ability to cast negative floats to unsigned
+echo " "
+echo 'Checking whether your C compiler can cast negative float to unsigned.' >&4
+$cat >try.c <<EOCP
+#include <stdio.h>
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#include <sys/types.h>
+#include <signal.h>
+$signal_t blech(int s) { exit(7); }
+$signal_t blech_in_list(int s) { exit(4); }
+unsigned long dummy_long(unsigned long p) { return p; }
+unsigned int dummy_int(unsigned int p) { return p; }
+unsigned short dummy_short(unsigned short p) { return p; }
+int main()
+{
+	double f;
+	unsigned long along;
+	unsigned int aint;
+	unsigned short ashort;
+	int result = 0;
+	char str[16];
+
+	/* Frustrate gcc-2.7.2's optimizer which failed this test with
+	   a direct f = -123. assignment.  gcc-2.8.0 reportedly
+	   optimized the whole file away
+	*/
+	/* Store the number in a writable string for gcc to pass to
+	   sscanf under HP-UX.
+	*/
+	sprintf(str, "-123");
+	sscanf(str, "%lf", &f);  /* f = -123.; */
+
+	signal(SIGFPE, blech);
+	along = (unsigned long)f;
+	aint = (unsigned int)f;
+	ashort = (unsigned short)f;
+	if (along != (unsigned long)-123)
+		result |= 1;
+	if (aint != (unsigned int)-123)
+		result |= 1;
+	if (ashort != (unsigned short)-123)
+		result |= 1;
+	sprintf(str, "1073741824.");
+	sscanf(str, "%lf", &f); /* f = (double)0x40000000; */
+	f = f + f;
+	along = 0;
+	along = (unsigned long)f;
+	if (along != 0x80000000)
+		result |= 2;
+	f -= 1.;
+	along = 0;
+	along = (unsigned long)f;
+	if (along != 0x7fffffff)
+		result |= 1;
+	f += 2.;
+	along = 0;
+	along = (unsigned long)f;
+	if (along != 0x80000001)
+		result |= 2;
+	if (result)
+		exit(result);
+	signal(SIGFPE, blech_in_list);
+	sprintf(str, "123.");
+	sscanf(str, "%lf", &f);  /* f = 123.; */
+	along = dummy_long((unsigned long)f);
+	aint = dummy_int((unsigned int)f);
+	ashort = dummy_short((unsigned short)f);
+	if (along != (unsigned long)123)
+		result |= 4;
+	if (aint != (unsigned int)123)
+		result |= 4;
+	if (ashort != (unsigned short)123)
+		result |= 4;
+	exit(result);
+
+}
+EOCP
+set try
+if eval $compile_ok; then
+	$run ./try 2>/dev/null
+	castflags=$?
+else
+	echo "(I can't seem to compile the test program--assuming it can't)"
+	castflags=7
+fi
+case "$castflags" in
+0)	val="$define"
+	echo "Yup, it can."
+	;;
+*)	val="$undef"
+	echo "Nope, it can't."
+	;;
+esac
+set d_castneg
+eval $setvar
+$rm_try
+
+: see if cbrt exists
+set cbrt d_cbrt
+eval $inlibc
+
+: see if chown exists
+set chown d_chown
+eval $inlibc
+
+: see if chroot exists
+set chroot d_chroot
+eval $inlibc
+
+: see if chsize exists
+set chsize d_chsize
+eval $inlibc
+
+: see if class exists
+set class d_class
+eval $inlibc
+
+: see if clearenv exists
+set clearenv d_clearenv
+eval $inlibc
+
+: Define hasstruct macro for Configure internal use
+hasstruct='varname=$1; struct=$2; shift; shift;
+while $test $# -ge 2; do
+	case "$1" in
+	$define) echo "#include <$2>";;
+	esac ;
+    shift 2;
+done > try.c;
+echo "int main () { struct $struct foo; }" >> try.c;
+set try;
+if eval $compile; then
+	val="$define";
+else
+	val="$undef";
+fi;
+set $varname;
+eval $setvar;
+$rm_try'
+
+: see whether socket exists
+socketlib=''
+sockethdr=''
+echo " "
+$echo $n "Hmm... $c" >&4
+if set socket val -f d_socket; eval $csym; $val; then
+    echo "Looks like you have Berkeley networking support." >&4
+    d_socket="$define"
+    if set setsockopt val -f; eval $csym; $val; then
+	d_oldsock="$undef"
+    else
+	echo "...but it uses the old BSD 4.1c interface, rather than 4.2." >&4
+	d_oldsock="$define"
+    fi
+else
+    if $contains socklib libc.list >/dev/null 2>&1; then
+	echo "Looks like you have Berkeley networking support." >&4
+	d_socket="$define"
+	: we will have to assume that it supports the 4.2 BSD interface
+	d_oldsock="$undef"
+    else
+	echo "You don't have Berkeley networking in libc$_a..." >&4
+	if test "X$d_socket" = "X$define"; then
+	    echo "...but you seem to believe that you have sockets." >&4
+	else
+	    for net in net socket
+	    do
+		if test -f $sysroot/usr/lib/lib$net$_a; then
+		    ( ($nm $nm_opt $sysroot/usr/lib/lib$net$_a | eval $nm_extract) ||  \
+		    $ar t $sysroot/usr/lib/lib$net$_a) 2>/dev/null >> libc.list
+		    if $contains socket libc.list >/dev/null 2>&1; then
+			d_socket="$define"
+			socketlib="-l$net"
+			case "$net" in
+			net)
+			    echo "...but the Wollongong group seems to have hacked it in." >&4
+			    sockethdr="-I$sysroot/usr/netinclude"
+			    ;;
+			esac
+			echo "Found Berkeley sockets interface in lib$net." >&4
+			if $contains setsockopt libc.list >/dev/null 2>&1; then
+			    d_oldsock="$undef"
+			else
+			    echo "...using the old BSD 4.1c interface, rather than 4.2." >&4
+			    d_oldsock="$define"
+			fi
+			break
+		    fi
+		fi
+	    done
+	    if test "X$d_socket" != "X$define"; then
+	       echo "or anywhere else I see." >&4
+	       d_socket="$undef"
+	       d_oldsock="$undef"
+	    fi
+	fi
+    fi
+fi
+
+: see if socketpair exists
+set socketpair d_sockpair
+eval $inlibc
+
+
+echo "Checking the availability sa_len in the sock struct ..." >&4
+$cat >try.c <<EOF
+#include <sys/types.h>
+#include <sys/socket.h>
+int main() {
+struct sockaddr sa;
+return (sa.sa_len);
+}
+EOF
+val="$undef"
+set try; if eval $compile; then
+    val="$define"
+fi
+set d_sockaddr_sa_len; eval $setvar
+$rm_try
+
+echo "Checking the availability struct sockaddr_in6 ..." >&4
+$cat >try.c <<EOF
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+int main() {
+struct sockaddr_in6 sin6;
+return (sin6.sin6_family);
+}
+EOF
+val="$undef"
+set try; if eval $compile; then
+    val="$define"
+fi
+set d_sockaddr_in6; eval $setvar
+$rm_try
+
+echo "Checking the availability struct sockaddr_storage ..." >&4
+$cat >try.c <<EOF
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+int main() {
+struct sockaddr_storage sastor;
+return (sastor.ss_family);
+}
+EOF
+val="$undef"
+set try; if eval $compile; then
+    val="$define"
+fi
+set d_sockaddr_storage; eval $setvar
+$rm_try
+
+echo "Checking the availability sin6_scope_id in struct sockaddr_in6 ..." >&4
+$cat >try.c <<EOF
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+int main() {
+struct sockaddr_in6 sin6;
+return (sin6.sin6_scope_id);
+}
+EOF
+val="$undef"
+set try; if eval $compile; then
+    val="$define"
+fi
+set d_sin6_scope_id; eval $setvar
+$rm_try
+
+echo "Checking the availability struct ip_mreq ..." >&4
+$cat >try.c <<EOF
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+int main() {
+struct ip_mreq mreq;
+return (mreq.imr_multiaddr.s_addr);
+}
+EOF
+val="$undef"
+set try; if eval $compile; then
+       val="$define"
+fi
+set d_ip_mreq; eval $setvar
+$rm_try
+
+echo "Checking the availability struct ip_mreq_source ..." >&4
+$cat >try.c <<EOF
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+int main() {
+struct ip_mreq_source mreq;
+return (mreq.imr_multiaddr.s_addr);
+}
+EOF
+val="$undef"
+set try; if eval $compile; then
+       val="$define"
+fi
+set d_ip_mreq_source; eval $setvar
+$rm_try
+
+echo "Checking the availability struct ipv6_mreq ..." >&4
+$cat >try.c <<EOF
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+int main() {
+struct ipv6_mreq mreq;
+return (mreq.ipv6mr_interface);
+}
+EOF
+val="$undef"
+set try; if eval $compile; then
+    val="$define"
+fi
+set d_ipv6_mreq; eval $setvar
+$rm_try
+
+echo "Checking the availability struct ipv6_mreq_source ..." >&4
+$cat >try.c <<EOF
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+int main() {
+struct ipv6_mreq_source mreq;
+return (mreq.imr_multiaddr.s_addr);
+}
+EOF
+val="$undef"
+set try; if eval $compile; then
+       val="$define"
+fi
+set d_ipv6_mreq_source; eval $setvar
+$rm_try
+
+echo "Checking the availability of certain socket constants..." >&4
+for ENUM in MSG_CTRUNC MSG_DONTROUTE MSG_OOB MSG_PEEK MSG_PROXY SCM_RIGHTS; do
+    enum=`$echo $ENUM|./tr '[A-Z]' '[a-z]'`
+    $cat >try.c <<EOF
+#include <sys/types.h>
+#include <sys/socket.h>
+int main() {
+    int i = $ENUM;
+}
+EOF
+    val="$undef"
+    set try; if eval $compile; then
+	val="$define"
+    fi
+    set d_${enum}; eval $setvar
+    $rm_try
+done
+
+: see if this is a sys/uio.h system
+set sys/uio.h i_sysuio
+eval $inhdr
+
+: Check for cmsghdr support
+echo " "
+echo "Checking to see if your system supports struct cmsghdr..." >&4
+set d_cmsghdr_s cmsghdr $i_systypes sys/types.h $d_socket sys/socket.h $i_sysuio sys/uio.h
+eval $hasstruct
+case "$d_cmsghdr_s" in
+"$define")      echo "Yes, it does."   ;;
+*)              echo "No, it doesn't." ;;
+esac
+
+: see if copysign exists
+set copysign d_copysign
+eval $inlibc
+
+: see if copysignl exists
+set copysignl d_copysignl
+eval $inlibc
+
+: see if crypt exists
+echo " "
+set crypt d_crypt
+eval $inlibc
+case "$d_crypt" in
+$define) cryptlib='' ;;
+*)	if set crypt val -f d_crypt; eval $csym; $val; then
+		echo 'crypt() found.' >&4
+		val="$define"
+		cryptlib=''
+	else
+		cryptlib=`./loc Slibcrypt$_a "" $xlibpth`
+		if $test -z "$cryptlib"; then
+			cryptlib=`./loc Mlibcrypt$_a "" $xlibpth`
+		else
+			cryptlib=-lcrypt
+		fi
+		if $test -z "$cryptlib"; then
+			cryptlib=`./loc Llibcrypt$_a "" $xlibpth`
+		else
+			cryptlib=-lcrypt
+		fi
+		if $test -z "$cryptlib"; then
+			cryptlib=`./loc libcrypt$_a "" $libpth`
+		else
+			cryptlib=-lcrypt
+		fi
+		if $test -z "$cryptlib"; then
+			echo 'crypt() NOT found.' >&4
+			val="$undef"
+		else
+			val="$define"
+		fi
+	fi
+	set d_crypt
+	eval $setvar
+	;;
+esac
+
+: see if this is a crypt.h system
+set crypt.h i_crypt
+eval $inhdr
+
+: see if crypt_r exists
+set crypt_r d_crypt_r
+eval $inlibc
+case "$d_crypt_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_crypt crypt.h"
+	case "$d_crypt_r_proto:$usethreads" in
+	":define")	d_crypt_r_proto=define
+		set d_crypt_r_proto crypt_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_crypt_r_proto" in
+	define)
+	case "$crypt_r_proto" in
+	''|0) try='char* crypt_r(const char*, const char*, struct crypt_data*);'
+	./protochk "$extern_C $try" $hdrs && crypt_r_proto=B_CCS ;;
+	esac
+	case "$crypt_r_proto" in
+	''|0) try='char* crypt_r(const char*, const char*, CRYPTD*);'
+	./protochk "$extern_C $try" $hdrs && crypt_r_proto=B_CCD ;;
+	esac
+	case "$crypt_r_proto" in
+	''|0)	d_crypt_r=undef
+		crypt_r_proto=0
+		echo "Disabling crypt_r, cannot determine prototype." >&4 ;;
+	* )	case "$crypt_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) crypt_r_proto="REENTRANT_PROTO_$crypt_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "crypt_r has no prototype, not using it." >&4 ;;
+		esac
+		d_crypt_r=undef
+		crypt_r_proto=0
+		;;
+	esac
+	;;
+*)	crypt_r_proto=0
+	;;
+esac
+
+: get csh whereabouts
+case "$csh" in
+'csh') val="$undef" ;;
+*) val="$define" ;;
+esac
+set d_csh
+eval $setvar
+: Respect a hint or command line value for full_csh.
+case "$full_csh" in
+'') full_csh=$csh ;;
+esac
+
+: see if ctermid exists
+set ctermid d_ctermid
+eval $inlibc
+
+: see if ctermid_r exists
+set ctermid_r d_ctermid_r
+eval $inlibc
+case "$d_ctermid_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h "
+	case "$d_ctermid_r_proto:$usethreads" in
+	":define")	d_ctermid_r_proto=define
+		set d_ctermid_r_proto ctermid_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_ctermid_r_proto" in
+	define)
+	case "$ctermid_r_proto" in
+	''|0) try='char* ctermid_r(char*);'
+	./protochk "$extern_C $try" $hdrs && ctermid_r_proto=B_B ;;
+	esac
+	case "$ctermid_r_proto" in
+	''|0)	d_ctermid_r=undef
+		ctermid_r_proto=0
+		echo "Disabling ctermid_r, cannot determine prototype." >&4 ;;
+	* )	case "$ctermid_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) ctermid_r_proto="REENTRANT_PROTO_$ctermid_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "ctermid_r has no prototype, not using it." >&4 ;;
+		esac
+		d_ctermid_r=undef
+		ctermid_r_proto=0
+		;;
+	esac
+	;;
+*)	ctermid_r_proto=0
+	;;
+esac
+
+: see if ctime_r exists
+set ctime_r d_ctime_r
+eval $inlibc
+case "$d_ctime_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_time time.h $i_systime sys/time.h"
+	case "$d_ctime_r_proto:$usethreads" in
+	":define")	d_ctime_r_proto=define
+		set d_ctime_r_proto ctime_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_ctime_r_proto" in
+	define)
+	case "$ctime_r_proto" in
+	''|0) try='char* ctime_r(const time_t*, char*);'
+	./protochk "$extern_C $try" $hdrs && ctime_r_proto=B_SB ;;
+	esac
+	case "$ctime_r_proto" in
+	''|0) try='char* ctime_r(const time_t*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && ctime_r_proto=B_SBI ;;
+	esac
+	case "$ctime_r_proto" in
+	''|0) try='int ctime_r(const time_t*, char*);'
+	./protochk "$extern_C $try" $hdrs && ctime_r_proto=I_SB ;;
+	esac
+	case "$ctime_r_proto" in
+	''|0) try='int ctime_r(const time_t*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && ctime_r_proto=I_SBI ;;
+	esac
+	case "$ctime_r_proto" in
+	''|0)	d_ctime_r=undef
+		ctime_r_proto=0
+		echo "Disabling ctime_r, cannot determine prototype." >&4 ;;
+	* )	case "$ctime_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) ctime_r_proto="REENTRANT_PROTO_$ctime_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "ctime_r has no prototype, not using it." >&4 ;;
+		esac
+		d_ctime_r=undef
+		ctime_r_proto=0
+		;;
+	esac
+	;;
+*)	ctime_r_proto=0
+	;;
+esac
+
+: see if cuserid exists
+set cuserid d_cuserid
+eval $inlibc
+
+: see if dbm.h is available
+: see if dbmclose exists
+set dbmclose d_dbmclose
+eval $inlibc
+
+case "$d_dbmclose" in
+$define)
+	set dbm.h i_dbm
+	eval $inhdr
+	case "$i_dbm" in
+	$define)
+		val="$undef"
+		set i_rpcsvcdbm
+		eval $setvar
+		;;
+	*)	set rpcsvc/dbm.h i_rpcsvcdbm
+		eval $inhdr
+		;;
+	esac
+	;;
+*)	echo "We won't be including <dbm.h>"
+	val="$undef"
+	set i_dbm
+	eval $setvar
+	val="$undef"
+	set i_rpcsvcdbm
+	eval $setvar
+	;;
+esac
+
+: see if prototype for dbminit is available
+echo " "
+set d_dbminitproto dbminit $i_dbm dbm.h
+eval $hasproto
+
+: see if difftime exists
+set difftime d_difftime
+eval $inlibc
+
+: see if this is a dirent system
+echo " "
+if xinc=`./findhdr dirent.h`; $test "$xinc"; then
+	val="$define"
+	echo "<dirent.h> found." >&4
+else
+	val="$undef"
+	if xinc=`./findhdr sys/dir.h`; $test "$xinc"; then
+		echo "<sys/dir.h> found." >&4
+		echo " "
+	else
+		xinc=`./findhdr sys/ndir.h`
+	fi
+	echo "<dirent.h> NOT found." >&4
+fi
+set i_dirent
+eval $setvar
+
+: Look for type of directory structure.
+echo " "
+$cppstdin $cppflags $cppminus < "$xinc" > try.c
+
+case "$direntrytype" in
+''|' ')
+	case "$i_dirent" in
+	$define) guess1='struct dirent' ;;
+	*) guess1='struct direct'  ;;
+	esac
+	;;
+*)	guess1="$direntrytype"
+	;;
+esac
+
+case "$guess1" in
+'struct dirent') guess2='struct direct' ;;
+*) guess2='struct dirent' ;;
+esac
+
+if $contains "$guess1" try.c >/dev/null 2>&1; then
+	direntrytype="$guess1"
+	echo "Your directory entries are $direntrytype." >&4
+elif $contains "$guess2" try.c >/dev/null 2>&1; then
+	direntrytype="$guess2"
+	echo "Your directory entries seem to be $direntrytype." >&4
+else
+	echo "I don't recognize your system's directory entries." >&4
+	rp="What type is used for directory entries on this system?"
+	dflt="$guess1"
+	. ./myread
+	direntrytype="$ans"
+fi
+$rm_try
+
+: see if the directory entry stores field length
+echo " "
+$cppstdin $cppflags $cppminus < "$xinc" > try.c
+if $contains 'd_namlen' try.c >/dev/null 2>&1; then
+	echo "Good, your directory entry keeps length information in d_namlen." >&4
+	val="$define"
+else
+	echo "Your directory entry does not know about the d_namlen field." >&4
+	val="$undef"
+fi
+set d_dirnamlen
+eval $setvar
+$rm_try
+
+: Look for DIR.dd_fd
+case "$i_dirent" in
+"$define")
+    echo "Checking to see if DIR has a dd_fd member variable" >&4
+    $cat >try.c <<EOCP
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#include <dirent.h>
+
+int main() {
+    DIR dir;
+    dir.dd_fd = 1;
+    return 0;
+}
+EOCP
+    val=$undef
+    set try
+    if eval $compile; then
+        echo "Yes, it does."
+        val="$define"
+    else
+        echo "No, it does not."
+        val="$undef"
+    fi
+    ;;
+*)
+    echo "You don't have a <dirent.h>, so not checking for dd_fd." >&4
+    val="$undef"
+    ;;
+esac
+set d_dir_dd_fd
+eval $setvar
+$rm_try
+
+: see if this is an sysdir system
+set sys/dir.h i_sysdir
+eval $inhdr
+
+: see if this is an sysndir system
+set sys/ndir.h i_sysndir
+eval $inhdr
+
+: Look for dirfd
+echo " "
+$cat >dirfd.c <<EOM
+#include <stdio.h>
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#$i_dirent I_DIRENT		/**/
+#$i_sysdir I_SYS_DIR		/**/
+#$i_sysndir I_SYS_NDIR		/**/
+#$i_systypes I_SYS_TYPES	/**/
+#if defined(I_SYS_TYPES)
+#include <sys/types.h>
+#endif
+#if defined(I_DIRENT)
+#include <dirent.h>
+#else
+#ifdef I_SYS_NDIR
+#include <sys/ndir.h>
+#else
+#ifdef I_SYS_DIR
+#include <sys/dir.h>
+#endif
+#endif
+#endif
+int main() {
+	DIR *dirp = opendir(".");
+	if (dirfd(dirp) >= 0)
+		exit(0);
+	else
+		exit(1);
+}
+EOM
+val=$undef
+set dirfd
+if eval $compile; then
+	val="$define"
+fi
+case "$val" in
+$define)	echo "dirfd() found." >&4	;;
+*)		echo "dirfd() NOT found." >&4	;;
+esac
+set d_dirfd
+eval $setvar
+$rm -f dirfd*
+
+: see if dladdr exists
+set dladdr d_dladdr
+eval $inlibc
+
+: see if dlerror exists
+xxx_runnm="$runnm"
+runnm=false
+set dlerror d_dlerror
+eval $inlibc
+runnm="$xxx_runnm"
+
+: see if dlfcn is available
+set dlfcn.h i_dlfcn
+eval $inhdr
+
+: Check what extension to use for shared libs
+case "$usedl" in
+$define|y|true)
+	$cat << EOM
+
+On a few systems, the dynamically loaded modules that perl generates and uses
+will need a different extension than shared libs. The default will probably
+be appropriate.
+
+EOM
+	case "$dlext" in
+	'')	dflt="$so" ;;
+	*)	dflt="$dlext" ;;
+	esac
+	rp='What is the extension of dynamically loaded modules'
+	. ./myread
+	dlext="$ans"
+	;;
+*)
+	dlext="none"
+	;;
+esac
+
+: Check if dlsym need a leading underscore
+echo " "
+val="$undef"
+
+case "$dlsrc" in
+dl_dlopen.xs)
+	echo "Checking whether your dlsym() needs a leading underscore ..." >&4
+	$cat >dyna.c <<'EOM'
+fred () { }
+EOM
+
+$cat >fred.c<<EOM
+
+#include <stdio.h>
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#$i_dlfcn I_DLFCN
+#ifdef I_DLFCN
+#include <dlfcn.h>      /* the dynamic linker include file for SunOS/Solaris */
+#else
+#include <sys/types.h>
+#include <nlist.h>
+#include <link.h>
+#endif
+
+extern int fred() ;
+
+int main()
+{
+    void * handle ;
+    void * symbol ;
+#ifndef RTLD_LAZY
+    int mode = 1 ;
+#else
+    int mode = RTLD_LAZY ;
+#endif
+    handle = dlopen("./dyna.$dlext", mode) ;
+    if (handle == NULL) {
+	printf ("1\n") ;
+	fflush (stdout) ;
+	exit(0);
+    }
+    symbol = dlsym(handle, "fred") ;
+    if (symbol == NULL) {
+	/* try putting a leading underscore */
+	symbol = dlsym(handle, "_fred") ;
+	if (symbol == NULL) {
+	    printf ("2\n") ;
+	    fflush (stdout) ;
+	    exit(0);
+	}
+	printf ("3\n") ;
+    }
+    else
+	printf ("4\n") ;
+    fflush (stdout) ;
+    exit(0);
+}
+EOM
+	: Call the object file tmp-dyna.o in case dlext=o.
+	if $cc $ccflags $cccdlflags -c dyna.c > /dev/null 2>&1 &&
+		mv dyna${_o} tmp-dyna${_o} > /dev/null 2>&1 &&
+		$ld -o dyna.$dlext $ldflags $lddlflags tmp-dyna${_o} > /dev/null 2>&1 &&
+		$cc -o fred $ccflags $ldflags $cccdlflags $ccdlflags fred.c $libs > /dev/null 2>&1 && $to dyna.$dlext; then
+		xxx=`$run ./fred`
+		case $xxx in
+		1)	echo "Test program failed using dlopen." >&4
+			echo "Perhaps you should not use dynamic loading." >&4;;
+		2)	echo "Test program failed using dlsym." >&4
+			echo "Perhaps you should not use dynamic loading." >&4;;
+		3)	echo "dlsym needs a leading underscore" >&4
+			val="$define" ;;
+		4)	echo "dlsym doesn't need a leading underscore." >&4;;
+		esac
+	else
+		echo "I can't compile and run the test program." >&4
+                echo "I'm guessing that dlsym doesn't need a leading underscore." >&4
+	fi
+	;;
+esac
+
+$rm -f fred fred.* dyna.$dlext dyna.* tmp-dyna.*
+
+set d_dlsymun
+eval $setvar
+
+: see if drand48_r exists
+set drand48_r d_drand48_r
+eval $inlibc
+case "$d_drand48_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_stdlib stdlib.h"
+	case "$d_drand48_r_proto:$usethreads" in
+	":define")	d_drand48_r_proto=define
+		set d_drand48_r_proto drand48_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_drand48_r_proto" in
+	define)
+	case "$drand48_r_proto" in
+	''|0) try='int drand48_r(struct drand48_data*, double*);'
+	./protochk "$extern_C $try" $hdrs && drand48_r_proto=I_ST ;;
+	esac
+	case "$drand48_r_proto" in
+	''|0)	d_drand48_r=undef
+		drand48_r_proto=0
+		echo "Disabling drand48_r, cannot determine prototype." >&4 ;;
+	* )	case "$drand48_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) drand48_r_proto="REENTRANT_PROTO_$drand48_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "drand48_r has no prototype, not using it." >&4 ;;
+		esac
+		d_drand48_r=undef
+		drand48_r_proto=0
+		;;
+	esac
+	;;
+*)	drand48_r_proto=0
+	;;
+esac
+
+: see if prototype for drand48 is available
+echo " "
+set d_drand48proto drand48 $i_stdlib stdlib.h $i_unistd unistd.h
+eval $hasproto
+
+: see if dup2 exists
+set dup2 d_dup2
+eval $inlibc
+
+: see if dup3 exists
+set dup3 d_dup3
+eval $inlibc
+
+: see if this is an xlocale.h system
+set xlocale.h i_xlocale
+eval $inhdr
+
+: see if newlocale exists
+set newlocale d_newlocale
+eval $inlibc
+
+: see if freelocale exists
+set freelocale d_freelocale
+eval $inlibc
+
+: see if uselocale exists
+set uselocale d_uselocale
+eval $inlibc
+
+: see if duplocale exists
+set duplocale d_duplocale
+eval $inlibc
+
+: see if querylocale exists
+set querylocale d_querylocale
+eval $inlibc
+
+: see if eaccess exists
+set eaccess d_eaccess
+eval $inlibc
+
+: see if endgrent exists
+set endgrent d_endgrent
+eval $inlibc
+
+: see if this is an grp system
+set grp.h i_grp
+eval $inhdr
+
+case "$i_grp" in
+$define)
+	xxx=`./findhdr grp.h`
+	$cppstdin $cppflags $cppminus < $xxx >$$.h
+
+	if $contains 'gr_passwd' $$.h >/dev/null 2>&1; then
+		val="$define"
+	else
+		val="$undef"
+	fi
+	set d_grpasswd
+	eval $setvar
+
+	$rm -f $$.h
+	;;
+*)
+	val="$undef";
+	set d_grpasswd; eval $setvar
+	;;
+esac
+
+: see if endgrent_r exists
+set endgrent_r d_endgrent_r
+eval $inlibc
+case "$d_endgrent_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_grp grp.h"
+	case "$d_endgrent_r_proto:$usethreads" in
+	":define")	d_endgrent_r_proto=define
+		set d_endgrent_r_proto endgrent_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_endgrent_r_proto" in
+	define)
+	case "$endgrent_r_proto" in
+	''|0) try='int endgrent_r(FILE**);'
+	./protochk "$extern_C $try" $hdrs && endgrent_r_proto=I_H ;;
+	esac
+	case "$endgrent_r_proto" in
+	''|0) try='void endgrent_r(FILE**);'
+	./protochk "$extern_C $try" $hdrs && endgrent_r_proto=V_H ;;
+	esac
+	case "$endgrent_r_proto" in
+	''|0)	d_endgrent_r=undef
+		endgrent_r_proto=0
+		echo "Disabling endgrent_r, cannot determine prototype." >&4 ;;
+	* )	case "$endgrent_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) endgrent_r_proto="REENTRANT_PROTO_$endgrent_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "endgrent_r has no prototype, not using it." >&4 ;;
+		esac
+		d_endgrent_r=undef
+		endgrent_r_proto=0
+		;;
+	esac
+	;;
+*)	endgrent_r_proto=0
+	;;
+esac
+
+: see if endhostent exists
+set endhostent d_endhent
+eval $inlibc
+
+: see if this is a netdb.h system
+set netdb.h i_netdb
+eval $inhdr
+
+: see if endhostent_r exists
+set endhostent_r d_endhostent_r
+eval $inlibc
+case "$d_endhostent_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_netdb netdb.h"
+	case "$d_endhostent_r_proto:$usethreads" in
+	":define")	d_endhostent_r_proto=define
+		set d_endhostent_r_proto endhostent_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_endhostent_r_proto" in
+	define)
+	case "$endhostent_r_proto" in
+	''|0) try='int endhostent_r(struct hostent_data*);'
+	./protochk "$extern_C $try" $hdrs && endhostent_r_proto=I_D ;;
+	esac
+	case "$endhostent_r_proto" in
+	''|0) try='void endhostent_r(struct hostent_data*);'
+	./protochk "$extern_C $try" $hdrs && endhostent_r_proto=V_D ;;
+	esac
+	case "$endhostent_r_proto" in
+	''|0)	d_endhostent_r=undef
+		endhostent_r_proto=0
+		echo "Disabling endhostent_r, cannot determine prototype." >&4 ;;
+	* )	case "$endhostent_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) endhostent_r_proto="REENTRANT_PROTO_$endhostent_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "endhostent_r has no prototype, not using it." >&4 ;;
+		esac
+		d_endhostent_r=undef
+		endhostent_r_proto=0
+		;;
+	esac
+	;;
+*)	endhostent_r_proto=0
+	;;
+esac
+
+: see if endnetent exists
+set endnetent d_endnent
+eval $inlibc
+
+: see if endnetent_r exists
+set endnetent_r d_endnetent_r
+eval $inlibc
+case "$d_endnetent_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_netdb netdb.h"
+	case "$d_endnetent_r_proto:$usethreads" in
+	":define")	d_endnetent_r_proto=define
+		set d_endnetent_r_proto endnetent_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_endnetent_r_proto" in
+	define)
+	case "$endnetent_r_proto" in
+	''|0) try='int endnetent_r(struct netent_data*);'
+	./protochk "$extern_C $try" $hdrs && endnetent_r_proto=I_D ;;
+	esac
+	case "$endnetent_r_proto" in
+	''|0) try='void endnetent_r(struct netent_data*);'
+	./protochk "$extern_C $try" $hdrs && endnetent_r_proto=V_D ;;
+	esac
+	case "$endnetent_r_proto" in
+	''|0)	d_endnetent_r=undef
+		endnetent_r_proto=0
+		echo "Disabling endnetent_r, cannot determine prototype." >&4 ;;
+	* )	case "$endnetent_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) endnetent_r_proto="REENTRANT_PROTO_$endnetent_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "endnetent_r has no prototype, not using it." >&4 ;;
+		esac
+		d_endnetent_r=undef
+		endnetent_r_proto=0
+		;;
+	esac
+	;;
+*)	endnetent_r_proto=0
+	;;
+esac
+
+: see if endprotoent exists
+set endprotoent d_endpent
+eval $inlibc
+
+: see if endprotoent_r exists
+set endprotoent_r d_endprotoent_r
+eval $inlibc
+case "$d_endprotoent_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_netdb netdb.h"
+	case "$d_endprotoent_r_proto:$usethreads" in
+	":define")	d_endprotoent_r_proto=define
+		set d_endprotoent_r_proto endprotoent_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_endprotoent_r_proto" in
+	define)
+	case "$endprotoent_r_proto" in
+	''|0) try='int endprotoent_r(struct protoent_data*);'
+	./protochk "$extern_C $try" $hdrs && endprotoent_r_proto=I_D ;;
+	esac
+	case "$endprotoent_r_proto" in
+	''|0) try='void endprotoent_r(struct protoent_data*);'
+	./protochk "$extern_C $try" $hdrs && endprotoent_r_proto=V_D ;;
+	esac
+	case "$endprotoent_r_proto" in
+	''|0)	d_endprotoent_r=undef
+		endprotoent_r_proto=0
+		echo "Disabling endprotoent_r, cannot determine prototype." >&4 ;;
+	* )	case "$endprotoent_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) endprotoent_r_proto="REENTRANT_PROTO_$endprotoent_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "endprotoent_r has no prototype, not using it." >&4 ;;
+		esac
+		d_endprotoent_r=undef
+		endprotoent_r_proto=0
+		;;
+	esac
+	;;
+*)	endprotoent_r_proto=0
+	;;
+esac
+
+: see if endpwent exists
+set endpwent d_endpwent
+eval $inlibc
+
+: see if this is a pwd.h system
+set pwd.h i_pwd
+eval $inhdr
+
+case "$i_pwd" in
+$define)
+	xxx=`./findhdr pwd.h`
+	$cppstdin $cppflags $cppminus < $xxx >$$.h
+
+	if $contains 'pw_quota' $$.h >/dev/null 2>&1; then
+		val="$define"
+	else
+		val="$undef"
+	fi
+	set d_pwquota
+	eval $setvar
+
+	if $contains 'pw_age' $$.h >/dev/null 2>&1; then
+		val="$define"
+	else
+		val="$undef"
+	fi
+	set d_pwage
+	eval $setvar
+
+	if $contains 'pw_change' $$.h >/dev/null 2>&1; then
+		val="$define"
+	else
+		val="$undef"
+	fi
+	set d_pwchange
+	eval $setvar
+
+	if $contains 'pw_class' $$.h >/dev/null 2>&1; then
+		val="$define"
+	else
+		val="$undef"
+	fi
+	set d_pwclass
+	eval $setvar
+
+	if $contains 'pw_expire' $$.h >/dev/null 2>&1; then
+		val="$define"
+	else
+		val="$undef"
+	fi
+	set d_pwexpire
+	eval $setvar
+
+	if $contains 'pw_comment' $$.h >/dev/null 2>&1; then
+		val="$define"
+	else
+		val="$undef"
+	fi
+	set d_pwcomment
+	eval $setvar
+
+	if $contains 'pw_gecos' $$.h >/dev/null 2>&1; then
+		val="$define"
+	else
+		val="$undef"
+	fi
+	set d_pwgecos
+	eval $setvar
+
+	if $contains 'pw_passwd' $$.h >/dev/null 2>&1; then
+		val="$define"
+	else
+		val="$undef"
+	fi
+	set d_pwpasswd
+	eval $setvar
+
+	$rm -f $$.h
+	;;
+*)
+	val="$undef";
+	set d_pwquota; eval $setvar
+	set d_pwage; eval $setvar
+	set d_pwchange; eval $setvar
+	set d_pwclass; eval $setvar
+	set d_pwexpire; eval $setvar
+	set d_pwcomment; eval $setvar
+	set d_pwgecos; eval $setvar
+	set d_pwpasswd; eval $setvar
+	;;
+esac
+
+: see if endpwent_r exists
+set endpwent_r d_endpwent_r
+eval $inlibc
+case "$d_endpwent_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_pwd pwd.h"
+	case "$d_endpwent_r_proto:$usethreads" in
+	":define")	d_endpwent_r_proto=define
+		set d_endpwent_r_proto endpwent_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_endpwent_r_proto" in
+	define)
+	case "$endpwent_r_proto" in
+	''|0) try='int endpwent_r(FILE**);'
+	./protochk "$extern_C $try" $hdrs && endpwent_r_proto=I_H ;;
+	esac
+	case "$endpwent_r_proto" in
+	''|0) try='void endpwent_r(FILE**);'
+	./protochk "$extern_C $try" $hdrs && endpwent_r_proto=V_H ;;
+	esac
+	case "$endpwent_r_proto" in
+	''|0)	d_endpwent_r=undef
+		endpwent_r_proto=0
+		echo "Disabling endpwent_r, cannot determine prototype." >&4 ;;
+	* )	case "$endpwent_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) endpwent_r_proto="REENTRANT_PROTO_$endpwent_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "endpwent_r has no prototype, not using it." >&4 ;;
+		esac
+		d_endpwent_r=undef
+		endpwent_r_proto=0
+		;;
+	esac
+	;;
+*)	endpwent_r_proto=0
+	;;
+esac
+
+: see if endservent exists
+set endservent d_endsent
+eval $inlibc
+
+: see if endservent_r exists
+set endservent_r d_endservent_r
+eval $inlibc
+case "$d_endservent_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_netdb netdb.h"
+	case "$d_endservent_r_proto:$usethreads" in
+	":define")	d_endservent_r_proto=define
+		set d_endservent_r_proto endservent_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_endservent_r_proto" in
+	define)
+	case "$endservent_r_proto" in
+	''|0) try='int endservent_r(struct servent_data*);'
+	./protochk "$extern_C $try" $hdrs && endservent_r_proto=I_D ;;
+	esac
+	case "$endservent_r_proto" in
+	''|0) try='void endservent_r(struct servent_data*);'
+	./protochk "$extern_C $try" $hdrs && endservent_r_proto=V_D ;;
+	esac
+	case "$endservent_r_proto" in
+	''|0)	d_endservent_r=undef
+		endservent_r_proto=0
+		echo "Disabling endservent_r, cannot determine prototype." >&4 ;;
+	* )	case "$endservent_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) endservent_r_proto="REENTRANT_PROTO_$endservent_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "endservent_r has no prototype, not using it." >&4 ;;
+		esac
+		d_endservent_r=undef
+		endservent_r_proto=0
+		;;
+	esac
+	;;
+*)	endservent_r_proto=0
+	;;
+esac
+
+: Locate the flags for 'open()'
+echo " "
+$cat >try.c <<EOCP
+#include <sys/types.h>
+#ifdef I_FCNTL
+#include <fcntl.h>
+#endif
+#ifdef I_SYS_FILE
+#include <sys/file.h>
+#endif
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+int main() {
+	if(O_RDONLY);
+#ifdef O_TRUNC
+	exit(0);
+#else
+	exit(1);
+#endif
+}
+EOCP
+: check sys/file.h first to get FREAD on Sun
+if $test `./findhdr sys/file.h` && \
+		set try -DI_SYS_FILE && eval $compile; then
+	h_sysfile=true;
+	echo "<sys/file.h> defines the O_* constants..." >&4
+	if $run ./try; then
+		echo "and you have the 3 argument form of open()." >&4
+		val="$define"
+	else
+		echo "but not the 3 argument form of open().  Oh, well." >&4
+		val="$undef"
+	fi
+elif $test `./findhdr fcntl.h` && \
+		set try -DI_FCNTL && eval $compile; then
+	h_fcntl=true;
+	echo "<fcntl.h> defines the O_* constants..." >&4
+	if $run ./try; then
+		echo "and you have the 3 argument form of open()." >&4
+		val="$define"
+	else
+		echo "but not the 3 argument form of open().  Oh, well." >&4
+		val="$undef"
+	fi
+else
+	val="$undef"
+	echo "I can't find the O_* constant definitions!  You got problems." >&4
+fi
+set d_open3
+eval $setvar
+$rm_try
+
+: see if this is a sys/file.h system
+val=''
+set sys/file.h val
+eval $inhdr
+
+: do we need to include sys/file.h ?
+case "$val" in
+"$define")
+	echo " "
+	if $h_sysfile; then
+		val="$define"
+		echo "We'll be including <sys/file.h>." >&4
+	else
+		val="$undef"
+		echo "We won't be including <sys/file.h>." >&4
+	fi
+	;;
+*)
+	h_sysfile=false
+	;;
+esac
+set i_sysfile
+eval $setvar
+
+: see if fcntl.h is there
+val=''
+set fcntl.h val
+eval $inhdr
+
+: see if we can include fcntl.h
+case "$val" in
+"$define")
+	echo " "
+	if $h_fcntl; then
+		val="$define"
+		echo "We'll be including <fcntl.h>." >&4
+	else
+		val="$undef"
+		if $h_sysfile; then
+	echo "We don't need to include <fcntl.h> if we include <sys/file.h>." >&4
+		else
+			echo "We won't be including <fcntl.h>." >&4
+		fi
+	fi
+	;;
+*)
+	h_fcntl=false
+	val="$undef"
+	;;
+esac
+set i_fcntl
+eval $setvar
+
+: see if fork exists
+set fork d_fork
+eval $inlibc
+
+: see if pipe exists
+set pipe d_pipe
+eval $inlibc
+
+: check for non-blocking I/O stuff
+case "$h_sysfile" in
+true) echo "#include <sys/file.h>" > head.c;;
+*)
+       case "$h_fcntl" in
+       true) echo "#include <fcntl.h>" > head.c;;
+       *) echo "#include <sys/fcntl.h>" > head.c;;
+       esac
+       ;;
+esac
+echo " "
+echo "Figuring out the flag used by open() for non-blocking I/O..." >&4
+case "$o_nonblock" in
+'')
+	$cat head.c > try.c
+	$cat >>try.c <<EOCP
+#include <stdio.h>
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#$i_fcntl I_FCNTL
+#ifdef I_FCNTL
+#include <fcntl.h>
+#endif
+int main() {
+#ifdef O_NONBLOCK
+	printf("O_NONBLOCK\n");
+	exit(0);
+#endif
+#ifdef O_NDELAY
+	printf("O_NDELAY\n");
+	exit(0);
+#endif
+#ifdef FNDELAY
+	printf("FNDELAY\n");
+	exit(0);
+#endif
+	exit(0);
+}
+EOCP
+	set try
+	if eval $compile_ok; then
+		o_nonblock=`$run ./try`
+		case "$o_nonblock" in
+		'') echo "I can't figure it out, assuming O_NONBLOCK will do.";;
+		*) echo "Seems like we can use $o_nonblock.";;
+		esac
+	else
+		echo "(I can't compile the test program; pray O_NONBLOCK is right!)"
+	fi
+	;;
+*) echo "Using $hint value $o_nonblock.";;
+esac
+$rm_try
+
+echo " "
+echo "Let's see what value errno gets from read() on a $o_nonblock file..." >&4
+case "$eagain" in
+'')
+	case "$d_fork:$d_pipe:$d_alarm" in
+	define:define:define)
+	$cat head.c > try.c
+	$cat >>try.c <<EOCP
+#include <errno.h>
+#include <sys/types.h>
+#include <signal.h>
+#include <stdio.h>
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#$i_fcntl I_FCNTL
+#ifdef I_FCNTL
+#include <fcntl.h>
+#endif
+#define MY_O_NONBLOCK $o_nonblock
+#ifndef errno  /* XXX need better Configure test */
+extern int errno;
+#endif
+#$i_unistd I_UNISTD
+#ifdef I_UNISTD
+#include <unistd.h>
+#endif
+#include <string.h>
+$signal_t blech(int x) { exit(3); }
+EOCP
+	$cat >> try.c <<'EOCP'
+int main()
+{
+	int pd[2];
+	int pu[2];
+	char buf[1];
+	char string[100];
+	int ret;
+
+	ret = pipe(pd);	/* Down: child -> parent */
+	if (ret != 0)
+		exit(3);
+	ret = pipe(pu);	/* Up: parent -> child */
+	if (ret != 0)
+		exit(3);
+	if (0 != fork()) {
+		close(pd[1]);	/* Parent reads from pd[0] */
+		close(pu[0]);	/* Parent writes (blocking) to pu[1] */
+#ifdef F_SETFL
+		if (-1 == fcntl(pd[0], F_SETFL, MY_O_NONBLOCK))
+			exit(1);
+#else
+		exit(4);
+#endif
+		signal(SIGALRM, blech);
+		alarm(5);
+		if ((ret = read(pd[0], buf, 1)) > 0)	/* Nothing to read! */
+			exit(2);
+		sprintf(string, "%d\n", ret);
+		ret = write(2, string, strlen(string));
+		if (ret != strlen(string))
+			exit(3);
+		alarm(0);
+#ifdef EAGAIN
+		if (errno == EAGAIN) {
+			printf("EAGAIN\n");
+			goto ok;
+		}
+#endif
+#ifdef EWOULDBLOCK
+		if (errno == EWOULDBLOCK)
+			printf("EWOULDBLOCK\n");
+#endif
+	ok:
+		ret = write(pu[1], buf, 1);	/* Unblocks child, tell it to close our pipe */
+		if (ret != 1)
+			exit(3);
+		sleep(2);				/* Give it time to close our pipe */
+		alarm(5);
+		ret = read(pd[0], buf, 1);	/* Should read EOF */
+		alarm(0);
+		sprintf(string, "%d\n", ret);
+		ret = write(4, string, strlen(string));
+		if (ret != strlen(string))
+			exit(3);
+		exit(0);
+	}
+
+	close(pd[0]);			/* We write to pd[1] */
+	close(pu[1]);			/* We read from pu[0] */
+	ret = read(pu[0], buf, 1);	/* Wait for parent to signal us we may continue */
+	if (ret != 1)
+		exit(3);
+	close(pd[1]);			/* Pipe pd is now fully closed! */
+	exit(0);				/* Bye bye, thank you for playing! */
+}
+EOCP
+	set try
+	if eval $compile_ok; then
+		echo "$startsh" >mtry
+		echo "$run ./try >try.out 2>try.ret 4>try.err || exit 4" >>mtry
+		chmod +x mtry
+		$run ./mtry >/dev/null 2>&1
+		case $? in
+		0) eagain=`$cat try.out`;;
+		1) echo "Could not perform non-blocking setting!";;
+		2) echo "I did a successful read() for something that was not there!";;
+		3) echo "Hmm... non-blocking I/O does not seem to be working!";;
+		4) echo "Could not find F_SETFL!";;
+		*) echo "Something terribly wrong happened during testing.";;
+		esac
+		rd_nodata=`$cat try.ret`
+		echo "A read() system call with no data present returns $rd_nodata."
+		case "$rd_nodata" in
+		0|-1) ;;
+		*)
+			echo "(That's peculiar, fixing that to be -1.)"
+			rd_nodata=-1
+			;;
+		esac
+		case "$eagain" in
+		'')
+			echo "Forcing errno EAGAIN on read() with no data available."
+			eagain=EAGAIN
+			;;
+		*)
+			echo "Your read() sets errno to $eagain when no data is available."
+			;;
+		esac
+		status=`$cat try.err`
+		case "$status" in
+		0) echo "And it correctly returns 0 to signal EOF.";;
+		-1) echo "But it also returns -1 to signal EOF, so be careful!";;
+		*) echo "However, your read() returns '$status' on EOF??";;
+		esac
+		val="$define"
+		if test "$status" = "$rd_nodata"; then
+			echo "WARNING: you can't distinguish between EOF and no data!"
+			val="$undef"
+		fi
+	else
+		echo "I can't compile the test program--assuming errno EAGAIN will do."
+		eagain=EAGAIN
+	fi
+	;;
+	*)	echo "Can't figure out how to test this--assuming errno EAGAIN will do."
+		eagain=EAGAIN
+		val="$define"
+		;;
+	esac
+	set d_eofnblk
+	eval $setvar
+	;;
+*)
+	echo "Using $hint value $eagain."
+	echo "Your read() returns $rd_nodata when no data is present."
+	case "$d_eofnblk" in
+	"$define") echo "And you can see EOF because read() returns 0.";;
+	"$undef") echo "But you can't see EOF status from read() returned value.";;
+	*)
+		echo "(Assuming you can't see EOF status from read anyway.)"
+		d_eofnblk=$undef
+		;;
+	esac
+	;;
+esac
+$rm_try head.c mtry
+
+: see if erf exists
+set erf d_erf
+eval $inlibc
+
+: see if erfc exists
+set erfc d_erfc
+eval $inlibc
+
+: see if exp2 exists
+set exp2 d_exp2
+eval $inlibc
+
+: see if expm1 exists
+set expm1 d_expm1
+eval $inlibc
+
+: see if _ptr and _cnt from stdio act std
+echo " "
+
+if $contains '_lbfsize' `./findhdr stdio.h` >/dev/null 2>&1 ; then
+	echo "(Looks like you have stdio.h from BSD.)"
+	case "$stdio_ptr" in
+	'') stdio_ptr='((fp)->_p)'
+		ptr_lval=$define
+		;;
+	*)	ptr_lval=$d_stdio_ptr_lval;;
+	esac
+	case "$stdio_cnt" in
+	'') stdio_cnt='((fp)->_r)'
+		cnt_lval=$define
+		;;
+	*)	cnt_lval=$d_stdio_cnt_lval;;
+	esac
+	case "$stdio_base" in
+	'') stdio_base='((fp)->_ub._base ? (fp)->_ub._base : (fp)->_bf._base)';;
+	esac
+	case "$stdio_bufsiz" in
+	'') stdio_bufsiz='((fp)->_ub._base ? (fp)->_ub._size : (fp)->_bf._size)';;
+	esac
+elif $contains '_IO_fpos_t' `./findhdr stdio.h` `./findhdr libio.h` >/dev/null 2>&1 ; then
+	echo "(Looks like you have stdio.h from Linux.)"
+	case "$stdio_ptr" in
+	'') stdio_ptr='((fp)->_IO_read_ptr)'
+		ptr_lval=$define
+		;;
+	*)	ptr_lval=$d_stdio_ptr_lval;;
+	esac
+	case "$stdio_cnt" in
+	'') stdio_cnt='((fp)->_IO_read_end - (fp)->_IO_read_ptr)'
+		cnt_lval=$undef
+		;;
+	*)	cnt_lval=$d_stdio_cnt_lval;;
+	esac
+	case "$stdio_base" in
+	'') stdio_base='((fp)->_IO_read_base)';;
+	esac
+	case "$stdio_bufsiz" in
+	'') stdio_bufsiz='((fp)->_IO_read_end - (fp)->_IO_read_base)';;
+	esac
+else
+	case "$stdio_ptr" in
+	'') stdio_ptr='((fp)->_ptr)'
+		ptr_lval=$define
+		;;
+	*)	ptr_lval=$d_stdio_ptr_lval;;
+	esac
+	case "$stdio_cnt" in
+	'') stdio_cnt='((fp)->_cnt)'
+		cnt_lval=$define
+		;;
+	*)	cnt_lval=$d_stdio_cnt_lval;;
+	esac
+	case "$stdio_base" in
+	'') stdio_base='((fp)->_base)';;
+	esac
+	case "$stdio_bufsiz" in
+	'') stdio_bufsiz='((fp)->_cnt + (fp)->_ptr - (fp)->_base)';;
+	esac
+fi
+
+: test whether _ptr and _cnt really work
+echo "Checking how std your stdio is..." >&4
+$cat >try.c <<EOP
+#include <stdio.h>
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#define FILE_ptr(fp)	$stdio_ptr
+#define FILE_cnt(fp)	$stdio_cnt
+int main() {
+	FILE *fp = fopen("try.c", "r");
+	char c = getc(fp);
+	if (
+		18 <= FILE_cnt(fp) &&
+		strncmp(FILE_ptr(fp), "include <stdio.h>\n", 18) == 0
+	)
+		exit(0);
+	exit(1);
+}
+EOP
+val="$undef"
+set try
+if eval $compile && $to try.c; then
+	if $run ./try; then
+		echo "Your stdio acts pretty std."
+		val="$define"
+	else
+		echo "Your stdio isn't very std."
+	fi
+else
+	echo "Your stdio doesn't appear very std."
+fi
+$rm_try
+
+# glibc 2.2.90 and above apparently change stdio streams so Perl's
+# direct buffer manipulation no longer works.  The Configure tests
+# should be changed to correctly detect this, but until then,
+# the following check should at least let perl compile and run.
+# (This quick fix should be updated before 5.8.1.)
+# To be defensive, reject all unknown versions, and all versions  > 2.2.9.
+# A. Dougherty, June 3, 2002.
+case "$d_gnulibc" in
+$define)
+	case "$gnulibc_version" in
+	2.[01]*)  ;;
+	2.2) ;;
+	2.2.[0-9]) ;;
+	*)  echo "But I will not snoop inside glibc $gnulibc_version stdio buffers."
+		val="$undef"
+		;;
+	esac
+	;;
+esac
+set d_stdstdio
+eval $setvar
+
+: Can _ptr be used as an lvalue?
+case "$d_stdstdio$ptr_lval" in
+$define$define) val=$define ;;
+*) val=$undef ;;
+esac
+set d_stdio_ptr_lval
+eval $setvar
+
+: Can _cnt be used as an lvalue?
+case "$d_stdstdio$cnt_lval" in
+$define$define) val=$define ;;
+*) val=$undef ;;
+esac
+set d_stdio_cnt_lval
+eval $setvar
+
+
+: test whether setting _ptr sets _cnt as a side effect
+d_stdio_ptr_lval_sets_cnt="$undef"
+d_stdio_ptr_lval_nochange_cnt="$undef"
+case "$d_stdio_ptr_lval$d_stdstdio" in
+$define$define)
+	echo "Checking to see what happens if we set the stdio ptr..." >&4
+$cat >try.c <<EOP
+#include <stdio.h>
+/* Can we scream? */
+/* Eat dust sed :-) */
+/* In the buffer space, no one can hear you scream. */
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#define FILE_ptr(fp)	$stdio_ptr
+#define FILE_cnt(fp)	$stdio_cnt
+#include <sys/types.h>
+int main() {
+	FILE *fp = fopen("try.c", "r");
+	int c;
+	char *ptr;
+	size_t cnt;
+	if (!fp) {
+	    puts("Fail even to read");
+	    exit(1);
+	}
+	c = getc(fp); /* Read away the first # */
+	if (c == EOF) {
+	    puts("Fail even to read");
+	    exit(1);
+	}
+	if (!(
+		18 <= FILE_cnt(fp) &&
+		strncmp(FILE_ptr(fp), "include <stdio.h>\n", 18) == 0
+	)) {
+		puts("Fail even to read");
+		exit (1);
+	}
+	ptr = (char*) FILE_ptr(fp);
+	cnt = (size_t)FILE_cnt(fp);
+
+	FILE_ptr(fp) += 42;
+
+	if ((char*)FILE_ptr(fp) != (ptr + 42)) {
+		printf("Fail ptr check %p != %p", FILE_ptr(fp), (ptr + 42));
+		exit (1);
+	}
+	if (FILE_cnt(fp) <= 20) {
+		printf ("Fail (<20 chars to test)");
+		exit (1);
+	}
+	if (strncmp(FILE_ptr(fp), "Eat dust sed :-) */\n", 20) != 0) {
+		puts("Fail compare");
+		exit (1);
+	}
+	if (cnt == FILE_cnt(fp)) {
+		puts("Pass_unchanged");
+		exit (0);
+	}
+	if (FILE_cnt(fp) == (cnt - 42)) {
+		puts("Pass_changed");
+		exit (0);
+	}
+	printf("Fail count was %d now %d\n", cnt, FILE_cnt(fp));
+	return 1;
+
+}
+EOP
+	set try
+	if eval $compile && $to try.c; then
+		case `$run ./try` in
+		Pass_changed)
+			echo "Increasing ptr in your stdio decreases cnt by the same amount.  Good." >&4
+			d_stdio_ptr_lval_sets_cnt="$define" ;;
+		Pass_unchanged)
+			echo "Increasing ptr in your stdio leaves cnt unchanged.  Good." >&4
+			d_stdio_ptr_lval_nochange_cnt="$define" ;;
+		Fail*)
+			echo "Increasing ptr in your stdio didn't do exactly what I expected.  We'll not be doing that then." >&4 ;;
+		*)
+			echo "It appears attempting to set ptr in your stdio is a bad plan." >&4 ;;
+	esac
+	else
+		echo "It seems we can't set ptr in your stdio.  Nevermind." >&4
+	fi
+	$rm_try
+	;;
+esac
+
+: see if _base is also standard
+val="$undef"
+case "$d_stdstdio" in
+$define)
+	$cat >try.c <<EOP
+#include <stdio.h>
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#define FILE_base(fp)	$stdio_base
+#define FILE_bufsiz(fp)	$stdio_bufsiz
+int main() {
+	FILE *fp = fopen("try.c", "r");
+	char c = getc(fp);
+	if (
+		19 <= FILE_bufsiz(fp) &&
+		strncmp(FILE_base(fp), "#include <stdio.h>\n", 19) == 0
+	)
+		exit(0);
+	exit(1);
+}
+EOP
+	set try
+	if eval $compile && $to try.c; then
+		if $run ./try; then
+			echo "And its _base field acts std."
+			val="$define"
+		else
+			echo "But its _base field isn't std."
+		fi
+	else
+		echo "However, it seems to be lacking the _base field."
+	fi
+	$rm_try
+	;;
+esac
+set d_stdiobase
+eval $setvar
+
+: see if fast_stdio exists
+val="$undef"
+case "$d_stdstdio:$d_stdio_ptr_lval" in
+"$define:$define")
+	case "$d_stdio_cnt_lval$d_stdio_ptr_lval_sets_cnt" in
+	*$define*)
+		echo "You seem to have 'fast stdio' to directly manipulate the stdio buffers." >& 4
+		val="$define"
+		;;
+	esac
+	;;
+esac
+set d_faststdio
+eval $setvar
+
+: see if fchdir exists
+set fchdir d_fchdir
+eval $inlibc
+
+: see if fchmod exists
+set fchmod d_fchmod
+eval $inlibc
+
+: check for openat, unlinkat, renameat, linkat, fchmodat
+set openat d_openat
+eval $inlibc
+
+set unlinkat d_unlinkat
+eval $inlibc
+
+set renameat d_renameat
+eval $inlibc
+
+set linkat d_linkat
+eval $inlibc
+
+set fchmodat d_fchmodat
+eval $inlibc
+
+: see if fchown exists
+set fchown d_fchown
+eval $inlibc
+
+: see if this is an fcntl system
+set fcntl d_fcntl
+eval $inlibc
+
+: See if fcntl-based locking works.
+echo " "
+$cat >try.c <<EOCP
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#include <unistd.h>
+#include <fcntl.h>
+#include <signal.h>
+$signal_t blech(int x) { exit(3); }
+int main() {
+#if defined(F_SETLK) && defined(F_SETLKW)
+     struct flock flock;
+     int retval, fd;
+     fd = open("try.c", O_RDONLY);
+     flock.l_type = F_RDLCK;
+     flock.l_whence = SEEK_SET;
+     flock.l_start = flock.l_len = 0;
+     signal(SIGALRM, blech);
+     alarm(10);
+     retval = fcntl(fd, F_SETLK, &flock);
+     close(fd);
+     (retval < 0 ? exit(2) : exit(0));
+#else
+     exit(2);
+#endif
+}
+EOCP
+echo "Checking if fcntl-based file locking works... "
+case "$d_fcntl" in
+"$define")
+	set try
+	if eval $compile_ok; then
+		if $run ./try; then
+			echo "Yes, it seems to work."
+			val="$define"
+		else
+			echo "Nope, it didn't work."
+			val="$undef"
+			case "$?" in
+			3) $cat >&4 <<EOM
+***
+*** I had to forcibly timeout from fcntl(..., F_SETLK, ...).
+*** This is (almost) impossible.
+*** If your NFS lock daemons are not feeling well, something like
+*** this may happen, please investigate.  Cannot continue, aborting.
+***
+EOM
+				exit 1
+				;;
+			esac
+		fi
+	else
+		echo "I'm unable to compile the test program, so I'll assume not."
+		val="$undef"
+	fi
+	;;
+*) val="$undef";
+	echo "Nope, since you don't even have fcntl()."
+	;;
+esac
+set d_fcntl_can_lock
+eval $setvar
+$rm_try
+
+: check for fd_set items
+$cat <<EOM
+
+Checking to see how well your C compiler handles fd_set and friends ...
+EOM
+$cat >try.c <<EOCP
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#$i_systime I_SYS_TIME
+#$i_sysselct I_SYS_SELECT
+#$d_socket HAS_SOCKET
+#include <sys/types.h>
+#ifdef HAS_SOCKET
+#include <sys/socket.h> /* Might include <sys/bsdtypes.h> */
+#endif
+#ifdef I_SYS_TIME
+#include <sys/time.h>
+#endif
+#ifdef I_SYS_SELECT
+#include <sys/select.h>
+#endif
+int main() {
+	fd_set fds;
+
+#ifdef TRYBITS
+	if(fds.fds_bits);
+#endif
+
+#if defined(FD_SET) && defined(FD_CLR) && defined(FD_ISSET) && defined(FD_ZERO)
+	exit(0);
+#else
+	exit(1);
+#endif
+}
+EOCP
+set try -DTRYBITS
+if eval $compile; then
+	d_fds_bits="$define"
+	d_fd_set="$define"
+	echo "Well, your system knows about the normal fd_set typedef..." >&4
+	if $run ./try; then
+		echo "and you have the normal fd_set macros (just as I'd expect)." >&4
+		d_fd_macros="$define"
+	else
+		$cat >&4 <<'EOM'
+but not the normal fd_set macros!  Gaaack!  I'll have to cover for you.
+EOM
+		d_fd_macros="$undef"
+	fi
+else
+	$cat <<'EOM'
+Hmm, your compiler has some difficulty with fd_set.  Checking further...
+EOM
+	set try
+	if eval $compile; then
+		d_fds_bits="$undef"
+		d_fd_set="$define"
+		echo "Well, your system has some sort of fd_set available..." >&4
+		if $run ./try; then
+			echo "and you have the normal fd_set macros." >&4
+			d_fd_macros="$define"
+		else
+			$cat <<'EOM'
+but not the normal fd_set macros!  Gross!  More work for me...
+EOM
+			d_fd_macros="$undef"
+		fi
+	else
+	echo "Well, you got zip.  That's OK, I can roll my own fd_set stuff." >&4
+		d_fd_set="$undef"
+		d_fds_bits="$undef"
+		d_fd_macros="$undef"
+	fi
+fi
+$rm_try
+
+: see if fdclose exists
+set fdclose d_fdclose
+eval $inlibc
+
+: see if fdim exists
+set fdim d_fdim
+eval $inlibc
+
+: see if fegetround exists
+set fegetround d_fegetround
+eval $inlibc
+
+: see if fgetpos exists
+set fgetpos d_fgetpos
+eval $inlibc
+
+: see if finite exists
+set finite d_finite
+eval $inlibc
+
+: see if finitel exists
+set finitel d_finitel
+eval $inlibc
+
+: see if flock exists
+set flock d_flock
+eval $inlibc
+
+: see if prototype for flock is available
+echo " "
+set d_flockproto flock $i_sysfile sys/file.h
+eval $hasproto
+
+: see if fma exists
+set fma d_fma
+eval $inlibc
+
+: see if fmax exists
+set fmax d_fmax
+eval $inlibc
+
+: see if fmin exists
+set fmin d_fmin
+eval $inlibc
+
+: see if fp_class exists
+set fp_class d_fp_class
+eval $inlibc
+
+: check for fpclassify
+echo "Checking to see if you have fpclassify..." >&4
+$cat >try.c <<EOCP
+#include <math.h>
+int main() { return fpclassify(1.0) == FP_NORMAL ? 0 : 1; }
+EOCP
+set try
+if eval $compile; then
+	val="$define"
+	echo "You have fpclassify."
+else
+	val="$undef"
+	echo "You do not have fpclassify."
+fi
+$rm_try
+set d_fpclassify
+eval $setvar
+
+: see if fp_classify exists
+set fp_classify d_fp_classify
+eval $inlibc
+
+: see if fp_classl exists
+set fp_classl d_fp_classl
+eval $inlibc
+
+: see if pathconf exists
+set pathconf d_pathconf
+eval $inlibc
+
+: see if fpathconf exists
+set fpathconf d_fpathconf
+eval $inlibc
+
+: see if fpclass exists
+set fpclass d_fpclass
+eval $inlibc
+
+: see if fpclassl exists
+set fpclassl d_fpclassl
+eval $inlibc
+
+: see if fpgetround exists
+set fpgetround d_fpgetround
+eval $inlibc
+
+: check for fpos64_t
+echo " "
+echo "Checking to see if you have fpos64_t..." >&4
+$cat >try.c <<EOCP
+#include <stdio.h>
+int main() { fpos64_t x = 7; }
+EOCP
+set try
+if eval $compile; then
+	val="$define"
+	echo "You have fpos64_t."
+else
+	val="$undef"
+	echo "You do not have fpos64_t."
+	case "$fpossize" in
+	8) echo "(Your fpos_t is 64 bits, so you could use that.)" ;;
+	esac
+fi
+$rm_try
+set d_fpos64_t
+eval $setvar
+
+: see if frexpl exists
+set frexpl d_frexpl
+eval $inlibc
+
+: see if this is a sys/param system
+set sys/param.h i_sysparam
+eval $inhdr
+
+: see if this is a sys/mount.h system
+set sys/mount.h i_sysmount
+eval $inhdr
+
+: Check for fs_data_s
+echo " "
+echo "Checking to see if your system supports struct fs_data..." >&4
+set d_fs_data_s fs_data $i_systypes sys/types.h $i_sysparam sys/param.h $i_sysmount sys/mount.h
+eval $hasstruct
+case "$d_fs_data_s" in
+"$define")      echo "Yes, it does."   ;;
+*)              echo "No, it doesn't." ;;
+esac
+
+: see if fseeko exists
+set fseeko d_fseeko
+eval $inlibc
+case "$longsize" in
+8) echo "(Your long is 64 bits, so you could use fseek.)" ;;
+esac
+
+: see if fsetpos exists
+set fsetpos d_fsetpos
+eval $inlibc
+
+: see if fstatfs exists
+set fstatfs d_fstatfs
+eval $inlibc
+
+: see if statvfs exists
+set statvfs d_statvfs
+eval $inlibc
+
+: see if fstatvfs exists
+set fstatvfs d_fstatvfs
+eval $inlibc
+
+: see if fsync exists
+set fsync d_fsync
+eval $inlibc
+
+: see if ftello exists
+set ftello d_ftello
+eval $inlibc
+case "$longsize" in
+8) echo "(Your long is 64 bits, so you could use ftell.)" ;;
+esac
+
+: check for a working futimes
+d_futimes="$undef"
+echo " "
+echo "Checking if you have a working futimes()" >&4
+$cat >try.c <<EOCP
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+
+int main ()
+{
+    int fd, rv;
+    fd = open ("try.c", O_RDWR);
+    if (-1 == fd) exit (1);
+    rv = futimes (fd, NULL);
+    exit (rv == -1 ? errno : 0);
+}
+EOCP
+set try
+if eval $compile; then
+    `$run ./try`
+    rc=$?
+    case "$rc" in
+	0)  echo "Yes, you have" >&4
+	    d_futimes="$define"
+	    ;;
+	*)  echo "No, you have futimes, but it isn't working ($rc) (probably harmless)" >&4
+	    ;;
+    esac
+else
+    echo "No, it does not (probably harmless)" >&4
+fi
+$rm_try
+
+: look for gai_strerror
+echo " "
+$cat >try.c <<'EOCP'
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+int main ()
+{
+    return (gai_strerror (0) ? 0 : 1);
+    }
+EOCP
+set try
+val="$undef"
+if eval $compile; then
+    `$run ./try`
+    case "$?" in
+	0)  echo "A working gai_strerror() found." >&4
+	    val="$define" ;;
+	*)  echo "gai_strerror() found, but it doesn't work" >&4
+	    ;;
+	esac
+else
+    echo "gai_strerror() NOT found." >&4
+    fi
+set d_gai_strerror
+eval $setvar
+$rm_try
+
+: see if ndbm.h is available
+set ndbm.h i_ndbm
+eval $inhdr
+: Compatibility location for RedHat 7.1
+set gdbm/ndbm.h i_gdbmndbm
+eval $inhdr
+: Compatibility location for Debian 4.0
+set gdbm-ndbm.h i_gdbm_ndbm
+eval $inhdr
+
+val="$undef"
+if $test "$i_ndbm" = "$define" -o "$i_gdbmndbm" = "$define" -o "$i_gdbm_ndbm" = "$define"; then
+	: see if dbm_open exists
+	set dbm_open d_dbm_open
+	eval $inlibc
+	case "$d_dbm_open" in
+	$undef)
+		i_ndbm="$undef"
+		i_gdbmndbm="$undef"
+		i_gdbm_ndbm="$undef"
+		echo "We won't be including <ndbm.h>"
+		val="$undef"
+		;;
+	*) val="$define"
+	   ;;
+	esac
+fi
+set d_ndbm
+eval $setvar
+
+ndbm_hdr_protochk='name=$1; hdr=$2;
+eval "ihdr=\$""i_$name";
+val="$undef";
+if $test "$ihdr" = "$define"; then
+	$echo "Checking if your <$hdr> uses prototypes..." >&4;
+	case "$d_cplusplus" in
+	$define) ./protochk "$extern_C void dbm_close(DBM *);" literal "extern \"C\" {" $ihdr $hdr literal "}" && val="$define" ;;
+	*) ./protochk "$extern_C void dbm_close(int, int);" $ihdr $hdr || val="$define" ;;
+	esac;
+	case "$val" in
+	$define) $echo "Your <$hdr> seems to have prototypes";;
+	*) $echo "Your <$hdr> does not seem to have prototypes";;
+	esac;
+fi;
+set "d_${name}_h_uses_prototypes";
+eval $setvar'
+
+set ndbm ndbm.h
+eval $ndbm_hdr_protochk
+set gdbmndbm gdbm/ndbm.h
+eval $ndbm_hdr_protochk
+set gdbm_ndbm gdbm-ndbm.h
+eval $ndbm_hdr_protochk
+
+: see if getaddrinfo exists
+set getaddrinfo d_getaddrinfo
+eval $inlibc
+
+: see if getcwd exists
+set getcwd d_getcwd
+eval $inlibc
+
+: check for getenv behavior
+case "$d_getenv_preserves_other_thread" in
+'')
+$echo "Checking to see if getenv() preserves a different thread's results" >&4
+$cat >try.c <<EOCP
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#  include <stdlib.h>
+#endif
+#include <stdio.h>
+#include <string.h>
+#$i_pthread I_PTHREAD
+#ifdef I_PTHREAD
+#  include <pthread.h>
+#endif
+
+void *
+thread_start(void * arg)
+{
+    (void *) getenv("HOME");
+}
+
+int main() {
+    char * main_buffer;
+    char save_main_buffer[1000];
+    pthread_t subthread;
+    pthread_attr_t attr;
+
+    main_buffer = getenv("PATH");
+
+    /* If too large for our generous allowance, return we couldn't figure it
+     * out. */
+    if (strlen(main_buffer) >= sizeof(save_main_buffer)) {
+        exit(2);
+    }
+
+    strcpy(save_main_buffer, main_buffer);
+
+    if (pthread_attr_init(&attr) != 0) {
+        exit(2);
+    }
+
+    if (pthread_create(&subthread, &attr, thread_start, NULL) != 0) {
+        exit(2);
+    }
+
+    if (pthread_join(subthread, NULL) != 0) {
+        exit(2);
+    }
+
+    exit(! strcmp(main_buffer, save_main_buffer) == 0);
+}
+EOCP
+val=
+set try
+if eval $compile_ok; then
+    $run ./try
+    rc=$?
+    case "$rc" in
+	0) echo "getenv() didn't destroy another thread's buffer" >&4
+	   val=$define
+	   ;;
+	1) echo "getenv() does destroy another thread's buffer" >&4
+	   val=$undef
+	   ;;
+	*) echo "Couldn't determine if getenv() destroys another thread's return value (code=$rc); assuming it does" >&4
+	   val=$undef
+	   ;;
+    esac
+else
+    echo "(I can't seem to compile the test program.)" >&4
+    echo "Assuming that your C library's getenv destroys another thread's return value." >&4
+    val=$undef
+fi
+set d_getenv_preserves_other_thread
+eval $setvar
+$rm_try
+;;
+esac
+
+: see if getespwnam exists
+set getespwnam d_getespwnam
+eval $inlibc
+
+: see if getfsstat exists
+set getfsstat d_getfsstat
+eval $inlibc
+
+: see if getgrent exists
+set getgrent d_getgrent
+eval $inlibc
+
+: see if getgrent_r exists
+set getgrent_r d_getgrent_r
+eval $inlibc
+case "$d_getgrent_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_grp grp.h"
+	case "$d_getgrent_r_proto:$usethreads" in
+	":define")	d_getgrent_r_proto=define
+		set d_getgrent_r_proto getgrent_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_getgrent_r_proto" in
+	define)
+	case "$getgrent_r_proto" in
+	''|0) try='int getgrent_r(struct group*, char*, size_t, struct group**);'
+	./protochk "$extern_C $try" $hdrs && getgrent_r_proto=I_SBWR ;;
+	esac
+	case "$getgrent_r_proto" in
+	''|0) try='int getgrent_r(struct group*, char*, int, struct group**);'
+	./protochk "$extern_C $try" $hdrs && getgrent_r_proto=I_SBIR ;;
+	esac
+	case "$getgrent_r_proto" in
+	''|0) try='struct group* getgrent_r(struct group*, char*, size_t);'
+	./protochk "$extern_C $try" $hdrs && getgrent_r_proto=S_SBW ;;
+	esac
+	case "$getgrent_r_proto" in
+	''|0) try='struct group* getgrent_r(struct group*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getgrent_r_proto=S_SBI ;;
+	esac
+	case "$getgrent_r_proto" in
+	''|0) try='int getgrent_r(struct group*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getgrent_r_proto=I_SBI ;;
+	esac
+	case "$getgrent_r_proto" in
+	''|0) try='int getgrent_r(struct group*, char*, int, FILE**);'
+	./protochk "$extern_C $try" $hdrs && getgrent_r_proto=I_SBIH ;;
+	esac
+	case "$getgrent_r_proto" in
+	''|0)	d_getgrent_r=undef
+		getgrent_r_proto=0
+		echo "Disabling getgrent_r, cannot determine prototype." >&4 ;;
+	* )	case "$getgrent_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) getgrent_r_proto="REENTRANT_PROTO_$getgrent_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "getgrent_r has no prototype, not using it." >&4 ;;
+		esac
+		d_getgrent_r=undef
+		getgrent_r_proto=0
+		;;
+	esac
+	;;
+*)	getgrent_r_proto=0
+	;;
+esac
+
+: see if getgrgid_r exists
+set getgrgid_r d_getgrgid_r
+eval $inlibc
+case "$d_getgrgid_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_grp grp.h"
+	case "$d_getgrgid_r_proto:$usethreads" in
+	":define")	d_getgrgid_r_proto=define
+		set d_getgrgid_r_proto getgrgid_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_getgrgid_r_proto" in
+	define)
+	case "$getgrgid_r_proto" in
+	''|0) try='int getgrgid_r(gid_t, struct group*, char*, size_t, struct group**);'
+	./protochk "$extern_C $try" $hdrs && getgrgid_r_proto=I_TSBWR ;;
+	esac
+	case "$getgrgid_r_proto" in
+	''|0) try='int getgrgid_r(gid_t, struct group*, char*, int, struct group**);'
+	./protochk "$extern_C $try" $hdrs && getgrgid_r_proto=I_TSBIR ;;
+	esac
+	case "$getgrgid_r_proto" in
+	''|0) try='int getgrgid_r(gid_t, struct group*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getgrgid_r_proto=I_TSBI ;;
+	esac
+	case "$getgrgid_r_proto" in
+	''|0) try='struct group* getgrgid_r(gid_t, struct group*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getgrgid_r_proto=S_TSBI ;;
+	esac
+	case "$getgrgid_r_proto" in
+	''|0)	d_getgrgid_r=undef
+		getgrgid_r_proto=0
+		echo "Disabling getgrgid_r, cannot determine prototype." >&4 ;;
+	* )	case "$getgrgid_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) getgrgid_r_proto="REENTRANT_PROTO_$getgrgid_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "getgrgid_r has no prototype, not using it." >&4 ;;
+		esac
+		d_getgrgid_r=undef
+		getgrgid_r_proto=0
+		;;
+	esac
+	;;
+*)	getgrgid_r_proto=0
+	;;
+esac
+
+: see if getgrnam_r exists
+set getgrnam_r d_getgrnam_r
+eval $inlibc
+case "$d_getgrnam_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_grp grp.h"
+	case "$d_getgrnam_r_proto:$usethreads" in
+	":define")	d_getgrnam_r_proto=define
+		set d_getgrnam_r_proto getgrnam_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_getgrnam_r_proto" in
+	define)
+	case "$getgrnam_r_proto" in
+	''|0) try='int getgrnam_r(const char*, struct group*, char*, size_t, struct group**);'
+	./protochk "$extern_C $try" $hdrs && getgrnam_r_proto=I_CSBWR ;;
+	esac
+	case "$getgrnam_r_proto" in
+	''|0) try='int getgrnam_r(const char*, struct group*, char*, int, struct group**);'
+	./protochk "$extern_C $try" $hdrs && getgrnam_r_proto=I_CSBIR ;;
+	esac
+	case "$getgrnam_r_proto" in
+	''|0) try='struct group* getgrnam_r(const char*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getgrnam_r_proto=S_CBI ;;
+	esac
+	case "$getgrnam_r_proto" in
+	''|0) try='int getgrnam_r(const char*, struct group*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getgrnam_r_proto=I_CSBI ;;
+	esac
+	case "$getgrnam_r_proto" in
+	''|0) try='struct group* getgrnam_r(const char*, struct group*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getgrnam_r_proto=S_CSBI ;;
+	esac
+	case "$getgrnam_r_proto" in
+	''|0)	d_getgrnam_r=undef
+		getgrnam_r_proto=0
+		echo "Disabling getgrnam_r, cannot determine prototype." >&4 ;;
+	* )	case "$getgrnam_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) getgrnam_r_proto="REENTRANT_PROTO_$getgrnam_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "getgrnam_r has no prototype, not using it." >&4 ;;
+		esac
+		d_getgrnam_r=undef
+		getgrnam_r_proto=0
+		;;
+	esac
+	;;
+*)	getgrnam_r_proto=0
+	;;
+esac
+
+: see if gethostbyaddr exists
+set gethostbyaddr d_gethbyaddr
+eval $inlibc
+
+: see if gethostbyname exists
+set gethostbyname d_gethbyname
+eval $inlibc
+
+: see if gethostent exists
+set gethostent d_gethent
+eval $inlibc
+
+: see how we will look up host name
+echo " "
+call=''
+if set gethostname val -f d_gethname; eval $csym; $val; then
+	echo 'gethostname() found.' >&4
+	d_gethname="$define"
+	call=gethostname
+fi
+if set uname val -f d_uname; eval $csym; $val; then
+	if ./xenix; then
+		$cat <<'EOM'
+uname() was found, but you're running xenix, and older versions of xenix
+have a broken uname(). If you don't really know whether your xenix is old
+enough to have a broken system call, use the default answer.
+
+EOM
+		dflt=y
+		case "$d_uname" in
+		"$define") dflt=n;;
+		esac
+		rp='Is your uname() broken?'
+		. ./myread
+		case "$ans" in
+		n*) d_uname="$define"; call=uname;;
+		esac
+	else
+		echo 'uname() found.' >&4
+		d_uname="$define"
+		case "$call" in
+		'') call=uname ;;
+		esac
+	fi
+fi
+case "$d_gethname" in
+'') d_gethname="$undef";;
+esac
+case "$d_uname" in
+'') d_uname="$undef";;
+esac
+case "$d_uname$d_gethname" in
+*define*)
+	dflt=n
+	cat <<EOM
+
+Every now and then someone has a $call() that lies about the hostname
+but can't be fixed for political or economic reasons.  If you wish, I can
+pretend $call() isn't there and maybe compute hostname at run-time
+thanks to the '$phostname' command.
+
+EOM
+	rp="Shall I ignore $call() from now on?"
+	. ./myread
+	case "$ans" in
+	y*) d_uname="$undef" d_gethname="$undef"; $echo $n "Okay...$c";;
+	esac;;
+esac
+case "$phostname" in
+'') aphostname='';;
+*) case "$aphostname" in
+	/*) ;;
+	*) set X $phostname
+		shift
+		file=$1
+		shift
+		file=`./loc $file $file $pth`
+		aphostname=`echo $file $*`
+		;;
+	esac
+	;;
+esac
+case "$d_uname$d_gethname" in
+*define*) ;;
+*)
+	case "$phostname" in
+	'')
+		echo "There will be no way for $package to get your hostname." >&4;;
+	*)
+	echo "I'll use 'popen("'"'$aphostname'", "r")'"' to get your hostname." >&4
+		;;
+	esac;;
+esac
+case "$d_phostname" in
+'') d_phostname="$undef";;
+esac
+
+: see if gethostbyaddr_r exists
+set gethostbyaddr_r d_gethostbyaddr_r
+eval $inlibc
+case "$d_gethostbyaddr_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_netdb netdb.h"
+	case "$d_gethostbyaddr_r_proto:$usethreads" in
+	":define")	d_gethostbyaddr_r_proto=define
+		set d_gethostbyaddr_r_proto gethostbyaddr_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_gethostbyaddr_r_proto" in
+	define)
+	case "$gethostbyaddr_r_proto" in
+	''|0) try='int gethostbyaddr_r(const char*, size_t, int, struct hostent*, char*, size_t, struct hostent**, int*);'
+	./protochk "$extern_C $try" $hdrs && gethostbyaddr_r_proto=I_CWISBWRE ;;
+	esac
+	case "$gethostbyaddr_r_proto" in
+	''|0) try='struct hostent* gethostbyaddr_r(const char*, size_t, int, struct hostent*, char*, size_t, int, int*);'
+	./protochk "$extern_C $try" $hdrs && gethostbyaddr_r_proto=S_CWISBWIE ;;
+	esac
+	case "$gethostbyaddr_r_proto" in
+	''|0) try='struct hostent* gethostbyaddr_r(const char*, size_t, int, struct hostent*, char*, int, int*);'
+	./protochk "$extern_C $try" $hdrs && gethostbyaddr_r_proto=S_CWISBIE ;;
+	esac
+	case "$gethostbyaddr_r_proto" in
+	''|0) try='struct hostent* gethostbyaddr_r(const void*, size_t, int, struct hostent*, char*, int, int*);'
+	./protochk "$extern_C $try" $hdrs && gethostbyaddr_r_proto=S_TWISBIE ;;
+	esac
+	case "$gethostbyaddr_r_proto" in
+	''|0) try='struct hostent* gethostbyaddr_r(const char*, int, int, struct hostent*, char*, int, int*);'
+	./protochk "$extern_C $try" $hdrs && gethostbyaddr_r_proto=S_CIISBIE ;;
+	esac
+	case "$gethostbyaddr_r_proto" in
+	''|0) try='struct hostent* gethostbyaddr_r(const char*, struct hostent*, char*, int, int*);'
+	./protochk "$extern_C $try" $hdrs && gethostbyaddr_r_proto=S_CSBIE ;;
+	esac
+	case "$gethostbyaddr_r_proto" in
+	''|0) try='struct hostent* gethostbyaddr_r(const void*, struct hostent*, char*, int, int*);'
+	./protochk "$extern_C $try" $hdrs && gethostbyaddr_r_proto=S_TSBIE ;;
+	esac
+	case "$gethostbyaddr_r_proto" in
+	''|0) try='int gethostbyaddr_r(const char*, size_t, int, struct hostent*, struct hostent_data*);'
+	./protochk "$extern_C $try" $hdrs && gethostbyaddr_r_proto=I_CWISD ;;
+	esac
+	case "$gethostbyaddr_r_proto" in
+	''|0) try='int gethostbyaddr_r(const char*, int, int, struct hostent*, struct hostent_data*);'
+	./protochk "$extern_C $try" $hdrs && gethostbyaddr_r_proto=I_CIISD ;;
+	esac
+	case "$gethostbyaddr_r_proto" in
+	''|0) try='int gethostbyaddr_r(const char*, int, int);'
+	./protochk "$extern_C $try" $hdrs && gethostbyaddr_r_proto=I_CII ;;
+	esac
+	case "$gethostbyaddr_r_proto" in
+	''|0) try='int gethostbyaddr_r(const void*, socklen_t, int, struct hostent*, char*, size_t, struct hostent**, int*);'
+	./protochk "$extern_C $try" $hdrs && gethostbyaddr_r_proto=I_TsISBWRE ;;
+	esac
+	case "$gethostbyaddr_r_proto" in
+	''|0)	d_gethostbyaddr_r=undef
+		gethostbyaddr_r_proto=0
+		echo "Disabling gethostbyaddr_r, cannot determine prototype." >&4 ;;
+	* )	case "$gethostbyaddr_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) gethostbyaddr_r_proto="REENTRANT_PROTO_$gethostbyaddr_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "gethostbyaddr_r has no prototype, not using it." >&4 ;;
+		esac
+		d_gethostbyaddr_r=undef
+		gethostbyaddr_r_proto=0
+		;;
+	esac
+	;;
+*)	gethostbyaddr_r_proto=0
+	;;
+esac
+
+: see if gethostbyname_r exists
+set gethostbyname_r d_gethostbyname_r
+eval $inlibc
+case "$d_gethostbyname_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_netdb netdb.h"
+	case "$d_gethostbyname_r_proto:$usethreads" in
+	":define")	d_gethostbyname_r_proto=define
+		set d_gethostbyname_r_proto gethostbyname_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_gethostbyname_r_proto" in
+	define)
+	case "$gethostbyname_r_proto" in
+	''|0) try='int gethostbyname_r(const char*, struct hostent*, char*, size_t, struct hostent**, int*);'
+	./protochk "$extern_C $try" $hdrs && gethostbyname_r_proto=I_CSBWRE ;;
+	esac
+	case "$gethostbyname_r_proto" in
+	''|0) try='struct hostent* gethostbyname_r(const char*, struct hostent*, char*, int, int*);'
+	./protochk "$extern_C $try" $hdrs && gethostbyname_r_proto=S_CSBIE ;;
+	esac
+	case "$gethostbyname_r_proto" in
+	''|0) try='int gethostbyname_r(const char*, struct hostent*, struct hostent_data*);'
+	./protochk "$extern_C $try" $hdrs && gethostbyname_r_proto=I_CSD ;;
+	esac
+	case "$gethostbyname_r_proto" in
+	''|0)	d_gethostbyname_r=undef
+		gethostbyname_r_proto=0
+		echo "Disabling gethostbyname_r, cannot determine prototype." >&4 ;;
+	* )	case "$gethostbyname_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) gethostbyname_r_proto="REENTRANT_PROTO_$gethostbyname_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "gethostbyname_r has no prototype, not using it." >&4 ;;
+		esac
+		d_gethostbyname_r=undef
+		gethostbyname_r_proto=0
+		;;
+	esac
+	;;
+*)	gethostbyname_r_proto=0
+	;;
+esac
+
+: see if gethostent_r exists
+set gethostent_r d_gethostent_r
+eval $inlibc
+case "$d_gethostent_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_netdb netdb.h"
+	case "$d_gethostent_r_proto:$usethreads" in
+	":define")	d_gethostent_r_proto=define
+		set d_gethostent_r_proto gethostent_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_gethostent_r_proto" in
+	define)
+	case "$gethostent_r_proto" in
+	''|0) try='int gethostent_r(struct hostent*, char*, size_t, struct hostent**, int*);'
+	./protochk "$extern_C $try" $hdrs && gethostent_r_proto=I_SBWRE ;;
+	esac
+	case "$gethostent_r_proto" in
+	''|0) try='int gethostent_r(struct hostent*, char*, int, int*);'
+	./protochk "$extern_C $try" $hdrs && gethostent_r_proto=I_SBIE ;;
+	esac
+	case "$gethostent_r_proto" in
+	''|0) try='struct hostent* gethostent_r(struct hostent*, char*, int, int*);'
+	./protochk "$extern_C $try" $hdrs && gethostent_r_proto=S_SBIE ;;
+	esac
+	case "$gethostent_r_proto" in
+	''|0) try='struct hostent* gethostent_r(struct hostent*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && gethostent_r_proto=S_SBI ;;
+	esac
+	case "$gethostent_r_proto" in
+	''|0) try='int gethostent_r(struct hostent*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && gethostent_r_proto=I_SBI ;;
+	esac
+	case "$gethostent_r_proto" in
+	''|0) try='int gethostent_r(struct hostent*, struct hostent_data*);'
+	./protochk "$extern_C $try" $hdrs && gethostent_r_proto=I_SD ;;
+	esac
+	case "$gethostent_r_proto" in
+	''|0)	d_gethostent_r=undef
+		gethostent_r_proto=0
+		echo "Disabling gethostent_r, cannot determine prototype." >&4 ;;
+	* )	case "$gethostent_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) gethostent_r_proto="REENTRANT_PROTO_$gethostent_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "gethostent_r has no prototype, not using it." >&4 ;;
+		esac
+		d_gethostent_r=undef
+		gethostent_r_proto=0
+		;;
+	esac
+	;;
+*)	gethostent_r_proto=0
+	;;
+esac
+
+: see if prototypes for various gethostxxx netdb.h functions are available
+echo " "
+set d_gethostprotos gethostent $i_netdb netdb.h
+eval $hasproto
+
+: see if getitimer exists
+set getitimer d_getitimer
+eval $inlibc
+
+: see if getlogin exists
+set getlogin d_getlogin
+eval $inlibc
+
+: see if getlogin_r exists
+set getlogin_r d_getlogin_r
+eval $inlibc
+case "$d_getlogin_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_unistd unistd.h"
+	case "$d_getlogin_r_proto:$usethreads" in
+	":define")	d_getlogin_r_proto=define
+		set d_getlogin_r_proto getlogin_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_getlogin_r_proto" in
+	define)
+	case "$getlogin_r_proto" in
+	''|0) try='int getlogin_r(char*, size_t);'
+	./protochk "$extern_C $try" $hdrs && getlogin_r_proto=I_BW ;;
+	esac
+	case "$getlogin_r_proto" in
+	''|0) try='int getlogin_r(char*, int);'
+	./protochk "$extern_C $try" $hdrs && getlogin_r_proto=I_BI ;;
+	esac
+	case "$getlogin_r_proto" in
+	''|0) try='char* getlogin_r(char*, size_t);'
+	./protochk "$extern_C $try" $hdrs && getlogin_r_proto=B_BW ;;
+	esac
+	case "$getlogin_r_proto" in
+	''|0) try='char* getlogin_r(char*, int);'
+	./protochk "$extern_C $try" $hdrs && getlogin_r_proto=B_BI ;;
+	esac
+	case "$getlogin_r_proto" in
+	''|0)	d_getlogin_r=undef
+		getlogin_r_proto=0
+		echo "Disabling getlogin_r, cannot determine prototype." >&4 ;;
+	* )	case "$getlogin_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) getlogin_r_proto="REENTRANT_PROTO_$getlogin_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "getlogin_r has no prototype, not using it." >&4 ;;
+		esac
+		d_getlogin_r=undef
+		getlogin_r_proto=0
+		;;
+	esac
+	;;
+*)	getlogin_r_proto=0
+	;;
+esac
+
+: see if getmnt exists
+set getmnt d_getmnt
+eval $inlibc
+
+: see if getmntent exists
+set getmntent d_getmntent
+eval $inlibc
+
+: see if getnameinfo exists
+set getnameinfo d_getnameinfo
+eval $inlibc
+
+: see if getnetbyaddr exists
+set getnetbyaddr d_getnbyaddr
+eval $inlibc
+
+: see if getnetbyname exists
+set getnetbyname d_getnbyname
+eval $inlibc
+
+: see if getnetent exists
+set getnetent d_getnent
+eval $inlibc
+
+: see if getnetbyaddr_r exists
+set getnetbyaddr_r d_getnetbyaddr_r
+eval $inlibc
+case "$d_getnetbyaddr_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_netdb netdb.h"
+	case "$d_getnetbyaddr_r_proto:$usethreads" in
+	":define")	d_getnetbyaddr_r_proto=define
+		set d_getnetbyaddr_r_proto getnetbyaddr_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_getnetbyaddr_r_proto" in
+	define)
+	case "$getnetbyaddr_r_proto" in
+	''|0) try='int getnetbyaddr_r(unsigned long, int, struct netent*, char*, size_t, struct netent**, int*);'
+	./protochk "$extern_C $try" $hdrs && getnetbyaddr_r_proto=I_UISBWRE ;;
+	esac
+	case "$getnetbyaddr_r_proto" in
+	''|0) try='int getnetbyaddr_r(long, int, struct netent*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getnetbyaddr_r_proto=I_LISBI ;;
+	esac
+	case "$getnetbyaddr_r_proto" in
+	''|0) try='struct netent* getnetbyaddr_r(in_addr_t, int, struct netent*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getnetbyaddr_r_proto=S_TISBI ;;
+	esac
+	case "$getnetbyaddr_r_proto" in
+	''|0) try='struct netent* getnetbyaddr_r(long, int, struct netent*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getnetbyaddr_r_proto=S_LISBI ;;
+	esac
+	case "$getnetbyaddr_r_proto" in
+	''|0) try='int getnetbyaddr_r(in_addr_t, int, struct netent*, struct netent_data*);'
+	./protochk "$extern_C $try" $hdrs && getnetbyaddr_r_proto=I_TISD ;;
+	esac
+	case "$getnetbyaddr_r_proto" in
+	''|0) try='int getnetbyaddr_r(long, int, struct netent*, struct netent_data*);'
+	./protochk "$extern_C $try" $hdrs && getnetbyaddr_r_proto=I_LISD ;;
+	esac
+	case "$getnetbyaddr_r_proto" in
+	''|0) try='int getnetbyaddr_r(int, int, struct netent*, struct netent_data*);'
+	./protochk "$extern_C $try" $hdrs && getnetbyaddr_r_proto=I_IISD ;;
+	esac
+	case "$getnetbyaddr_r_proto" in
+	''|0) try='int getnetbyaddr_r(uint32_t, int, struct netent*, char*, size_t, struct netent**, int*);'
+	./protochk "$extern_C $try" $hdrs && getnetbyaddr_r_proto=I_uISBWRE ;;
+	esac
+	case "$getnetbyaddr_r_proto" in
+	''|0)	d_getnetbyaddr_r=undef
+		getnetbyaddr_r_proto=0
+		echo "Disabling getnetbyaddr_r, cannot determine prototype." >&4 ;;
+	* )	case "$getnetbyaddr_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) getnetbyaddr_r_proto="REENTRANT_PROTO_$getnetbyaddr_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "getnetbyaddr_r has no prototype, not using it." >&4 ;;
+		esac
+		d_getnetbyaddr_r=undef
+		getnetbyaddr_r_proto=0
+		;;
+	esac
+	;;
+*)	getnetbyaddr_r_proto=0
+	;;
+esac
+
+: see if getnetbyname_r exists
+set getnetbyname_r d_getnetbyname_r
+eval $inlibc
+case "$d_getnetbyname_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_netdb netdb.h"
+	case "$d_getnetbyname_r_proto:$usethreads" in
+	":define")	d_getnetbyname_r_proto=define
+		set d_getnetbyname_r_proto getnetbyname_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_getnetbyname_r_proto" in
+	define)
+	case "$getnetbyname_r_proto" in
+	''|0) try='int getnetbyname_r(const char*, struct netent*, char*, size_t, struct netent**, int*);'
+	./protochk "$extern_C $try" $hdrs && getnetbyname_r_proto=I_CSBWRE ;;
+	esac
+	case "$getnetbyname_r_proto" in
+	''|0) try='int getnetbyname_r(const char*, struct netent*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getnetbyname_r_proto=I_CSBI ;;
+	esac
+	case "$getnetbyname_r_proto" in
+	''|0) try='struct netent* getnetbyname_r(const char*, struct netent*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getnetbyname_r_proto=S_CSBI ;;
+	esac
+	case "$getnetbyname_r_proto" in
+	''|0) try='int getnetbyname_r(const char*, struct netent*, struct netent_data*);'
+	./protochk "$extern_C $try" $hdrs && getnetbyname_r_proto=I_CSD ;;
+	esac
+	case "$getnetbyname_r_proto" in
+	''|0)	d_getnetbyname_r=undef
+		getnetbyname_r_proto=0
+		echo "Disabling getnetbyname_r, cannot determine prototype." >&4 ;;
+	* )	case "$getnetbyname_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) getnetbyname_r_proto="REENTRANT_PROTO_$getnetbyname_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "getnetbyname_r has no prototype, not using it." >&4 ;;
+		esac
+		d_getnetbyname_r=undef
+		getnetbyname_r_proto=0
+		;;
+	esac
+	;;
+*)	getnetbyname_r_proto=0
+	;;
+esac
+
+: see if getnetent_r exists
+set getnetent_r d_getnetent_r
+eval $inlibc
+case "$d_getnetent_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_netdb netdb.h"
+	case "$d_getnetent_r_proto:$usethreads" in
+	":define")	d_getnetent_r_proto=define
+		set d_getnetent_r_proto getnetent_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_getnetent_r_proto" in
+	define)
+	case "$getnetent_r_proto" in
+	''|0) try='int getnetent_r(struct netent*, char*, size_t, struct netent**, int*);'
+	./protochk "$extern_C $try" $hdrs && getnetent_r_proto=I_SBWRE ;;
+	esac
+	case "$getnetent_r_proto" in
+	''|0) try='int getnetent_r(struct netent*, char*, int, int*);'
+	./protochk "$extern_C $try" $hdrs && getnetent_r_proto=I_SBIE ;;
+	esac
+	case "$getnetent_r_proto" in
+	''|0) try='struct netent* getnetent_r(struct netent*, char*, int, int*);'
+	./protochk "$extern_C $try" $hdrs && getnetent_r_proto=S_SBIE ;;
+	esac
+	case "$getnetent_r_proto" in
+	''|0) try='struct netent* getnetent_r(struct netent*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getnetent_r_proto=S_SBI ;;
+	esac
+	case "$getnetent_r_proto" in
+	''|0) try='int getnetent_r(struct netent*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getnetent_r_proto=I_SBI ;;
+	esac
+	case "$getnetent_r_proto" in
+	''|0) try='int getnetent_r(struct netent*, struct netent_data*);'
+	./protochk "$extern_C $try" $hdrs && getnetent_r_proto=I_SD ;;
+	esac
+	case "$getnetent_r_proto" in
+	''|0)	d_getnetent_r=undef
+		getnetent_r_proto=0
+		echo "Disabling getnetent_r, cannot determine prototype." >&4 ;;
+	* )	case "$getnetent_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) getnetent_r_proto="REENTRANT_PROTO_$getnetent_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "getnetent_r has no prototype, not using it." >&4 ;;
+		esac
+		d_getnetent_r=undef
+		getnetent_r_proto=0
+		;;
+	esac
+	;;
+*)	getnetent_r_proto=0
+	;;
+esac
+
+: see if prototypes for various getnetxxx netdb.h functions are available
+echo " "
+set d_getnetprotos getnetent $i_netdb netdb.h
+eval $hasproto
+
+: see if getpagesize exists
+set getpagesize d_getpagsz
+eval $inlibc
+
+: Optional checks for getprotobyname and getprotobynumber
+
+: see if getprotobyname exists
+set getprotobyname d_getpbyname
+eval $inlibc
+
+: see if getprotobynumber exists
+set getprotobynumber d_getpbynumber
+eval $inlibc
+
+: see if getprotoent exists
+set getprotoent d_getpent
+eval $inlibc
+
+: see if getpgid exists
+set getpgid d_getpgid
+eval $inlibc
+
+: see if getpgrp2 exists
+set getpgrp2 d_getpgrp2
+eval $inlibc
+
+: see if getppid exists
+set getppid d_getppid
+eval $inlibc
+
+: see if getpriority exists
+set getpriority d_getprior
+eval $inlibc
+
+: see if getprotobyname_r exists
+set getprotobyname_r d_getprotobyname_r
+eval $inlibc
+case "$d_getprotobyname_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_netdb netdb.h"
+	case "$d_getprotobyname_r_proto:$usethreads" in
+	":define")	d_getprotobyname_r_proto=define
+		set d_getprotobyname_r_proto getprotobyname_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_getprotobyname_r_proto" in
+	define)
+	case "$getprotobyname_r_proto" in
+	''|0) try='int getprotobyname_r(const char*, struct protoent*, char*, size_t, struct protoent**);'
+	./protochk "$extern_C $try" $hdrs && getprotobyname_r_proto=I_CSBWR ;;
+	esac
+	case "$getprotobyname_r_proto" in
+	''|0) try='struct protoent* getprotobyname_r(const char*, struct protoent*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getprotobyname_r_proto=S_CSBI ;;
+	esac
+	case "$getprotobyname_r_proto" in
+	''|0) try='int getprotobyname_r(const char*, struct protoent*, struct protoent_data*);'
+	./protochk "$extern_C $try" $hdrs && getprotobyname_r_proto=I_CSD ;;
+	esac
+	case "$getprotobyname_r_proto" in
+	''|0)	d_getprotobyname_r=undef
+		getprotobyname_r_proto=0
+		echo "Disabling getprotobyname_r, cannot determine prototype." >&4 ;;
+	* )	case "$getprotobyname_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) getprotobyname_r_proto="REENTRANT_PROTO_$getprotobyname_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "getprotobyname_r has no prototype, not using it." >&4 ;;
+		esac
+		d_getprotobyname_r=undef
+		getprotobyname_r_proto=0
+		;;
+	esac
+	;;
+*)	getprotobyname_r_proto=0
+	;;
+esac
+
+: see if getprotobynumber_r exists
+set getprotobynumber_r d_getprotobynumber_r
+eval $inlibc
+case "$d_getprotobynumber_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_netdb netdb.h"
+	case "$d_getprotobynumber_r_proto:$usethreads" in
+	":define")	d_getprotobynumber_r_proto=define
+		set d_getprotobynumber_r_proto getprotobynumber_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_getprotobynumber_r_proto" in
+	define)
+	case "$getprotobynumber_r_proto" in
+	''|0) try='int getprotobynumber_r(int, struct protoent*, char*, size_t, struct protoent**);'
+	./protochk "$extern_C $try" $hdrs && getprotobynumber_r_proto=I_ISBWR ;;
+	esac
+	case "$getprotobynumber_r_proto" in
+	''|0) try='struct protoent* getprotobynumber_r(int, struct protoent*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getprotobynumber_r_proto=S_ISBI ;;
+	esac
+	case "$getprotobynumber_r_proto" in
+	''|0) try='int getprotobynumber_r(int, struct protoent*, struct protoent_data*);'
+	./protochk "$extern_C $try" $hdrs && getprotobynumber_r_proto=I_ISD ;;
+	esac
+	case "$getprotobynumber_r_proto" in
+	''|0)	d_getprotobynumber_r=undef
+		getprotobynumber_r_proto=0
+		echo "Disabling getprotobynumber_r, cannot determine prototype." >&4 ;;
+	* )	case "$getprotobynumber_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) getprotobynumber_r_proto="REENTRANT_PROTO_$getprotobynumber_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "getprotobynumber_r has no prototype, not using it." >&4 ;;
+		esac
+		d_getprotobynumber_r=undef
+		getprotobynumber_r_proto=0
+		;;
+	esac
+	;;
+*)	getprotobynumber_r_proto=0
+	;;
+esac
+
+: see if getprotoent_r exists
+set getprotoent_r d_getprotoent_r
+eval $inlibc
+case "$d_getprotoent_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_netdb netdb.h"
+	case "$d_getprotoent_r_proto:$usethreads" in
+	":define")	d_getprotoent_r_proto=define
+		set d_getprotoent_r_proto getprotoent_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_getprotoent_r_proto" in
+	define)
+	case "$getprotoent_r_proto" in
+	''|0) try='int getprotoent_r(struct protoent*, char*, size_t, struct protoent**);'
+	./protochk "$extern_C $try" $hdrs && getprotoent_r_proto=I_SBWR ;;
+	esac
+	case "$getprotoent_r_proto" in
+	''|0) try='int getprotoent_r(struct protoent*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getprotoent_r_proto=I_SBI ;;
+	esac
+	case "$getprotoent_r_proto" in
+	''|0) try='struct protoent* getprotoent_r(struct protoent*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getprotoent_r_proto=S_SBI ;;
+	esac
+	case "$getprotoent_r_proto" in
+	''|0) try='int getprotoent_r(struct protoent*, struct protoent_data*);'
+	./protochk "$extern_C $try" $hdrs && getprotoent_r_proto=I_SD ;;
+	esac
+	case "$getprotoent_r_proto" in
+	''|0)	d_getprotoent_r=undef
+		getprotoent_r_proto=0
+		echo "Disabling getprotoent_r, cannot determine prototype." >&4 ;;
+	* )	case "$getprotoent_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) getprotoent_r_proto="REENTRANT_PROTO_$getprotoent_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "getprotoent_r has no prototype, not using it." >&4 ;;
+		esac
+		d_getprotoent_r=undef
+		getprotoent_r_proto=0
+		;;
+	esac
+	;;
+*)	getprotoent_r_proto=0
+	;;
+esac
+
+: see if prototypes for various getprotoxxx netdb.h functions are available
+echo " "
+set d_getprotoprotos getprotoent $i_netdb netdb.h
+eval $hasproto
+
+: see if getprpwnam exists
+set getprpwnam d_getprpwnam
+eval $inlibc
+
+: see if getpwent exists
+set getpwent d_getpwent
+eval $inlibc
+
+: see if getpwent_r exists
+set getpwent_r d_getpwent_r
+eval $inlibc
+case "$d_getpwent_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_pwd pwd.h"
+	case "$d_getpwent_r_proto:$usethreads" in
+	":define")	d_getpwent_r_proto=define
+		set d_getpwent_r_proto getpwent_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_getpwent_r_proto" in
+	define)
+	case "$getpwent_r_proto" in
+	''|0) try='int getpwent_r(struct passwd*, char*, size_t, struct passwd**);'
+	./protochk "$extern_C $try" $hdrs && getpwent_r_proto=I_SBWR ;;
+	esac
+	case "$getpwent_r_proto" in
+	''|0) try='int getpwent_r(struct passwd*, char*, int, struct passwd**);'
+	./protochk "$extern_C $try" $hdrs && getpwent_r_proto=I_SBIR ;;
+	esac
+	case "$getpwent_r_proto" in
+	''|0) try='struct passwd* getpwent_r(struct passwd*, char*, size_t);'
+	./protochk "$extern_C $try" $hdrs && getpwent_r_proto=S_SBW ;;
+	esac
+	case "$getpwent_r_proto" in
+	''|0) try='struct passwd* getpwent_r(struct passwd*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getpwent_r_proto=S_SBI ;;
+	esac
+	case "$getpwent_r_proto" in
+	''|0) try='int getpwent_r(struct passwd*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getpwent_r_proto=I_SBI ;;
+	esac
+	case "$getpwent_r_proto" in
+	''|0) try='int getpwent_r(struct passwd*, char*, int, FILE**);'
+	./protochk "$extern_C $try" $hdrs && getpwent_r_proto=I_SBIH ;;
+	esac
+	case "$getpwent_r_proto" in
+	''|0)	d_getpwent_r=undef
+		getpwent_r_proto=0
+		echo "Disabling getpwent_r, cannot determine prototype." >&4 ;;
+	* )	case "$getpwent_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) getpwent_r_proto="REENTRANT_PROTO_$getpwent_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "getpwent_r has no prototype, not using it." >&4 ;;
+		esac
+		d_getpwent_r=undef
+		getpwent_r_proto=0
+		;;
+	esac
+	;;
+*)	getpwent_r_proto=0
+	;;
+esac
+
+: see if getpwnam_r exists
+set getpwnam_r d_getpwnam_r
+eval $inlibc
+case "$d_getpwnam_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_pwd pwd.h"
+	case "$d_getpwnam_r_proto:$usethreads" in
+	":define")	d_getpwnam_r_proto=define
+		set d_getpwnam_r_proto getpwnam_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_getpwnam_r_proto" in
+	define)
+	case "$getpwnam_r_proto" in
+	''|0) try='int getpwnam_r(const char*, struct passwd*, char*, size_t, struct passwd**);'
+	./protochk "$extern_C $try" $hdrs && getpwnam_r_proto=I_CSBWR ;;
+	esac
+	case "$getpwnam_r_proto" in
+	''|0) try='int getpwnam_r(const char*, struct passwd*, char*, int, struct passwd**);'
+	./protochk "$extern_C $try" $hdrs && getpwnam_r_proto=I_CSBIR ;;
+	esac
+	case "$getpwnam_r_proto" in
+	''|0) try='struct passwd* getpwnam_r(const char*, struct passwd*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getpwnam_r_proto=S_CSBI ;;
+	esac
+	case "$getpwnam_r_proto" in
+	''|0) try='int getpwnam_r(const char*, struct passwd*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getpwnam_r_proto=I_CSBI ;;
+	esac
+	case "$getpwnam_r_proto" in
+	''|0)	d_getpwnam_r=undef
+		getpwnam_r_proto=0
+		echo "Disabling getpwnam_r, cannot determine prototype." >&4 ;;
+	* )	case "$getpwnam_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) getpwnam_r_proto="REENTRANT_PROTO_$getpwnam_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "getpwnam_r has no prototype, not using it." >&4 ;;
+		esac
+		d_getpwnam_r=undef
+		getpwnam_r_proto=0
+		;;
+	esac
+	;;
+*)	getpwnam_r_proto=0
+	;;
+esac
+
+: see if getpwuid_r exists
+set getpwuid_r d_getpwuid_r
+eval $inlibc
+case "$d_getpwuid_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_pwd pwd.h"
+	case "$d_getpwuid_r_proto:$usethreads" in
+	":define")	d_getpwuid_r_proto=define
+		set d_getpwuid_r_proto getpwuid_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_getpwuid_r_proto" in
+	define)
+	case "$getpwuid_r_proto" in
+	''|0) try='int getpwuid_r(uid_t, struct passwd*, char*, size_t, struct passwd**);'
+	./protochk "$extern_C $try" $hdrs && getpwuid_r_proto=I_TSBWR ;;
+	esac
+	case "$getpwuid_r_proto" in
+	''|0) try='int getpwuid_r(uid_t, struct passwd*, char*, int, struct passwd**);'
+	./protochk "$extern_C $try" $hdrs && getpwuid_r_proto=I_TSBIR ;;
+	esac
+	case "$getpwuid_r_proto" in
+	''|0) try='int getpwuid_r(uid_t, struct passwd*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getpwuid_r_proto=I_TSBI ;;
+	esac
+	case "$getpwuid_r_proto" in
+	''|0) try='struct passwd* getpwuid_r(uid_t, struct passwd*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getpwuid_r_proto=S_TSBI ;;
+	esac
+	case "$getpwuid_r_proto" in
+	''|0)	d_getpwuid_r=undef
+		getpwuid_r_proto=0
+		echo "Disabling getpwuid_r, cannot determine prototype." >&4 ;;
+	* )	case "$getpwuid_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) getpwuid_r_proto="REENTRANT_PROTO_$getpwuid_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "getpwuid_r has no prototype, not using it." >&4 ;;
+		esac
+		d_getpwuid_r=undef
+		getpwuid_r_proto=0
+		;;
+	esac
+	;;
+*)	getpwuid_r_proto=0
+	;;
+esac
+
+: Optional checks for getsbyname and getsbyport
+
+: see if getservbyname exists
+set getservbyname d_getsbyname
+eval $inlibc
+
+: see if getservbyport exists
+set getservbyport d_getsbyport
+eval $inlibc
+
+: see if getservent exists
+set getservent d_getsent
+eval $inlibc
+
+: see if getservbyname_r exists
+set getservbyname_r d_getservbyname_r
+eval $inlibc
+case "$d_getservbyname_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_netdb netdb.h"
+	case "$d_getservbyname_r_proto:$usethreads" in
+	":define")	d_getservbyname_r_proto=define
+		set d_getservbyname_r_proto getservbyname_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_getservbyname_r_proto" in
+	define)
+	case "$getservbyname_r_proto" in
+	''|0) try='int getservbyname_r(const char*, const char*, struct servent*, char*, size_t, struct servent**);'
+	./protochk "$extern_C $try" $hdrs && getservbyname_r_proto=I_CCSBWR ;;
+	esac
+	case "$getservbyname_r_proto" in
+	''|0) try='struct servent* getservbyname_r(const char*, const char*, struct servent*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getservbyname_r_proto=S_CCSBI ;;
+	esac
+	case "$getservbyname_r_proto" in
+	''|0) try='int getservbyname_r(const char*, const char*, struct servent*, struct servent_data*);'
+	./protochk "$extern_C $try" $hdrs && getservbyname_r_proto=I_CCSD ;;
+	esac
+	case "$getservbyname_r_proto" in
+	''|0)	d_getservbyname_r=undef
+		getservbyname_r_proto=0
+		echo "Disabling getservbyname_r, cannot determine prototype." >&4 ;;
+	* )	case "$getservbyname_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) getservbyname_r_proto="REENTRANT_PROTO_$getservbyname_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "getservbyname_r has no prototype, not using it." >&4 ;;
+		esac
+		d_getservbyname_r=undef
+		getservbyname_r_proto=0
+		;;
+	esac
+	;;
+*)	getservbyname_r_proto=0
+	;;
+esac
+
+: see if getservbyport_r exists
+set getservbyport_r d_getservbyport_r
+eval $inlibc
+case "$d_getservbyport_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_netdb netdb.h"
+	case "$d_getservbyport_r_proto:$usethreads" in
+	":define")	d_getservbyport_r_proto=define
+		set d_getservbyport_r_proto getservbyport_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_getservbyport_r_proto" in
+	define)
+	case "$getservbyport_r_proto" in
+	''|0) try='int getservbyport_r(int, const char*, struct servent*, char*, size_t, struct servent**);'
+	./protochk "$extern_C $try" $hdrs && getservbyport_r_proto=I_ICSBWR ;;
+	esac
+	case "$getservbyport_r_proto" in
+	''|0) try='struct servent* getservbyport_r(int, const char*, struct servent*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getservbyport_r_proto=S_ICSBI ;;
+	esac
+	case "$getservbyport_r_proto" in
+	''|0) try='int getservbyport_r(int, const char*, struct servent*, struct servent_data*);'
+	./protochk "$extern_C $try" $hdrs && getservbyport_r_proto=I_ICSD ;;
+	esac
+	case "$getservbyport_r_proto" in
+	''|0)	d_getservbyport_r=undef
+		getservbyport_r_proto=0
+		echo "Disabling getservbyport_r, cannot determine prototype." >&4 ;;
+	* )	case "$getservbyport_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) getservbyport_r_proto="REENTRANT_PROTO_$getservbyport_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "getservbyport_r has no prototype, not using it." >&4 ;;
+		esac
+		d_getservbyport_r=undef
+		getservbyport_r_proto=0
+		;;
+	esac
+	;;
+*)	getservbyport_r_proto=0
+	;;
+esac
+
+: see if getservent_r exists
+set getservent_r d_getservent_r
+eval $inlibc
+case "$d_getservent_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_netdb netdb.h"
+	case "$d_getservent_r_proto:$usethreads" in
+	":define")	d_getservent_r_proto=define
+		set d_getservent_r_proto getservent_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_getservent_r_proto" in
+	define)
+	case "$getservent_r_proto" in
+	''|0) try='int getservent_r(struct servent*, char*, size_t, struct servent**);'
+	./protochk "$extern_C $try" $hdrs && getservent_r_proto=I_SBWR ;;
+	esac
+	case "$getservent_r_proto" in
+	''|0) try='int getservent_r(struct servent*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getservent_r_proto=I_SBI ;;
+	esac
+	case "$getservent_r_proto" in
+	''|0) try='struct servent* getservent_r(struct servent*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getservent_r_proto=S_SBI ;;
+	esac
+	case "$getservent_r_proto" in
+	''|0) try='int getservent_r(struct servent*, struct servent_data*);'
+	./protochk "$extern_C $try" $hdrs && getservent_r_proto=I_SD ;;
+	esac
+	case "$getservent_r_proto" in
+	''|0)	d_getservent_r=undef
+		getservent_r_proto=0
+		echo "Disabling getservent_r, cannot determine prototype." >&4 ;;
+	* )	case "$getservent_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) getservent_r_proto="REENTRANT_PROTO_$getservent_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "getservent_r has no prototype, not using it." >&4 ;;
+		esac
+		d_getservent_r=undef
+		getservent_r_proto=0
+		;;
+	esac
+	;;
+*)	getservent_r_proto=0
+	;;
+esac
+
+: see if prototypes for various getservxxx netdb.h functions are available
+echo " "
+set d_getservprotos getservent $i_netdb netdb.h
+eval $hasproto
+
+: see if getspnam exists
+set getspnam d_getspnam
+eval $inlibc
+
+: see if this is a shadow.h system
+set shadow.h i_shadow
+eval $inhdr
+
+: see if getspnam_r exists
+set getspnam_r d_getspnam_r
+eval $inlibc
+case "$d_getspnam_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_shadow shadow.h"
+	case "$d_getspnam_r_proto:$usethreads" in
+	":define")	d_getspnam_r_proto=define
+		set d_getspnam_r_proto getspnam_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_getspnam_r_proto" in
+	define)
+	case "$getspnam_r_proto" in
+	''|0) try='int getspnam_r(const char*, struct spwd*, char*, size_t, struct spwd**);'
+	./protochk "$extern_C $try" $hdrs && getspnam_r_proto=I_CSBWR ;;
+	esac
+	case "$getspnam_r_proto" in
+	''|0) try='struct spwd* getspnam_r(const char*, struct spwd*, char*, int);'
+	./protochk "$extern_C $try" $hdrs && getspnam_r_proto=S_CSBI ;;
+	esac
+	case "$getspnam_r_proto" in
+	''|0)	d_getspnam_r=undef
+		getspnam_r_proto=0
+		echo "Disabling getspnam_r, cannot determine prototype." >&4 ;;
+	* )	case "$getspnam_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) getspnam_r_proto="REENTRANT_PROTO_$getspnam_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "getspnam_r has no prototype, not using it." >&4 ;;
+		esac
+		d_getspnam_r=undef
+		getspnam_r_proto=0
+		;;
+	esac
+	;;
+*)	getspnam_r_proto=0
+	;;
+esac
+
+: see if gettimeofday or ftime exists
+set gettimeofday d_gettimeod
+eval $inlibc
+case "$d_gettimeod" in
+"$undef")
+	set ftime d_ftime 
+	eval $inlibc
+	;;
+*)
+	val="$undef"; set d_ftime; eval $setvar
+	;;
+esac
+case "$d_gettimeod$d_ftime" in
+"$undef$undef")
+	echo " "
+	echo 'No ftime() nor gettimeofday() -- timing may be less accurate.' >&4
+	;;
+esac
+
+: see if gmtime_r exists
+set gmtime_r d_gmtime_r
+eval $inlibc
+case "$d_gmtime_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_time time.h $i_systime sys/time.h"
+	case "$d_gmtime_r_proto:$usethreads" in
+	":define")	d_gmtime_r_proto=define
+		set d_gmtime_r_proto gmtime_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_gmtime_r_proto" in
+	define)
+	case "$gmtime_r_proto" in
+	''|0) try='struct tm* gmtime_r(const time_t*, struct tm*);'
+	./protochk "$extern_C $try" $hdrs && gmtime_r_proto=S_TS ;;
+	esac
+	case "$gmtime_r_proto" in
+	''|0) try='int gmtime_r(const time_t*, struct tm*);'
+	./protochk "$extern_C $try" $hdrs && gmtime_r_proto=I_TS ;;
+	esac
+	case "$gmtime_r_proto" in
+	''|0)	d_gmtime_r=undef
+		gmtime_r_proto=0
+		echo "Disabling gmtime_r, cannot determine prototype." >&4 ;;
+	* )	case "$gmtime_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) gmtime_r_proto="REENTRANT_PROTO_$gmtime_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "gmtime_r has no prototype, not using it." >&4 ;;
+		esac
+		d_gmtime_r=undef
+		gmtime_r_proto=0
+		;;
+	esac
+	;;
+*)	gmtime_r_proto=0
+	;;
+esac
+
+: see if hasmntopt exists
+set hasmntopt d_hasmntopt
+eval $inlibc
+
+: see if this is a netinet/in.h or sys/in.h system
+set netinet/in.h i_niin sys/in.h i_sysin
+eval $inhdr
+
+: see if arpa/inet.h has to be included
+set arpa/inet.h i_arpainet
+eval $inhdr
+
+: see if htonl --and friends-- exists
+val=''
+set htonl val
+eval $inlibc
+
+: Maybe they are macros.
+case "$val" in
+$undef)
+	$cat >htonl.c <<EOM
+#include <stdio.h>
+#include <sys/types.h>
+#$i_niin I_NETINET_IN
+#$i_sysin I_SYS_IN
+#$i_arpainet I_ARPA_INET
+#ifdef I_NETINET_IN
+#include <netinet/in.h>
+#endif
+#ifdef I_SYS_IN
+#include <sys/in.h>
+#endif
+#ifdef I_ARPA_INET
+#include <arpa/inet.h>
+#endif
+#ifdef htonl
+printf("Defined as a macro.");
+#endif
+EOM
+	$cppstdin $cppflags $cppminus < htonl.c >htonl.E 2>/dev/null
+	if $contains 'Defined as a macro' htonl.E >/dev/null 2>&1; then
+		val="$define"
+		echo "But it seems to be defined as a macro." >&4
+	fi
+	$rm -f htonl.?
+	;;
+esac
+set d_htonl
+eval $setvar
+
+: see if hypot exists
+set hypot d_hypot
+eval $inlibc
+
+: see if ilogb exists
+set ilogb d_ilogb
+eval $inlibc
+
+: see if ilogbl exists
+set ilogbl d_ilogbl
+eval $inlibc
+
+: check whether inet_aton exists
+set inet_aton d_inetaton
+eval $inlibc
+
+: see if inet_ntop exists
+set inet_ntop d_inetntop
+eval $inlibc
+
+: see if inet_pton exists
+set inet_pton d_inetpton
+eval $inlibc
+
+: Look for isascii
+echo " "
+$cat >isascii.c <<EOCP
+#include <stdio.h>
+#include <ctype.h>
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+int main() {
+	int c = 'A';
+	if (isascii(c))
+		exit(0);
+	else
+		exit(1);
+}
+EOCP
+set isascii
+if eval $compile; then
+	echo "isascii() found." >&4
+	val="$define"
+else
+	echo "isascii() NOT found." >&4
+	val="$undef"
+fi
+set d_isascii
+eval $setvar
+$rm -f isascii*
+
+: Look for isblank
+echo " "
+$cat >isblank.c <<'EOCP'
+#include <stdio.h>
+#include <ctype.h>
+int main() {
+	int c = ' ';
+	if (isblank(c))
+		return 0 ;
+	else
+		return 1 ;
+}
+EOCP
+if $cc $ccflags $ldflags -o isblank isblank.c $libs >/dev/null 2>&1 ; then
+	echo "isblank() found." >&4
+	val="$define"
+else
+	echo "isblank() NOT found." >&4
+	val="$undef"
+fi
+set d_isblank
+eval $setvar
+$rm -f isblank*
+
+: check for isfinite
+echo "Checking to see if you have isfinite..." >&4
+$cat >try.c <<EOCP
+#include <math.h>
+int main() { return isfinite(0.0); }
+EOCP
+set try
+if eval $compile; then
+	val="$define"
+	echo "You have isfinite."
+else
+	val="$undef"
+	echo "You do not have isfinite."
+fi
+$rm_try
+set d_isfinite
+eval $setvar
+
+: see if isfinitel exists
+set isfinitel d_isfinitel
+eval $inlibc
+
+: check for isinf
+echo "Checking to see if you have isinf..." >&4
+$cat >try.c <<EOCP
+#include <math.h>
+int main() { return isinf(0.0); }
+EOCP
+set try
+if eval $compile; then
+	val="$define"
+	echo "You have isinf."
+else
+	val="$undef"
+	echo "You do not have isinf."
+fi
+$rm_try
+set d_isinf
+eval $setvar
+
+: see if isinfl exists
+set isinfl d_isinfl
+eval $inlibc
+
+: check for isless
+echo "Checking to see if you have isless..." >&4
+$cat >try.c <<EOCP
+#include <math.h>
+int main() { return isless(2.0, 1.0); }
+EOCP
+set try
+if eval $compile; then
+	val="$define"
+	echo "You have isless."
+else
+	val="$undef"
+	echo "You do not have isless."
+fi
+$rm_try
+set d_isless
+eval $setvar
+
+: check for isnan
+echo "Checking to see if you have isnan..." >&4
+$cat >try.c <<EOCP
+#include <math.h>
+int main() { return isnan(0.0); }
+EOCP
+set try
+if eval $compile; then
+	val="$define"
+	echo "You have isnan."
+else
+	val="$undef"
+	echo "You do not have isnan."
+fi
+$rm_try
+set d_isnan
+eval $setvar
+
+: see if isnanl exists
+set isnanl d_isnanl
+eval $inlibc
+
+: check for isnormal
+echo "Checking to see if you have isnormal..." >&4
+$cat >try.c <<EOCP
+#include <math.h>
+int main() { return isnormal(0.0); }
+EOCP
+set try
+if eval $compile; then
+	val="$define"
+	echo "You have isnormal."
+else
+	val="$undef"
+	echo "You do not have isnormal."
+fi
+$rm_try
+set d_isnormal
+eval $setvar
+
+: see if j0 exists
+set j0 d_j0
+eval $inlibc
+
+: see if j0l exists
+set j0l d_j0l
+eval $inlibc
+
+: see if killpg exists
+set killpg d_killpg
+eval $inlibc
+
+: see if localeconv exists
+set localeconv d_locconv
+eval $inlibc
+
+: see if libc has the POSIX.1-2008 currency locale rules
+case "$d_locconv:$d_lc_monetary_2008" in
+$define:)
+	$cat >try.c <<EOCP
+#include <locale.h>
+int main() {
+	struct lconv *lc = localeconv();
+	char int_p_cs_precedes = lc->int_p_cs_precedes;
+	return 0;
+}
+EOCP
+	set try
+	if eval $compile; then
+		d_lc_monetary_2008="$define"
+	else
+		d_lc_monetary_2008="$undef"
+	fi;
+	$rm_try
+	;;
+esac
+
+: see if lchown exists
+echo " "
+$cat > try.c <<EOCP
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#$i_unistd	I_UNISTD
+#ifdef I_UNISTD
+#  include <unistd.h>
+#endif
+int main(int argc, char *argv[])
+{
+   if (lchown("./try.c", -1, getgid()) == -1) {
+       exit(EXIT_FAILURE);
+   }
+   exit(EXIT_SUCCESS);
+}
+EOCP
+set try
+if eval $compile && ./try; then
+    $echo "lchown() found." >&4
+    val="$define"
+else
+    $echo "lchown() NOT found." >&4
+    val="$undef"
+fi
+set d_lchown
+eval $setvar
+$rm_try
+
+: See if number of significant digits in a double precision number is known
+echo " "
+$cat >ldbl_dig.c <<EOM
+#include <limits.h>
+#include <float.h>
+#ifdef LDBL_DIG
+printf("Contains LDBL_DIG");
+#endif
+EOM
+$cppstdin $cppflags $cppminus < ldbl_dig.c >ldbl_dig.E 2>/dev/null
+if $contains 'LDBL_DIG' ldbl_dig.E >/dev/null 2>&1; then
+	echo "LDBL_DIG found." >&4
+	val="$define"
+else
+	echo "LDBL_DIG NOT found." >&4
+	val="$undef"
+fi
+$rm -f ldbl_dig.?
+set d_ldbl_dig
+eval $setvar
+
+: see if lgamma exists
+set lgamma d_lgamma
+eval $inlibc
+
+: see if lgamma_r exists
+set lgamma_r d_lgamma_r
+eval $inlibc
+
+: check to see if math.h defines _LIB_VERSION
+d_libm_lib_version="$undef"
+echo " "
+echo "Checking to see if your libm supports _LIB_VERSION..." >&4
+$cat >try.c <<EOCP
+#include <unistd.h>
+#include <math.h>
+int main (int argc, char *argv[])
+{
+    printf ("%d\n", _LIB_VERSION);
+    return (0);
+    } /* main */
+EOCP
+set try
+if eval $compile; then
+    foo=`$run ./try`
+    echo "Yes, it does ($foo)" >&4
+    d_libm_lib_version="$define"
+else
+    echo "No, it does not (probably harmless)" >&4
+    fi
+$rm_try
+
+: see if link exists
+set link d_link
+eval $inlibc
+
+: see if llrint exists
+set llrint d_llrint
+eval $inlibc
+
+: see if llrintl exists
+set llrintl d_llrintl
+eval $inlibc
+
+: see if llround exists
+set llround d_llround
+eval $inlibc
+
+: see if llroundl exists
+set llroundl d_llroundl
+eval $inlibc
+
+: see if localeconv_l exists
+set localeconv_l d_localeconv_l
+eval $inlibc
+
+: see if localtime_r exists
+set localtime_r d_localtime_r
+eval $inlibc
+case "$d_localtime_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_time time.h $i_systime sys/time.h"
+	case "$d_localtime_r_proto:$usethreads" in
+	":define")	d_localtime_r_proto=define
+		set d_localtime_r_proto localtime_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_localtime_r_proto" in
+	define)
+	case "$localtime_r_proto" in
+	''|0) try='struct tm* localtime_r(const time_t*, struct tm*);'
+	./protochk "$extern_C $try" $hdrs && localtime_r_proto=S_TS ;;
+	esac
+	case "$localtime_r_proto" in
+	''|0) try='int localtime_r(const time_t*, struct tm*);'
+	./protochk "$extern_C $try" $hdrs && localtime_r_proto=I_TS ;;
+	esac
+	case "$localtime_r_proto" in
+	''|0)	d_localtime_r=undef
+		localtime_r_proto=0
+		echo "Disabling localtime_r, cannot determine prototype." >&4 ;;
+	* )	case "$localtime_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) localtime_r_proto="REENTRANT_PROTO_$localtime_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "localtime_r has no prototype, not using it." >&4 ;;
+		esac
+		d_localtime_r=undef
+		localtime_r_proto=0
+		;;
+	esac
+	;;
+*)	localtime_r_proto=0
+	;;
+esac
+
+: see if localtime_r calls tzset
+case "$localtime_r_proto" in
+REENTRANT_PROTO*)
+	$cat >try.c <<EOCP
+/*  Does our libc's localtime_r call tzset ?
+ *  return 0 if so, 1 otherwise.
+ */
+#$i_systypes	I_SYS_TYPES
+#$i_unistd	I_UNISTD
+#$i_time	I_TIME
+#$i_stdlib	I_STDLIB
+#$i_malloc	I_MALLOC
+#ifdef I_SYS_TYPES
+#  include <sys/types.h>
+#endif
+#ifdef I_UNISTD
+#  include <unistd.h>
+#endif
+#ifdef I_TIME
+#  include <time.h>
+#endif
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#include <string.h>
+#ifdef I_MALLOC
+#  include <malloc.h>
+#endif
+int main()
+{
+    int result = 0;
+    time_t t = time(0L);
+    char w_tz[]="TZ" "=GMT+5",
+	 e_tz[]="TZ" "=GMT-5",
+	*tz_e = (char*)malloc(16),
+	*tz_w = (char*)malloc(16);
+    struct tm tm_e, tm_w;
+    memset(&tm_e,'\0',sizeof(struct tm));
+    memset(&tm_w,'\0',sizeof(struct tm));
+    strcpy(tz_e,e_tz);
+    strcpy(tz_w,w_tz);
+
+    putenv(tz_e);
+    localtime_r(&t, &tm_e);
+
+    putenv(tz_w);
+    localtime_r(&t, &tm_w);
+
+    if( memcmp(&tm_e, &tm_w, sizeof(struct tm)) == 0 )
+	result = 1;
+
+    free(tz_e);free(tz_w);
+    return result;
+}
+EOCP
+	set try
+	if eval $compile; then
+	    if $run ./try; then
+		d_localtime_r_needs_tzset=undef;
+	    else
+		d_localtime_r_needs_tzset=define;
+	    fi;
+	else
+	    d_localtime_r_needs_tzset=undef;
+	fi;
+     ;;
+  *)
+     d_localtime_r_needs_tzset=undef;
+     ;;
+esac
+$rm_try
+
+: see if lockf exists
+set lockf d_lockf
+eval $inlibc
+
+: see if log1p exists
+set log1p d_log1p
+eval $inlibc
+
+: see if log2 exists
+set log2 d_log2
+eval $inlibc
+
+: see if logb exists
+set logb d_logb
+eval $inlibc
+
+: see if lrint exists
+set lrint d_lrint
+eval $inlibc
+
+: see if lrintl exists
+set lrintl d_lrintl
+eval $inlibc
+
+: see if lround exists
+set lround d_lround
+eval $inlibc
+
+: see if lroundl exists
+set lroundl d_lroundl
+eval $inlibc
+
+: see if prototype for lseek is available
+echo " "
+set d_lseekproto lseek $i_systypes sys/types.h $i_unistd unistd.h
+eval $hasproto
+
+: see if lstat exists
+set lstat d_lstat
+eval $inlibc
+
+: see if madvise exists
+set madvise d_madvise
+eval $inlibc
+
+: see if malloc_size exists
+set malloc_size d_malloc_size
+eval $inlibc
+
+: see if malloc_size_good exists
+set malloc_good_size d_malloc_good_size
+eval $inlibc
+
+: see if malloc_usable_size exists
+set malloc_usable_size d_malloc_usable_size
+eval $inlibc
+
+: see if mblen exists
+set mblen d_mblen
+eval $inlibc
+
+: see if mbrlen exists
+set mbrlen d_mbrlen
+eval $inlibc
+
+: see if mbrtowc exists
+set mbrtowc d_mbrtowc
+eval $inlibc
+
+: see if mbstowcs exists
+set mbstowcs d_mbstowcs
+eval $inlibc
+
+: see if mbtowc exists
+set mbtowc d_mbtowc
+eval $inlibc
+
+: see if memmem exists
+: We need both a prototype in string.h and the symbol in libc.
+echo " "
+d_memmem_proto=''
+xx1="#$d_gnulibc HAS_GNULIBC"
+xx2='#if defined(HAS_GNULIBC) && !defined(_GNU_SOURCE)'
+xx3='#   define _GNU_SOURCE'
+xx4='#endif'
+set d_memmem_proto memmem literal "$xx1" literal "$xx2" literal "$xx3" literal "$xx4" define string.h
+eval $hasproto
+case "$d_memmem_proto" in
+    define) # see if memmem exists
+	set memmem d_memmem
+	eval $inlibc
+	;;
+    *)  val=$undef
+	set d_memmem
+	eval $setvar
+	;;
+esac
+
+: see if memrchr exists
+: We need both a prototype in string.h and the symbol in libc.
+echo " "
+d_memrchr_proto=''
+xx1="#$d_gnulibc HAS_GNULIBC"
+xx2='#if defined(HAS_GNULIBC) && !defined(_GNU_SOURCE)'
+xx3='#   define _GNU_SOURCE'
+xx4='#endif'
+set d_memrchr_proto memrchr literal "$xx1" literal "$xx2" literal "$xx3" literal "$xx4" define string.h
+eval $hasproto
+case "$d_memrchr_proto" in
+    define) # see if memrchr exists
+	set memrchr d_memrchr
+	eval $inlibc
+	;;
+    *)  val=$undef
+	set d_memrchr
+	eval $setvar
+	;;
+esac
+
+: see if mkdir exists
+set mkdir d_mkdir
+eval $inlibc
+
+: see if mkdtemp exists
+set mkdtemp d_mkdtemp
+eval $inlibc
+
+: see if mkfifo exists
+set mkfifo d_mkfifo
+eval $inlibc
+
+: see if mkostemp exists
+set mkostemp d_mkostemp
+eval $inlibc
+
+: see if mkstemp exists
+set mkstemp d_mkstemp
+eval $inlibc
+
+: see if mkstemps exists
+set mkstemps d_mkstemps
+eval $inlibc
+
+: see if mktime exists
+set mktime d_mktime
+eval $inlibc
+
+: see if sys/mman.h has to be included
+set sys/mman.h i_sysmman
+eval $inhdr
+
+: see if mmap exists
+set mmap d_mmap
+eval $inlibc
+: see what shmat returns
+: default to something harmless
+mmaptype='void *'
+case "$i_sysmman$d_mmap" in
+"$define$define")
+	$cat >mmap.c <<'END'
+#include <sys/mman.h>
+void *mmap();
+END
+	if $cc $ccflags -c mmap.c >/dev/null 2>&1; then
+		mmaptype='void *'
+	else
+		mmaptype='caddr_t'
+	fi
+	echo "and it returns ($mmaptype)." >&4
+	;;
+esac
+
+: see if sqrtl exists
+set sqrtl d_sqrtl
+eval $inlibc
+
+: see if scalbnl exists
+set scalbnl d_scalbnl
+eval $inlibc
+
+: see if truncl exists
+set truncl d_truncl
+eval $inlibc
+
+: see if modfl exists
+set modfl d_modfl
+eval $inlibc
+
+: see if prototype for modfl is available
+echo " "
+set d_modflproto modfl define math.h
+eval $hasproto
+
+if $test "$uselongdouble" = "$define"; then
+    message=""
+    if $test "$d_sqrtl" != "$define"; then
+	message="$message sqrtl"
+    fi
+    if $test "$d_modfl" != "$define"; then
+	if $test "$d_truncl:$d_copysignl" = "$define:$define"; then
+	    echo "You have both truncl and copysignl, so I can emulate modfl."
+	else
+	    if $test "$d_aintl:$d_copysignl" = "$define:$define"; then
+		echo "You have both aintl and copysignl, so I can emulate modfl."
+	    else
+		message="$message modfl"
+	    fi
+	fi
+    fi
+    if $test "$d_frexpl" != "$define"; then
+	if $test "$d_ilogbl:$d_scalbnl" = "$define:$define"; then
+	    echo "You have both ilogbl and scalbnl, so I can emulate frexpl."
+	else
+	    message="$message frexpl"
+	fi
+    fi
+    if $test "$d_ldexpl" != "$define"; then
+	message="$message ldexpl"
+    fi
+
+    if $test "$message" != ""; then
+	$cat <<EOM >&4
+
+*** You requested the use of long doubles but you do not seem to have
+*** the following mathematical functions needed for long double support:
+***    $message
+*** Please rerun Configure without -Duselongdouble and/or -Dusemorebits.
+*** Cannot continue, aborting.
+
+EOM
+
+	exit 1
+    fi
+fi
+
+: see if mprotect exists
+set mprotect d_mprotect
+eval $inlibc
+
+: see if msgctl exists
+set msgctl d_msgctl
+eval $inlibc
+
+: see if msgget exists
+set msgget d_msgget
+eval $inlibc
+
+: see if msgsnd exists
+set msgsnd d_msgsnd
+eval $inlibc
+
+: see if msgrcv exists
+set msgrcv d_msgrcv
+eval $inlibc
+
+: see how much of the 'msg*(2)' library is present.
+h_msg=true
+echo " "
+case "$d_msgctl$d_msgget$d_msgsnd$d_msgrcv" in
+*"$undef"*) h_msg=false;;
+esac
+case "$osname" in
+freebsd)
+    case "`ipcs 2>&1`" in
+    "SVID messages"*"not configured"*)
+	echo "Your $osname does not have the msg*(2) configured." >&4
+        h_msg=false
+	val="$undef"
+	set msgctl d_msgctl
+	eval $setvar
+	set msgget d_msgget
+	eval $setvar
+	set msgsnd d_msgsnd
+	eval $setvar
+	set msgrcv d_msgrcv
+	eval $setvar
+	;;
+    esac
+    ;;
+esac
+: we could also check for sys/ipc.h ...
+if $h_msg && $test `./findhdr sys/msg.h`; then
+	echo "You have the full msg*(2) library." >&4
+	val="$define"
+else
+	echo "You don't have the full msg*(2) library." >&4
+	val="$undef"
+fi
+set d_msg
+eval $setvar
+
+: Check for msghdr_s
+echo " "
+echo "Checking to see if your system supports struct msghdr..." >&4
+set d_msghdr_s msghdr $i_systypes sys/types.h $d_socket sys/socket.h $i_sysuio sys/uio.h
+eval $hasstruct
+case "$d_msghdr_s" in
+"$define")      echo "Yes, it does."   ;;
+*)              echo "No, it doesn't." ;;
+esac
+
+: see if msync exists
+set msync d_msync
+eval $inlibc
+
+: see if munmap exists
+set munmap d_munmap
+eval $inlibc
+
+: see if nan exists
+set nan d_nan
+eval $inlibc
+
+: see if nanosleep exists
+set nanosleep d_nanosleep
+eval $inlibc
+
+: see if nearbyint exists
+set nearbyint d_nearbyint
+eval $inlibc
+
+: see if nextafter exists
+set nextafter d_nextafter
+eval $inlibc
+
+: see if nexttoward exists
+set nexttoward d_nexttoward
+eval $inlibc
+
+: see if nice exists
+set nice d_nice
+eval $inlibc
+
+: see if this is a langinfo.h system
+set langinfo.h i_langinfo
+eval $inhdr
+
+: see if nl_langinfo exists
+set nl_langinfo d_nl_langinfo
+eval $inlibc
+
+: see if this is a quadmath.h system
+set quadmath.h i_quadmath
+eval $inhdr
+
+: Check basic sizes
+echo " "
+$echo "Choosing the C types to be used for Perl's internal types..." >&4
+
+case "$use64bitint:$d_quad:$quadtype" in
+define:define:?*)
+	ivtype="$quadtype"
+	uvtype="$uquadtype"
+	ivsize=8
+	uvsize=8
+	;;
+*)	ivtype="long"
+	uvtype="unsigned long"
+	ivsize=$longsize
+	uvsize=$longsize
+	;;
+esac
+
+case "$uselongdouble:$d_longdbl" in
+define:define)
+	nvtype="long double"
+	nvsize=$longdblsize
+	;;
+*)	nvtype=double
+	nvsize=$doublesize
+	;;
+esac
+
+case "$usequadmath:$i_quadmath" in
+define:define)
+  nvtype="__float128"
+  nvsize=16
+  case "$libs" in
+  *quadmath*) ;;
+  *) $cat <<EOM >&4
+
+*** You requested the use of the quadmath library, but you
+*** do not seem to have the quadmath library installed.
+*** Cannot continue, aborting.
+EOM
+    exit 1
+    ;;
+  esac
+  ;;
+define:*) $cat <<EOM >&4
+
+*** You requested the use of the quadmath library, but you
+*** do not seem to have the required header, <quadmath.h>.
+EOM
+  case "$gccversion" in
+  [23].*|4.[0-5]*)
+   $cat <<EOM >&4
+*** Your gcc looks a bit old:
+*** $gccversion
+EOM
+    ;;
+  '')
+   $cat <<EOM >&4
+*** You are not running a gcc.
+EOM
+    ;;
+  esac
+  $cat <<EOM >&4
+*** For the quadmath library you need at least gcc 4.6.
+*** Cannot continue, aborting.
+EOM
+  exit 1
+  ;;
+esac
+
+$echo "(IV will be "$ivtype", $ivsize bytes)"
+$echo "(UV will be "$uvtype", $uvsize bytes)"
+$echo "(NV will be "$nvtype", $nvsize bytes)"
+
+$cat >try.c <<EOCP
+#$i_inttypes I_INTTYPES
+#ifdef I_INTTYPES
+#include <inttypes.h>
+#endif
+#include <stdio.h>
+int main() {
+#ifdef INT8
+   int8_t i =  INT8_MAX;
+  uint8_t u = UINT8_MAX;
+  printf("int8_t\n");
+#endif
+#ifdef INT16
+   int16_t i =  INT16_MAX;
+  uint16_t u = UINT16_MAX;
+  printf("int16_t\n");
+#endif
+#ifdef INT32
+   int32_t i =  INT32_MAX;
+  uint32_t u = UINT32_MAX;
+  printf("int32_t\n");
+#endif
+}
+EOCP
+
+i8type="signed char"
+u8type="unsigned char"
+i8size=1
+u8size=1
+
+case "$i16type" in
+'')	case "$shortsize" in
+	2)	i16type=short
+		u16type="unsigned short"
+		i16size=$shortsize
+		u16size=$shortsize
+		;;
+	esac
+	;;
+esac
+case "$i16type" in
+'')	set try -DINT16
+	if eval $compile; then
+		case "`$run ./try`" in
+		int16_t)
+			i16type=int16_t
+			u16type=uint16_t
+			i16size=2
+			u16size=2
+			;;
+		esac
+	fi
+	;;
+esac
+case "$i16type" in
+'')	if $test $shortsize -ge 2; then
+		i16type=short
+		u16type="unsigned short"
+		i16size=$shortsize
+		u16size=$shortsize
+	fi
+	;;
+esac
+
+case "$i32type" in
+'')	case "$longsize" in
+	4)	i32type=long
+		u32type="unsigned long"
+		i32size=$longsize
+		u32size=$longsize
+		;;
+	*)	case "$intsize" in
+		4)	i32type=int
+			u32type="unsigned int"
+			i32size=$intsize
+			u32size=$intsize
+			;;
+		esac
+		;;
+	esac
+	;;
+esac
+case "$i32type" in
+'')	set try -DINT32
+	if eval $compile; then
+		case "`$run ./try`" in
+		int32_t)
+			i32type=int32_t
+			u32type=uint32_t
+			i32size=4
+			u32size=4
+			;;
+		esac
+	fi
+	;;
+esac
+case "$i32type" in
+'')	if $test $intsize -ge 4; then
+		i32type=int
+		u32type="unsigned int"
+		i32size=$intsize
+		u32size=$intsize
+	fi
+	;;
+esac
+
+case "$i64type" in
+'')	case "$d_quad:$quadtype" in
+	define:?*)
+		i64type="$quadtype"
+		u64type="$uquadtype"
+		i64size=8
+		u64size=8
+		;;
+	esac
+	;;
+esac
+
+$echo "Checking how many bits of your UVs your NVs can preserve..." >&4
+$cat <<EOP >try.c
+#include <stdio.h>
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#include <sys/types.h>
+#include <signal.h>
+#ifdef SIGFPE
+/* volatile so that the compiler has to store it out to memory */
+volatile int bletched = 0;
+$signal_t blech(int s) { bletched = 1; }
+#endif
+int main() {
+    $uvtype u = 0;
+    $nvtype d;
+    int     n = 8 * $uvsize;
+    int     i;
+#ifdef SIGFPE
+    signal(SIGFPE, blech);
+#endif
+
+    for (i = 0; i < n; i++) {
+      u = u << 1 | ($uvtype)1;
+      d = ($nvtype)u;
+      if (($uvtype)d != u)
+        break;
+      if (d <= 0)
+	break;
+      d = ($nvtype)(u - 1);
+      if (($uvtype)d != (u - 1))
+        break;
+#ifdef SIGFPE
+      if (bletched)
+	break;
+#endif
+    }
+    printf("%d\n", ((i == n) ? -n : i));
+    exit(0);
+}
+EOP
+set try
+
+d_nv_preserves_uv="$undef"
+if eval $compile; then
+	nv_preserves_uv_bits="`$run ./try`"
+fi
+case "$nv_preserves_uv_bits" in
+\-[1-9]*)
+	nv_preserves_uv_bits=`expr 0 - $nv_preserves_uv_bits`
+	$echo "Your NVs can preserve all $nv_preserves_uv_bits bits of your UVs."  2>&1
+	d_nv_preserves_uv="$define"
+	;;
+[1-9]*)	$echo "Your NVs can preserve only $nv_preserves_uv_bits bits of your UVs."  2>&1
+	d_nv_preserves_uv="$undef" ;;
+*)	$echo "Can't figure out how many bits your NVs preserve." 2>&1
+	nv_preserves_uv_bits="0" ;;
+esac
+$rm_try
+
+$echo "Checking to find the largest integer value your NVs can hold..." >&4
+$cat <<EOP >try.c
+#include <stdio.h>
+
+typedef $nvtype NV;
+
+int
+main() {
+  NV value = 2;
+  int count = 1;
+
+  while(count < 256) {
+    /* volatile so that the compiler has to store it out to memory */
+    volatile NV up = value + 1.0;
+    volatile NV negated = -value;
+    volatile NV down = negated - 1.0;
+    volatile NV got_up = up - value;
+    int up_good = got_up == 1.0;
+    int got_down = down - negated;
+    int down_good = got_down == -1.0;
+
+    if (down_good != up_good) {
+      fprintf(stderr,
+	      "Inconsistency - up %d %f; down %d %f; for 2**%d (%.20f)\n",
+	      up_good, (double) got_up, down_good, (double) got_down,
+	      count, (double) value);
+      return 1;
+    }
+    if (!up_good) {
+      while (1) {
+	if (count > 8) {
+	  count -= 8;
+	  fputs("256.0", stdout);
+	} else {
+	  count--;
+	  fputs("2.0", stdout);
+	}
+	if (!count) {
+	  puts("");
+	  return 0;
+	}
+	fputs("*", stdout);
+      }
+    }
+    value *= 2;
+    ++count;
+  }
+  fprintf(stderr, "Cannot overflow integer range, even at 2**%d (%.20f)\n",
+	  count, (double) value);
+  return 1;
+}
+EOP
+set try
+
+nv_overflows_integers_at='0'
+if eval $compile; then
+    xxx="`$run ./try`"
+    case "$?" in
+	0)
+	    case "$xxx" in
+		2*)  cat >&4 <<EOM
+The largest integer your NVs can preserve is equal to $xxx
+EOM
+		    nv_overflows_integers_at="$xxx"
+		    ;;
+		*)  cat >&4 <<EOM
+Cannot determine the largest integer value your NVs can hold, unexpected output
+'$xxx'
+EOM
+		    ;;
+	    esac
+	    ;;
+	*)  cat >&4 <<EOM
+Cannot determine the largest integer value your NVs can hold
+EOM
+	    ;;
+    esac
+fi
+$rm_try
+
+$echo "Checking whether NV 0.0 is all bits zero in memory..." >&4
+$cat <<EOP >try.c
+#include <stdio.h>
+#$i_stdlib I_STDLIB
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#include <string.h>
+#include <sys/types.h>
+#include <signal.h>
+#ifdef SIGFPE
+/* volatile so that the compiler has to store it out to memory */
+volatile int bletched = 0;
+$signal_t blech(int s) { bletched = 1; }
+#endif
+
+int checkit($nvtype d, const char *where) {
+    void *v = &d;
+    unsigned char *p = (unsigned char *)v;
+    unsigned char *end = p + sizeof(d);
+    int fail = 0;
+
+    while (p < end)
+	fail += *p++;
+
+    if (!fail)
+	return 0;
+
+    p = (unsigned char *)v;
+    printf("No - %s: 0x", where);
+    while (p < end)
+	printf ("%02X", *p++);
+    printf("\n");
+    return 1;
+}
+
+int main(int argc, char **argv) {
+    $nvtype d = 0.0;
+    int fail = 0;
+    fail += checkit(d, "0.0");
+
+    /* The compiler shouldn't be assuming that bletched is 0  */
+    d = bletched;
+
+    fail += checkit(d, "bleched");
+
+#ifdef SIGFPE
+    signal(SIGFPE, blech);
+#endif
+
+    /* Paranoia - the compiler should have no way of knowing that ANSI says
+       that argv[argc] will always be NULL.  Actually, if it did assume this it
+       would be buggy, as this is C and main() can be called from elsewhere in
+       the program.  */
+    d = argv[argc] ? 1 : 0;
+
+    if (d) {
+	printf("Odd argv[argc]=%p, d=%g\n", argv[argc], d);
+    }
+
+    fail += checkit(d, "ternary");
+
+    memset(&d, sizeof(d), argv[argc] ? 1 : 0);
+
+    if (d != 0.0) {
+	printf("No - memset doesn't give 0.0\n");
+	/* This might just blow up:  */
+	printf("(gives %g)\n", d);
+	return 1;
+    }
+
+#ifdef SIGFPE
+    if (bletched) {
+	printf("No - something bleched\n");
+	return 1;
+    }
+#endif
+    if (fail) {
+      printf("No - %d fail(s)\n", fail);
+      return 1;
+    }
+    printf("Yes\n");
+    return 0;
+}
+EOP
+set try
+
+d_nv_zero_is_allbits_zero="$undef"
+if eval $compile; then
+    xxx="`$run ./try`"
+    case "$?" in
+	0)
+	    case "$xxx" in
+		Yes)  cat >&4 <<EOM
+0.0 is represented as all bits zero in memory
+EOM
+		    d_nv_zero_is_allbits_zero="$define"
+		    ;;
+		*)  cat >&4 <<EOM
+0.0 is not represented as all bits zero in memory
+EOM
+		    d_nv_zero_is_allbits_zero="$undef"
+		    ;;
+	    esac
+	    ;;
+	*)  cat >&4 <<EOM
+0.0 is not represented as all bits zero in memory
+EOM
+	    d_nv_zero_is_allbits_zero="$undef"
+	    ;;
+    esac
+fi
+$rm_try
+
+: check for off64_t
+echo " "
+echo "Checking to see if you have off64_t..." >&4
+$cat >try.c <<EOCP
+#include <sys/types.h>
+#include <unistd.h>
+int main() { off64_t x = 7; }
+EOCP
+set try
+if eval $compile; then
+	val="$define"
+	echo "You have off64_t."
+else
+	val="$undef"
+	echo "You do not have off64_t."
+	case "$lseeksize" in
+	8) echo "(Your off_t is 64 bits, so you could use that.)" ;;
+	esac
+fi
+$rm_try
+set d_off64_t
+eval $setvar
+
+: how to create joinable pthreads
+if test "X$usethreads" = "X$define" -a "X$i_pthread" = "X$define"; then
+	echo " "
+	echo "Checking what constant to use for creating joinable pthreads..." >&4
+	$cat >try.c <<'EOCP'
+#include <pthread.h>
+int main() {
+    int detachstate = JOINABLE;
+}
+EOCP
+	set try -DJOINABLE=PTHREAD_CREATE_JOINABLE
+	if eval $compile; then
+		echo "You seem to use PTHREAD_CREATE_JOINABLE." >&4
+		val="$undef" # Yes, undef.
+		set d_old_pthread_create_joinable
+		eval $setvar
+		val=""
+		set old_pthread_create_joinable
+		eval $setvar
+	else
+		set try -DJOINABLE=PTHREAD_CREATE_UNDETACHED
+		if eval $compile; then
+			echo "You seem to use PTHREAD_CREATE_UNDETACHED." >&4
+			val="$define"
+			set d_old_pthread_create_joinable
+			eval $setvar
+			val=PTHREAD_CREATE_UNDETACHED
+			set old_pthread_create_joinable
+			eval $setvar
+		else
+			set try -DJOINABLE=__UNDETACHED
+			if eval $compile; then
+				echo "You seem to use __UNDETACHED." >&4
+				val="$define"
+				set d_old_pthread_create_joinable
+				eval $setvar
+				val=__UNDETACHED
+				set old_pthread_create_joinable
+				eval $setvar
+			else
+				echo "Egads, nothing obvious found.  Guessing that you use 0." >&4
+				val="$define"
+				set d_old_pthread_create_joinable
+				eval $setvar
+				val=0
+				set old_pthread_create_joinable
+				eval $setvar
+			fi
+		fi
+	fi
+	$rm_try
+else
+    d_old_pthread_create_joinable="$undef"
+    old_pthread_create_joinable=""
+fi
+
+: see if pause exists
+set pause d_pause
+eval $inlibc
+
+: see if pipe2 exists
+set pipe2 d_pipe2
+eval $inlibc
+
+: see if poll exists
+set poll d_poll
+eval $inlibc
+
+: see if prctl exists
+set prctl d_prctl
+eval $inlibc
+
+: see if prctl supports PR_SET_NAME
+d_prctl_set_name=$undef
+case $d_prctl in
+    $define)
+	$cat >try.c <<EOM
+#ifdef __ANDROID__
+#include <unistd.h>
+#endif
+#include <sys/prctl.h>
+
+int main (int argc, char *argv[])
+{
+    return (prctl (PR_SET_NAME, "Test"));
+    } /* main */
+EOM
+	set try
+	if eval $compile_ok && $run ./try; then
+	    echo "Your prctl (PR_SET_NAME, ...) works"
+	    d_prctl_set_name=$define
+	    fi
+	$rm_try
+	;;
+    esac
+
+: see if readlink exists
+set readlink d_readlink
+eval $inlibc
+
+: Check if there is a /proc symlink to the abs path of
+: the executing program.  We will honor hints of d_procselfexe=$undef
+: or procselfexe being non-empty, otherwise will try to determine both
+: if we have readlink.
+: AmigaOS will attempt to mount proc: aka /proc, if /proc/... is
+: referenced, and AmigaOS does not have a proc filesystem anyway.
+echo " "
+val="$undef"
+if $test "X$d_procselfexe" = Xundef; then
+	procselfexe=''
+elif $test "X$procselfexe" != X -a "X$procselfexe" != 'X '; then
+	val="$define"
+elif $test "X$d_readlink" = Xdefine; then
+        : NetBSD first as /proc/self is a symlink to /proc/curproc,
+        : and it feels more tidy to avoid an extra level of symlink
+	set NetBSD /proc/curproc/exe Linux /proc/self/exe FreeBSD /proc/curproc/file Solaris /proc/self/path/a.out
+	while test $# -gt 0; do
+	    type=$1; try=$2
+	    shift; shift
+	    if $issymlink $try; then
+		$ls -l $try > reflect
+		if $contains /`basename $ls` reflect >/dev/null 2>&1; then
+		    echo "You have $type-like $try."
+		    procselfexe='"'$try'"'
+		    val="$define"
+		    : This will break out of the loop
+		    set X; shift
+		fi
+	    fi
+	done
+fi
+$rm -f reflect
+set d_procselfexe
+eval $setvar
+
+: backward compatibility for d_hvfork
+if test X$d_hvfork != X; then
+	d_vfork="$d_hvfork"
+	d_hvfork=''
+fi
+: see if there is a vfork
+val=''
+set vfork val
+eval $inlibc
+
+d_pseudofork=$undef
+
+: Ok, but do we want to use it. vfork is reportedly unreliable in
+: perl on Solaris 2.x, and probably elsewhere.
+case "$val" in
+$define)
+	echo " "
+	case "$usevfork" in
+	false) dflt='n';;
+	*) dflt='y';;
+	esac
+	cat <<'EOM'
+
+Perl can only use a vfork() that doesn't suffer from strict
+restrictions on calling functions or modifying global data in
+the child.  For example, glibc-2.1 contains such a vfork()
+that is unsuitable.  If your system provides a proper fork()
+call, chances are that you do NOT want perl to use vfork().
+
+EOM
+	rp="Do you still want to use vfork()?"
+	. ./myread
+	case "$ans" in
+	y|Y) ;;
+	*)
+		echo "Ok, we won't use vfork()."
+		val="$undef"
+		;;
+	esac
+	;;
+esac
+set d_vfork
+eval $setvar
+case "$d_vfork" in
+$define) usevfork='true';;
+*) usevfork='false';;
+esac
+
+: see whether the pthread_atfork exists
+$cat >try.c <<EOP
+#include <pthread.h>
+#include <stdio.h>
+int main() {
+#ifdef  PTHREAD_ATFORK
+        pthread_atfork(NULL,NULL,NULL);
+#endif
+}
+EOP
+
+: see if pthread_atfork exists
+set try -DPTHREAD_ATFORK
+if eval $compile; then
+    val="$define"
+else
+    val="$undef"
+fi
+case "$usethreads" in
+$define)
+        case "$val" in
+        $define) echo 'pthread_atfork found.' >&4        ;;
+        *)       echo 'pthread_atfork NOT found.' >&4    ;;
+        esac
+esac
+set d_pthread_atfork
+eval $setvar
+
+: see if pthread_attr_setscope exists
+set pthread_attr_setscope d_pthread_attr_setscope
+eval $inlibc
+
+: see whether the various POSIXish _yields exist
+$cat >try.c <<EOP
+#include <pthread.h>
+#include <stdio.h>
+int main() {
+#ifdef SCHED_YIELD
+	sched_yield();
+#else
+#ifdef PTHREAD_YIELD
+	pthread_yield();
+#else
+#ifdef PTHREAD_YIELD_NULL
+	pthread_yield(NULL);
+#endif
+#endif
+#endif
+}
+EOP
+: see if sched_yield exists
+set try -DSCHED_YIELD
+if eval $compile; then
+    val="$define"
+    sched_yield='sched_yield()'
+else
+    val="$undef"
+fi
+case "$usethreads" in
+$define)
+	case "$val" in
+	$define) echo 'sched_yield() found.' >&4	;;
+	*)	 echo 'sched_yield() NOT found.' >&4	;;
+	esac
+esac
+set d_sched_yield
+eval $setvar
+
+: see if pthread_yield exists
+set try -DPTHREAD_YIELD
+if eval $compile; then
+    val="$define"
+    case "$sched_yield" in
+    '') sched_yield='pthread_yield()' ;;
+    esac
+else
+    set try -DPTHREAD_YIELD_NULL
+    if eval $compile; then
+	val="$define"
+	case "$sched_yield" in
+	'') sched_yield='pthread_yield(NULL)' ;;
+	esac
+    else
+	val="$undef"
+    fi
+fi
+case "$usethreads" in
+$define)
+	case "$val" in
+	$define) echo 'pthread_yield() found.' >&4	;;
+	*)	 echo 'pthread_yield() NOT found.' >&4	;;
+	esac
+	;;
+esac
+set d_pthread_yield
+eval $setvar
+case "$sched_yield" in
+'') sched_yield=undef ;;
+esac
+$rm_try
+
+: check for ptrdiff_t
+echo " "
+echo "Checking to see if you have ptrdiff_t..." >&4
+$cat >try.c <<EOCP
+#include <stddef.h>
+int main() { ptrdiff_t x = 7; }
+EOCP
+set try
+if eval $compile; then
+	val="$define"
+	echo "You have ptrdiff_t."
+else
+	val="$undef"
+	echo "You do not have ptrdiff_t."
+fi
+$rm_try
+set d_ptrdiff_t
+eval $setvar
+
+: see if random_r exists
+set random_r d_random_r
+eval $inlibc
+case "$d_random_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_stdlib stdlib.h"
+	case "$d_random_r_proto:$usethreads" in
+	":define")	d_random_r_proto=define
+		set d_random_r_proto random_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_random_r_proto" in
+	define)
+	case "$random_r_proto" in
+	''|0) try='int random_r(int*, struct random_data*);'
+	./protochk "$extern_C $try" $hdrs && random_r_proto=I_iS ;;
+	esac
+	case "$random_r_proto" in
+	''|0) try='int random_r(long*, struct random_data*);'
+	./protochk "$extern_C $try" $hdrs && random_r_proto=I_lS ;;
+	esac
+	case "$random_r_proto" in
+	''|0) try='int random_r(struct random_data*, int32_t*);'
+	./protochk "$extern_C $try" $hdrs && random_r_proto=I_St ;;
+	esac
+	case "$random_r_proto" in
+	''|0)	d_random_r=undef
+		random_r_proto=0
+		echo "Disabling random_r, cannot determine prototype." >&4 ;;
+	* )	case "$random_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) random_r_proto="REENTRANT_PROTO_$random_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "random_r has no prototype, not using it." >&4 ;;
+		esac
+		d_random_r=undef
+		random_r_proto=0
+		;;
+	esac
+	;;
+*)	random_r_proto=0
+	;;
+esac
+
+: see if readdir and friends exist
+set readdir d_readdir
+eval $inlibc
+set seekdir d_seekdir
+eval $inlibc
+set telldir d_telldir
+eval $inlibc
+set rewinddir d_rewinddir
+eval $inlibc
+
+: see if readdir64_r exists
+set readdir64_r d_readdir64_r
+eval $inlibc
+case "$d_readdir64_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_dirent dirent.h"
+	case "$d_readdir64_r_proto:$usethreads" in
+	":define")	d_readdir64_r_proto=define
+		set d_readdir64_r_proto readdir64_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_readdir64_r_proto" in
+	define)
+	case "$readdir64_r_proto" in
+	''|0) try='int readdir64_r(DIR*, struct dirent64*, struct dirent64**);'
+	./protochk "$extern_C $try" $hdrs && readdir64_r_proto=I_TSR ;;
+	esac
+	case "$readdir64_r_proto" in
+	''|0) try='int readdir64_r(DIR*, struct dirent64*);'
+	./protochk "$extern_C $try" $hdrs && readdir64_r_proto=I_TS ;;
+	esac
+	case "$readdir64_r_proto" in
+	''|0)	d_readdir64_r=undef
+		readdir64_r_proto=0
+		echo "Disabling readdir64_r, cannot determine prototype." >&4 ;;
+	* )	case "$readdir64_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) readdir64_r_proto="REENTRANT_PROTO_$readdir64_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "readdir64_r has no prototype, not using it." >&4 ;;
+		esac
+		d_readdir64_r=undef
+		readdir64_r_proto=0
+		;;
+	esac
+	;;
+*)	readdir64_r_proto=0
+	;;
+esac
+
+: see if readdir_r exists
+set readdir_r d_readdir_r
+eval $inlibc
+case "$d_readdir_r" in
+"$define")
+	hdrs="$i_systypes sys/types.h define stdio.h $i_dirent dirent.h"
+	case "$d_readdir_r_proto:$usethreads" in
+	":define")	d_readdir_r_proto=define
+		set d_readdir_r_proto readdir_r $hdrs
+		eval $hasproto ;;
+	*)	;;
+	esac
+	case "$d_readdir_r_proto" in
+	define)
+	case "$readdir_r_proto" in
+	''|0) try='int readdir_r(DIR*, struct dirent*, struct dirent**);'
+	./protochk "$extern_C $try" $hdrs && readdir_r_proto=I_TSR ;;
+	esac
+	case "$readdir_r_proto" in
+	''|0) try='int readdir_r(DIR*, struct dirent*);'
+	./protochk "$extern_C $try" $hdrs && readdir_r_proto=I_TS ;;
+	esac
+	case "$readdir_r_proto" in
+	''|0)	d_readdir_r=undef
+		readdir_r_proto=0
+		echo "Disabling readdir_r, cannot determine prototype." >&4 ;;
+	* )	case "$readdir_r_proto" in
+		REENTRANT_PROTO*) ;;
+		*) readdir_r_proto="REENTRANT_PROTO_$readdir_r_proto" ;;
+		esac
+		echo "Prototype: $try" ;;
+	esac
+	;;
+	*)	case "$usethreads" in
+		define) echo "readdir_r has no prototype, not using it." >&4 ;;
+		esac
+		d_readdir_r=undef
+		readdir_r_proto=0
+		;;
+	esac
+	;;
+*)	readdir_r_proto=0
+	;;
+esac
+
+: see if readv exists
+set readv d_readv
+eval $inlibc
+
+: see if recvmsg exists
+set recvmsg d_recvmsg
+eval $inlibc
+
+: see if regcomp, regcmp, or re_comp exist, for regular pattern matching
+echo " "
+if set regcomp val -f d_regcomp; eval $csym; $val; then
+	echo 'regcomp() found.' >&4
+	d_regcomp="$define"
+	d_regcmp="$undef"
+	d_re_comp="$undef"
+elif set regcmp val -f d_regcmp; eval $csym; $val; then
+	echo 'regcmp() found.' >&4
+	d_regcmp="$define"
+	d_regcomp="$undef"
+	d_re_comp="$undef"
+elif set re_comp val -f d_re_comp; eval $csym; $val; then
+	echo 're_comp() found, assuming re_exec() also exists.' >&4
+	d_re_comp="$define"
+	d_regcomp="$undef"
+	d_regcmp="$undef"
+else
+	$cat >&4 <<EOM
+No regcomp(), regcmp() nor re_comp() found !! No regular pattern matching.
+EOM
+	d_regcmp="$undef"
+	d_re_comp="$undef"
+	d_regcomp="$undef"
+fi
+
+: see if remainder exists
+set remainder d_remainder
+eval $inlibc
+
+: see if remquo exists
+set remquo d_remquo
+eval $inlibc
+
+: see if rename exists
+set rename d_rename
+eval $inlibc
+
+: see if rint exists
+set rint d_rint
+eval $inlibc
+
+: see if rmdir exists
+set rmdir d_rmdir
+eval $inlibc
+
+: see if round exists
+set round d_round
+eval $inlibc
+
+: see if prototype for sbrk is available
+echo " "
+set d_sbrkproto sbrk $i_unistd unistd.h
+eval $hasproto
+
+: see if scalbn exists
+set scalbn d_scalbn
+eval $inlibc
+
+: see if select exists
+set select d_select
+eval $inlibc
+
+: see if semctl exists
+set semctl d_semctl
+eval $inlibc
+
+: see if semget exists
+set semget d_semget
+eval $inlibc
+
+: see if semop exists
+set semop d_semop
+eval $inlibc
+
+: see how much of the 'sem*(2)' library is present.
+h_sem=true
+echo " "
+case "$d_semctl$d_semget$d_semop" in
+*"$undef"*) h_sem=