Puritan
Puritan
Source code. README. Latest version: ui: bd0fefc0, compilation: e077d7a6. Puritan is a disk-image compiler which converts source material including packages, activities, and hacks into installable disk images. It consists of two pieces: a UI and a family of compilations (example). The compilations are simple Python programs which populate a filesystem with the materials you supply, then format it for distribution. The UI runs the compilations in a controlled environment created by Mock and configured according to the compilation's bootstrap and dependencies files.
Puritan was developed as a replacement for Pilgrim but was never officially adopted by OLPC. For details on the active OLPC build system, see Build system.
Principles
Puritan is based on several fundamental principles.
- Tools should be usable for both decentralized and centralized patterns of development.
- People **will** want to make unpackaged changes to their builds.
- Caching matters.
- Interactive development matters.
- Build reproducibility matters.
- Error-detection, handling, and cleanup matter.
- People working on the OLPC build system will become accustomed to git and python.
Instructions
Preparation
To use Puritan, you need to install dependencies:
# NB: mock >= 0.9.7 is needed. # debian: sudo apt-get install mock git-core # fedora: sudo yum install mock git-core # both sudo usermod -a -G mock $USER newgrp mock
and to check out and run a 'ui' and a 'compilation'.
(git clone git://dev.laptop.org/users/mstone/puritan compilation; cd compilation; git branch --track 767 origin/767; git checkout 767) git clone git://dev.laptop.org/users/mstone/puritan ui python2.5 ui/puritan/main.py # read help sudo python2.5 ui/puritan/main.py -v build ./compilation HEAD ./results -- -i
Interactive Debugging
The '-i' option above enables an interactive error-handling mode. If an error occurs,
with the most recent compilation and ui, you will be dropped directly into bash inside the buildroot.
- to resume the compilation, type
exit 0
- to quit the compilation, type
exit 1
with earlier compilations which still support interactive error-handling: instructions
Other Notes
- Fedora
Note: if you encounter permission errors when running this command, you may need to:
sudo setenforce 0 # disable selinux
Note: a word of warning: while _my_ uis and compilations will treat your computer nicely, other people's might not. Caveat emptor.
- Ubuntu
mock_0.9.7-2 on ubuntu requires [1] in order to run. Additionally, if you run puritan as root, you should either
usermod -a -G mock -u $SUDO_UID unset SUDO_UID # or
- All
Some puritan compilations now feature a 'download' operation which can be used to download all packages that the compilation will install for later (offline) use:
sudo python2.5 ui/puritan/main.py -v download ./compilation HEAD ./results
This command will generate a program in the results directory which can be used to download the packages.
Configuration
Puritan's compilations are highly and easily configurable by means of small modifications to files and directories.
Choosing stages and products
Current compilations' main.py file contain a section like
tasks = dict( build = [ 'bootstrap', ['make_chroot', 'install_pkgs', 'install_hacks'], 'final_install', 'produce_tree', 'produce_jffs2', 'produce_tar', 'publish', ], download = ['make_chroot', 'download_pkgs'], run = ['run'], )
By adding and removing entries to this datastructure, builders may customize which compilation stages will be performed in response to a request to 'build' or to 'download' or to 'run' the compiler. (New subcommands can be added in the obvious fashion.)
Choosing package repos
Current compilations' bootstrap.py contains lines like
smart(['channel', '-y', '--add', '8.2-fedora', 'type=rpm-md', 'baseurl=http://mock.laptop.org/repos/koji.dist-olpc3-testing/'])
which direct the smart package manager to pull packages from one of the several yum-format RPM repository located at mock.laptop.org/repos.
(The smart package manager is package- and repository-format agnostic and can process many common formats including apt-dpkg and yum-rpm.)
Choosing packages
Current compilations' package manifests are configured by means of the contents of the config/packages directory. In order to add or remove packages from the manifest, simply touch or remove the appropriately named files in this directory.
Caching
Puritan uses technologies which can be easily configured to use caches of data. Three ways to improve puritan's caching behavior include:
- Using mock buildroot caching to conserve bandwidth when preparing buildroots.
- Configuring smart to use an http caching proxy in the compilation's bootstrap.py file.
- Configuring smart to pull packages from a (manually generated) local package repository (rather than from the internet), also via bootstrap.py.
NB: The most recent puritan compilation automatically caches packages it downloads in a directory named 'smart/packages' in the compilation.
Notes
- with some uis and compilations, the last step may fail because /etc/mock/fedora-9-i386.cfg is not present in Debian's mock package 0.9.7-2
- one workaround is to create it from http://teach.laptop.org/~mstone/fedora-9-i386.cfg.
- Mock and SElinux do not interact very well.
- at least one workaround is discussed on the Fedora MockTricks] page.
Help Out
Finally, please help improve puritan by:
- Making puritan work on your platform - it's only dependencies are python2.5, git-core, and mock!
- Maintaining the devel_ext3 compilation
- Adding some reasonable package or buildroot caching system so that it runs faster without impairing build repeatability
- Improving the UI with commands for manipulating compilations, or for diffing builds, or for profiling compilations, or ...