diff options
Diffstat (limited to '')
-rw-r--r-- | os400/make.sh | 366 |
1 files changed, 366 insertions, 0 deletions
diff --git a/os400/make.sh b/os400/make.sh new file mode 100644 index 0000000..ddbfb16 --- /dev/null +++ b/os400/make.sh | |||
@@ -0,0 +1,366 @@ | |||
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-2016 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 | ||