123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366 |
- #!/bin/sh
- #
- # ZLIB compilation script for the OS/400.
- #
- #
- # This is a shell script since make is not a standard component of OS/400.
- ################################################################################
- #
- # Tunable configuration parameters.
- #
- ################################################################################
- TARGETLIB='ZLIB' # Target OS/400 program library
- STATBNDDIR='ZLIB_A' # Static binding directory.
- DYNBNDDIR='ZLIB' # Dynamic binding directory.
- SRVPGM="ZLIB" # Service program.
- IFSDIR='/zlib' # IFS support base directory.
- TGTCCSID='500' # Target CCSID of objects
- DEBUG='*NONE' # Debug level
- OPTIMIZE='40' # Optimisation level
- OUTPUT='*NONE' # Compilation output option.
- TGTRLS='V6R1M0' # Target OS release
- export TARGETLIB STATBNDDIR DYNBNDDIR SRVPGM IFSDIR
- export TGTCCSID DEBUG OPTIMIZE OUTPUT TGTRLS
- ################################################################################
- #
- # OS/400 specific definitions.
- #
- ################################################################################
- LIBIFSNAME="/QSYS.LIB/${TARGETLIB}.LIB"
- ################################################################################
- #
- # Procedures.
- #
- ################################################################################
- # action_needed dest [src]
- #
- # dest is an object to build
- # if specified, src is an object on which dest depends.
- #
- # exit 0 (succeeds) if some action has to be taken, else 1.
- action_needed()
- {
- [ ! -e "${1}" ] && return 0
- [ "${2}" ] || return 1
- [ "${1}" -ot "${2}" ] && return 0
- return 1
- }
- # make_module module_name source_name [additional_definitions]
- #
- # Compile source name into module if needed.
- # As side effect, append the module name to variable MODULES.
- # Set LINK to "YES" if the module has been compiled.
- make_module()
- {
- MODULES="${MODULES} ${1}"
- MODIFSNAME="${LIBIFSNAME}/${1}.MODULE"
- CSRC="`basename \"${2}\"`"
- if action_needed "${MODIFSNAME}" "${2}"
- then :
- elif [ ! "`sed -e \"/<source name=\\\"${CSRC}\\\">/,/<\\\\/source>/!d\" \
- -e '/<depend /!d' \
- -e 's/.* name=\"\\([^\"]*\\)\".*/\\1/' < \"${TOPDIR}/treebuild.xml\" |
- while read HDR
- do if action_needed \"${MODIFSNAME}\" \"${IFSDIR}/include/${HDR}\"
- then echo recompile
- break
- fi
- done`" ]
- then return 0
- fi
- CMD="CRTCMOD MODULE(${TARGETLIB}/${1}) SRCSTMF('${2}')"
- CMD="${CMD} SYSIFCOPT(*IFS64IO) OPTION(*INCDIRFIRST)"
- CMD="${CMD} LOCALETYPE(*LOCALE) FLAG(10)"
- CMD="${CMD} INCDIR('${IFSDIR}/include' ${INCLUDES})"
- CMD="${CMD} TGTCCSID(${TGTCCSID}) TGTRLS(${TGTRLS})"
- CMD="${CMD} OUTPUT(${OUTPUT})"
- CMD="${CMD} OPTIMIZE(${OPTIMIZE})"
- CMD="${CMD} DBGVIEW(${DEBUG})"
- system "${CMD}"
- LINK=YES
- }
- # Determine DB2 object name from IFS name.
- db2_name()
- {
- basename "${1}" |
- tr 'a-z-' 'A-Z_' |
- sed -e 's/\..*//' \
- -e 's/^\(.\).*\(.........\)$/\1\2/'
- }
- # Force enumeration types to be the same size as integers.
- copy_hfile()
- {
- sed -e '1i\
- #pragma enum(int)\
- ' "${@}" -e '$a\
- #pragma enum(pop)\
- '
- }
- ################################################################################
- #
- # Script initialization.
- #
- ################################################################################
- SCRIPTDIR=`dirname "${0}"`
- case "${SCRIPTDIR}" in
- /*) ;;
- *) SCRIPTDIR="`pwd`/${SCRIPTDIR}"
- esac
- while true
- do case "${SCRIPTDIR}" in
- */.) SCRIPTDIR="${SCRIPTDIR%/.}";;
- *) break;;
- esac
- done
- # The script directory is supposed to be in ${TOPDIR}/os400.
- TOPDIR=`dirname "${SCRIPTDIR}"`
- export SCRIPTDIR TOPDIR
- cd "${TOPDIR}"
- # Extract the version from the master compilation XML file.
- VERSION=`sed -e '/^<package /!d' \
- -e 's/^.* version="\([0-9.]*\)".*$/\1/' -e 'q' \
- < treebuild.xml`
- export VERSION
- ################################################################################
- # Create the OS/400 library if it does not exist.
- if action_needed "${LIBIFSNAME}"
- then CMD="CRTLIB LIB(${TARGETLIB}) TEXT('ZLIB: Data compression API')"
- system "${CMD}"
- fi
- # Create the DOCS source file if it does not exist.
- if action_needed "${LIBIFSNAME}/DOCS.FILE"
- then CMD="CRTSRCPF FILE(${TARGETLIB}/DOCS) RCDLEN(112)"
- CMD="${CMD} CCSID(${TGTCCSID}) TEXT('Documentation texts')"
- system "${CMD}"
- fi
- # Copy some documentation files if needed.
- for TEXT in "${TOPDIR}/ChangeLog" "${TOPDIR}/FAQ" \
- "${TOPDIR}/README" "${SCRIPTDIR}/README400"
- do MEMBER="${LIBIFSNAME}/DOCS.FILE/`db2_name \"${TEXT}\"`.MBR"
- if action_needed "${MEMBER}" "${TEXT}"
- then CMD="CPY OBJ('${TEXT}') TOOBJ('${MEMBER}') TOCCSID(${TGTCCSID})"
- CMD="${CMD} DTAFMT(*TEXT) REPLACE(*YES)"
- system "${CMD}"
- fi
- done
- # Create the OS/400 source program file for the C header files.
- SRCPF="${LIBIFSNAME}/H.FILE"
- if action_needed "${SRCPF}"
- then CMD="CRTSRCPF FILE(${TARGETLIB}/H) RCDLEN(112)"
- CMD="${CMD} CCSID(${TGTCCSID}) TEXT('ZLIB: C/C++ header files')"
- system "${CMD}"
- fi
- # Create the IFS directory for the C header files.
- if action_needed "${IFSDIR}/include"
- then mkdir -p "${IFSDIR}/include"
- fi
- # Copy the header files to DB2 library. Link from IFS include directory.
- for HFILE in "${TOPDIR}/"*.h
- do DEST="${SRCPF}/`db2_name \"${HFILE}\"`.MBR"
- if action_needed "${DEST}" "${HFILE}"
- then copy_hfile < "${HFILE}" > tmphdrfile
- # Need to translate to target CCSID.
- CMD="CPY OBJ('`pwd`/tmphdrfile') TOOBJ('${DEST}')"
- CMD="${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)"
- system "${CMD}"
- # touch -r "${HFILE}" "${DEST}"
- rm -f tmphdrfile
- fi
- IFSFILE="${IFSDIR}/include/`basename \"${HFILE}\"`"
- if action_needed "${IFSFILE}" "${DEST}"
- then rm -f "${IFSFILE}"
- ln -s "${DEST}" "${IFSFILE}"
- fi
- done
- # Install the ILE/RPG header file.
- HFILE="${SCRIPTDIR}/zlib.inc"
- DEST="${SRCPF}/ZLIB.INC.MBR"
- if action_needed "${DEST}" "${HFILE}"
- then CMD="CPY OBJ('${HFILE}') TOOBJ('${DEST}')"
- CMD="${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)"
- system "${CMD}"
- # touch -r "${HFILE}" "${DEST}"
- fi
- IFSFILE="${IFSDIR}/include/`basename \"${HFILE}\"`"
- if action_needed "${IFSFILE}" "${DEST}"
- then rm -f "${IFSFILE}"
- ln -s "${DEST}" "${IFSFILE}"
- fi
- # Create and compile the identification source file.
- echo '#pragma comment(user, "ZLIB version '"${VERSION}"'")' > os400.c
- echo '#pragma comment(user, __DATE__)' >> os400.c
- echo '#pragma comment(user, __TIME__)' >> os400.c
- echo '#pragma comment(copyright, "Copyright (C) 1995-2017 Jean-Loup Gailly, Mark Adler. OS/400 version by P. Monnerat.")' >> os400.c
- make_module OS400 os400.c
- LINK= # No need to rebuild service program yet.
- MODULES=
- # Get source list.
- CSOURCES=`sed -e '/<source name="/!d' \
- -e 's/.* name="\([^"]*\)".*/\1/' < treebuild.xml`
- # Compile the sources into modules.
- for SRC in ${CSOURCES}
- do MODULE=`db2_name "${SRC}"`
- make_module "${MODULE}" "${SRC}"
- done
- # If needed, (re)create the static binding directory.
- if action_needed "${LIBIFSNAME}/${STATBNDDIR}.BNDDIR"
- then LINK=YES
- fi
- if [ "${LINK}" ]
- then rm -rf "${LIBIFSNAME}/${STATBNDDIR}.BNDDIR"
- CMD="CRTBNDDIR BNDDIR(${TARGETLIB}/${STATBNDDIR})"
- CMD="${CMD} TEXT('ZLIB static binding directory')"
- system "${CMD}"
- for MODULE in ${MODULES}
- do CMD="ADDBNDDIRE BNDDIR(${TARGETLIB}/${STATBNDDIR})"
- CMD="${CMD} OBJ((${TARGETLIB}/${MODULE} *MODULE))"
- system "${CMD}"
- done
- fi
- # The exportation file for service program creation must be in a DB2
- # source file, so make sure it exists.
- if action_needed "${LIBIFSNAME}/TOOLS.FILE"
- then CMD="CRTSRCPF FILE(${TARGETLIB}/TOOLS) RCDLEN(112)"
- CMD="${CMD} CCSID(${TGTCCSID}) TEXT('ZLIB: build tools')"
- system "${CMD}"
- fi
- DEST="${LIBIFSNAME}/TOOLS.FILE/BNDSRC.MBR"
- if action_needed "${SCRIPTDIR}/bndsrc" "${DEST}"
- then CMD="CPY OBJ('${SCRIPTDIR}/bndsrc') TOOBJ('${DEST}')"
- CMD="${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)"
- system "${CMD}"
- # touch -r "${SCRIPTDIR}/bndsrc" "${DEST}"
- LINK=YES
- fi
- # Build the service program if needed.
- if action_needed "${LIBIFSNAME}/${SRVPGM}.SRVPGM"
- then LINK=YES
- fi
- if [ "${LINK}" ]
- then CMD="CRTSRVPGM SRVPGM(${TARGETLIB}/${SRVPGM})"
- CMD="${CMD} SRCFILE(${TARGETLIB}/TOOLS) SRCMBR(BNDSRC)"
- CMD="${CMD} MODULE(${TARGETLIB}/OS400)"
- CMD="${CMD} BNDDIR(${TARGETLIB}/${STATBNDDIR})"
- CMD="${CMD} TEXT('ZLIB ${VERSION} dynamic library')"
- CMD="${CMD} TGTRLS(${TGTRLS})"
- system "${CMD}"
- LINK=YES
- # Duplicate the service program for a versioned backup.
- BACKUP=`echo "${SRVPGM}${VERSION}" |
- sed -e 's/.*\(..........\)$/\1/' -e 's/\./_/g'`
- BACKUP="`db2_name \"${BACKUP}\"`"
- BKUPIFSNAME="${LIBIFSNAME}/${BACKUP}.SRVPGM"
- rm -f "${BKUPIFSNAME}"
- CMD="CRTDUPOBJ OBJ(${SRVPGM}) FROMLIB(${TARGETLIB})"
- CMD="${CMD} OBJTYPE(*SRVPGM) NEWOBJ(${BACKUP})"
- system "${CMD}"
- fi
- # If needed, (re)create the dynamic binding directory.
- if action_needed "${LIBIFSNAME}/${DYNBNDDIR}.BNDDIR"
- then LINK=YES
- fi
- if [ "${LINK}" ]
- then rm -rf "${LIBIFSNAME}/${DYNBNDDIR}.BNDDIR"
- CMD="CRTBNDDIR BNDDIR(${TARGETLIB}/${DYNBNDDIR})"
- CMD="${CMD} TEXT('ZLIB dynamic binding directory')"
- system "${CMD}"
- CMD="ADDBNDDIRE BNDDIR(${TARGETLIB}/${DYNBNDDIR})"
- CMD="${CMD} OBJ((*LIBL/${SRVPGM} *SRVPGM))"
- system "${CMD}"
- fi
|