1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2008 Jean Privat <jean@pryen.org>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # Nit compiler main module
26 import native_interface
27 import separate_options
29 # The main class of the nitcompiler program
31 super AbstractCompiler
32 readable var _opt_output
: OptionString = new OptionString("Output file", "-o", "--output")
33 readable var _opt_boost
: OptionBool = new OptionBool("Optimize compilation", "-O", "--boost")
34 readable var _opt_no_cc
: OptionBool = new OptionBool("Do not invoke C compiler", "--no-cc")
35 readable var _opt_cc_no_link
: OptionBool = new OptionBool("Do not invoke C linker", "--cc-no-link")
36 readable var _opt_clibdir
: OptionString = new OptionString("NIT C library directory", "--clibdir")
37 readable var _opt_bindir
: OptionString = new OptionString("NIT tools directory", "--bindir")
38 readable var _opt_compdir
: OptionString = new OptionString("Intermediate compilation directory", "--compdir")
39 readable var _opt_extension_prefix
: OptionString = new OptionString("Append prefix to file extension", "-p", "--extension-prefix")
40 readable var _opt_output_format
: OptionEnum = new OptionEnum(["none", "C", "icode"], "The type of code we want to be generated", 1, "--output-format")
45 option_context
.add_option
(opt_output
, opt_boost
, opt_no_cc
, opt_cc_no_link
, opt_cc_libs
, opt_cc_lib_paths
, opt_cc_include_paths
, opt_clibdir
, opt_bindir
, opt_compdir
, opt_extension_prefix
, opt_output_format
)
48 redef fun process_options
51 output_file
= opt_output
.value
52 boost
= opt_boost
.value
53 no_cc
= opt_no_cc
.value
54 cc_link
= not opt_cc_no_link
.value
55 cc_lib_paths
.add_all
( opt_cc_lib_paths
.value
)
56 cc_libs
.add_all
( opt_cc_libs
.value
)
57 cc_include_paths
.add_all
( opt_cc_include_paths
.value
)
58 var ext
= opt_extension_prefix
.value
59 if ext
!= null then ext_prefix
= ext
else ext_prefix
= ""
60 compdir
= opt_compdir
.value
61 if compdir
== null then
62 var dir
= "NIT_COMPDIR".environ
63 if not dir
.is_empty
then
66 if compdir
== null then
67 compdir
= ".nit_compile"
71 compdir
= compdir
.simplify_path
73 clibdir
= opt_clibdir
.value
74 if clibdir
== null then
75 var dir
= "NIT_DIR".environ
77 dir
= "{sys.program_name.dirname}/../clib"
78 if dir
.file_exists
then clibdir
= dir
81 if dir
.file_exists
then clibdir
= dir
83 if clibdir
== null then
84 fatal_error
(null, "Error: Cannot locate NIT C library directory. Uses --clibdir or envvar NIT_DIR.")
87 clibdir
= clibdir
.simplify_path
89 bindir
= opt_bindir
.value
90 if bindir
== null then
91 var dir
= "NIT_DIR".environ
93 dir
= "{sys.program_name.dirname}/../bin"
94 if dir
.file_exists
then bindir
= dir
97 if dir
.file_exists
then bindir
= dir
99 if bindir
== null then
100 fatal_error
(null, "Error: Cannot locate NIT tools directory. Uses --bindir or envvar NIT_DIR.")
103 bindir
= bindir
.simplify_path
106 redef fun perform_work
(mods
)
109 var p
= new Program(mod
, self)
110 p
.output_format
= opt_output_format
.value_name
111 p
.compute_main_method
112 p
.generate_allocation_iroutines
113 if global
then p
.do_global_analysis
114 p
.do_table_computation
120 redef class ToolContext
121 redef init do super # Avoid local property conflict
125 var c
= new NitCompiler