toolcontext: add `usage` and `tooldescription`
[nit.git] / src / abstract_compiler.nit
index c9abd5d..e5d5977 100644 (file)
@@ -236,7 +236,12 @@ class MakefileToolchain
                        hfile.write "#include \"{hfilename}\"\n"
                        for key in f.required_declarations do
                                if not compiler.provided_declarations.has_key(key) then
-                                       print "No provided declaration for {key}"
+                                       var node = compiler.requirers_of_declarations.get_or_null(key)
+                                       if node != null then
+                                               node.debug "No provided declaration for {key}"
+                                       else
+                                               print "No provided declaration for {key}"
+                                       end
                                        abort
                                end
                                hfile.write compiler.provided_declarations[key]
@@ -330,7 +335,7 @@ class MakefileToolchain
                                var o = f.makefile_rule_name
                                var ff = f.filename.basename("")
                                makefile.write("{o}: {ff}\n")
-                               makefile.write("\t{f.makefile_rule_content}\n")
+                               makefile.write("\t{f.makefile_rule_content}\n\n")
                                dep_rules.add(f.makefile_rule_name)
 
                                if f isa ExternCppFile then ofiles.add(o)
@@ -338,7 +343,7 @@ class MakefileToolchain
                end
 
                # Link edition
-               makefile.write("{outpath}: {ofiles.join(" ")}\n\t$(CC) $(LDFLAGS) -o {outpath} {ofiles.join(" ")} $(LDLIBS)\n\n")
+               makefile.write("{outpath}: {dep_rules.join(" ")}\n\t$(CC) $(LDFLAGS) -o {outpath} {ofiles.join(" ")} $(LDLIBS)\n\n")
                # Clean
                makefile.write("clean:\n\trm {ofiles.join(" ")} 2>/dev/null\n\n")
                makefile.close
@@ -422,6 +427,8 @@ abstract class AbstractCompiler
 
        private var provided_declarations = new HashMap[String, String]
 
+       private var requirers_of_declarations = new HashMap[String, ANode]
+
        # Builds the .c and .h files to be used when generating a Stack Trace
        # Binds the generated C function names to Nit function names
        fun build_c_to_nit_bindings
@@ -560,6 +567,7 @@ abstract class AbstractCompiler
                v.add("signal(SIGINT, sig_handler);")
                v.add("signal(SIGTERM, sig_handler);")
                v.add("signal(SIGSEGV, sig_handler);")
+               v.add("signal(SIGPIPE, sig_handler);")
 
                v.add("glob_argc = argc; glob_argv = argv;")
                v.add("initialize_gc_option();")
@@ -715,9 +723,6 @@ abstract class AbstractCompiler
                nmodule.finalize_ffi(visitor, modelbuilder)
                nmodule.finalize_nitni(visitor)
        end
-
-       # Does this compiler support the FFI?
-       fun supports_ffi: Bool do return false
 end
 
 # A file unit (may be more than one file if
@@ -1074,7 +1079,11 @@ abstract class AbstractCompilerVisitor
        # Request the presence of a global declaration
        fun require_declaration(key: String)
        do
-               self.writer.file.required_declarations.add(key)
+               var reqs = self.writer.file.required_declarations
+               if reqs.has(key) then return
+               reqs.add(key)
+               var node = current_node
+               if node != null then compiler.requirers_of_declarations[key] = node
        end
 
        # Add a declaration in the local-header
@@ -1551,10 +1560,10 @@ redef class AConcreteMethPropdef
                        var args = [arguments.first]
                        for auto_super_init in auto_super_inits do
                                args.clear
-                               for i in [0..auto_super_init.intro.msignature.arity+1[ do
+                               for i in [0..auto_super_init.msignature.arity+1[ do
                                        args.add(arguments[i])
                                end
-                               v.send(auto_super_init, args)
+                               v.compile_callsite(auto_super_init, args)
                        end
                end
                v.stmt(self.n_block)
@@ -2502,7 +2511,7 @@ redef class ASuperExpr
                end
 
                # stantard call-next-method
-               return v.supercall(v.frame.mpropdef.as(MMethodDef), recv.mtype.as(MClassType), args)
+               return v.supercall(mpropdef.as(not null), recv.mtype.as(MClassType), args)
        end
 end