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