My FreeBSD Development Setup
I do my FreeBSD development using
git
,
tmux
,
vim
and
cscope
.
I keep a FreeBSD fork on my github, I have forked https://github.com/freebsd/freebsd to https://github.com/adventureloop/freebsd
On my fork I have the freebsd/freebsd repo set as an upstream
$ git remote -v
origin git@github.com:adventureloop/freebsd.git (fetch)
origin git@github.com:adventureloop/freebsd.git (push)
upstream https://github.com/freebsd/freebsd.git (fetch)
upstream https://github.com/freebsd/freebsd.git (push)
See this article for information on setting this up https://help.github.com/en/articles/configuring-a-remote-for-a-fork
I do all work on branches using worktrees, keeping the master branch clean.
Periodically I sync the master branch with the FreeBSD upstream:
$ cd ~/code/freebsd-dev/freebsd-git
$ git checkout master
$ git fetch upstream
$ git merge upstream/master
$ git push
I have a development setup based on Ian Lapore's arm set up documented on the FreeBSD wiki https://wiki.freebsd.org/FreeBSD/arm/crossbuild
I have a
freebsd-dev
directory in my code directory. It their I keep a copy of
FreeBSD in
freebsd-git
, and
obj
directory for build output and a projects
directory for in progress code.
$ tree -L2
.
├── diffs
│ ├── D15222.diff
│ └── old
├── dstdir
│ ├── boot
│ ├── METALOG
│ └── usr
├── freebsd-git
│ ├── bin
│ ├── sbin
...
│ └── usr.sbin
├── obj
│ └── usr
├── projects
│ ├── atomicstats
│ ├── axp288
│ ├── bugsquash
│ ├── byebyejumbograms
...
I use
git
worktrees for ongoing projects.
git
worktrees allow you to have a
shallow file system copy on a
git
branch in a directory.
When starting a new project I do something like:
$ cd ~/code/freebsd-dev/freebsd-git
$ git worktree add thj/newdevelopment ../projects/newdevelopment master
$ cd ../projects/newdevelopment
Once the worktree is set up I launch a
tmux
session in the projects directory.
Each random idea or itch I have, if there is enough there, ends up with a
project worktree and a
tmux
session.
tmux
allows me to have many windows in a session, I have a serious
tmux
problem. Right now I have 11 sessions with 42 windows across them. This is a
good indicator of my focus level.
I do FreeBSD development with
cscope
and
vim
. With
tmux
splits I normally
have an open file and I use other
cscope
instances in
tmux
windows to search
for things I need in the tree.
I do testing in a
bhyve
vm and leave the serial port in a
tmux
window
somewhere. I follow the setup in the FreeBSD
handbook
and back each vm
with a zfs dataset.
I do FreeBSD kernel builds using a command like:
env MAKEOBJDIRPREFIX=/home/tom/code/freebsd-dev/obj make -j 44 buildkernel \
-DKERNFAST installkernel \
-DNO_ROOT DESTDIR=/home/tom/code/freebsd-dev/dstdir
I then ship kernels to the test vm with scp. jhb@ has a nicer method using the
bhyve-loader
, but I am yet to try it.
When changes are maturing I create reviews for them using arcanist, manu@ has a good article on doing this