1#!/bin/sh
2#***************************************************************************
3#                                  _   _ ____  _
4#  Project                     ___| | | |  _ \| |
5#                             / __| | | | |_) | |
6#                            | (__| |_| |  _ <| |___
7#                             \___|\___/|_| \_\_____|
8#
9# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
10#
11# This software is licensed as described in the file COPYING, which
12# you should have received as part of this distribution. The terms
13# are also available at https://curl.se/docs/copyright.html.
14#
15# You may opt to use, copy, modify, merge, publish, distribute and/or sell
16# copies of the Software, and permit persons to whom the Software is
17# furnished to do so, under the terms of the COPYING file.
18#
19# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
20# KIND, either express or implied.
21#
22###########################################################################
23
24
25setenv()
26
27{
28        #       Define and export.
29
30        eval ${1}="${2}"
31        export ${1}
32}
33
34
35case "${SCRIPTDIR}" in
36/*)     ;;
37*)      SCRIPTDIR="`pwd`/${SCRIPTDIR}"
38esac
39
40while true
41do      case "${SCRIPTDIR}" in
42        */.)    SCRIPTDIR="${SCRIPTDIR%/.}";;
43        *)      break;;
44        esac
45done
46
47#  The script directory is supposed to be in $TOPDIR/packages/os400.
48
49TOPDIR=`dirname "${SCRIPTDIR}"`
50TOPDIR=`dirname "${TOPDIR}"`
51export SCRIPTDIR TOPDIR
52
53#  Extract the SONAME from the library makefile.
54
55SONAME=`sed -e '/^VERSIONINFO=/!d' -e 's/^.* \([0-9]*\):.*$/\1/' -e 'q' \
56                                                < "${TOPDIR}/lib/Makefile.am"`
57export SONAME
58
59
60################################################################################
61#
62#                       Tunable configuration parameters.
63#
64################################################################################
65
66setenv TARGETLIB        'CURL'                  # Target OS/400 program library.
67setenv STATBNDDIR       'CURL_A'                # Static binding directory.
68setenv DYNBNDDIR        'CURL'                  # Dynamic binding directory.
69setenv SRVPGM           "CURL.${SONAME}"        # Service program.
70setenv TGTCCSID         '500'                   # Target CCSID of objects.
71setenv DEBUG            '*ALL'                  # Debug level.
72setenv OPTIMIZE         '10'                    # Optimisation level
73setenv OUTPUT           '*NONE'                 # Compilation output option.
74setenv TGTRLS           'V6R1M0'                # Target OS release.
75setenv IFSDIR           '/curl'                 # Installation IFS directory.
76
77#       Define ZLIB availability and locations.
78
79setenv WITH_ZLIB        0                       # Define to 1 to enable.
80setenv ZLIB_INCLUDE     '/zlib/include'         # ZLIB include IFS directory.
81setenv ZLIB_LIB         'ZLIB'                  # ZLIB library.
82setenv ZLIB_BNDDIR      'ZLIB_A'                # ZLIB binding directory.
83
84#       Define LIBSSH2 availability and locations.
85
86setenv WITH_LIBSSH2     0                       # Define to 1 to enable.
87setenv LIBSSH2_INCLUDE  '/libssh2/include'      # LIBSSH2 include IFS directory.
88setenv LIBSSH2_LIB      'LIBSSH2'               # LIBSSH2 library.
89setenv LIBSSH2_BNDDIR   'LIBSSH2_A'             # LIBSSH2 binding directory.
90
91
92################################################################################
93
94#       Need to get the version definitions.
95
96LIBCURL_VERSION=`grep '^#define  *LIBCURL_VERSION '                     \
97                        "${TOPDIR}/include/curl/curlver.h"              |
98                sed 's/.*"\(.*\)".*/\1/'`
99LIBCURL_VERSION_MAJOR=`grep '^#define  *LIBCURL_VERSION_MAJOR '         \
100                        "${TOPDIR}/include/curl/curlver.h"              |
101                sed 's/^#define  *LIBCURL_VERSION_MAJOR  *\([^ ]*\).*/\1/'`
102LIBCURL_VERSION_MINOR=`grep '^#define  *LIBCURL_VERSION_MINOR '         \
103                        "${TOPDIR}/include/curl/curlver.h"              |
104                sed 's/^#define  *LIBCURL_VERSION_MINOR  *\([^ ]*\).*/\1/'`
105LIBCURL_VERSION_PATCH=`grep '^#define  *LIBCURL_VERSION_PATCH '         \
106                        "${TOPDIR}/include/curl/curlver.h"              |
107                sed 's/^#define  *LIBCURL_VERSION_PATCH  *\([^ ]*\).*/\1/'`
108LIBCURL_VERSION_NUM=`grep '^#define  *LIBCURL_VERSION_NUM '             \
109                        "${TOPDIR}/include/curl/curlver.h"              |
110                sed 's/^#define  *LIBCURL_VERSION_NUM  *0x\([^ ]*\).*/\1/'`
111LIBCURL_TIMESTAMP=`grep '^#define  *LIBCURL_TIMESTAMP '                 \
112                        "${TOPDIR}/include/curl/curlver.h"              |
113                sed 's/.*"\(.*\)".*/\1/'`
114export LIBCURL_VERSION
115export LIBCURL_VERSION_MAJOR LIBCURL_VERSION_MINOR LIBCURL_VERSION_PATCH
116export LIBCURL_VERSION_NUM LIBCURL_TIMESTAMP
117
118################################################################################
119#
120#                       OS/400 specific definitions.
121#
122################################################################################
123
124LIBIFSNAME="/QSYS.LIB/${TARGETLIB}.LIB"
125
126
127################################################################################
128#
129#                               Procedures.
130#
131################################################################################
132
133#       action_needed dest [src]
134#
135#       dest is an object to build
136#       if specified, src is an object on which dest depends.
137#
138#       exit 0 (succeeds) if some action has to be taken, else 1.
139
140action_needed()
141
142{
143        [ ! -e "${1}" ] && return 0
144        [ "${2}" ] || return 1
145        [ "${1}" -ot "${2}" ] && return 0
146        return 1
147}
148
149
150#       canonicalize_path path
151#
152#       Return canonicalized path as:
153#       - Absolute
154#       - No . or .. component.
155
156canonicalize_path()
157
158{
159        if expr "${1}" : '^/' > /dev/null
160        then    P="${1}"
161        else    P="`pwd`/${1}"
162        fi
163
164        R=
165        IFSSAVE="${IFS}"
166        IFS="/"
167
168        for C in ${P}
169        do      IFS="${IFSSAVE}"
170                case "${C}" in
171                .)      ;;
172                ..)     R=`expr "${R}" : '^\(.*/\)..*'`
173                        ;;
174                ?*)     R="${R}${C}/"
175                        ;;
176                *)      ;;
177                esac
178        done
179
180        IFS="${IFSSAVE}"
181        echo "/`expr "${R}" : '^\(.*\)/'`"
182}
183
184
185#       make_module module_name source_name [additional_definitions]
186#
187#       Compile source name into ASCII module if needed.
188#       As side effect, append the module name to variable MODULES.
189#       Set LINK to "YES" if the module has been compiled.
190
191make_module()
192
193{
194        MODULES="${MODULES} ${1}"
195        MODIFSNAME="${LIBIFSNAME}/${1}.MODULE"
196        action_needed "${MODIFSNAME}" "${2}" || return 0;
197        SRCDIR=`dirname \`canonicalize_path "${2}"\``
198
199        #       #pragma convert has to be in the source file itself, i.e.
200        #               putting it in an include file makes it only active
201        #               for that include file.
202        #       Thus we build a temporary file with the pragma prepended to
203        #               the source file and we compile that themporary file.
204
205        echo "#line 1 \"${2}\"" > __tmpsrcf.c
206        echo "#pragma convert(819)" >> __tmpsrcf.c
207        echo "#line 1" >> __tmpsrcf.c
208        cat "${2}" >> __tmpsrcf.c
209        CMD="CRTCMOD MODULE(${TARGETLIB}/${1}) SRCSTMF('__tmpsrcf.c')"
210#       CMD="${CMD} SYSIFCOPT(*IFS64IO) OPTION(*INCDIRFIRST *SHOWINC *SHOWSYS)"
211        CMD="${CMD} SYSIFCOPT(*IFS64IO) OPTION(*INCDIRFIRST)"
212        CMD="${CMD} LOCALETYPE(*LOCALE) FLAG(10)"
213        CMD="${CMD} INCDIR('/qibm/proddata/qadrt/include'"
214        CMD="${CMD} '${TOPDIR}/include/curl' '${TOPDIR}/include' '${SRCDIR}'"
215        CMD="${CMD} '${TOPDIR}/packages/OS400'"
216
217        if [ "${WITH_ZLIB}" != "0" ]
218        then    CMD="${CMD} '${ZLIB_INCLUDE}'"
219        fi
220
221        if [ "${WITH_LIBSSH2}" != "0" ]
222        then    CMD="${CMD} '${LIBSSH2_INCLUDE}'"
223        fi
224
225        CMD="${CMD} ${INCLUDES})"
226        CMD="${CMD} TGTCCSID(${TGTCCSID}) TGTRLS(${TGTRLS})"
227        CMD="${CMD} OUTPUT(${OUTPUT})"
228        CMD="${CMD} OPTIMIZE(${OPTIMIZE})"
229        CMD="${CMD} DBGVIEW(${DEBUG})"
230
231        DEFINES="${3} BUILDING_LIBCURL"
232
233        if [ "${WITH_ZLIB}" != "0" ]
234        then    DEFINES="${DEFINES} HAVE_LIBZ HAVE_ZLIB_H"
235        fi
236
237        if [ "${WITH_LIBSSH2}" != "0" ]
238        then    DEFINES="${DEFINES} USE_LIBSSH2 HAVE_LIBSSH2_H"
239        fi
240
241        if [ "${DEFINES}" ]
242        then    CMD="${CMD} DEFINE(${DEFINES})"
243        fi
244
245        system "${CMD}"
246        rm -f __tmpsrcf.c
247        LINK=YES
248}
249
250
251#       Determine DB2 object name from IFS name.
252
253db2_name()
254
255{
256        if [ "${2}" = 'nomangle' ]
257        then    basename "${1}"                                         |
258                tr 'a-z-' 'A-Z_'                                        |
259                sed -e 's/\..*//'                                       \
260                    -e 's/^\(.\).*\(.........\)$/\1\2/'
261        else    basename "${1}"                                         |
262                tr 'a-z-' 'A-Z_'                                        |
263                sed -e 's/\..*//'                                       \
264                    -e 's/^CURL_*/C/'                                   \
265                    -e 's/^\(.\).*\(.........\)$/\1\2/'
266        fi
267}
268
269
270#       Copy IFS file replacing version info.
271
272versioned_copy()
273
274{
275        sed -e "s/@LIBCURL_VERSION@/${LIBCURL_VERSION}/g"               \
276            -e "s/@LIBCURL_VERSION_MAJOR@/${LIBCURL_VERSION_MAJOR}/g"   \
277            -e "s/@LIBCURL_VERSION_MINOR@/${LIBCURL_VERSION_MINOR}/g"   \
278            -e "s/@LIBCURL_VERSION_PATCH@/${LIBCURL_VERSION_PATCH}/g"   \
279            -e "s/@LIBCURL_VERSION_NUM@/${LIBCURL_VERSION_NUM}/g"       \
280            -e "s/@LIBCURL_TIMESTAMP@/${LIBCURL_TIMESTAMP}/g"           \
281                < "${1}" > "${2}"
282}
283