### Porting to a new platform

Porting to a new 32 or 64 bits platform is usually automatically handled
by `make full`:

  -  The makefile compiles `src/tools/make/configure.c` with the
     platform's default C compiler.
  -  `configure.c` determines which types to use for 32 and 64 bit
     variables, and their alignment.
  -  `configure.c` uses a number of strategies to determine the
     operating system it is running on and what the appropriate
     installation directory will be.
  -  `configure.c` sets makefile variables that are used to select
     which of 5 sets of preprepared C source files to build to create
     the bootstrap compiler.

On most systems this will be sufficient for `make full` to build
and install the compiler and libraries.

`make full` will terminate with a message such as:

`--- Branch v2docs freebsd gcc LP64 confidence tests passed ---`

#### Updating configure.c

It should only be necessary to change `configure.c` if it
cannot determine the correct install directory.

In this case add code to `src/tools/make/configure.c`'s
function `determineOS()` to set the `os` variable to the name
of the new OS platform.

The following variables are also set by `determineOS()` to the
followind defaults:

variable     | set to                 | example
--------     | ------                 | -------
`platform`   | Base platform          | `"unix"`
`binext`     | Binary file extension  | `""`
`staticlink` | Static linking option  | `"-static"`

If your new platform does not support static removing, set the
`staticlink` variable to `""`.

Then modify `determineInstallDirectory()` to select the correct
instalation root based on the changes you have made to `determineOS()`.

The `platform` variable selects which variety of the Platform
module is compiled. Vishap provides two varieties, one specific
to the Windows API (`Platformwindows.Mod`), and one suitable for
Unix-like systems including Linux, BSD, Android and cygwin
(`Platformunix.Mod`).


#### How to add a new compiler option

 - Define it in OPM as a constant before defopt is defined.
 - Define a BOOLEAN variable in OPM which will describe if setting is set.
 - Add handling of a new option in OPM.ScanOptions
 - Set your BOOLEAN value in OPM.OpenPari (or in ScanOptions, after the
   CASE) so you can check it later.
 - Check your boolean when necessary, (see useParFile in OPM.GetOptions)
 - Add it in OPC.GenHeaderMsg function.

#### Known bugs

When using SYSTEM.LSH(s, n) where s is SET,
the C compiler generates an error like
`error: duplicate 'unsigned'`,
that's because SET is defined as unsigned in SYSTEM.h,
while LSH is defined in SYSTEM.h as ((t)((unsigned t)(x)<<(n))),
and it makes not possible to make SYSTEM.LSH with type SET.

I don't want to prohibit it at the parser level
because C backend is only one of possible backends.

The solution currently is to cast set type to longint before lsh-ing it.
And then casting it back to set if necessary.
