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