Merge: Fix some AST bugs
[nit.git] / src / abstract_compiler.nit
index e51090f..cef1c5b 100644 (file)
@@ -20,7 +20,6 @@ module abstract_compiler
 import literal
 import typing
 import auto_super_init
-import frontend
 import platform
 import c_tools
 
@@ -74,13 +73,13 @@ redef class ToolContext
                super
 
                var st = opt_stacktrace.value
-               if st == null or st == "none" or st == "libunwind" or st == "gperf" then
+               if st == null or st == "none" or st == "libunwind" or st == "nitstack" then
                        # Fine, do nothing
                else if st == "auto" then
                        # Default just unset
                        opt_stacktrace.value = null
                else
-                       print "Error: unknown value `{st}` for --stacktrace. Use `none`, `libunwind`, `gperf` or `auto`."
+                       print "Error: unknown value `{st}` for --stacktrace. Use `none`, `libunwind`, `nitstack` or `auto`."
                        exit(1)
                end
        end
@@ -128,22 +127,19 @@ class MakefileToolchain
        # The list is initially set with :
        #   * the toolcontext --cc-path option
        #   * the NIT_CC_PATH environment variable
-       #   * some heuristics including the NIT_DIR environment variable and the progname of the process
+       #   * `toolcontext.nit_dir`
        # Path can be added (or removed) by the client
        var cc_paths = new Array[String]
 
        protected fun gather_cc_paths
        do
                # Look for the the Nit clib path
-               var path_env = "NIT_DIR".environ
-               if not path_env.is_empty then
+               var path_env = toolcontext.nit_dir
+               if path_env != null then
                        var libname = "{path_env}/clib"
                        if libname.file_exists then cc_paths.add(libname)
                end
 
-               var libname = "{sys.program_name.dirname}/../clib"
-               if libname.file_exists then cc_paths.add(libname.simplify_path)
-
                if cc_paths.is_empty then
                        toolcontext.error(null, "Cannot determine the nit clib path. define envvar NIT_DIR.")
                end
@@ -197,7 +193,7 @@ class MakefileToolchain
 
        fun write_files(compiler: AbstractCompiler, compile_dir: String, cfiles: Array[String])
        do
-               if self.toolcontext.opt_stacktrace.value == "gperf" then compiler.build_c_to_nit_bindings
+               if self.toolcontext.opt_stacktrace.value == "nitstack" then compiler.build_c_to_nit_bindings
 
                # Add gc_choser.h to aditionnal bodies
                var gc_chooser = new ExternCFile("gc_chooser.c", "-DWITH_LIBGC")
@@ -313,7 +309,7 @@ class MakefileToolchain
                end
 
                var ost = toolcontext.opt_stacktrace.value
-               if ost == "libunwind" or ost == "gperf" then linker_options.add("-lunwind")
+               if ost == "libunwind" or ost == "nitstack" then linker_options.add("-lunwind")
 
                makefile.write("CC = ccache cc\nCFLAGS = -g -O2\nCINCL = {cc_includes}\nLDFLAGS ?= \nLDLIBS  ?= -lm -lgc {linker_options.join(" ")}\n\n")
                makefile.write("all: {outpath}\n\n")
@@ -328,6 +324,8 @@ class MakefileToolchain
                        dep_rules.add(o)
                end
 
+               var java_files = new Array[ExternFile]
+
                # Compile each required extern body into a specific .o
                for f in compiler.extern_bodies do
                        var o = f.makefile_rule_name
@@ -335,7 +333,21 @@ class MakefileToolchain
                        makefile.write("{o}: {ff}\n")
                        makefile.write("\t{f.makefile_rule_content}\n\n")
                        dep_rules.add(f.makefile_rule_name)
-                       ofiles.add(o)
+
+                       if f.compiles_to_o_file then ofiles.add(o)
+                       if f.add_to_jar then java_files.add(f)
+               end
+               
+               if not java_files.is_empty then
+                       var jar_file = "{outpath}.jar"
+
+                       var class_files_array = new Array[String]
+                       for f in java_files do class_files_array.add(f.makefile_rule_name)
+                       var class_files = class_files_array.join(" ")
+
+                       makefile.write("{jar_file}: {class_files}\n")
+                       makefile.write("\tjar cf {jar_file} {class_files}\n\n")
+                       dep_rules.add jar_file
                end
 
                # Link edition
@@ -526,14 +538,14 @@ abstract class AbstractCompiler
                var ost = modelbuilder.toolcontext.opt_stacktrace.value
 
                if ost == null then
-                       ost = "gperf"
+                       ost = "nitstack"
                        modelbuilder.toolcontext.opt_stacktrace.value = ost
                end
 
-               if ost == "gperf" or ost == "libunwind" then
+               if ost == "nitstack" or ost == "libunwind" then
                        v.add_decl("#define UNW_LOCAL_ONLY")
                        v.add_decl("#include <libunwind.h>")
-                       if ost == "gperf" then
+                       if ost == "nitstack" then
                                v.add_decl("#include \"c_functions_hash.h\"")
                        end
                end
@@ -567,7 +579,7 @@ abstract class AbstractCompiler
                v.add_decl("\}")
 
                v.add_decl("void show_backtrace (int signo) \{")
-               if ost == "gperf" or ost == "libunwind" then
+               if ost == "nitstack" or ost == "libunwind" then
                        v.add_decl("char* opt = getenv(\"NIT_NO_STACK\");")
                        v.add_decl("unw_cursor_t cursor;")
                        v.add_decl("if(opt==NULL)\{")
@@ -581,7 +593,7 @@ abstract class AbstractCompiler
                        v.add_decl("printf(\"-------------------------------------------------\\n\");")
                        v.add_decl("while (unw_step(&cursor) > 0) \{")
                        v.add_decl("    unw_get_proc_name(&cursor, procname, 100, &ip);")
-                       if ost == "gperf" then
+                       if ost == "nitstack" then
                        v.add_decl("    const char* recv = get_nit_name(procname, strlen(procname));")
                        v.add_decl("    if (recv != NULL)\{")
                        v.add_decl("            printf(\"` %s\\n\", recv);")