Suppose you want your app to run on Ubuntu. Your development machine runs Ubuntu 18. But you also want users on Ubuntu 16 to be able to execute your app.
The (shared) libraries on Linux systems are normally not backwards-compatible. This means that, most likely, when you build your app on Ubuntu 18, then it won't run on Ubuntu 16.
To solve this, fbs now lets you use [Docker](https://www.docker.com/) virtual machines for building your app. This lets you build your app inside a virtual machine (=Docker container) running Ubuntu 14. That way, everyone on Ubuntu 14+ can run your app.
There are now two new commands: `fbs buildvm <name>` and `fbs runvm <name>`. The first initializes the given Docker container; the latter runs it. Here's what this looks like:
Initialise the container:
(venv) michael:~/Temp$ fbs buildvm ubuntu
Done. You can now execute:
fbs runvm ubuntu
Run it:
(venv) michael:~/Temp$ fbs runvm ubuntu
You are now in a Docker container running Ubuntu. To build your app
for this platform, use the normal commands `fbs freeze` etc.
Note that you can't launch GUIs here. So eg. `fbs run` won't work.
Another caveat is that target/ is special here: It symlinks to your
usual target/ubuntu/. So when you are done and type `exit` to leave
this container, you can find the produced binaries there.
Freeze your app. Note how the `ubuntu:` prefix indicates that you are inside the VM:
(venv) ubuntu:MyApp$ fbs freeze
Exit the container:
(venv) ubuntu:MyApp$ exit
Now, back outside the VM, run the binary that was just produced. Note the `ubuntu/` subdirectory of the `target/` directory:
(venv) michael:~/Temp$ target/ubuntu/MyApp/MyApp
In addition to `ubuntu`, fbs currently supports `arch` and `fedora` for building for Arch and Fedora Linux, respectively.