mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-21 04:13:46 +00:00
scripts/init_grade_options.sh-subr:
scripts/mdb.in:
scripts/mercury_config.in:
scripts/mercury_update_interface.in:
scripts/mgnuc.in:
scripts/ml.in:
scripts/parse_ml_options.sh-subr.in:
Indent by four spaces, not by tabs, or by three spaces.
Use ${varname}, not just $varname.
Put successive commands on separate lines.
Indent case statements in a consistent manner: put case patterns
on their own lines; put ;;s on their own lines.
Replace the [ command with test.
Put quotes around strings that should be considered one word
even if they are empty or contain spaces.
Fix English in messages and comments.
528 lines
16 KiB
Bash
528 lines
16 KiB
Bash
#---------------------------------------------------------------------------#
|
|
# vim: ts=4 sw=4 expandtab ft=sh
|
|
#---------------------------------------------------------------------------#
|
|
# Copyright (C) 2001-2007, 2011 The University of Melbourne.
|
|
# Copyright (C) 2019-2020 The Mercury team.
|
|
# This file may only be copied under the terms of the GNU General
|
|
# Public License - see the file COPYING in the Mercury distribution.
|
|
#---------------------------------------------------------------------------#
|
|
#
|
|
# parse_ml_options.sh-subr:
|
|
#
|
|
# A `sh' subroutine for parsing the options for the `ml' and `c2init'
|
|
# scripts. `ml' and `c2init' share the same set of options so that
|
|
# users can mostly ignore the existence of `c2init'.
|
|
#
|
|
# The invoking script must set the shell variable `Usage' to a string
|
|
# containing the name and description of the script and the general
|
|
# format of the command line.
|
|
#
|
|
# The invoking script must also define FULLARCH and DEFAULT_GRADE.
|
|
#---------------------------------------------------------------------------#
|
|
|
|
# Initialize common options.
|
|
mercury_config_dir=${MERCURY_STDLIB_DIR-@CONFIG_LIBDIR@}
|
|
mercury_config_dir=${MERCURY_CONFIG_DIR=${mercury_config_dir}}
|
|
mercury_stdlib_dir=${MERCURY_STDLIB_DIR=@LIBDIR@}
|
|
|
|
# Initialize ml options.
|
|
verbose=false
|
|
allow_undef=false
|
|
trace=false
|
|
ssdb=false
|
|
readline=true
|
|
case ${FULLARCH} in
|
|
*-win95|*-winnt|*-win32|*-cygwin32|*-cygwin|*mingw*)
|
|
# `gcc -s' is broken in gnu-win32
|
|
# XXX actually strip = true is fine for MinGW / GCC, but
|
|
# MSVC doesn't like it.
|
|
strip=false
|
|
;;
|
|
*-darwin*)
|
|
# `gcc -s' is deprecated on Mac OS X. Enabling it will cause
|
|
# a warning to be emitted.
|
|
strip=false
|
|
;;
|
|
*)
|
|
strip=true
|
|
;;
|
|
esac
|
|
mercury_libs=default
|
|
all_libs=default
|
|
demangle=@DEMANGLE@
|
|
make_shared_lib=false
|
|
leave_shlib_dirs_relative=false
|
|
user_shlib_dirs=""
|
|
use_thread_libs=false
|
|
print_grade=false
|
|
print_gc_grade=false
|
|
print_link_command=false
|
|
print_shared_lib_link_command=false
|
|
print_map=false
|
|
|
|
# Initialize c2init options.
|
|
maxcalls=40 # maximum number of calls to put in a single function
|
|
defentry_opt=""
|
|
init_opt=""
|
|
trace_opt=""
|
|
ssdb_opt=""
|
|
library_opt=""
|
|
extra_inits_opt=""
|
|
always_exec_init_opts=""
|
|
extra_init_dirs=""
|
|
trace_init_files=""
|
|
ssdb_init_files=""
|
|
init_c_file="-"
|
|
runtime_flags=""
|
|
experimental_complexity=""
|
|
|
|
# Include the file `init_grade_options.sh-subr'.
|
|
@INIT_GRADE_OPTIONS@
|
|
|
|
Help="\
|
|
${Usage}
|
|
Options:
|
|
-h, --help
|
|
Print this help message.
|
|
|
|
Diagnostics options:
|
|
-v, --verbose
|
|
Print each command before executing it.
|
|
--no-demangle
|
|
Don't pipe the output of the linker through the Mercury
|
|
demangler.
|
|
--allow-undef
|
|
--allow-undefined
|
|
Don't report an error if there are unresolved symbols.
|
|
This option is only used if you are building a shared
|
|
library (with \`--make-shared-lib); when building
|
|
executables, unresolved symbols are always errors.
|
|
This option is useful when building shared libraries
|
|
that are not intended to be self-contained.
|
|
--print-grade
|
|
Compute the grade of the Mercury libraries to link with based
|
|
on the command line options, print it to the standard output,
|
|
and then exit (don't actually link anything).
|
|
--print-gc-grade
|
|
Compute the base name of the garbage collection library to
|
|
link with based on the command line options, print it to the
|
|
standard output, and then exit (don't actually link anything).
|
|
--print-link-command
|
|
Print the command used to link executables.
|
|
--print-shared-lib-link-command
|
|
Print the command used to link shared libraries.
|
|
--print-map
|
|
Print a link map, via \`ld --print-map'.
|
|
|
|
Dynamic/static linking options:
|
|
--mercury-libs {shared, static, none}
|
|
Specify which version of the standard Mercury libraries to
|
|
link with.
|
|
\`shared' links with the shared libraries (*.so) if possible,
|
|
otherwise with the static ones.
|
|
\`static' links with the static libraries (*.a).
|
|
\`none' disables linking with the Mercury standard libraries.
|
|
-shared, --shared
|
|
Similar to \`--mercury-libs shared', but applies to all
|
|
libraries, not just the standard Mercury libraries.
|
|
-static, --static
|
|
Similar to \`--mercury-libs static', but applies to all
|
|
libraries, not just the standard Mercury libraries.
|
|
--make-shared-lib
|
|
Produce a shared library, rather than an executable.
|
|
|
|
Directory options:
|
|
--mercury-standard-library-directory <directory>
|
|
--mercury-stdlib-dir <directory>
|
|
The directory in which to find the Mercury standard library.
|
|
--no-mercury-standard-library-directory, --no-mercury-stdlib-dir
|
|
Same as \`--mercury-libs none'.
|
|
--mercury-config-directory <directory>
|
|
--mercury-config-dir <directory>
|
|
The location of an alternative configuration
|
|
(created with mercury_config) to use.
|
|
-L <directory>, --lib-dir <directory>
|
|
Include <directory> in the list of directories that the
|
|
linker will use to search for libraries.
|
|
-R <directory>, --shared-lib-dir <directory>
|
|
Include <directory> in the list of directories that the
|
|
dynamic linker will use to search for shared libraries.
|
|
--leave-shared-lib-dirs-relative
|
|
Don't convert relative shared library directory names
|
|
into absolute paths.
|
|
--no-leave-shared-lib-dirs-relative
|
|
Convert relative shared library directory names into
|
|
absolute paths. This is the default.
|
|
|
|
Debugging options:
|
|
-t, --trace
|
|
Link in the Mercury debugging libraries.
|
|
This option is needed if any of the modules being linked
|
|
were compiled with tracing enabled. However, \`--debug'
|
|
implies \`--trace', so if you're using \`--debug',
|
|
then you don't need to explicitly specify \`--trace'.
|
|
Note that \`--trace' is incompatible with \`--static'
|
|
on some platforms (e.g. sparc-sun-solaris2.6).
|
|
Implies \`--include-initialization-code'.
|
|
-r-, --no-readline
|
|
Don't link in the GPL'd GNU Readline Library.
|
|
-g, --c-debug, --no-strip
|
|
Do not strip C debugging information.
|
|
|
|
Initialization options:
|
|
--no-main, --library
|
|
Don't generate a \`main()' function.
|
|
Instead, generate a function
|
|
mercury_main(int argc, char **argv);
|
|
(declared in \"mercury_init.h\") that can be called
|
|
from C code.
|
|
(A more fine-grained interface is also available;
|
|
see \"mercury_init.h\" for details.)
|
|
-I <directory>, --init-file-directory <directory>
|
|
Include <directory> in the list of directories searched to
|
|
locate \`.init' files.
|
|
-w <label>, --entry-point <label>
|
|
Set entry point to <label>.
|
|
(Default value corresponds to main/2.)
|
|
--runtime-flags <flags>
|
|
Add <flags> to the list of flags to pass to the
|
|
Mercury runtime. Flags can also be passed at runtime
|
|
in the MERCURY_OPTIONS environment variable.
|
|
For the list of available flags, see the documentation
|
|
for MERCURY_OPTIONS in the \"Environment\" chapter
|
|
of the Mercury User's Guide.
|
|
--experimental-complexity <filename>
|
|
Set up for the experimental determination of the complexity
|
|
of the procedures listed in the given file.
|
|
--init-c-file <filename>
|
|
Output the generated C initialization program to the
|
|
specified file, rather than sending it to the standard
|
|
output.
|
|
-A <funcname>
|
|
Always execute the named void function (which must take no
|
|
arguments) when the Mercury runtime is initialized.
|
|
-x, --extra-inits
|
|
Search \`.c' files for extra initialization functions.
|
|
(This may be necessary if the C files contain
|
|
hand-coded C code with \`INIT' comments, rather than
|
|
containing only C code that was automatically generated
|
|
by the Mercury compiler.)
|
|
|
|
Threads options:
|
|
--use-thread-libs
|
|
Link with the POSIX thread libraries. This option is useful
|
|
if a C library being linked with uses threads, but the
|
|
Mercury code being linked doesn't.
|
|
|
|
${grade_usage}
|
|
|
|
Environment variables:
|
|
MERCURY_DEFAULT_GRADE, MERCURY_C_COMPILER,
|
|
MERCURY_NONSHARED_LIB_DIR, MERCURY_MKINIT."
|
|
|
|
# The following options are not generally useful, so they are not documented:
|
|
# -i, --include-initialization-code
|
|
# Always include code that calls the initialization functions
|
|
# of the various modules. With this option, the debugger can use
|
|
# information from any modules that were compiled with execution
|
|
# tracing to print (partial) stack traces, and to print the
|
|
# values of variables in ancestors of the current call, even
|
|
# in grades in which this not normally possible.
|
|
# (It's usually better just to use `--trace').
|
|
# -c <n>, --max-calls <n>
|
|
# Break up the initialization into groups of at most <n> function
|
|
# calls. (Default value of <n> is 40.)
|
|
|
|
while true
|
|
do
|
|
case "$1" in
|
|
-h|--help|"-?")
|
|
echo "${Help}"
|
|
exit 0
|
|
;;
|
|
-v|--verbose)
|
|
verbose=true
|
|
;;
|
|
|
|
#
|
|
# ml options.
|
|
#
|
|
--demangle)
|
|
demangle=true
|
|
;;
|
|
--no-demangle)
|
|
demangle=false
|
|
;;
|
|
--allow-undef|--allow-undefined)
|
|
allow_undef=true
|
|
;;
|
|
--no-allow-undef|--no-allow-undefined)
|
|
allow_undef=false
|
|
;;
|
|
-t|--trace)
|
|
trace=true
|
|
trace_opt="-t"
|
|
;;
|
|
-t-|--no-trace)
|
|
trace=false
|
|
trace_opt=""
|
|
;;
|
|
--ssdb)
|
|
ssdb=true
|
|
ssdb_opt="--ssdb"
|
|
;;
|
|
--no-ssdb)
|
|
ssdb=false
|
|
ssdb_opt=""
|
|
;;
|
|
-r|--readline)
|
|
readline=true
|
|
;;
|
|
-r-|--no-readline)
|
|
readline=false
|
|
;;
|
|
-g-|--no-c-debug|--strip)
|
|
strip=true
|
|
;;
|
|
-g|--c-debug|--no-strip)
|
|
strip=false
|
|
;;
|
|
--make-shared-lib)
|
|
make_shared_lib=true
|
|
# on some targets, stripping shared libraries will
|
|
# make them unusable, I think, so don't strip
|
|
strip=false
|
|
;;
|
|
--no-libs)
|
|
progname=`basename $0`
|
|
cat 1>&2 << EOF
|
|
${progname}: Warning: option \`--no-libs' is deprecated --
|
|
${progname}: please use the new option \`--mercury-libs none' instead.
|
|
${progname}: Support for \`--no-libs' may be removed in a future release.
|
|
EOF
|
|
mercury_libs=none
|
|
;;
|
|
--mercury-libs)
|
|
case "$2" in
|
|
shared|static|default)
|
|
mercury_libs="$2"
|
|
shift ;;
|
|
none)
|
|
mercury_libs=none
|
|
unset mercury_stdlib_dir
|
|
shift ;;
|
|
*)
|
|
progname=`basename $0`
|
|
cat 1>&2 << EOF
|
|
${progname}: Error: parameter to \`--mercury-libs' option should be either
|
|
${progname}: \`shared', \`static', \`none', or \`default', not \`$2'.
|
|
${progname}: Try \`$0 --help' for help.
|
|
EOF
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
-shared|--shared)
|
|
all_libs=shared
|
|
case ${mercury_libs} in
|
|
static|default)
|
|
mercury_libs=shared
|
|
;;
|
|
esac
|
|
;;
|
|
-static|--static)
|
|
all_libs=static
|
|
case ${mercury_libs} in
|
|
shared|default)
|
|
mercury_libs=static
|
|
;;
|
|
esac
|
|
;;
|
|
|
|
--mercury-standard-library-directory|--mercury-stdlib-dir)
|
|
mercury_stdlib_dir="$2"
|
|
mercury_config_dir="$2"
|
|
shift
|
|
;;
|
|
--no-mercury-standard-library-directory|--no-mercury-stdlib-dir)
|
|
mercury_libs=none
|
|
unset mercury_stdlib_dir
|
|
unset mercury_config_dir
|
|
;;
|
|
|
|
--mercury-config-directory|--mercury-config-dir)
|
|
mercury_config_dir="$2"
|
|
shift
|
|
;;
|
|
|
|
-L|--lib-dir)
|
|
dir="$2"
|
|
user_libdir_opts="${user_libdir_opts} @LIB_LIBPATH@${dir}"
|
|
shift
|
|
;;
|
|
-L*)
|
|
user_libdir_opts="${user_libdir_opts} $1"
|
|
;;
|
|
--leave-shared-lib-dirs-relative)
|
|
leave_shlib_dirs_relative=true
|
|
;;
|
|
--no-leave-shared-lib-dirs-relative)
|
|
leave_shlib_dirs_relative=false
|
|
;;
|
|
-R|--shared-lib-dir)
|
|
dir="$2"
|
|
case "${leave_shlib_dirs_relative}" in
|
|
false)
|
|
case "${dir}" in
|
|
/*) ;;
|
|
*) dir="`pwd`/${dir}" ;;
|
|
esac
|
|
;;
|
|
esac
|
|
user_shlib_dirs="${user_shlib_dirs} ${dir}"
|
|
shift
|
|
;;
|
|
-R*)
|
|
dir="` expr X$1 : 'X-R\(.*\)' `"
|
|
case "${leave_shlib_dirs_relative}" in
|
|
false)
|
|
case "${dir}" in
|
|
/*) ;;
|
|
*) dir="`pwd`/${dir}" ;;
|
|
esac
|
|
;;
|
|
esac
|
|
user_shlib_dirs="${user_shlib_dirs} ${dir}"
|
|
;;
|
|
|
|
--use-thread-libs)
|
|
use_thread_libs=true
|
|
;;
|
|
--no-use-thread-libs)
|
|
use_thread_libs=false
|
|
;;
|
|
|
|
--print-grade)
|
|
print_grade=true
|
|
;;
|
|
--no-print-grade)
|
|
print_grade=false
|
|
;;
|
|
--print-gc-grade)
|
|
print_gc_grade=true
|
|
;;
|
|
--no-print-gc-grade)
|
|
print_gc_grade=false
|
|
;;
|
|
--print-link-command)
|
|
print_link_command=true
|
|
;;
|
|
--no-print-link-command)
|
|
print_link_command=false
|
|
;;
|
|
--print-shared-lib-link-command)
|
|
print_shared_lib_link_command=true
|
|
;;
|
|
--no-print-shared-lib-link-command)
|
|
print_shared_lib_link_command=false
|
|
;;
|
|
--print-map)
|
|
print_map=true
|
|
;;
|
|
--no-print-map)
|
|
print_map=false
|
|
;;
|
|
|
|
#
|
|
# c2init options.
|
|
#
|
|
-A)
|
|
always_exec_init_opts="${always_exec_init_opts} -A $2"
|
|
shift
|
|
;;
|
|
|
|
-c|--max-calls)
|
|
maxcalls="$2"
|
|
shift
|
|
;;
|
|
|
|
-i|--include-initialization-code)
|
|
init_opt="-i"
|
|
;;
|
|
|
|
--no-main|--library)
|
|
library_opt="-l"
|
|
;;
|
|
|
|
--main|--no-library)
|
|
library_opt=""
|
|
;;
|
|
|
|
-I|--init-file-directory)
|
|
extra_init_dirs="${extra_init_dirs} -I $2"
|
|
shift
|
|
;;
|
|
|
|
--init-c-file)
|
|
init_c_file="$2"
|
|
shift
|
|
;;
|
|
|
|
--trace-init-file)
|
|
trace_init_files="${trace_init_files} $2"
|
|
shift
|
|
;;
|
|
|
|
--ssdb-init-file)
|
|
ssdb_init_files="${ssdb_init_files} $2"
|
|
shift
|
|
;;
|
|
|
|
--runtime-flags)
|
|
runtime_flags="${runtime_flags} $2"
|
|
shift
|
|
;;
|
|
|
|
--experimental-complexity)
|
|
if test "${experimental_complexity}" = ""
|
|
then
|
|
experimental_complexity="$2"
|
|
shift
|
|
else
|
|
cat 1>&2 << EOF
|
|
${progname}: Error: duplicate --experimental-complexity parameter
|
|
EOF
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
-w|--entry-point)
|
|
defentry_opt="-w$2"
|
|
shift
|
|
;;
|
|
|
|
-x|--extra-inits)
|
|
extra_inits_opt="-x"
|
|
;;
|
|
|
|
-x-|--no-extra-inits)
|
|
extra_inits_opt=""
|
|
;;
|
|
|
|
# include the file `parse_grade_options.sh-subr'
|
|
@PARSE_GRADE_OPTIONS@
|
|
|
|
--)
|
|
shift
|
|
break
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
# include the file `final_grade_options.sh-subr'
|
|
@FINAL_GRADE_OPTIONS@
|