Files
mercury/scripts/parse_grade_options.sh-subr
Peter Wang fd76da59ff Add support for the csharp' grade to mmc --make', and make it possible to
Branches: main

Add support for the `csharp' grade to `mmc --make', and make it possible to
install the `csharp' grade with `mmake install'.

Also some miscellaneous fixes.


configure.in:
        Require a recent enough bootstrap compiler that recognises C# as a
        language for `pragma foreign_type'.

Mmakefile:
        Use `mmc --make' to install the standard library in csharp grade.

aclocal.m4:
        Search for the Mono C# compiler `gmcs', which is required for generics
        at this time.  Prefer it over the DotGNU C# compiler, which I have not
        tested.

        Search for `mono'.  If found, it will be used in shell scripts to
        launch executables generated via the csharp backend.

        Remove "MS_" prefixes on the variables MS_CSC and MS_ILASM, which are
        not Microsoft-specific.  More importantly, it should be less likely to
        make the mistake of adding an extra underscore to CSCFLAGS and
        ILASMFLAGS.

README.DotNet:
        Conform to variable renamings.

compiler/compile_target_code.m:
        Add new linked target types `csharp_executable', `java_launcher' and
        `erlang_launcher', instead of overloading `executable'.

        Link with `mer_std.dll' and other libraries when generating C#
        executables.  There is no `mer_rt.dll'.

        Pass "/debug" to the C# compiler if `--target-debug' is set.

        Create a shell script to launch the executable if necessary.

        Delete an unused predicate `standard_library_directory_option'.

compiler/file_names.m:
        `.cs' and `.cs_date' are grade-dependent.

compiler/handle_options.m:
        Force `.exe' as the executable file extension in csharp grades.

        Make the `erlang' grade component imply the same options as MLDS
        grades.

compiler/make.m:
        Classify executable target types based on the compilation target.

compiler/make.module_target.m:
        Handle `mmc --grade csharp --make <target>.dll'.

compiler/make.program_target.m:
        Install library DLLs in csharp grades.

        Make clean targets remove files for csharp grades.

        Conform to changes.

compiler/make.util.m:
        Add a stub foreign type.

        Conform to changes.

compiler/module_cmds.m:
        Factor out code to generate the shell scripts which launch programs
        compiled in Java, Erlang and C# grades.

compiler/options.m:
        Add `cli_interpreter' option to remember the name of the program which
        should be used to run CLI (.NET) programs.

        Add C#-related options to the help message.

compiler/options_file.m:
        Remove "MS_" prefixes on MS_ILASM_FLAGS and MS_CSC_FLAGS, and remove
        the extra underscore before "FLAGS".  In all uses of the variables,
        they were spelt without the extra underscore.

doc/user_guide.texi:
        Document options and file types related to the C# grade.

library/Mmakefile:
        Pass `mercury_dotnet.cs' to the C# compiler when building the standard
        library.  Suppress some warnings.

        Allow stubs in this directory for csharp grade.

        Conform to variable renamings.

library/builtin.m:
        Uncomment foreign language pragmas for C#.

        Handle null values in C# implementation of `deep_copy'.

library/private_builtin.m:
library/string.m:
        Compare strings by ordinals in C#, instead of culture-specific rules.
        Although the latter is allowed according to the documentation, it is
        likely to slower, and cause confusion when porting between backends.

        Handle negative index in string.set_char.

library/rtti_implementation.m:
        Uncomment foreign language pragmas for C#.

        `System.Type.GetType' only searches the current executing assembly or
        in mscorlib for a type.  As we have to be able to find types in other
        assemblies (e.g. mer_std.dll or user DLLs), explicitly search through
        a list of assemblies.

library/thread.semaphore.m:
        Uncomment foreign language pragmas for C#.

        Fix missing class qualification.

library/array.m:
library/bitmap.m:
library/bool.m:
library/dir.m:
library/exception.m:
library/io.m:
library/mutvar.m:
library/par_builtin.m:
library/region_builtin.m:
library/store.m:
library/thread.m:
library/time.m:
library/univ.m:
library/version_array.m:
        Uncomment foreign language pragmas for C#.

mdbcomp/rtti_access.m:
        Add type and procedure stubs.

runtime/mercury_dotnet.cs.in:
        Override `Equals(object)' methods in `TypeCtorInfo_Struct' and
        `TypeInfo_Struct' classes.  This requires we override `GetHashCode' as
        well.

        Handle nulls arguments to `Equals' methods as is the expected behaviour.

        Override `ToString' in `TypeCtorInfo_Struct' to produce more useful
        output during debugging.

scripts/Mercury.config.in:
        Record the configured CLI_INTERPRETER and pass that to the compiler as
        a flag.

        Conform to variable renamings.

