v0.5 Release Notes
==================

FAB: product fabrication framework

This version of Fab is actually the second generation framework, the 
first being referred to as oldfab.

The word "Fab" originates from the microelectronics industry. A fab, or
fabrication plant is a factory where devices (eg. integrated circuits)
are manufactured for one of more customers. A fab is semantically
connected to the most cutting edge technological factories in existence
(Silicon chip foundries).

A fab is a very tightly controlled environment (clean room), but instead
of keeping out physical impurities (e.g., dust and dirt), the Fab is
used in fabricating systems while tightly controlling "logical"
impurities (e.g., security threats, malware, etc.)

These release notes only contain a high-level overview, please refer to 
the design notes for detailed information, and help from the commands 
themeselves.


OVERVIEW
--------
The fab provides 'toolchain' utilities, which allows us to build products 
and collaborate on them using the same workflow and tools used on 
software projects.

Building is performed per-product, each in its own directory. We leverage 
'make' to implement the 'build pipeline', git and covin for revision 
control and collaboration.

The output of a product is the product itself, and a recipe (very small 
footprint compared to the product) which can be use to automatically 
reproduce the product bit for bit.
                   

TERMINOLOGY
-----------
product: the final product used by the end-user
    the product is generated by formatting the "patched root"

root.patched: the chroot'able root filesystem of a product
    patched manually or automatically
    can be re-created automatically by applying the root patch as an overlay to `the root'

root.build: the chroot'able root filesystem of a product
    built by applying the "root.spec" on the bootstrap

bootstrap: the minimal chroot'able filesystem used to bootstrap the root
    built from a "bootstrap.spec"

spec: a set of (package name, package version tuples)
    a spec is created from a plan against a specific pool
    the same plan will generate different specs against different pools

plan: set of package names
    root plan
        the recursable plan from which the root.spec is created
        recursable means we lookup the dependencies of listed packages recursively
    
    bootstrap plan
        the non-recursable plan from which we create the bootstrap spec
        non-recursable means no recursion of the plan (this is planned to 
change)


CLI
---
Fab has 4 basic commands,
    plan-resolve        Resolve plan into spec using latest packages from pool
    spec-install        Install packages into chroot according to spec
    apply-removelist    Remove files and folders according to removelist
    apply-overlay       Apply overlay ontop of given path

4 internal/advanced commands,
    cpp                 Pre-process a plan
    chroot              Executes command in chroot
    chroot-umount       Umount chroot virtual filesystems if mounted
    spec-get            Get packages according to spec
        
and can be configured via 3 environment variables,
    FAB_PLAN_INCLUDE_PATH   Global include path for plan preprocessing
    FAB_POOL_PATH           Lookup path for a relative pool path
    FAB_TMPDIR              Temporary storage (defaults to /var/tmp)

