compile: intro of option files for modules with special needs
authorAlexis Laferrière <alexis.laf@xymus.net>
Mon, 1 Aug 2011 17:29:10 +0000 (13:29 -0400)
committerAlexis Laferrière <alexis.laf@xymus.net>
Thu, 9 Feb 2012 21:00:52 +0000 (16:00 -0500)
This allows the user to specify compiler arguments for each module with files.
To do so for a given module "json", the user inputs the args for the compiler
in a file named json.nit.args. As example, the content of the file could be
"--cc-lib-name json", which asks to link with a native library when using this
module. Theses args will be interpreted as those given on the command line.

The args allowed are limited to C compilation options, as others don't seam
to be of any use in this way.

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

src/nitc.nit
src/separate_options.nit [new file with mode: 0644]

index 9818765..a5a7945 100644 (file)
@@ -23,6 +23,7 @@ import program
 private import compiling
 private import syntax
 import native_interface
+import separate_options
 
 # The main class of the nitcompiler program
 class NitCompiler
@@ -31,9 +32,6 @@ class NitCompiler
        readable var _opt_boost: OptionBool = new OptionBool("Optimize compilation", "-O", "--boost")
        readable var _opt_no_cc: OptionBool = new OptionBool("Do not invoke C compiler", "--no-cc")
        readable var _opt_cc_no_link: OptionBool = new OptionBool("Do not invoke C linker", "--cc-no-link")
-       readable var _opt_cc_lib_paths: OptionArray = new OptionArray("Path to libraries for C compiler", "--cc-lib-path")
-       readable var _opt_cc_libs: OptionArray = new OptionArray("Name of library to use for C compiler", "--cc-lib-name")
-       readable var _opt_cc_include_paths: OptionArray = new OptionArray("Path to .h files for C compiler", "--cc-header-path")
        readable var _opt_global: OptionBool = new OptionBool("Use global compilation", "--global")
        readable var _opt_global_no_STF_opt: OptionBool = new OptionBool("Do not use SFT optimization", "--no-global-SFT-optimization")
        readable var _opt_global_no_DMR_opt: OptionBool = new OptionBool("Do not use dead method removal optimization", "--no-global-DMR-optimization")
diff --git a/src/separate_options.nit b/src/separate_options.nit
new file mode 100644 (file)
index 0000000..37f1a2d
--- /dev/null
@@ -0,0 +1,54 @@
+# module adding separate specification of opts to compiler
+
+import mmloader
+import compiling
+
+# only to order correctly redefs of compile_separate_module
+import native_interface
+
+redef class ToolContext
+       # all ops precised in .ops files
+       var separate_options : OptionContext = new OptionContext
+       var opt_cc_lib_paths: OptionArray = new OptionArray("Path to libraries for C compiler", "--cc-lib-path")
+       var opt_cc_libs: OptionArray = new OptionArray("Name of library to use for C compiler", "--cc-lib-name")
+       var opt_cc_include_paths: OptionArray = new OptionArray("Path to .h files for C compiler", "--cc-header-path")
+
+       redef init
+       do
+               super
+
+               separate_options.add_option( opt_cc_lib_paths )
+               separate_options.add_option( opt_cc_libs )
+               separate_options.add_option( opt_cc_include_paths )
+       end
+
+       fun integrate_separate_options( options : String )
+       do
+               separate_options.parse( options.split_with( ' ' ) )
+               if separate_options.rest.length > 0 then
+                       warning( null, "module {self} args file has unknown args: {separate_options.rest.join(", ")}" )
+               end
+
+               cc_lib_paths.append( opt_cc_lib_paths.value )
+               cc_libs.append( opt_cc_libs.value )
+               cc_include_paths.append( opt_cc_include_paths.value )
+       end
+end
+
+redef class MMSrcModule
+
+       redef fun compile_separate_module(cprogram)
+       do
+               super
+
+               # extract options from file
+               var options_path = "{location.file.filename}.args"
+               if options_path.file_exists then
+                       var option_file = new IFStream.open( options_path )
+                       var option_content = option_file.read_all
+                       option_file.close
+
+                       cprogram.program.tc.integrate_separate_options( option_content )
+               end
+       end
+end