Files
mercury/scripts/canonical_grade.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

199 lines
5.5 KiB
Bash

#---------------------------------------------------------------------------#
# vim: ft=sh
#---------------------------------------------------------------------------#
# Copyright (C) 2000-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.
#---------------------------------------------------------------------------#
#
# canonical_grade.sh-subr:
# An `sh' subroutine for computing a canonical grade string based on
# the values of grade-related options.
# It is used by the `ml', `c2init' and `canonical_grade' scripts.
#
# The code here should be inserted after init_grade_options.sh-subr,
# parse_grade_options.sh-subr and final_grade_options.sh-subr, which
# together define a set of shell variables giving the values of the
# various grade options.
#
# Canonical_grade.sh-subr defines the variable GRADE, which will contain
# the canonical string for the grade implied by the option values.
#
# If the option values are inconsistent, this script fragment will
# print an error message and exit with failure.
#
# IMPORTANT: any changes to the handling of grades here may also require
# changes to all the files indicated by runtime/mercury_grade.h.
case $non_local_gotos,$global_regs in
true,true) GRADE="fast" ;;
true,false) GRADE="jump" ;;
false,true) GRADE="reg" ;;
false,false) GRADE="none" ;;
esac
case $asm_labels in
true) GRADE="asm_$GRADE" ;;
false) ;;
esac
case $highlevel_code,$highlevel_data,$GRADE,$target in
true,true,none,*)
case $target in
c|asm) GRADE="hl" ;;
il) GRADE="il" ;;
csharp) GRADE="csharp" ;;
java) GRADE="java" ;;
erlang) GRADE="erlang" ;;
*)
progname=`basename $0`
echo "$progname: unknown target: $target"
exit 1
;;
esac
;;
true,false,none,*)
case $target in
c|asm) GRADE="hlc" ;;
il) GRADE="ilc" ;;
*)
progname=`basename $0`
echo "$progname: unsupported target: $target"
exit 1
;;
esac
;;
false,false,*,*)
# GRADE was set above
;;
false,true,*,*)
progname=`basename $0`
echo "$progname: error: \`--high-level-data' requires \`--high-level-code'" 1>&2
exit 1
;;
*)
echo "$progname: error: \`--high-level-code' is incompatible with the use of" 1>&2
echo "$progname: error: low-level gcc extensions implied by grade \`$GRADE'" 1>&2
exit 1
;;
esac
case $gcc_nested_functions,$highlevel_code in
true,true) GRADE="${GRADE}_nest" ;;
*) ;;
esac
case $thread_safe,$threadscope in
true,false) GRADE="$GRADE.par" ;;
true,true) GRADE="$GRADE.par.threadscope" ;;
false,false) ;;
*)
echo "$progname: error: The 'threadscope' grade component may only be" 1>&2
echo "$progname: error: used in parallel grades"
exit 1
;;
esac
case $gc_method in
conservative) GRADE="$GRADE.gc" ;; # deprecated; alias for boehm
boehm) GRADE="$GRADE.gc" ;;
boehm_debug) GRADE="$GRADE.gcd" ;;
hgc) GRADE="$GRADE.hgc" ;;
mps) GRADE="$GRADE.mps" ;;
accurate) GRADE="$GRADE.agc" ;;
esac
case $profile_time,$profile_calls,$profile_memory,$profile_deep in
true,true,false,false) GRADE="$GRADE.prof" ;;
true,false,false,false) GRADE="$GRADE.proftime" ;;
false,true,false,false) GRADE="$GRADE.profcalls" ;;
true,true,true,false) GRADE="$GRADE.profall" ;;
false,true,true,false) GRADE="$GRADE.memprof" ;;
false,false,false,true) GRADE="$GRADE.profdeep" ;;
false,false,false,false) ;;
*) progname=`basename $0`
echo "$progname: error: invalid combination of profiling options." 1>&2
exit 1
;;
esac
case $record_term_sizes_as_words,$record_term_sizes_as_cells in
true,false) GRADE="$GRADE.tsw" ;;
false,true) GRADE="$GRADE.tsc" ;;
false,false) ;;
*) progname=`basename $0`
echo "$progname: error: invalid combination of term size profiling options." 1>&2
exit 1
;;
esac
case $use_trail,$trail_segments in
true,false) GRADE="$GRADE.tr" ;;
true,true) GRADE="$GRADE.trseg" ;;
false,false) ;;
*) progname=`basename $0`
echo "$progname: error: invalid combination of trailing options." 1>&2
exit 1
;;
esac
case $use_minimal_model_stack_copy,$use_minimal_model_own_stacks,$minimal_model_debug in
true,false,false) GRADE="$GRADE.mmsc" ;;
true,false,true) GRADE="$GRADE.dmmsc" ;;
false,true,false) GRADE="$GRADE.mmos" ;;
false,true,true) GRADE="$GRADE.dmmos" ;;
*) ;;
esac
case $single_prec_float in
true) GRADE="$GRADE.spf" ;;
false) ;;
esac
# We ignore the value of $picreg in computing the name of the grade
# that we will use as a directory name in the Mercury linker.
# case $picreg in
# true) GRADE="$GRADE.picreg" ;;
# false) ;;
# esac
case $debug,$decl_debug,$ss_debug in
true,true,false) GRADE="$GRADE.decldebug" ;;
true,false,false) GRADE="$GRADE.debug" ;;
false,false,true) GRADE="$GRADE.ssdebug" ;;
false,false,false) ;;
*) progname=`basename $0`
echo "$progname: error: invalid combination of debugging options." 1>&2
exit 1
;;
esac
case $ll_debug in
true) GRADE="$GRADE.ll_debug" ;;
*) ;;
esac;
case $extend_stacks,$stack_segments in
true,false) GRADE="$GRADE.exts" ;;
false,true) GRADE="$GRADE.stseg" ;;
false,false) ;;
*) progname=`basename $0`
echo "$progname: error: invalid combination of stack extension options." 1>&2
exit 1
;;
esac
case $use_regions in
true)
case $use_regions_debug,$use_regions_profiling in
false,false) GRADE="$GRADE.rbmm" ;;
false,true) GRADE="$GRADE.rbmmp" ;;
true,false) GRADE="$GRADE.rbmmd" ;;
true,true) GRADE="$GRADE.rbmmdp" ;;
esac
;;
false)
;;
esac