make.sh 10 KB

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