# flex and bison binaries

This folder contains the flex and bison binaries. We use these binaries to
generate the ANGLE translator's lexer and parser.

Use the script [`update_flex_bison_binaries.py`](update_flex_bison_binaries.py)
to update the versions of these binaries in cloud storage. It must be run on
Linux or Windows. It will update the SHAs for your platform. After running the
script run `git commit` and then `git cl upload` to code review using the normal
review process. You will also want to run
[`scripts/run_code_generation.py`](../../scripts/run_code_generation.py) to
update the generated files.

Please update both Windows and Linux binaries at the same time. Start with
Windows, then merge your work into a single CL that updates both binaries
simultaneously. Note that we don't currently support Mac for generating the
lexer and parser files. If we do we should add a flex/bison download for Mac
as well.

Contact jmadill or syoussefi for any help with updating the binaries.

## Updating flex and bison binaries

This is expected to be a rare operation, and is currently done based on the
following instructions.  Note: get the binaries first on windows, as only a
single option is available, then build the binaries for the same version on
Linux.

### On Windows

Install MSys2 (x86_64) from http://www.msys2.org/ on Windows.  `flex` should
already be installed.  Install bison:

```
$ pacman -S bison
```

Note the versions of flex and bison, so you can build the exact same versions on Linux.
For example:

```
$ flex --version
flex 2.6.4

$ bison --version
bison (GNU Bison) 3.8.2
```

The only dependencies outside /Windows/ from MSys2 should be the following:

```
msys-intl-8.dll
msys-iconv-2.dll
msys-2.0.dll
```

This can be verified with:

```
$ ldd /usr/bin/flex
$ ldd /usr/bin/bison
```

Additionally, we need the binary for m4 at `/usr/bin/m4`.

Copy all these 5 files to this directory:

```
$ cd angle/
$ cp /usr/bin/flex.exe \
     /usr/bin/bison.exe \
     /usr/bin/m4.exe \
     /usr/bin/msys-intl-8.dll \
     /usr/bin/msys-iconv-2.dll \
     /usr/bin/msys-2.0.dll \
     tools/flex-bison/windows/
```

Upload the binaries:

```
$ cd angle/
$ py tools/flex-bison/update_flex_bison_binaries.py
```

### On Linux

```
# Get the source of flex
$ git clone https://github.com/westes/flex.git
$ cd flex/
# Checkout the same version as msys2 on windows
$ git checkout v2.6.4
# Build
$ autoreconf -i
$ mkdir build && cd build
$ ../configure CFLAGS="-O2 -D_GNU_SOURCE"
$ make -j
```

```
# Get the source of bison
$ curl http://ftp.gnu.org/gnu/bison/bison-3.8.2.tar.xz | tar -xJ
$ cd bison-3.8.2
# Build
$ mkdir build && cd build
$ ../configure CFLAGS="-O2"
$ make -j
```

Note: Bison's [home page][Bison] lists ftp server and other mirrors.  If the
above link is broken, replace with a mirror.

Copy the 2 executables to this directory:

```
$ cd angle/
$ cp /path/to/flex/build/src/flex \
     /path/to/bison/build/src/bison \
     tools/flex-bison/linux/
```

Upload the binaries:

```
$ cd angle/
$ ./tools/flex-bison/update_flex_bison_binaries.py
```

[Bison]: https://www.gnu.org/software/bison/