scripts/Mmake.vars.in:
        Pass value of CSCFLAGS from Mmake through to `mmc --make'.

        Conform to variable renamings.

scripts/Mercury.config.bootstrap.in:
scripts/Mmake.rules:
        Conform to variable renaming.

scripts/canonical_grade.sh-subr:
scripts/final_grade_options.sh-subr:
scripts/init_grade_options.sh-subr:
scripts/parse_grade_options.sh-subr:
        Canonicalise high-level code, high-level-data, C# target code to the
        `csharp' grade.

        Handle erlang grades like other grades.

scripts/prepare_install_dir.in:
        Copy `.cs' files from the runtime directory when preparing an install
        directory.

browser/Mmakefile:
compiler/Mmakefile:
deep_profiler/Mmakefile:
mdbcomp/Mmakefile:
profiler/Mmakefile:
runtime/Mmakefile:
slice/Mmakefile:
ssdb/Mmakefile:
trace/Mmakefile:
        Do as other non-C grades in this directory.

        Conform to variable renamings.

tests/hard_coded/foreign_enum_dummy.m:
tests/hard_coded/sub-modules/non_word_mutable.m:
tests/hard_coded/sub-modules/sm_exp_bug.m:
        Make these tests work in C#.

tests/mmc_make/Mmakefile:
        Update a regular expression to account for `mmc --make' writing
        "Making rebuild.exe" on platforms where the .exe suffix is not normally
        used.

tests/mmc_make/complex_test.exp2:
        Add alternative output (minor difference in floating point precision).

tests/debugger/Mmakefile:
tests/debugger/declarative/Mmakefile:
tests/general/structure_reuse/Mmakefile:
tests/hard_coded/Mmakefile:
tests/hard_coded/sub-modules/Mmakefile:
tests/par_conj/Mmakefile:
tests/stm/Mmakefile:
        Disable some tests in the csharp grade.

tests/invalid/Mmakefile:
        Disable some tests in the csharp grade.

        Enable a test which should work in java grades.

tests/valid/Mmakefile:
        Do as other non-C grades in this directory.

        When testing the csharp grade in this directory, produce only the C#
        target files for now.

tests/run_one_test:
        Don't compress a failing test case executable when the executable is
        actually only a shell script.
2010-09-30 07:23:36 +00:00

599 lines
17 KiB
Plaintext

