mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-08 02:11:55 +00:00
526 lines
13 KiB
Bash
526 lines
13 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:
|
|
# An `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 : ; 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@
|