From c494b4d0e2ca04d7d2c99e7125d0a7b042d3281f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alexis=20Laferri=C3=A8re?= Date: Sat, 28 Mar 2015 13:58:27 -0400 Subject: [PATCH] nitc: `Toolchain` keeps the compiler as an attribute MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Alexis Laferrière --- src/compiler/abstract_compiler.nit | 51 +++++++++++++++++++++++++----------- src/platform/android.nit | 12 ++++----- src/platform/emscripten.nit | 8 +++--- src/platform/pnacl.nit | 10 +++---- 4 files changed, 50 insertions(+), 31 deletions(-) diff --git a/src/compiler/abstract_compiler.nit b/src/compiler/abstract_compiler.nit index 658f0e7..9842d1d 100644 --- a/src/compiler/abstract_compiler.nit +++ b/src/compiler/abstract_compiler.nit @@ -121,20 +121,30 @@ redef class ModelBuilder protected fun write_and_make(compiler: AbstractCompiler) do var platform = compiler.target_platform - var toolchain = platform.toolchain(toolcontext) + var toolchain = platform.toolchain(toolcontext, compiler) compile_dir = toolchain.compile_dir - toolchain.write_and_make compiler + toolchain.write_and_make end end redef class Platform # The specific tool-chain associated to the platform - fun toolchain(toolcontext: ToolContext): Toolchain do return new MakefileToolchain(toolcontext) + fun toolchain(toolcontext: ToolContext, compiler: AbstractCompiler): Toolchain + do + return new MakefileToolchain(toolcontext, compiler) + end end +# Build toolchain for a specific target program, varies per `Platform` class Toolchain + + # Toolcontext var toolcontext: ToolContext + # Compiler of the target program + var compiler: AbstractCompiler + + # Directory where to generate all C files fun compile_dir: String do var compile_dir = toolcontext.opt_compile_dir.value @@ -142,13 +152,15 @@ class Toolchain return compile_dir end - fun write_and_make(compiler: AbstractCompiler) is abstract + # Write all C files and compile them + fun write_and_make is abstract end +# Default toolchain using a Makefile class MakefileToolchain super Toolchain - redef fun write_and_make(compiler) + redef fun write_and_make do var compile_dir = compile_dir @@ -161,11 +173,11 @@ class MakefileToolchain compile_dir.mkdir var cfiles = new Array[String] - write_files(compiler, compile_dir, cfiles) + write_files(compile_dir, cfiles) # Generate the Makefile - write_makefile(compiler, compile_dir, cfiles) + write_makefile(compile_dir, cfiles) var time1 = get_time self.toolcontext.info("*** END WRITING C: {time1-time0} ***", 2) @@ -177,13 +189,14 @@ class MakefileToolchain time0 = time1 self.toolcontext.info("*** COMPILING C ***", 1) - compile_c_code(compiler, compile_dir) + compile_c_code(compile_dir) time1 = get_time self.toolcontext.info("*** END COMPILING C: {time1-time0} ***", 2) end - fun write_files(compiler: AbstractCompiler, compile_dir: String, cfiles: Array[String]) + # Write all source files to the `compile_dir` + fun write_files(compile_dir: String, cfiles: Array[String]) do var platform = compiler.target_platform if self.toolcontext.opt_stacktrace.value == "nitstack" and platform.supports_libunwind then compiler.build_c_to_nit_bindings @@ -280,10 +293,14 @@ class MakefileToolchain self.toolcontext.info("Total C source files to compile: {cfiles.length}", 2) end - fun makefile_name(mainmodule: MModule): String do return "{mainmodule.c_name}.mk" + # Get the name of the Makefile to use + fun makefile_name: String do return "{compiler.mainmodule.c_name}.mk" - fun default_outname(mainmodule: MModule): String + # Get the default name of the executable to produce + fun default_outname: String do + var mainmodule = compiler.mainmodule + # Search a non fictive module var res = mainmodule.name while mainmodule.is_fictive do @@ -298,13 +315,14 @@ class MakefileToolchain do var res = self.toolcontext.opt_output.value if res != null then return res - res = default_outname(mainmodule) + res = default_outname var dir = self.toolcontext.opt_dir.value if dir != null then return dir.join_path(res) return res end - fun write_makefile(compiler: AbstractCompiler, compile_dir: String, cfiles: Array[String]) + # Write the Makefile + fun write_makefile(compile_dir: String, cfiles: Array[String]) do var mainmodule = compiler.mainmodule var platform = compiler.target_platform @@ -319,7 +337,7 @@ class MakefileToolchain # 2. copy the binary at the right place in the `all` goal. outpath = mainmodule.c_name end - var makename = makefile_name(mainmodule) + var makename = makefile_name var makepath = "{compile_dir}/{makename}" var makefile = new FileWriter.open(makepath) @@ -444,9 +462,10 @@ endif makepath.file_copy_to "{compile_dir}/Makefile" end - fun compile_c_code(compiler: AbstractCompiler, compile_dir: String) + # The C code is generated, compile it to an executable + fun compile_c_code(compile_dir: String) do - var makename = makefile_name(compiler.mainmodule) + var makename = makefile_name var makeflags = self.toolcontext.opt_make_flags.value if makeflags == null then makeflags = "" diff --git a/src/platform/android.nit b/src/platform/android.nit index e2db002..2c9e706 100644 --- a/src/platform/android.nit +++ b/src/platform/android.nit @@ -42,7 +42,7 @@ class AndroidPlatform redef fun supports_linker_script do return false - redef fun toolchain(toolcontext) do return new AndroidToolchain(toolcontext) + redef fun toolchain(toolcontext, compiler) do return new AndroidToolchain(toolcontext, compiler) end class AndroidToolchain @@ -57,9 +57,9 @@ class AndroidToolchain return "{android_project_root}/jni/nit_compile/" end - redef fun default_outname(mainmodule) do return "{mainmodule.name}.apk" + redef fun default_outname do return "{super}.apk" - redef fun write_files(compiler, compile_dir, cfiles) + redef fun write_files(compile_dir, cfiles) do var android_project_root = android_project_root.as(not null) var project = toolcontext.modelbuilder.android_project_for(compiler.mainmodule) @@ -107,7 +107,7 @@ class AndroidToolchain if not dir.file_exists then dir.mkdir # compile normal C files - super(compiler, compile_dir, cfiles) + super # Gather extra C files generated elsewhere than in super for f in compiler.extern_bodies do @@ -311,12 +311,12 @@ $(call import-module,android/native_app_glue) end end - redef fun write_makefile(compiler, compile_dir, cfiles) + redef fun write_makefile(compile_dir, cfiles) do # Do nothing, already done in `write_files` end - redef fun compile_c_code(compiler, compile_dir) + redef fun compile_c_code(compile_dir) do var android_project_root = android_project_root.as(not null) var short_project_name = compiler.mainmodule.name.replace("-", "_") diff --git a/src/platform/emscripten.nit b/src/platform/emscripten.nit index 3e9199a..90e361e 100644 --- a/src/platform/emscripten.nit +++ b/src/platform/emscripten.nit @@ -35,17 +35,17 @@ class EmscriptenPlatform redef fun supports_libunwind do return false redef fun supports_libgc do return false redef fun supports_linker_script do return false - redef fun toolchain(toolcontext) do return new EnscriptenToolchain(toolcontext) + redef fun toolchain(toolcontext, compiler) do return new EnscriptenToolchain(toolcontext, compiler) end class EnscriptenToolchain super MakefileToolchain - redef fun makefile_name(mainmodule) do return "{mainmodule.name}.js.mk" + redef fun makefile_name do return "{super}.js.mk" - redef fun default_outname(mainmodule) do return "{super}.js" + redef fun default_outname do return "{super}.js" - redef fun write_makefile(compiler, compile_dir, cfiles) + redef fun write_makefile(compile_dir, cfiles) do super diff --git a/src/platform/pnacl.nit b/src/platform/pnacl.nit index d7103db..8136187 100644 --- a/src/platform/pnacl.nit +++ b/src/platform/pnacl.nit @@ -37,13 +37,13 @@ class PnaclPlatform redef fun no_main do return true - redef fun toolchain(toolcontext) do return new PnaclToolchain(toolcontext) + redef fun toolchain(toolcontext, compiler) do return new PnaclToolchain(toolcontext, compiler) end class PnaclToolchain super MakefileToolchain - redef fun write_files(compiler, compile_dir, cfiles) + redef fun write_files(compile_dir, cfiles) do var app_name = compiler.mainmodule.name @@ -52,7 +52,7 @@ class PnaclToolchain if not dir.file_exists then dir.mkdir # compile normal C files - super(compiler, compile_dir, cfiles) + super # Gather extra C files generated elsewhere than in super for f in compiler.extern_bodies do @@ -238,12 +238,12 @@ function updateStatus(opt_message) { """.write_to_file(file) end - redef fun write_makefile(compiler, compile_dir, cfiles) + redef fun write_makefile(compile_dir, cfiles) do # Do nothing, already done in `write_files` end - redef fun compile_c_code(compiler, compile_dir) + redef fun compile_c_code(compile_dir) do # Generate the pexe toolcontext.exec_and_check(["make", "-C", compile_dir, "-j", "4"], "PNaCl project error") -- 1.7.9.5