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