#---------------------------------------------------------------------------#
# vim: ts=4 sw=4 expandtab
#---------------------------------------------------------------------------#
# Copyright (C) 1997-2007, 2010 The 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.
#---------------------------------------------------------------------------#
#
# parse_grade_options.sh-subr:
# An `sh' subroutine for parsing grade-related options.
# Used by the `ml', `mgnuc' and `c2init' scripts.
#
# The code here should be inserted in the case statement in a script's
# option-parsing loop.
#
# IMPORTANT: any changes to the handling of grades here may also require
# changes to all the files indicated by runtime/mercury_grade.h.
#
# This file should handle the setting of all the shell variables defined by
# init_grade_options.sh-subr.
#
#---------------------------------------------------------------------------#
--target)
shift
case "$1" in
asm)
target=asm ;;
c|C)
target=c ;;
il|IL)
target=il ;;
csharp|'C#')
target=csharp ;;
java|Java)
target=java ;;
erlang|Erlang)
target=erlang ;;
*)
echo "$0: invalid target \`$1'" 1>&2
exit 1
;;
esac
;;
--il|--IL|--il-only|--IL-only)
target=il ;;
--csharp|'--C#'|--csharp-only|'--C#-only')
target=csharp ;;
--java|--Java|--java-only|--Java-only)
target=java ;;
--erlang|--Erlang|--erlang-only|--Erlang-only)
target=erlang ;;
--high-level-code|-H)
highlevel_code=true ;;
--no-high-level-code|-H-)
highlevel_code=false ;;
--high-level-data)
highlevel_data=true ;;
--no-high-level-data)
highlevel_data=false ;;
--gcc-nested-functions)
gcc_nested_functions=true ;;
--no-gcc-nested-functions)
gcc_nested_functions=false ;;
--asm-labels)
asm_labels=true ;;
--no-asm-labels)
asm_labels=false ;;
--gcc-non-local-gotos)
non_local_gotos=true ;;
--no-gcc-non-local-gotos)
non_local_gotos=false ;;
--gcc-global-registers)
global_regs=true ;;
--no-gcc-global-registers)
global_regs=false ;;
--gc)
shift
case "$1" in
accurate|conservative|boehm|boehm_debug|hgc|mps|none|automatic)
gc_method=$1 ;;
*)
echo "$0: invalid gc method \`$1'" 1>&2
exit 1
;;
esac
;;
--parallel)
thread_safe=true ;;
-p|--profiling|--time-profiling)
profile_time=true
profile_calls=true
profile_memory=false
profile_deep=false
;;
--memory-profiling)
profile_time=false
profile_calls=true
profile_memory=true
profile_deep=false
;;
--deep-profiling)
profile_time=false
profile_calls=false
profile_memory=false
profile_deep=true
;;
-p-|--no-profiling)
profile_time=false
profile_calls=false
profile_memory=false
profile_deep=false
;;
--profile-time)
profile_time=true ;;
--no-profile-time)
profile_time=false ;;
--profile-calls)
profile_calls=true ;;
--no-profile-calls)
profile_calls=false ;;
--profile-memory)
profile_memory=true ;;
--no-profile-memory)
profile_memory=false ;;
--profile-deep)
profile_deep=true ;;
--no-profile-deep)
profile_deep=false ;;
--record-term-sizes-as-words)
record_term_sizes_as_words=true ;;
--no-record-term-sizes-as-words)
record_term_sizes_as_words=false ;;
--record-term-sizes-as-cells)
record_term_sizes_as_cells=true ;;
--no-record-term-sizes-as-cells)
record_term_sizes_as_cells=false ;;
--use-trail)
use_trail=true ;;
--no-use-trail)
use_trail=false ;;
--trail-segments)
trail_segments=true ;;
--no-trail-segments)
trail_segments=false ;;
--use-minimal-model-stack-copy)
use_minimal_model_stack_copy=true ;;
--no-use-minimal-model-stack-copy)
use_minimal_model_stack_copy=false ;;
--use-minimal-model-own-stacks)
use_minimal_model_own_stacks=true ;;
--no-use-minimal-model-own-stacks)
use_minimal_model_own_stacks=false ;;
--minimal-model-debug)
minimal_model_debug=true ;;
--no-minimal-model-debug)
minimal_model_debug=false ;;
--single-prec-float)
single_prec_float=true ;;
--no-single-prec-float)
single_prec_float=false ;;
--pic-reg)
pic_reg=true ;;
--no-pic-reg)
pic_reg=false ;;
--debug)
debug=true ;;
--no-debug)
debug=false ;;
--decl-debug)
decl_debug=true ;;
--no-decl-debug)
decl_debug=false ;;
--ss-debug)
ss_debug=true ;;
--no-ss-debug)
ss_debug=false ;;
--low-level-debug)
ll_debug= true ;;
--no-low-level-debug)
ll_debug= false ;;
--extend-stacks-when-needed)
extend_stacks=true ;;
--no-extend-stacks-when-needed)
extend_stacks=false ;;
--stack-segments)
stack_segments=true ;;
--no-stack-segments)
stack_segments=false ;;
--use-regions)
use_regions=true;;
--no-use-regions)
use_regions=false ;;
--use-regions-debug)
use_regions_debug=true;;
--no-use-regions-debug)
use_regions_debug=false ;;
--use-regions-profiling)
use_regions_profiling=true;;
--no-use-regions-profiling)
use_regions_profiling=false ;;
-s|--grade)
shift
grade="$1";
# Convert a grade to a set of options.
#
# IMPORTANT: any changes to the handling of grades here
# may also require changes to all the files indicated by
# runtime/mercury_grade.h.
target=c
highlevel_code=false
gcc_nested_functions=false
highlevel_data=false
asm_labels=false
non_local_gotos=false
global_regs=false
thread_safe=false
gc_method=none
profile_time=false
profile_calls=false
profile_memory=false
profile_deep=false
record_term_sizes_as_words=false
record_term_sizes_as_cells=false
use_trail=false
trail_segments=false
use_minimal_model_stack_copy=false
use_minimal_model_own_stacks=false
minimal_model_debug=false
single_prec_float=false
pic_reg=false
debug=false
decl_debug=false
ss_debug=false
ll_debug=false
extend_stacks=false
stack_segments=false
use_regions=false
use_regions_debug=false
use_regions_profiling=false
grade_pieces=`echo $grade | tr '.' ' '`
for grade_piece in $grade_pieces
do
case "$grade_piece" in
il)
target=il
asm_labels=false
non_local_gotos=false
global_regs=false
highlevel_code=true
gcc_nested_functions=false
highlevel_data=true
;;
ilc)
target=il
asm_labels=false
non_local_gotos=false
global_regs=false
highlevel_code=true
gcc_nested_functions=false
highlevel_data=false
;;
csharp)
target=csharp
asm_labels=false
non_local_gotos=false
global_regs=false
highlevel_code=true
gcc_nested_functions=false
highlevel_data=true
;;
java)
target=java
asm_labels=false
non_local_gotos=false
global_regs=false
highlevel_code=true
gcc_nested_functions=false
highlevel_data=true
;;
erlang)
target=erlang
asm_labels=false
non_local_gotos=false
global_regs=false
highlevel_code=true
gcc_nested_functions=false
highlevel_data=true
;;
hl)
asm_labels=false
non_local_gotos=false
global_regs=false
highlevel_code=true
gcc_nested_functions=false
highlevel_data=true
;;
hlc)
asm_labels=false
non_local_gotos=false
global_regs=false
highlevel_code=true
gcc_nested_functions=false
highlevel_data=false
;;
hl_nest)
asm_labels=false
non_local_gotos=false
global_regs=false
highlevel_code=true
gcc_nested_functions=true
highlevel_data=true
;;
hlc_nest)
asm_labels=false
non_local_gotos=false
global_regs=false
highlevel_code=true
gcc_nested_functions=true
highlevel_data=false
;;
asm_fast)
target=c
asm_labels=true
non_local_gotos=true
global_regs=true
highlevel_code=false
gcc_nested_functions=false
highlevel_data=false
;;
asm_jump)
target=c
asm_labels=true
non_local_gotos=true
global_regs=false
highlevel_code=false
gcc_nested_functions=false
highlevel_data=false
;;
fast)
target=c
asm_labels=false
non_local_gotos=true
global_regs=true
highlevel_code=false
gcc_nested_functions=false
highlevel_data=false
;;
jump)
target=c
asm_labels=false
non_local_gotos=true
global_regs=false
highlevel_code=false
gcc_nested_functions=false
highlevel_data=false
;;
reg)
target=c
asm_labels=false
non_local_gotos=false
global_regs=true
highlevel_code=false
gcc_nested_functions=false
highlevel_data=false
;;
none)
target=c
asm_labels=false
non_local_gotos=false
global_regs=false
highlevel_code=false
gcc_nested_functions=false
highlevel_data=false
;;
par)
thread_safe=true
;;
threadscope)
threadscope=true
;;
agc)
gc_method=accurate
;;
mps)
gc_method=mps
;;
gc)
gc_method=boehm
;;
hgc)
gc_method=hgc
;;
gcd)
gc_method=boehm_debug
;;
nogc)
gc_method=none
;;
memprof)
profile_time=false
profile_calls=true
profile_memory=true
profile_deep=false
;;
prof)
profile_time=true
profile_calls=true
profile_memory=false
profile_deep=false
;;
proftime)
profile_time=true
profile_calls=false
profile_memory=false
profile_deep=false
;;
profcalls)
profile_time=false
profile_calls=true
profile_memory=false
profile_deep=false
;;
profall)
profile_time=true
profile_calls=true
profile_memory=true
profile_deep=false
;;
profdeep)
profile_time=false
profile_calls=false
profile_memory=false
profile_deep=true
;;
tsw)
record_term_sizes_as_words=true
record_term_sizes_as_cells=false
;;
tsc)
record_term_sizes_as_words=false
record_term_sizes_as_cells=true
;;
tr)
use_trail=true
trail_segments=false
;;
trseg)
use_trail=true
trail_segments=true
;;
mm)
use_minimal_model_stack_copy=true
minimal_model_debug=false
;;
dmm)
use_minimal_model_stack_copy=true
minimal_model_debug=true
;;
mmsc)
use_minimal_model_stack_copy=true
minimal_model_debug=false
;;
dmmsc)
use_minimal_model_stack_copy=true
minimal_model_debug=true
;;
mmos)
use_minimal_model_own_stacks=true
minimal_model_debug=false
;;
dmmos)
use_minimal_model_own_stacks=true
minimal_model_debug=true
;;
spf)
single_prec_float=true
;;
picreg)
pic_reg=true
;;
debug)
debug=true
;;
decldebug)
decl_debug=true
;;
ssdebug)
ss_debug=true
;;
ll_debug)
ll_debug=true
;;
exts)
extend_stacks=true
;;
stseg)
stack_segments=true
;;
rbmm)
use_regions=true
use_regions_debug=false
use_regions_profiling=false
;;
rbmmd)
use_regions=true
use_regions_debug=true
use_regions_profiling=false
;;
rbmmp)
use_regions=true
use_regions_debug=false
use_regions_profiling=true
;;
rbmmdp)
use_regions=true
use_regions_debug=true
use_regions_profiling=true
;;
*)
echo "$0: unknown grade component \`$grade_piece'" 1>&2
exit 1
;;
esac
done
;;
-s*)
grade="` expr $1 : '-s\(.*\)' `"
# just insert it as `--grade $grade' and then reparse it
shift
case $# in
0) set - x --grade "$grade" ;;
*) set - x --grade "$grade" "$@" ;;
esac
;;