mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-11 20:03:28 +00:00
scripts/*.sh:
Use ${var=default} rather than ${var:-$default}, since according
to the GNU autoconf manual, the latter is not portable.
95 lines
2.4 KiB
Bash
95 lines
2.4 KiB
Bash
#!/bin/sh
|
|
#---------------------------------------------------------------------------#
|
|
# Copyright (C) 1995 University of Melbourne.
|
|
# This file may only be copied under the terms of the GNU General
|
|
# Public License - see the file COPYING in the Mercury distribution.
|
|
#---------------------------------------------------------------------------#
|
|
|
|
# MOD2INIT - Convert *.mod (or *.c) to *_init.c
|
|
#
|
|
# This script outputs an appropriate init.c, given the .mod (or .c) files.
|
|
#
|
|
# Usage: mod2init [-w<entry_point>] modules...
|
|
#
|
|
# Environment variables: MERCURY_MOD_LIB_DIR, MERCURY_MOD_LIB_MODS.
|
|
|
|
MERCURY_MOD_LIB_DIR=${MERCURY_MOD_LIB_DIR=@LIBDIR@/modules}
|
|
MERCURY_MOD_LIB_MODS=${MERCURY_MOD_LIB_MODS=@LIBDIR@/modules/*}
|
|
|
|
# maximum number of calls to put in a single function
|
|
calls_per_func=50
|
|
|
|
defentry=mercury__io__run_0_0
|
|
while getopts w: c
|
|
do
|
|
case $c in
|
|
w) defentry="$OPTARG";;
|
|
\?) echo "Usage: mod2init -[wentry] modules ..."
|
|
exit 1;;
|
|
esac
|
|
shift `expr $OPTIND - 1`
|
|
done
|
|
|
|
files="$* $MERCURY_MOD_LIB_MODS"
|
|
modules="`sed -n '/^BEGIN_MODULE(\(.*\)).*$/s//\1/p' $files`"
|
|
echo "/*";
|
|
echo "** This code was automatically generated by mod2init.";
|
|
echo "** Do not edit.";
|
|
echo "**"
|
|
echo "** Input files:"
|
|
for file in $files; do
|
|
echo "** $file"
|
|
done
|
|
echo "*/";
|
|
echo "";
|
|
echo '#include <stddef.h>';
|
|
echo '#include "init.h"';
|
|
echo "";
|
|
echo "Declare_entry($defentry);";
|
|
echo "#if defined(USE_GCC_NONLOCAL_GOTOS) && !defined(USE_ASM_LABELS)";
|
|
echo "Code *default_entry;";
|
|
echo "#else";
|
|
echo "Code *default_entry = ENTRY($defentry);";
|
|
echo "#endif";
|
|
echo "";
|
|
for mod in $modules; do
|
|
echo "extern void $mod(void);";
|
|
done
|
|
echo "";
|
|
echo "#ifdef CONSERVATIVE_GC";
|
|
echo "/* This works around a bug in the Solaris 2.X (X <= 4) linker. */";
|
|
echo "/* The reason it is here is that it needs to be in statically linked */";
|
|
echo "/* code, it won't work if it is in the dynamically linked library. */";
|
|
echo "void init_gc(void)";
|
|
echo "{";
|
|
echo " GC_INIT();";
|
|
echo "}";
|
|
echo "#endif";
|
|
echo "";
|
|
|
|
init_funcs=
|
|
num_funcs=0
|
|
set - $modules
|
|
while [ $# -gt 0 ]; do
|
|
num_funcs=`expr $num_funcs + 1`
|
|
init_funcs="$init_funcs init_modules_$num_funcs"
|
|
echo "static void init_modules_$num_funcs(void) {"
|
|
num_calls=0
|
|
while [ $# -gt 0 ] && [ $num_calls -lt $calls_per_func ]; do
|
|
num_calls=`expr $num_calls + 1`
|
|
echo " $1();"
|
|
shift
|
|
done
|
|
echo "}"
|
|
echo ""
|
|
done
|
|
|
|
echo "void init_modules(void)";
|
|
echo "{";
|
|
for init in $init_funcs; do
|
|
echo " $init();";
|
|
done
|
|
echo "";
|
|
echo " default_entry = ENTRY($defentry);";
|
|
echo "}";
|