About the OPNsense tools ======================== In conjunction with src.git, ports.git, core.git and plugins.git they create sets, packages and images for the OPNsense project. Setting up a build system ========================= Install [FreeBSD](https://www.freebsd.org/) 11.1-RELEASE (i386 or amd64 depending on your target) on a machine with at least 25GB of hard disk (UFS works better than ZFS) and at least 4GB of RAM to successfully build all standard images. All tasks require a root user. Do the following to grab the repositories (overwriting standard ports and src): # pkg install git # cd /usr # git clone https://github.com/opnsense/tools # cd tools # make update TL;DR ===== # make dvd If successful, a dvd image can be found under: # make print-IMAGESDIR Detailed build steps and options ================================ How to specify build options on the command line ------------------------------------------------ The build is broken down into individual stages: base, kernel and ports can be built separately and repeatedly without affecting the others. All stages can be reinvoked and continue building without cleaning the previous progress. A final stage assembles all three stages into a target image. All build steps are invoked via make(1): # make step OPTION="value" Available early build options are: * CONFIG: reads the below from the specified file * SETTINGS: the name of the requested config directory Available build options are: * ADDITIONS: a list of packages/plugins to add to images * ARCH: the target architecture if not native * DEVICE: loads device-specific modifications, e.g. "a10" (default) * FLAVOUR: "OpenSSL" (default), "LibreSSL", "Base" * KERNEL: the kernel config to use, e.g. SMP (default) * MIRRORS: a list of mirrors to prefetch sets from * NAME: "OPNsense" (default) * PRIVKEY: the private key for signing sets * PUBKEY: the public key for signing sets * SPEED: serial speed, e.g. "115200" (default) * TYPE: the base name of the top package to be installed * SUFFIX: the suffix of top package name (empty, "-devel") * UEFI: "yes" for amd64 hybrid images with optional UEFI boot * VERSION: a version tag (if applicable) How to specify build options via configuration file --------------------------------------------------- The default CONFIG file is under "config/SETTINGS/build.conf". It can also be overrided by "/dev/null". How to run individual or composite build steps ---------------------------------------------- Kernel, base, packages and release sets are stored under: # make print-SETSDIR All final images are stored under: # make print-IMAGESDIR Build the userland binaries, bootloader and administrative files: # make base Build the kernel and loadable kernel modules: # make kernel Build all the third-party ports: # make ports Build additional plugins if needed: # make plugins Wrap up our core as a package: # make core A dvd live image is created using: # make dvd A serial memstick live image is created using: # make serial A vga memstick live image is created using: # make vga A flash card full disk image is created using: # make nano A virtual machine full disk image is created using: # make vm Release sets can be built using: # make release VERSION=product.version.number_revision Cross-building for other architecures ------------------------------------- This feature is currently experimental and tailored for use with the Raspberry Pi 2. It requires installation of the qemu package for user mode emulation: # pkg install qemu-user-static A cross-build on the operating system sources is executed by specifying the target architecture and custom kernel: # make base kernel ARCH=arm:armv6 KERNEL=SMP-RPI2 In order to speed up building of using an emulated packages build, the xtools set can be created like so: # make xtools ARCH=arm:armv6 The xtools set is then used during the packages build similar to the distfiles set. # make packages ARCH=arm:armv6 The image will also require a matching u-boot package: # pkg install u-boot-rpi2 The final image is built using: # make arm- ARCH=arm:armv6 About other scripts and tweaks ============================== Device-specific settings ------------------------ Device-specific settings can be found and added in the device/ directory. Of special interest are hooks into the build process for required non-default settings for image builds. The .conf files are shell scrips that can define hooks in the form of e.g.: serial_hook() { # ${1} is the target file system root touch ${1}/my_custom_file } These hooks are available for all image types, namely dvd, nano, serial, vga and vm. Device-specific hooks are loaded after config-specific hooks and both of them can coexist in a given build. Updating the code repositories ------------------------------ Updating all or individual repositories can be done as follows: # make update[-[,...]] Available update options are: core, plugins, ports, src, tools Regression tests ---------------- Before building images, you can run the regression tests to check the integrity of your core.git modifications plus generate output for the style checker: # make test Advanced package builds ----------------------- For very fast ports rebuilding of already installed packages the following works: # make ports-[,...] For even faster ports building it may be of use to cache all distribution files before running the actual build: # make distfiles Core packages can be batch-built using: # make core-[,...] Package sets ready for web server deployment are automatically generated and modified by ports.sh, plugins.sh and core.sh. If signing keys are available, the packages set will be signed twice, first embedded into repository metadata (inside) and then again as a flat file (outside) to ensure integrity. Acquiring precompiled sets from the mirrors ------------------------------------------- Compiled sets can be prefetched from a mirror if they exist, while removing any previously available set: # make prefetch-