3 nitc - compiles Nit programs.
8 nitc [*options*] FILE...
13 nitc is the current official Nit compiler.
14 It takes the main module of a Nit program as argument and produces an executable file.
16 By default, the generated executables are produced in the current directory.
17 (see `--dir` for details.)
19 Internally, nitc rely on the presence of a C compiler. Usually gcc (but nitc was successfully tested with clang).
20 A compilation directory is therefore created and (re-)used.
21 By default, the compilation directory is named `nit_compile` and is removed after the compilation.
22 (see `--compile-dir` for details.)
24 Currently, because Nit is still in heavy development, the compilation directory is not cleaned after the compilation.
26 By default, the compilation process tries to have a good trade-off between the compilation time and the performance of produced executables.
27 To produce more optimized executables, the current best option is `--semi-global`.
29 To improve the compilation time and simplify the compilation of multiple programs, more than one file can be given.
30 Each one will be compiled into a distinct executable.
32 $ nitc prog1.nit prog2.nit
34 To combine files into a single program, use the `-m` option.
36 $ nitc prog1.nit -m other_module.nit
38 nitc can produces executables for various platforms when specific modules are used.
39 Currently, android, pnacl and emscripten are supported.
40 See the documentation of these specific modules for details.
49 Show additional warnings (advices).
51 By default, only important warnings are displayed.
52 May be overridden by `-w`.
54 Important warnings are displayed by default. A warning is considered important when:
56 * There is a simple correction.
57 * There is no reason to let the code this way.
58 * There is always a real issue (no false positive).
60 Other warnings, called advices, are not displayed by default to avoid filling the terminal with
62 A warning is considered an advice when:
64 * The correction could be complex. e.g. require a refactorisation or an API change.
65 * The correction cannot be done. e.g. Code that use a deprecated API for some compatibility reason.
66 * There is not a real issue (false positive). Note that this should be unlikely.
67 * Transitional: While a real important warning, it fires a lot in current code, so a transition is needed
68 in order to let people fix them before promoting the advice to an important warning.
72 Show/hide a specific warning.
74 Each type of warning can be individually displayed or hidden.
75 The `-w` option takes the name of a warning (displayed at the end of the warning message, between parentheses) to activate it;
76 and "no-{name}" to disable it.
77 It has precedence over -q and -W.
78 Multiple `-w` can be given.
80 To show only `missing-doc` warnings in standard"
82 $ nitc -q -w missing-doc standard
84 To show all warnings and advices, except `missing-doc`:
86 $ nitc -W -w no-missing-doc standard
88 To show important warnings except `useless-type-test`, but not advice except `missing-doc`:
90 $ nitc -w missing-doc -w no-useless-type-test standard
94 May be overridden by `-w`
96 ### `--stop-on-first-error`
97 Just display the first encountered error then stop.
99 By default, nitc tries to detect and display more than one error before aborting the compilation.
102 Do not use color to display errors and warnings.
104 Also, do not echo the line.
105 This options is mainly used by scripts and tools that need parsable error messages.
107 ### `-v`, `--verbose`
108 Additional messages from the tool.
109 Multiple `-v` can be given to improve the verbosity.
111 With one `-v`, there is constant number of lines.
112 With two `-v`, the number of lines is proportional to the number of modules.
113 With three `-v`, the number of lines is proportional to the number of definition of classes.
114 With four `-v`, the number of lines is proportional to the number of definition of properties.
117 Generate various log files.
119 The tool will generate some files in the logging directory (see `--log-dir`).
120 These files are intended to the advanced user and the developers of the tools.
123 Directory where to generate log files.
125 By default the directory is called `logs` in the working directory.
128 ### `-h`, `-?`, `--help`
129 Show Help (the list of options).
132 Show version and exit.
138 Add an additional include path.
140 This option is used to indicate an additional path of a directory containing Nit libraries.
142 The path added with `-I` are searched before those added by the environment variable `NIT_PATH`.
144 May be used more than once.
147 Output executable name.
149 Indicates the path and name of the produced executable.
151 Note: it is better to use `--dir` if only the directory is important.
152 This way, the platform extension will be correctly set.
154 ### `-o` is not usable if multiple programs are compiled at once.
159 Produce the executables in the given directory instead of the current directory.
162 Base directory of the Nit installation.
164 Has precedence over the environment variable `NIT_DIR`.
169 Directory used to generate temporary files.
171 By default, it is named `nit_compile` and created in the current directory and destroyed after the compilation.
173 If the option `--compile_dir` or `--no-cc` is used, then the directory is not destroyed and let as is.
176 Do not invoke the C compiler.
178 Files in the compilation directory are generated but the C compiler is not invoked.
180 This option is mainly used to produce C files distributable then compilable on system that do not have a Nit compiler (e.g. embedded system).
181 In this case, it is suggested to also use the options `--dir`, `--compile-dir` and `--semi-global`.
183 $ nitc examples/hello_world.nit --no-cc --dir hello --compile-dir hello --semi-global
185 Will produce a `hello` directory that contains the required C files to finish the compilation.
186 Only the C files required for the program are generated.
187 The final binary will be generated in the same directory.
189 Note that, to be useful, the compilation directory is not destroyed when `--no-cc` is used.
192 Additional module to mix-in.
194 Additional modules are imported and refine the main module of the program.
195 This has basically the same effect than implementing a specific module that imports the main module of the program then each one of the mix-in modules.
196 May be used more than once.
198 This is option is used to weave additional behaviors to existing programs.
199 Modules designated to bring features to programs by refining basic or specialized services, without any intervention of the main program, are good candidates to be used with the `-m` option.
202 An other usage of the `-m` option is to compile program to a specific platform. E.g. `emscripten` or `android`.
204 A last usage is to develop programs as product lines with a main basic module (vanilla) and specific distinct features as flavor modules, then to combine them at compile-time.
206 $ nitc prog_vanilla.nit -m feature_chocolate.nit -m feature_cherry.nit
209 Define a specific property.
211 The `-D` option allows to refine a top-level method at compile-time.
212 This has basically the same effect than implementing a specific module that imports the main module of the program and refines the designated methods.
214 The designated method must be top-level function with no parameters that returns a Bool, an Int or a String.
216 The argument of the `-D` option is "{name}={value}".
217 For Bool, the argument can also be just "{name}", in this case, the value is considered to be `true`.
219 $ nitc foo.nit -D prefix=/opt/foo -D port=8080 -D with_ssl
222 Compile in release mode and finalize application.
224 Currently, this only affect the android platform.
227 Compile in debug mode.
229 Currently removes gcc optimizations.
230 Also preserves the source-files directory for C-debuggers.
232 For more debugging-related options, see also `--hardening` and `NIT_GC_OPTION`
236 ### `nitc` includes distinct compilation modes.
239 Use separate compilation (default mode).
241 In separate compilation, modules are compiled independently of their programs.
242 This makes the recompilation of programs faster since only the modified files need to be recompiled.
245 Use global compilation.
247 The produced executables may become huge and the compilation time is prohibitive.
248 But sometime, they are faster.
250 In practice, `--semi-global` produces nearly as fast but smaller executables.
255 Like `--separate` but use an erasure dynamic typing policy for generics and virtual types.
256 Usually you do not need this, even if you understand the previous sentence.
259 ## SEMI-GLOBAL OPTIMIZATIONS
261 In `--separate` and in `--erasure` modes, some optimization can be gained by relaxing the constraint about
262 the independence on programs.
264 Therefore, with these options, the produced executables may be faster and smaller but the recompilation time
268 Enable all semi-global optimizations.
271 Activate RTA (Rapid Type Analysis).
273 This option only make sense in `--erasure` to enable some semi-global optimizations.
275 RTA is implicitly enabled in `--separate` and `--global`.
277 ### `--inline-coloring-numbers`
278 Inline colors and ids (semi-global).
280 ### `--inline-some-methods`
281 Allow the separate compiler to inline some methods (semi-global).
284 ### `--direct-call-monomorph`
285 Allow the separate compiler to direct call monomorphic sites (semi-global).
288 ### `--skip-dead-methods`
289 Do not compile dead methods (semi-global).
292 ## LINK-BOOST OPTIMIZATIONS
294 In `--separate` and in `--erasure` modes, some optimization can be gained by hijacking the linker process.
296 Warning: these optimisations are not portable since they use extra features of the GNU linker `ld`.
297 However, there is very few reasons to not use them if GNU `ld` is available.
300 Enable all link-boost optimizations.
302 ### `--colors-are-symbols`
303 Store colors as symbols instead of static data.
305 By default, the various identifiers used to implement OO-mechanisms are stored as genuine constant static variables.
307 This option uses linker symbols to encode these identifiers.
308 This makes the compiled program faster since less indirections are required to get the values.
309 It also produces executables that are a little bit smaller since static memory does not have to store the colors.
311 ### `--substitute-monomorph`
312 Replace monomorphic trampolines with direct call.
314 Late-binding is implemented with *trampolines*, that are small functions that just select and jump the to right implementations.
315 If, at link-time, is it known that the target will always by the same implementation then all calls to the trampoline are replaced by
316 direct calls to this single implementation.
318 Note that using trampolines as indirection slows down the executable.
319 However, it is expected that the gain of monomorphic direct-calls overcompensates the additional indirections in polymorphic trampoline-calls.
321 Note: automatically enable option `--trampoline-call`.
323 ## DANGEROUS OPTIMIZATIONS
325 The following optimizations disable runtime checks.
326 It means that correct (non-buggy) programs may be slightly faster.
327 It also means that incorrect (buggy) programs may have unspecified behaviors
328 (e.g. formatting your hard drive or killing your cat).
330 In fact, these options are mainly used to bench the compilation results.
333 Disable all tests (dangerous).
335 ### `--no-check-covariance`
336 Disable type tests of covariant parameters (dangerous).
338 ### `--no-check-attr-isset`
339 Disable isset tests before each attribute access (dangerous).
341 ### `--no-check-assert`
342 Disable the evaluation of explicit `assert` and `as` (dangerous).
344 ### `--no-check-autocast`
345 Disable implicit casts on unsafe expression usage (dangerous).
347 ### `--no-check-null`
348 Disable tests of null receiver (dangerous).
350 ### `--no-check-erasure-cast`
351 Disable implicit casts on unsafe return with erasure-typing policy (dangerous).
356 These options are used to debug or to bench the compilation results.
357 Usually you do not need them since they make the generated code slower.
360 Generate contracts in the C code against bugs in the compiler.
362 ### `--no-shortcut-range`
363 Always instantiate a range and its iterator on 'for' loops.
365 ### `--no-union-attribute`
366 Put primitive attributes in a box instead of an union.
368 ### `--no-shortcut-equal`
369 Always call == in a polymorphic way.
371 ### `--no-tag-primitive`
372 Use only boxes for primitive types.
374 The separate compiler uses tagged values to encode common primitive types like Int, Bool and Char.
375 This option disables tags and forces such primitive values to be boxed.
376 The drawback is that each boxing costs a memory allocation thus increases the amount of work for the garbage collector.
378 However, in some cases, it is possible that this option improves performance since the absence of tags simplify the implementation
379 of OO mechanisms like method calls or equality tests.
381 ### `--no-inline-intern`
382 Do not inline call to intern methods.
384 ### `--colo-dead-methods`
385 Force colorization of dead methods.
387 ### `--no-gcc-directive`
388 Disable advanced gcc directives for optimization.
390 ### `--trampoline-call`
391 Use an indirection when calling.
393 Just add the trampolines of `--substitute-monomorph` without doing any aditionnal optimizations.
397 These options can be used to control the fine behavior of the tool.
398 They are useless for a normal user.
400 ### `--disable-phase`
401 Disable a specific phase; use `list` to get the list.
404 Only proceed to parse files.
406 ### `--only-metamodel`
407 Stop after meta-model processing.
409 ### `--ignore-visibility`
410 Do not check, and produce errors, on visibility issues.
413 Do not generate main entry point.
415 ### `--no-stacktrace`
416 The compiled program will not display stack traces on runtime errors.
418 Because stack traces rely on libunwind, this option might be useful in order to generate more portable binaries
419 since libunwind might be non available on the runtime system (or available with an ABI incompatible version).
421 The generated C is API-portable and can be reused, distributed and compiled on any supported system.
422 If the option `--no-stacktrace` is not used but the development files of the library `libunwind` are not available, then a warning will be displayed
423 and stack trace will be disabled.
425 Note that the `--no-stacktrace` option (or this absence) can be toggled manually in the generated Makefile (search `NO_STACKTRACE` in the Makefile).
426 Moreover, the environment variable `NIT_NO_STACK` (see bellow) can also be used at runtime to disable stack traces.
429 Maximum number of lines in generated C files. Use 0 for unlimited.
431 ### `--group-c-files`
432 Group all generated code in the same series of files.
435 Additional options to the `make` command.
437 $ nitc foo.nit --make-flags 'CC=clang' --make-flags 'CFLAGS="-O0 -g"'
439 ### `--typing-test-metrics`
440 Enable static and dynamic count of all type tests.
442 ### `--invocation-metrics`
443 Enable static and dynamic count of all method invocations.
445 ### `--isset-checks-metrics`
446 Enable static and dynamic count of isset checks before attributes access.
448 ### `--tables-metrics`
449 Enable static size measuring of tables used for vft, typing and resolution.
451 ### `--set-dummy-tool`
452 Set toolname and version to DUMMY. Useful for testing.
454 ### `--bash-completion`
455 Generate bash_completion file for this program.
458 Generate a stub manpage in pandoc markdown format.
461 Continue after errors, whatever the consequences.
463 The tool does not stop after some errors but continue until it produces incorrect result, crashes, erases the hard drive, or just continue forever in an infinite loop.
464 This option is used to test the robustness of the tools by allowing phases to progress on incorrect data.
466 # ENVIRONMENT VARIABLES
469 Base directory of the Nit installation.
471 When the `NIT_DIR` environment variable is set then it specifies the path of the Nit install directory.
473 This directory is used to locate binaries, shared files and the common libraries.
475 When unset, the directory is guessed according to some heuristic.
477 The `--nit-dir` option also set the base directory of the Nit installation but has precedence.
480 Additional include paths.
482 The `NIT_PATH` environment variable contains paths of directories containing Nit libraries.
483 Each path is separated with a column (`:`).
485 The `-I` option also add additional paths.
488 Runtime control of the garbage collector.
490 The behavior of the GC of the executables produced by nitc can be tuned with this environment variable.
492 The environment variable is used when programs are executed, not when they are compiled.
493 Thus, you do not need to recompile programs in order to tweak their GC options.
495 Available values are:
497 * boehm: use the Boehm-Demers-Weiser's conservative garbage collector (default).
498 * malloc: disable the GC and just use `malloc` without doing any `free`.
499 * large: disable the GC and just allocate a large memory area to use for all instantiation.
500 * help: show the list of available options.
503 Runtime control of stack traces.
505 By default, stack traces are printed when a runtime errors occurs during the execution of a compiled program.
506 When setting this environment variable to a non empty value, such stack traces are disabled.
508 The environment variable is used when programs are executed, not when they are compiled.
509 Thus, you do not need to recompile programs in order to disable generated stack traces.
511 Note that stack traces require that, during the compilation, development files of the library `libunwind` are available.
512 If they are not available, then programs are compiled without any stack trace support.
514 To completely disable stack traces, see the option `--no-stacktrace`.
518 The Nit language documentation and the source code of its tools and libraries may be downloaded from <http://nitlanguage.org>