About moulin ========================== The primary purpose of `moulin` is to build complex images for embedded devices. Imagine that you are running a hypervisor (like Xen or KVM) on your device, and you want to build multiple VM images with one simple command. `moulin` is made exactly for this task. But `moulin` can also be used to build simpler projects like standalone Yocto distribution or AOSP. As the `moulin` project file includes both code location and build instructions, it is much easier to invoke :code:`moulin myproject.yaml` to get the complete build than to fumble with Yocto layers and configs. Main purpose ------------ In the modern world, even embedded systems can benefit from virtualization technologies. For example, the ARMv8 architecture has built-in virtualization extensions, so both Xen hypervisor and KVM can run on a variety of ARMv8-based SoCs. In the embedded world, it is natural to have some way to build the whole bootable image with one command. But there is no easy way to build multiple different virtual machine images. For example, we want to build a Linux-based host VM, Android, and another Linux distro as a guest VM. `moulin` was created exactly for this purpose. Most of the modern BSPs are Yocto-based Linux distributions with vendor-specific changes. Mobile chips likely will have Android Open Source (AOSP) support as well. So right now, `moulin` is focused on supporting these two build systems. More will be added later. Design ------ `moulin` is not a replacement for `make` or `bitbake`. It merely processes the project YAML file and generates `Ninja `_ build file. So, the actual job runner is the Ninja. On the other hand, the `moulin` project files describe the whole build, with source code locations, build options, dependencies between images, and optional parameters. Requirements and Installation ----------------------------- `moulin` requires Python 3.6+ to run. You might need :code:`pip` or :code:`pip3` tool to install it. `moulin` generates `build.ninja` compatible with ninja 1.10+. This is because lower versions of Ninja do not support multiple outputs. So if you run Ninja and see an error message like this :: multiple outputs aren't (yet?) supported by depslog you need to get a newer version from ``_. Also, `moulin` requires :code:`pygit2`. If it is not installed on your system, :code:`pip` will try to install it from the repository. It may fail if you are missing :code:`libgit2` development files, or if installed :code:`libgit2` is too old. So, it is better to install :code:`pygit2` globally. For example, on Ubuntu 18.04 you need to install :code:`python3-pygit2` package. `moulin` source code is stored at `GitHub `_. The preferred way to install it right now is to put it in your local per-user storage using :: pip3 install --user git+https://github.com/xen-troops/moulin command. Make sure that your :code:`PATH` environment variable includes :code:`/home/${USER}/.local/bin`. You can encounter a problem with `pygit2` installation on some Ubuntu or Debian distribution due to this `bug `_. In this case, you will need to use the following command :: PIP_IGNORE_INSTALLED=0 pip3 install --user git+https://github.com/xen-troops/moulin as a workaround. Alternatively, you can clone the mentioned git repository and invoke :code:`moulin.py` directly.