Commit | Line | Data |
---|---|---|
de1ab01e NC |
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 | |
9c7e3b0e | 263 | echo '#pragma comment(copyright, "Copyright (C) 1995-2017 Jean-Loup Gailly, Mark Adler. OS/400 version by P. Monnerat.")' >> os400.c |
de1ab01e NC |
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 |