I do my FreeBSD development using
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 email@example.com:adventureloop/freebsd.git (fetch) origin firstname.lastname@example.org: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
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 ...
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 allows me to have many windows in a session, I have a serious
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
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
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