1#!/bin/sh
2#         $NetBSD: mknative-gcc,v 1.118 2024/02/21 08:24:46 mrg Exp $
3#
4# Shell script for generating all the constants needed for a native
5# platform build of gcc.
6#
7# This version is for GCC 10.3
8
9# initialise
10
11_TMPDIR=$2
12_TOP=$3
13_SRC=$4
14_PLATFORM=$5
15_MACHINE_ARCH=$6
16_DESTDIR=$7
17_TOOLDIR=$8
18_VPATH=`grep VPATH ${_TMPDIR}/Makefile | sed 's,^.*=[       ]*,,'`
19_GNU_DIST=`cd ${_VPATH}; pwd`
20
21if [ -z "$_DESTDIR" ]; then
22          echo "\$_DESTDIR is empty" 2>&1
23          exit 1
24fi
25
26. $_TOP/tools/gcc/mknative.common
27
28case $0 in
29          *mknative-gcc.old)
30                    _OUTDIRBASE="external/gpl3/gcc.old"
31                    ;;
32          *)
33                    _OUTDIRBASE="external/gpl3/gcc"
34                    ;;
35esac
36_OUTDIR="$_TOP/$_OUTDIRBASE"
37
38sanitise_includes () {
39          sed \
40                    -e "s,-I$_DESTDIR/usr/include,,g" \
41                    -e "s,-I$_SRC/external/lgpl3/mpfr/dist/src,,g" \
42                    -e "s,-I$_SRC/external/lgpl3/mpc/dist/src,,g" \
43                    -e "s,-I$_SRC/external/lgpl3/gmp/lib/libgmp/arch/[a-z_0-9-]*,,g" \
44                    -e "s,-I$_TOOLDIR/include,,g" \
45                    -e "s,-I/usr/include/[^       ]*,,"
46}
47
48##### lib/libg2c #####
49
50get_libg2c () {
51          mkdir -p $_OUTDIR/lib/libg2c3/arch/$_MACHINE_ARCH
52
53          write_c $_OUTDIRBASE/lib/libg2c3/arch/$_MACHINE_ARCH/config.h <$_TMPDIR/$_PLATFORM/libf2c/libU77/config.h
54          write_c $_OUTDIRBASE/lib/libg2c3/arch/$_MACHINE_ARCH/g2c.h <$_TMPDIR/$_PLATFORM/libf2c/g2c.h
55
56          {
57                    getvars $_PLATFORM/libf2c/Makefile \
58                              F2CEXT
59                    getvars $_PLATFORM/libf2c/libF77/Makefile \
60                              ALL_CFLAGS OBJS
61                    getvars $_PLATFORM/libf2c/libI77/Makefile \
62                              ALL_CFLAGS OBJS | sed 's,=,+=,'
63                    getvars $_PLATFORM/libf2c/libU77/Makefile \
64                              ALL_CFLAGS OBJS | sed 's,=,+=,'
65          } | write_mk $_OUTDIRBASE/lib/libg2c3/arch/$_MACHINE_ARCH/defs.mk
66}
67
68##### lib/libgcc #####
69
70get_libgcc () {
71          _subdir="$1"
72          mkdir -p $_OUTDIR/lib/lib$_subdir/arch
73
74          # DPBIT, FPBIT only used on mn10[23]00, we don't need them.
75          # XXX we should probably grab everything Just In Case for
76          # the future.
77
78          mkdir -p $_OUTDIR/lib/lib$_subdir/arch/$_MACHINE_ARCH
79          cd $_TMPDIR/$_PLATFORM/libgcc
80          {
81                    getvars $_PLATFORM/libgcc/Makefile \
82                              INCLUDES \
83                              INTERNAL_CFLAGS \
84                              LIB2ADD LIB2ADDEH LIB2ADD_ST \
85                              LIB1ASMFUNCS LIB1ASMSRC \
86                              LIB2_DIVMOD_FUNCS LIB2FUNCS_ST \
87                              LIB2FUNCS_EXTRA \
88                              LIBGCC2_CFLAGS \
89                              SHLIB_MKMAP SHLIB_MKMAP_OPTS \
90                              SHLIB_MAPFILES SHLIB_NM_FLAGS
91                    getvars gcc/Makefile \
92                              NOEXCEPTION_FLAGS EXTRA_HEADERS
93          }         | sanitise_includes \
94                    | write_mk $_OUTDIRBASE/lib/lib$_subdir/arch/$_MACHINE_ARCH/defs.mk
95
96          cd $_TMPDIR/$_PLATFORM/libgcc
97          {
98                    getvars $_PLATFORM/libgcc/Makefile \
99                              enable_execute_stack \
100                              unwind_header md_unwind_header \
101                              sfp_machine_header thread_header
102          }         | sanitise_includes \
103                    | write_mk $_OUTDIRBASE/lib/lib$_subdir/arch/$_MACHINE_ARCH/gthr-defs.mk
104
105          if [ "${_MACHINE_ARCH}" = "m68000" ]
106          then
107                    ex <<__EOF__ $_OUTDIR/lib/lib$_subdir/arch/$_MACHINE_ARCH/defs.mk
108/G_LIBGCC2_CFLAGS/ s/-fPIC//
109wq
110__EOF__
111          fi
112
113          for f in auto-target.h; do
114                    write_c $_OUTDIRBASE/lib/lib$_subdir/arch/$_MACHINE_ARCH/$f \
115                        <$_TMPDIR/$_PLATFORM/libgcc/$f
116          done
117}
118
119##### lib/libgcov #####
120
121get_libgcov () {
122          _subdir="$1"
123          _mf="$2"
124
125          mkdir -p $_OUTDIR/lib/lib$_subdir/libgcov/arch/$_MACHINE_ARCH
126
127          {
128                    getvars $_mf \
129                              LIBGCOV_MERGE \
130                              LIBGCOV_PROFILER \
131                              LIBGCOV_INTERFACE \
132                              LIBGCOV_DRIVER
133          } | write_mk $_OUTDIRBASE/lib/lib$_subdir/libgcov/arch/$_MACHINE_ARCH/defs.mk
134
135}
136
137##### lib/libiberty #####
138
139get_gcc_libiberty () {
140          _subdir="$1"
141          _libibertydir="lib/libiberty"
142          mkdir -p $_OUTDIR/$_libibertydir/arch/$_MACHINE_ARCH
143
144          getvars libiberty/Makefile \
145                    ALLOCA EXTRA_OFILES LIBOBJS REQUIRED_OFILES \
146                    | write_mk $_OUTDIRBASE/$_libibertydir/defs.mk
147
148          write_c $_OUTDIRBASE/$_libibertydir/arch/$_MACHINE_ARCH/config.h \
149                    <$_TMPDIR/libiberty/config.h
150}
151
152##### lib/libdecnumber #####
153
154get_libdecnumber () {
155          _subdir="$1"
156
157          mkdir -p $_OUTDIR/usr.bin/$_subdir/arch/$_MACHINE_ARCH
158          write_c $_OUTDIRBASE/usr.bin/$_subdir/arch/$_MACHINE_ARCH/config.h \
159                    <$_TMPDIR/libdecnumber/config.h
160}
161
162##### lib/libgomp #####
163
164get_libgomp () {
165          _subdir="$1"
166
167          mkdir -p $_OUTDIR/lib/$_subdir/arch/$_MACHINE_ARCH
168
169          getvars $_PLATFORM/libgomp/Makefile \
170                    libgomp_la_SOURCES \
171                    | write_mk $_OUTDIRBASE/lib/$_subdir/defs.mk
172
173          write_c $_OUTDIRBASE/lib/$_subdir/arch/$_MACHINE_ARCH/config.h \
174                    <$_TMPDIR/$_PLATFORM/libgomp/config.h
175          write_c $_OUTDIRBASE/lib/$_subdir/arch/$_MACHINE_ARCH/libgomp_f.h \
176                    <$_TMPDIR/$_PLATFORM/libgomp/libgomp_f.h
177          write_mk $_OUTDIRBASE/lib/$_subdir/arch/$_MACHINE_ARCH/libgomp.spec \
178                    <$_TMPDIR/$_PLATFORM/libgomp/libgomp.spec
179          write_c $_OUTDIRBASE/lib/$_subdir/arch/$_MACHINE_ARCH/omp.h \
180                    <$_TMPDIR/$_PLATFORM/libgomp/omp.h
181}
182
183##### lib/libbacktrace #####
184
185get_libbacktrace () {
186          _subdir="$1"
187
188          mkdir -p $_OUTDIR/lib/$_subdir/arch/$_MACHINE_ARCH
189          write_c $_OUTDIRBASE/lib/$_subdir/arch/$_MACHINE_ARCH/config.h \
190                    <$_TMPDIR/$_PLATFORM/$_subdir/config.h
191          write_c $_OUTDIRBASE/lib/$_subdir/arch/$_MACHINE_ARCH/backtrace-supported.h \
192                    <$_TMPDIR/$_PLATFORM/$_subdir/backtrace-supported.h
193}
194
195##### lib/libobjc #####
196
197get_libobjc () {
198          _subdir="$1/arch/$_MACHINE_ARCH"
199          _options="ALL_OPT_FILES"
200
201          mkdir -p $_OUTDIR/lib/$_subdir
202
203          {
204                    if [ -n "$_options" ]; then
205                              getvars gcc/Makefile $_options
206                    fi
207                    getvars $_PLATFORM/libobjc/Makefile \
208                              ALL_CFLAGS INCLUDES OBJC_SOURCE_FILES C_SOURCE_FILES OBJC_H \
209                              | sed "s,$_GNU_DIST,\${GNUHOSTDIST},g"
210          } | sanitise_includes \
211            | write_mk $_OUTDIRBASE/lib/$_subdir/defs.mk
212
213          write_c $_OUTDIRBASE/lib/$_subdir/config.h \
214                    <$_TMPDIR/$_PLATFORM/libobjc/config.h
215}
216
217##### lib/libstdc++-v3 #####
218
219get_libstdcxx_v3 () {
220          _subdir="$1"
221          _ver="$2"
222
223          mkdir -p $_OUTDIR/lib/$_subdir/arch/$_MACHINE_ARCH
224
225          _build_headers="c++config.h cxxabi_tweaks.h"
226          _headers1="backward_headers c_base_headers_extra"
227          _headers1="$_headers1 c_base_headers_extra_install"
228          _headers1="$_headers1 tr1_headers tr2_headers"
229          _headers1="$_headers1 decimal_headers c_compatibility_headers_install"
230          _headers1="$_headers1 debug_headers parallel_headers"
231          _headers1="$_headers1 pb_headers1 pb_headers2 pb_headers3 pb_headers4"
232          _headers1="$_headers1 pb_headers5 pb_headers6 pb_headers7"
233          _headers1="$_headers1 bits_headers ext_headers host_headers"
234          _headers1="$_headers1 pstl_headers"
235          _headers1="$_headers1 profile_headers profile_impl_headers"
236          _headers1="$_headers1 experimental_headers experimental_bits_headers"
237          _headers1="$_headers1 ext_host_headers"
238
239          # build files
240          for h in $_build_headers; do
241                    write_c $_OUTDIRBASE/lib/$_subdir/arch/$_MACHINE_ARCH/$h \
242                              <$_TMPDIR/$_PLATFORM/libstdc++-v3/include/$_PLATFORM/bits/$h
243          done
244
245          write_c $_OUTDIRBASE/lib/$_subdir/arch/$_MACHINE_ARCH/gstdint.h \
246                    <$_TMPDIR/$_PLATFORM/libstdc++-v3/include/gstdint.h
247          write_c $_OUTDIRBASE/lib/$_subdir/arch/$_MACHINE_ARCH/symver-config.h \
248                    <$_TMPDIR/$_PLATFORM/libstdc++-v3/config.h
249
250          {
251                    getvars $_PLATFORM/libstdc++-v3/Makefile \
252                              port_specific_symbol_files
253                    getvars $_PLATFORM/libstdc++-v3/src/Makefile \
254                              cxx11_sources \
255                              cxx17_sources \
256                              cxx20_sources \
257                              cxx98_sources
258
259                    # libsupc++
260                    getvars $_PLATFORM/libstdc++-v3/libsupc++/Makefile \
261                              sources | sed 's/^G_sources=/G_LIBSUPCXX_SOURCES=/'
262                    getvars $_PLATFORM/libstdc++-v3/libsupc++/Makefile \
263                              c_sources | sed 's/^G_c_sources=/G_LIBSUPCXX_C_SOURCES=/'
264
265                    # includes
266                    getvars $_PLATFORM/libstdc++-v3/include/Makefile \
267                              c_base_headers std_headers | sed -e 's#/[^        ][^       ]*/##g' -e 's/\${GNUHOSTDIST}//g'
268
269                    # src
270                    getvars $_PLATFORM/libstdc++-v3/src/Makefile \
271                              libstdc___la_SOURCES | sed 's/^G_libstdc___la_SOURCES=/G_SRC_SOURCES=/'
272                    getvars $_PLATFORM/libstdc++-v3/src/c++17/Makefile \
273                              libc__17convenience_la_SOURCES | \
274                              sed -e 's/^G_libc__17convenience_la_SOURCES=/G_CPP17_SOURCES=/'
275                    getvars $_PLATFORM/libstdc++-v3/src/c++20/Makefile \
276                              libc__20convenience_la_SOURCES | \
277                              sed -e 's/^G_libc__20convenience_la_SOURCES=/G_CPP20_SOURCES=/'
278                    getvars $_PLATFORM/libstdc++-v3/src/c++11/Makefile \
279                              libc__11convenience_la_SOURCES | \
280                              sed -e 's/^G_libc__11convenience_la_SOURCES=/G_CPP11_SOURCES=/'
281                    getvars $_PLATFORM/libstdc++-v3/src/c++98/Makefile \
282                              GLIBCXX_ABI_FLAGS libc__98convenience_la_SOURCES | \
283                              sed -e 's/^G_libc__98convenience_la_SOURCES=/G_CPP98_SOURCES=/'
284                    getvars $_PLATFORM/libstdc++-v3/src/filesystem/Makefile \
285                              libstdc__fs_la_SOURCES | \
286                              sed -e 's/^G_libstdc__fs_la_SOURCES=/G_FILESYSTEM_SOURCES=/'
287                    getvars $_PLATFORM/libstdc++-v3/Makefile ATOMICITY_SRCDIR \
288                              BASIC_FILE_CC CLOCALE_CC CCODECVT_CC CCOLLATE_CC \
289                              CCTYPE_CC  CMESSAGES_CC CMONEY_CC CNUMERIC_CC CTIME_CC \
290                              CPU_OPT_BITS_RANDOM
291
292                    # includes
293                    getvars $_PLATFORM/libstdc++-v3/include/Makefile \
294                              $_headers1 | \
295                                        sed -e 's#\${GNUHOSTDIST}/libstdc++-v3/include/##g' \
296                                            -e 's#\${GNUHOSTDIST}/libstdc++-v3/config/##g'
297                    getvars $_PLATFORM/libstdc++-v3/include/Makefile \
298                              BASIC_FILE_H ALLOCATOR_H CSTDIO_H CLOCALE_H CMESSAGES_H CTIME_H
299          } | sanitise_includes \
300            | write_mk $_OUTDIRBASE/lib/$_subdir/arch/$_MACHINE_ARCH/defs.mk
301}
302
303##### lib/libsanitizer #####
304
305get_libsanitizer () {
306          _subdir="$1"
307
308          mkdir -p $_OUTDIR/lib/$_subdir/arch/$_MACHINE_ARCH
309
310          {
311                    getvars $_PLATFORM/libsanitizer/asan/Makefile \
312                              asan_files
313                    getvars $_PLATFORM/libsanitizer/lsan/Makefile \
314                              lsan_files
315                    getvars $_PLATFORM/libsanitizer/tsan/Makefile \
316                              tsan_files
317                    getvars $_PLATFORM/libsanitizer/ubsan/Makefile \
318                              ubsan_files
319                    getvars $_PLATFORM/libsanitizer/interception/Makefile \
320                              interception_files
321
322          } | sanitise_includes \
323            | write_mk $_OUTDIRBASE/lib/$_subdir/arch/$_MACHINE_ARCH/defs.mk
324}
325
326##### usr.bin/gcc* #####
327
328get_gcc_bootstrap () {
329          _subdir="$1"
330          mkdir -p $_OUTDIR/usr.bin/$_subdir/arch/$_MACHINE_ARCH
331          for f in auto-host tm config; do
332                    write_c $_OUTDIRBASE/usr.bin/$_subdir/arch/$_MACHINE_ARCH/$f.h <$_TMPDIR/gcc/$f.h
333          done
334          # XXXGCC5 don't really want to copy insn-modes as we build
335          # it but libgcc needs to too early yet
336          for f in insn-modes; do
337                    write_c $_OUTDIRBASE/usr.bin/$_subdir/arch/$_MACHINE_ARCH/$f.h <$_TMPDIR/gcc/$f.h
338          done
339}
340
341get_gcc () {
342          _subdir="$1"
343          mkdir -p $_OUTDIR/usr.bin/$_subdir/arch/$_MACHINE_ARCH
344          mkdir -p $_OUTDIR/usr.bin/libcpp/arch/$_MACHINE_ARCH
345          mkdir -p $_OUTDIR/usr.bin/include/arch
346          mkdir -p $_OUTDIR/usr.bin/common-target/arch
347          _buildname="BUILD_"
348          _libcppsubdir=""
349          _extravars="TM_H ALL_OPT_FILES"
350          _hconfig_h=""
351          _extravars2="tm_file_list build_xm_include_list"
352          _extravars3="tm_p_include_list"
353
354          {
355                    getvars gcc/Makefile \
356                              ${_buildname}EARLY_SUPPORT ${_buildname}ERRORS ${_buildname}PRINT \
357                              ${_buildname}RTL ${_buildname}SUPPORT ${_buildname}VARRAY \
358                              ${_buildname}MD | \
359                        sed -e 's#build/errors.o#build-errors.o#g' \
360                              -e 's#build/print-rtl.o#build-print-rtl.o#g' \
361                              -e 's#build/rtl.o#build-rtl.o#g' \
362                              -e 's#build/varray.o#build-varray.o#g' \
363                              -e 's#build/ggc-none.o#build-ggc-none.o#g' \
364                              -e 's#build/##g'
365                    getvars gcc/Makefile \
366                              ALL_CFLAGS ALL_CPPFLAGS C_AND_OBJC_OBJS C_OBJS CCCP_OBJS \
367                              GCC_OBJS GCOV_OBJS GCOV_DUMP_OBJS GXX_OBJS GTM_H PROTO_OBJS ${_extravars1} \
368                              INCLUDES md_file OBJC_OBJS OBJS out_file version \
369                              BUILD_PREFIX RTL_H RTL_BASE_H TREE_H ${_hconfig_h} BASIC_BLOCK_H GCC_H \
370                              D_TARGET_DEF \
371                              GTFILES_SRCDIR GTFILES_FILES_FILES GTFILES_FILES_LANGS \
372                              GTFILES GTFILES_LANG_DIR_NAMES HASH_TABLE_H \
373                              NOEXCEPTION_FLAGS NATIVE_SYSTEM_HEADER_DIR \
374                              tm_defines host_xm_file host_xm_defines tm_p_file \
375                              target_cpu_default ${_extravars} ${_extravars2} \
376                              lang_specs_files ${_extravars3} \
377                              common_out_file \
378                                        | sanitise_includes
379                    getvars gcc/Makefile \
380                              LIB2ADDEHDEP | sed 's/unwind.inc//'
381                    getvars gcc/Makefile \
382                              CXX_OBJS CXX_C_OBJS | sed 's/cp\///g'
383                    getvars gcc/Makefile \
384                              F77_OBJS | sed 's/f\///g'
385                    getvars libcpp/Makefile \
386                              libcpp_a_OBJS
387                    getvars gcc/Makefile \
388                              ENABLE_SHARED
389                    echo G_SHLIB_LINK="$CC -shared"
390                    echo G_SHLIB_MULTILIB=.
391          } | write_mk $_OUTDIRBASE/usr.bin/$_subdir/arch/$_MACHINE_ARCH/defs.mk
392
393          getvars gcc/Makefile \
394                    EXTRA_HEADERS \
395                              | write_mk $_OUTDIRBASE/usr.bin/include/arch/$_MACHINE_ARCH.mk
396
397          getvars gcc/Makefile \
398                    OBJS-libcommon \
399                              | write_mk $_OUTDIRBASE/usr.bin/common/defs.mk
400          getvars gcc/Makefile \
401                    OBJS-libcommon-target \
402                              | write_mk $_OUTDIRBASE/usr.bin/common-target/arch/$_MACHINE_ARCH.mk
403
404          write_c $_OUTDIRBASE/usr.bin/libcpp/arch/$_MACHINE_ARCH/config.h <$_TMPDIR/libcpp/config.h
405          hfiles='auto-host configargs config bconfig bversion plugin-version multilib tm omp-device-properties'
406          for f in $hfiles; do
407                    write_c $_OUTDIRBASE/usr.bin/$_subdir/arch/$_MACHINE_ARCH/$f.h <$_TMPDIR/gcc/$f.h
408                    if [ "${_MACHINE_ARCH}" = "powerpc" -a "${f}" = "configargs" ]
409                    then
410                              ex <<__EOF__ $_OUTDIR/usr.bin/$_subdir/arch/$_MACHINE_ARCH/$f.h
411/configuration_arguments/ s/$//
412ya
413i
414#ifdef _SOFT_FLOAT
415.
416pu
417s/";$/ -with-float=soft";/
418a
419#else
420#endif
421.
422. m +1
423/configure_default_options/ s/{ NULL.*$//
424a
425#ifdef _SOFT_FLOAT
426  { "float", "soft" },
427#endif
428  { NULL, NULL }
429};
430.
431wq
432__EOF__
433                    fi
434                    if [ "${f}" = "configargs" ]
435                    then
436                              _srcquoted=$(echo "$_SRC" | sed 's/\//\\\//g')
437                              sed -i -E -e "s,$_srcquoted,/usr/src,g" \
438                                          -e 's/--build=[^ ]+ --host=([^ ]+)/--build=\1 --host=\1/' \
439                                        $_OUTDIR/usr.bin/$_subdir/arch/$_MACHINE_ARCH/$f.h
440                    fi
441          done
442
443          # keep identical
444          for f in all-tree.def; do
445                    cp $_TMPDIR/gcc/$f $_OUTDIR/usr.bin/$_subdir/arch/$_MACHINE_ARCH/$f
446          done
447
448          # special transforms
449          for f in gtyp-input.list; do
450                    sed -e "s@^.*$_OUTDIRBASE/dist@SRCDIR@" < $_TMPDIR/gcc/$f > $_OUTDIR/usr.bin/$_subdir/arch/$_MACHINE_ARCH/$f
451          done
452
453          # special platforms
454          if [ "${_MACHINE_ARCH}" = "sh3el" -o "${_MACHINE_ARCH}" = "sh3eb" ]; then
455                    write_c $_OUTDIRBASE/usr.bin/$_subdir/arch/$_MACHINE_ARCH/sysroot-suffix.h <$_TMPDIR/gcc/sysroot-suffix.h
456          fi
457
458          if [ "${_MACHINE_ARCH}" = "i386" -o "${_MACHINE_ARCH}" = "x86_64" ]; then
459                    write_c $_OUTDIRBASE/usr.bin/$_subdir/arch/$_MACHINE_ARCH/i386-builtin-types.inc <$_TMPDIR/gcc/i386-builtin-types.inc
460          fi
461
462          case "${_MACHINE_ARCH}" in
463          (*arm*)
464                    d=$_OUTDIRBASE/usr.bin/$_subdir/arch/${_MACHINE_ARCH}
465                    for f in arm-cpu.h arm-cpu-cdata.h arm-cpu-data.h arm-isa.h; do
466                              write_c $d/$f <$_TMPDIR/gcc/$f
467                    done
468                    ;;
469          esac
470}
471
472##### main #####
473
474case "$1" in
475# .mk and .h files for libgcc bootstrap (from host build)
476
477libgcc*-bootstrap)
478          get_libgcc gcc
479          get_libgcov gcc $_PLATFORM/libgcc/Makefile
480          get_gcc_bootstrap gcc
481          exit 0
482          ;;
483
484libstdc++-bootstrap)
485          get_libstdcxx_v3 libstdc++-v3 gcc
486          exit 0
487          ;;
488
489gcc*)
490          get_gcc gcc
491          get_libgcc gcc
492          get_libgcov gcc $_PLATFORM/libgcc/Makefile
493          get_gcc_bootstrap gcc
494          get_gcc_libiberty gcc
495          get_libobjc libobjc
496          get_libstdcxx_v3 libstdc++-v3 gcc
497          # wants libstdc++-v3 built
498          # get_libsanitizer libsanitizer
499          get_libdecnumber libdecnumber
500          get_libgomp libgomp
501          get_libbacktrace libbacktrace
502          exit 0
503          ;;
504
505
506*)
507          echo invalid arguments;
508          exit 1
509          ;;
510esac
511