1c3423655Schristos#!/bin/sh 2c3423655Schristos# 3c3423655Schristos# ZLIB compilation script for the OS/400. 4c3423655Schristos# 5c3423655Schristos# 6c3423655Schristos# This is a shell script since make is not a standard component of OS/400. 7c3423655Schristos 8c3423655Schristos 9c3423655Schristos################################################################################ 10c3423655Schristos# 11c3423655Schristos# Tunable configuration parameters. 12c3423655Schristos# 13c3423655Schristos################################################################################ 14c3423655Schristos 15c3423655SchristosTARGETLIB='ZLIB' # Target OS/400 program library 16c3423655SchristosSTATBNDDIR='ZLIB_A' # Static binding directory. 17c3423655SchristosDYNBNDDIR='ZLIB' # Dynamic binding directory. 18c3423655SchristosSRVPGM="ZLIB" # Service program. 19c3423655SchristosIFSDIR='/zlib' # IFS support base directory. 20c3423655SchristosTGTCCSID='500' # Target CCSID of objects 21c3423655SchristosDEBUG='*NONE' # Debug level 22c3423655SchristosOPTIMIZE='40' # Optimisation level 23c3423655SchristosOUTPUT='*NONE' # Compilation output option. 24c3423655SchristosTGTRLS='V6R1M0' # Target OS release 25c3423655Schristos 26c3423655Schristosexport TARGETLIB STATBNDDIR DYNBNDDIR SRVPGM IFSDIR 27c3423655Schristosexport TGTCCSID DEBUG OPTIMIZE OUTPUT TGTRLS 28c3423655Schristos 29c3423655Schristos 30c3423655Schristos################################################################################ 31c3423655Schristos# 32c3423655Schristos# OS/400 specific definitions. 33c3423655Schristos# 34c3423655Schristos################################################################################ 35c3423655Schristos 36c3423655SchristosLIBIFSNAME="/QSYS.LIB/${TARGETLIB}.LIB" 37c3423655Schristos 38c3423655Schristos 39c3423655Schristos################################################################################ 40c3423655Schristos# 41c3423655Schristos# Procedures. 42c3423655Schristos# 43c3423655Schristos################################################################################ 44c3423655Schristos 45c3423655Schristos# action_needed dest [src] 46c3423655Schristos# 47c3423655Schristos# dest is an object to build 48c3423655Schristos# if specified, src is an object on which dest depends. 49c3423655Schristos# 50c3423655Schristos# exit 0 (succeeds) if some action has to be taken, else 1. 51c3423655Schristos 52c3423655Schristosaction_needed() 53c3423655Schristos 54c3423655Schristos{ 55c3423655Schristos [ ! -e "${1}" ] && return 0 56c3423655Schristos [ "${2}" ] || return 1 57c3423655Schristos [ "${1}" -ot "${2}" ] && return 0 58c3423655Schristos return 1 59c3423655Schristos} 60c3423655Schristos 61c3423655Schristos 62c3423655Schristos# make_module module_name source_name [additional_definitions] 63c3423655Schristos# 64c3423655Schristos# Compile source name into module if needed. 65c3423655Schristos# As side effect, append the module name to variable MODULES. 66c3423655Schristos# Set LINK to "YES" if the module has been compiled. 67c3423655Schristos 68c3423655Schristosmake_module() 69c3423655Schristos 70c3423655Schristos{ 71c3423655Schristos MODULES="${MODULES} ${1}" 72c3423655Schristos MODIFSNAME="${LIBIFSNAME}/${1}.MODULE" 73c3423655Schristos CSRC="`basename \"${2}\"`" 74c3423655Schristos 75c3423655Schristos if action_needed "${MODIFSNAME}" "${2}" 76c3423655Schristos then : 77c3423655Schristos elif [ ! "`sed -e \"/<source name=\\\"${CSRC}\\\">/,/<\\\\/source>/!d\" \ 78c3423655Schristos -e '/<depend /!d' \ 79c3423655Schristos -e 's/.* name=\"\\([^\"]*\\)\".*/\\1/' < \"${TOPDIR}/treebuild.xml\" | 80c3423655Schristos while read HDR 81c3423655Schristos do if action_needed \"${MODIFSNAME}\" \"${IFSDIR}/include/${HDR}\" 82c3423655Schristos then echo recompile 83c3423655Schristos break 84c3423655Schristos fi 85c3423655Schristos done`" ] 86c3423655Schristos then return 0 87c3423655Schristos fi 88c3423655Schristos 89c3423655Schristos CMD="CRTCMOD MODULE(${TARGETLIB}/${1}) SRCSTMF('${2}')" 90c3423655Schristos CMD="${CMD} SYSIFCOPT(*IFS64IO) OPTION(*INCDIRFIRST)" 91c3423655Schristos CMD="${CMD} LOCALETYPE(*LOCALE) FLAG(10)" 92c3423655Schristos CMD="${CMD} INCDIR('${IFSDIR}/include' ${INCLUDES})" 93c3423655Schristos CMD="${CMD} TGTCCSID(${TGTCCSID}) TGTRLS(${TGTRLS})" 94c3423655Schristos CMD="${CMD} OUTPUT(${OUTPUT})" 95c3423655Schristos CMD="${CMD} OPTIMIZE(${OPTIMIZE})" 96c3423655Schristos CMD="${CMD} DBGVIEW(${DEBUG})" 97c3423655Schristos system "${CMD}" 98c3423655Schristos LINK=YES 99c3423655Schristos} 100c3423655Schristos 101c3423655Schristos 102c3423655Schristos# Determine DB2 object name from IFS name. 103c3423655Schristos 104c3423655Schristosdb2_name() 105c3423655Schristos 106c3423655Schristos{ 107c3423655Schristos basename "${1}" | 108c3423655Schristos tr 'a-z-' 'A-Z_' | 109c3423655Schristos sed -e 's/\..*//' \ 110c3423655Schristos -e 's/^\(.\).*\(.........\)$/\1\2/' 111c3423655Schristos} 112c3423655Schristos 113c3423655Schristos 114c3423655Schristos# Force enumeration types to be the same size as integers. 115c3423655Schristos 116c3423655Schristoscopy_hfile() 117c3423655Schristos 118c3423655Schristos{ 119c3423655Schristos sed -e '1i\ 120c3423655Schristos#pragma enum(int)\ 121c3423655Schristos' "${@}" -e '$a\ 122c3423655Schristos#pragma enum(pop)\ 123c3423655Schristos' 124c3423655Schristos} 125c3423655Schristos 126c3423655Schristos 127c3423655Schristos################################################################################ 128c3423655Schristos# 129c3423655Schristos# Script initialization. 130c3423655Schristos# 131c3423655Schristos################################################################################ 132c3423655Schristos 133c3423655SchristosSCRIPTDIR=`dirname "${0}"` 134c3423655Schristos 135c3423655Schristoscase "${SCRIPTDIR}" in 136c3423655Schristos/*) ;; 137c3423655Schristos*) SCRIPTDIR="`pwd`/${SCRIPTDIR}" 138c3423655Schristosesac 139c3423655Schristos 140c3423655Schristoswhile true 141c3423655Schristosdo case "${SCRIPTDIR}" in 142c3423655Schristos */.) SCRIPTDIR="${SCRIPTDIR%/.}";; 143c3423655Schristos *) break;; 144c3423655Schristos esac 145c3423655Schristosdone 146c3423655Schristos 147c3423655Schristos# The script directory is supposed to be in ${TOPDIR}/os400. 148c3423655Schristos 149c3423655SchristosTOPDIR=`dirname "${SCRIPTDIR}"` 150c3423655Schristosexport SCRIPTDIR TOPDIR 151c3423655Schristoscd "${TOPDIR}" 152c3423655Schristos 153c3423655Schristos 154c3423655Schristos# Extract the version from the master compilation XML file. 155c3423655Schristos 156c3423655SchristosVERSION=`sed -e '/^<package /!d' \ 157c3423655Schristos -e 's/^.* version="\([0-9.]*\)".*$/\1/' -e 'q' \ 158c3423655Schristos < treebuild.xml` 159c3423655Schristosexport VERSION 160c3423655Schristos 161c3423655Schristos################################################################################ 162c3423655Schristos 163c3423655Schristos 164c3423655Schristos# Create the OS/400 library if it does not exist. 165c3423655Schristos 166c3423655Schristosif action_needed "${LIBIFSNAME}" 167c3423655Schristosthen CMD="CRTLIB LIB(${TARGETLIB}) TEXT('ZLIB: Data compression API')" 168c3423655Schristos system "${CMD}" 169c3423655Schristosfi 170c3423655Schristos 171c3423655Schristos 172c3423655Schristos# Create the DOCS source file if it does not exist. 173c3423655Schristos 174c3423655Schristosif action_needed "${LIBIFSNAME}/DOCS.FILE" 175c3423655Schristosthen CMD="CRTSRCPF FILE(${TARGETLIB}/DOCS) RCDLEN(112)" 176c3423655Schristos CMD="${CMD} CCSID(${TGTCCSID}) TEXT('Documentation texts')" 177c3423655Schristos system "${CMD}" 178c3423655Schristosfi 179c3423655Schristos 180c3423655Schristos# Copy some documentation files if needed. 181c3423655Schristos 182c3423655Schristosfor TEXT in "${TOPDIR}/ChangeLog" "${TOPDIR}/FAQ" \ 183c3423655Schristos "${TOPDIR}/README" "${SCRIPTDIR}/README400" 184c3423655Schristosdo MEMBER="${LIBIFSNAME}/DOCS.FILE/`db2_name \"${TEXT}\"`.MBR" 185c3423655Schristos 186c3423655Schristos if action_needed "${MEMBER}" "${TEXT}" 187c3423655Schristos then CMD="CPY OBJ('${TEXT}') TOOBJ('${MEMBER}') TOCCSID(${TGTCCSID})" 188c3423655Schristos CMD="${CMD} DTAFMT(*TEXT) REPLACE(*YES)" 189c3423655Schristos system "${CMD}" 190c3423655Schristos fi 191c3423655Schristosdone 192c3423655Schristos 193c3423655Schristos 194c3423655Schristos# Create the OS/400 source program file for the C header files. 195c3423655Schristos 196c3423655SchristosSRCPF="${LIBIFSNAME}/H.FILE" 197c3423655Schristos 198c3423655Schristosif action_needed "${SRCPF}" 199c3423655Schristosthen CMD="CRTSRCPF FILE(${TARGETLIB}/H) RCDLEN(112)" 200c3423655Schristos CMD="${CMD} CCSID(${TGTCCSID}) TEXT('ZLIB: C/C++ header files')" 201c3423655Schristos system "${CMD}" 202c3423655Schristosfi 203c3423655Schristos 204c3423655Schristos 205c3423655Schristos# Create the IFS directory for the C header files. 206c3423655Schristos 207c3423655Schristosif action_needed "${IFSDIR}/include" 208c3423655Schristosthen mkdir -p "${IFSDIR}/include" 209c3423655Schristosfi 210c3423655Schristos 211c3423655Schristos# Copy the header files to DB2 library. Link from IFS include directory. 212c3423655Schristos 213c3423655Schristosfor HFILE in "${TOPDIR}/"*.h 214c3423655Schristosdo DEST="${SRCPF}/`db2_name \"${HFILE}\"`.MBR" 215c3423655Schristos 216c3423655Schristos if action_needed "${DEST}" "${HFILE}" 217c3423655Schristos then copy_hfile < "${HFILE}" > tmphdrfile 218c3423655Schristos 219c3423655Schristos # Need to translate to target CCSID. 220c3423655Schristos 221c3423655Schristos CMD="CPY OBJ('`pwd`/tmphdrfile') TOOBJ('${DEST}')" 222c3423655Schristos CMD="${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)" 223c3423655Schristos system "${CMD}" 224c3423655Schristos # touch -r "${HFILE}" "${DEST}" 225c3423655Schristos rm -f tmphdrfile 226c3423655Schristos fi 227c3423655Schristos 228c3423655Schristos IFSFILE="${IFSDIR}/include/`basename \"${HFILE}\"`" 229c3423655Schristos 230c3423655Schristos if action_needed "${IFSFILE}" "${DEST}" 231c3423655Schristos then rm -f "${IFSFILE}" 232c3423655Schristos ln -s "${DEST}" "${IFSFILE}" 233c3423655Schristos fi 234c3423655Schristosdone 235c3423655Schristos 236c3423655Schristos 237c3423655Schristos# Install the ILE/RPG header file. 238c3423655Schristos 239c3423655Schristos 240c3423655SchristosHFILE="${SCRIPTDIR}/zlib.inc" 241c3423655SchristosDEST="${SRCPF}/ZLIB.INC.MBR" 242c3423655Schristos 243c3423655Schristosif action_needed "${DEST}" "${HFILE}" 244c3423655Schristosthen CMD="CPY OBJ('${HFILE}') TOOBJ('${DEST}')" 245c3423655Schristos CMD="${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)" 246c3423655Schristos system "${CMD}" 247c3423655Schristos # touch -r "${HFILE}" "${DEST}" 248c3423655Schristosfi 249c3423655Schristos 250c3423655SchristosIFSFILE="${IFSDIR}/include/`basename \"${HFILE}\"`" 251c3423655Schristos 252c3423655Schristosif action_needed "${IFSFILE}" "${DEST}" 253c3423655Schristosthen rm -f "${IFSFILE}" 254c3423655Schristos ln -s "${DEST}" "${IFSFILE}" 255c3423655Schristosfi 256c3423655Schristos 257c3423655Schristos 258c3423655Schristos# Create and compile the identification source file. 259c3423655Schristos 260c3423655Schristosecho '#pragma comment(user, "ZLIB version '"${VERSION}"'")' > os400.c 261c3423655Schristosecho '#pragma comment(user, __DATE__)' >> os400.c 262c3423655Schristosecho '#pragma comment(user, __TIME__)' >> os400.c 263*ec47cc4bSchristosecho '#pragma comment(copyright, "Copyright (C) 1995-2017 Jean-Loup Gailly, Mark Adler. OS/400 version by P. Monnerat.")' >> os400.c 264c3423655Schristosmake_module OS400 os400.c 265c3423655SchristosLINK= # No need to rebuild service program yet. 266c3423655SchristosMODULES= 267c3423655Schristos 268c3423655Schristos 269c3423655Schristos# Get source list. 270c3423655Schristos 271c3423655SchristosCSOURCES=`sed -e '/<source name="/!d' \ 272c3423655Schristos -e 's/.* name="\([^"]*\)".*/\1/' < treebuild.xml` 273c3423655Schristos 274c3423655Schristos# Compile the sources into modules. 275c3423655Schristos 276c3423655Schristosfor SRC in ${CSOURCES} 277c3423655Schristosdo MODULE=`db2_name "${SRC}"` 278c3423655Schristos make_module "${MODULE}" "${SRC}" 279c3423655Schristosdone 280c3423655Schristos 281c3423655Schristos 282c3423655Schristos# If needed, (re)create the static binding directory. 283c3423655Schristos 284c3423655Schristosif action_needed "${LIBIFSNAME}/${STATBNDDIR}.BNDDIR" 285c3423655Schristosthen LINK=YES 286c3423655Schristosfi 287c3423655Schristos 288c3423655Schristosif [ "${LINK}" ] 289c3423655Schristosthen rm -rf "${LIBIFSNAME}/${STATBNDDIR}.BNDDIR" 290c3423655Schristos CMD="CRTBNDDIR BNDDIR(${TARGETLIB}/${STATBNDDIR})" 291c3423655Schristos CMD="${CMD} TEXT('ZLIB static binding directory')" 292c3423655Schristos system "${CMD}" 293c3423655Schristos 294c3423655Schristos for MODULE in ${MODULES} 295c3423655Schristos do CMD="ADDBNDDIRE BNDDIR(${TARGETLIB}/${STATBNDDIR})" 296c3423655Schristos CMD="${CMD} OBJ((${TARGETLIB}/${MODULE} *MODULE))" 297c3423655Schristos system "${CMD}" 298c3423655Schristos done 299c3423655Schristosfi 300c3423655Schristos 301c3423655Schristos 302c3423655Schristos# The exportation file for service program creation must be in a DB2 303c3423655Schristos# source file, so make sure it exists. 304c3423655Schristos 305c3423655Schristosif action_needed "${LIBIFSNAME}/TOOLS.FILE" 306c3423655Schristosthen CMD="CRTSRCPF FILE(${TARGETLIB}/TOOLS) RCDLEN(112)" 307c3423655Schristos CMD="${CMD} CCSID(${TGTCCSID}) TEXT('ZLIB: build tools')" 308c3423655Schristos system "${CMD}" 309c3423655Schristosfi 310c3423655Schristos 311c3423655Schristos 312c3423655SchristosDEST="${LIBIFSNAME}/TOOLS.FILE/BNDSRC.MBR" 313c3423655Schristos 314c3423655Schristosif action_needed "${SCRIPTDIR}/bndsrc" "${DEST}" 315c3423655Schristosthen CMD="CPY OBJ('${SCRIPTDIR}/bndsrc') TOOBJ('${DEST}')" 316c3423655Schristos CMD="${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)" 317c3423655Schristos system "${CMD}" 318c3423655Schristos # touch -r "${SCRIPTDIR}/bndsrc" "${DEST}" 319c3423655Schristos LINK=YES 320c3423655Schristosfi 321c3423655Schristos 322c3423655Schristos 323c3423655Schristos# Build the service program if needed. 324c3423655Schristos 325c3423655Schristosif action_needed "${LIBIFSNAME}/${SRVPGM}.SRVPGM" 326c3423655Schristosthen LINK=YES 327c3423655Schristosfi 328c3423655Schristos 329c3423655Schristosif [ "${LINK}" ] 330c3423655Schristosthen CMD="CRTSRVPGM SRVPGM(${TARGETLIB}/${SRVPGM})" 331c3423655Schristos CMD="${CMD} SRCFILE(${TARGETLIB}/TOOLS) SRCMBR(BNDSRC)" 332c3423655Schristos CMD="${CMD} MODULE(${TARGETLIB}/OS400)" 333c3423655Schristos CMD="${CMD} BNDDIR(${TARGETLIB}/${STATBNDDIR})" 334c3423655Schristos CMD="${CMD} TEXT('ZLIB ${VERSION} dynamic library')" 335c3423655Schristos CMD="${CMD} TGTRLS(${TGTRLS})" 336c3423655Schristos system "${CMD}" 337c3423655Schristos LINK=YES 338c3423655Schristos 339c3423655Schristos # Duplicate the service program for a versioned backup. 340c3423655Schristos 341c3423655Schristos BACKUP=`echo "${SRVPGM}${VERSION}" | 342c3423655Schristos sed -e 's/.*\(..........\)$/\1/' -e 's/\./_/g'` 343c3423655Schristos BACKUP="`db2_name \"${BACKUP}\"`" 344c3423655Schristos BKUPIFSNAME="${LIBIFSNAME}/${BACKUP}.SRVPGM" 345c3423655Schristos rm -f "${BKUPIFSNAME}" 346c3423655Schristos CMD="CRTDUPOBJ OBJ(${SRVPGM}) FROMLIB(${TARGETLIB})" 347c3423655Schristos CMD="${CMD} OBJTYPE(*SRVPGM) NEWOBJ(${BACKUP})" 348c3423655Schristos system "${CMD}" 349c3423655Schristosfi 350c3423655Schristos 351c3423655Schristos 352c3423655Schristos# If needed, (re)create the dynamic binding directory. 353c3423655Schristos 354c3423655Schristosif action_needed "${LIBIFSNAME}/${DYNBNDDIR}.BNDDIR" 355c3423655Schristosthen LINK=YES 356c3423655Schristosfi 357c3423655Schristos 358c3423655Schristosif [ "${LINK}" ] 359c3423655Schristosthen rm -rf "${LIBIFSNAME}/${DYNBNDDIR}.BNDDIR" 360c3423655Schristos CMD="CRTBNDDIR BNDDIR(${TARGETLIB}/${DYNBNDDIR})" 361c3423655Schristos CMD="${CMD} TEXT('ZLIB dynamic binding directory')" 362c3423655Schristos system "${CMD}" 363c3423655Schristos CMD="ADDBNDDIRE BNDDIR(${TARGETLIB}/${DYNBNDDIR})" 364c3423655Schristos CMD="${CMD} OBJ((*LIBL/${SRVPGM} *SRVPGM))" 365c3423655Schristos system "${CMD}" 366c3423655Schristosfi 367