Date: Mon, 10 Feb 2003 12:52:30 +0000 From: Trent Nelson <trent@limekiln.vcisp.net> To: David Leimbach <leimy2k@mac.com> Cc: freebsd-current@freebsd.org Subject: Re: Best method to produce patches? Message-ID: <20030210125230.GA70855@limekiln.vcisp.net> In-Reply-To: <8A57567D-3C7E-11D7-8E7D-0003937E39E0@mac.com> References: <8A57567D-3C7E-11D7-8E7D-0003937E39E0@mac.com>
index | next in thread | previous in thread | raw e-mail
On Sun, Feb 09, 2003 at 04:33:41PM -0600, David Leimbach wrote:
> I am about to try to make some changes to FreeBSD current...
>
> What is the recommend method to use for playing with the source?
I've attached an e-mail from Matt Dillon that gives a very good de-
scription for setting up a FreeBSD development environment.
> Thanks!
>
> Dave Leimbach
Date: Sat, 21 Dec 2002 16:41:23 -0800 (PST)
From: Matthew Dillon <dillon@apollo.backplane.com>
To: Trent Nelson <trent@alcyon-enterprises.com>
Subject: Re: Trying to chase up an old post.
:Hi Matt,
:
: You posted something to current@freebsd.org (or hackers@ possibly)
: just over a year ago describing how you set up your -stable and
: -current environments for doing development.
:
: I've attempted to search for the post, but I'm coming up with false
: hits left right and centre. Any idea which post I'm referring to,
: or even better, can you point me to a URL where it's been archived?
:
: Much appreciated.
:
: Regards,
:
: Trent.
:
:--
:Trent Nelson -- Director, Alcyon Enterprises, Ltd.
I remember making the post, but I don't remember when and I doubt
I could find it in my archives.
Hmm. This would be another good manual page. Maybe I will call
it 'developer' or 'development'. Ok, here we go:
ENVIRONMENT SETUP
Basically I recommend having at least two machines. Run -stable
on your main development system. Create a huge partition called
/FreeBSD. Mine is 12GB (and currently holds 8G of junk in it,
including portions of NetBSD, OpenBSD, and Linux as well as
FreeBSD).
REASON>> This way you can export /FreeBSD to any other machines
you have via read-only NFS without exposing sensitive partitions
on your main development machine.
REASON>> You always want your main development environment to be
on a stable, reliable platform, otherwise you might blow something
up and then not be able to fix it.
Use cvsup (once a night via cron) to keep a local copy of the
FreeBSD CVS tree.
mkdir /FreeBSD/FreeBSD-CVS
ln -s /FreeBSD/FreeBSD-CVS /home/ncvs
cron entry:
20 6 * * * /usr/local/bin/cvsup -g -r 20 -L 2 -h cvsup.freebsd.org /usr/share/examples/cvsup/cvs-supfile
Then use cvs to checkout and maintain a -stable source tree
and a -current source tree. I do this:
mkdir /FreeBSD/FreeBSD-4.x
mkdir /FreeBSD/FreeBSD-current
cd /FreeBSD/FreeBSD-4.x
cvs -d /home/ncvs checkout -rRELENG_4 src
cd /FreeBSD/FreeBSD-current
cvs -d /home/ncvs checkout src
cvs -d /home/ncvs checkout ports
cvs -d /home/ncvs checkout doc
REASON>> Keeping the broken-out source in /FreeBSD allows
you to export it to other machines along with the rest
of the development environment.
Now create a softlink for /usr/src and /usr/src2. I
usually point /usr/src at -stable and /usr/src2 at -current:
cd /usr
rm -rf src src2
ln -s /FreeBSD/FreeBSD-4.x/src src
ln -s /FreeBSD/FreeBSD-current/src src
Put /usr/obj in /FreeBSD as well, or give it its own partition
(at least 4GB is recommended). Example:
mkdir /FreeBSD/obj
cd /usr
rm -rf obj
ln -s /FreeBSD/obj obj
ALTERNATIVE:
(/usr/obj has its own partition)
REASON>> you are going to want to export /usr/obj via read-only NFS
to your other boxes, which I explain in the BUILDING section. If
you want to be able to compile the world and kernels on the clients,
rather then only compiling on your main development box, I recommend
making /usr/obj its own partition to make it easier to give each
client its own /usr/obj (for client-side compiling), or mounting
/usr/obj on the client from the main development server via read-only
NFS.
I usually keep track of ports via CVS and, as you can
see above, a checkedout version can be maintained in
/FreeBSD/FreeBSD-current/ports. However, in order
to be able to build ports on other machines you will
need to change the distfiles subdirectory:
cd /usr
rm -rf ports
ln -s /FreeBSD/FreeBSD-current/ports ports
cd /usr/ports (this pushes into the softlink)
rm -rf distfiles
ln -s /usr/ports.distfiles distfiles
mkdir /usr/ports.distfiles
mkdir /usr/ports.workdir
IN /etc/make.conf add
--------------------------------------
WRKDIRPREFIX=/usr/ports.workdir
--------------------------------------
REASON>> This allows you to export /usr/ports via a read-only NFS
mount. In fact, just exporting /FreeBSD also gives you ports for
free and on your other machines you can simply softlink
/usr/ports to /FreeBSD/FreeBSD-current/ports.
NOT!!! You may want to choose different directories for distfiles
and workdir, but try to make it consistent across all machines
because the softlink for /usr/ports/distfiles is in /FreeBSD and
must be the same for all machines since it is exported from your
master server. IN PARTICULAR, be aware that both the distfiles
directory and the working directory for building ports might require
hundred of megabytes of space in order to build certain ports, like
the openoffice port or the mozilla port.
EXPORTING VIA NFS FROM THE SERVER
Your /etc/exports file should look something like this:
--------------------------------------
/FreeBSD -ro -alldirs -maproot=root: -network YOURLAN -mask YOURLANMASK
/usr/obj -ro -alldirs -maproot=root: -network YOURLAN -mask YOURLANMASK
--------------------------------------
I strongly recommend only doing READ-ONLY exports. This is not only a
security mechanism (nobody can mess with your development source without
actually being on the development machine), but also a safety mechanism...
it is not usually a good idea to accidently modify /FreeBSD via a client,
especially if you are working on several clients at the same time. So
keep the exports read-only.
CLIENT ENVIRONMENT
Other machines... for example, your -current box or any other machine
you have, can import your development environment via a read-only
NFS mount of /FreeBSD:
An fstab entry looks like this:
--------------------------------------
yourserver:/FreeBSD /FreeBSD nfs ro 0 0
--------------------------------------
Each client should create softlinks links for /usr/ports and /usr/src
that point to the appropriate place. If the client is going to be
a -current box, point the /usr/src on the client at
/FreeBSD/FreeBSD-current/src. Otherwise point it at
/FreeBSD/FreeBSD-4.x/src.
(on client)
cd /usr
rm -rf ports src
ln -s /FreeBSD/FreeBSD-current/ports ports
ln -s /FreeBSD/FreeBSD-XXX/src src (XXX the type of environment
you want on the client, either
4.x or current)
If /usr/obj is its own partition on the server then create an NFS mount
in your fstab for it. Again, it should be a read-only mount.
--------------------------------------
yourserver:/usr/obj /usr/obj nfs ro 0 0
--------------------------------------
lf, instead, /usr/obj is a softlink on the server then create the same
softlink on the client.
cd /usr
rm -rf obj
ln -s <SAME_SOFTLINK_AS_ON_SERVER> obj
Make sure the appropriate directories and make.conf entries exist to
allow you to build ports on your client as well. Note that the ports
distribution is not branched, it exists on the HEAD branch only
(i.e. /FreeBSD/FreeBSD-current/ports).
BUILDING AND INSTALLING THE WORLD
On your main development server you can build a -stable world with:
cd /usr/src
make buildworld
You can also build -current on your main development box, even though
your main development box is running -stable (just don't install it
accidently :-)):
cd /usr/src2
make buildworld
When upgrading your main development box, be sure to not accidently
install -current. That's why I have the /usr/src softlink pointing
at -stable
INSTALLING THE WORLD AND INSTALLING KERNELS ON CLIENTS
You can build on your main development server and install on clients.
The main development server must export /FreeBSD and /usr/obj (if /usr/obj
is its own partition) via read-only NFS to the clients.
NOTE!!!>> If /usr/obj is a softlink on the main development server, it
must also be the EXACT SAME softlink on each client. This is because the
absolute paths are expected to be the same when building the world as when
installing it, and you generally build it on your main development box
and install it from a client.
On the client, installing the world is easy if it has NFS mounted
/FreeBSD and /usr/obj (or pointed /usr/obj as a softlink into /FreeBSD
in the precisely the same manner as the softlink is on the main
development box):
(ON THE CLIENT)
cd /usr/src
make installworld
BUILDING AND INSTALLING KERNELS
Building a -stable kernel (on your main development box):
cd /usr/src/sys/i386/conf
config KERNELNAME
cd /usr/src/sys/compile/KERNELNAME
make depend; make
Installing a -stable kernel (typically done on a client. Only do on
your main development server if you want to install a new kernel for
your main development server):
cd /usr/src/sys/compile/KERNELNAME
make install
Building a -current kernel
cd /usr/src
make buildkernel KERNCONF=KERNELNAME
Installing a -current kernerl (typically done on a client)
cd /usr/src (on the client this is typically a softlink to
/FreeBSD/FreeBSD-current/src, but if that confuses
you too much just use the same /usr/src and /usr/src2
softlinks as you have on the main development
server and then cd into /usr/src2)
make installkernel KERNCONF=KERNELNAME
DOING DEVELOPMENT ON A CLIENT, NOT JUST INSTALLING
I strongly recommend that you only mess around with the source on
your main development server. However, you may wish to do buildworlds
and buildkernel's on the clients (instead of on the main development
server) for testing or other reasons.
If you want to be able to compile the world or kernels directly on a
client, the client needs its own private /usr/obj. This could just be
/usr/obj:
cd /usr
rm -rf obj
mkdir obj
Then you can build and install the world and kernels on a client the
same way you would build them on the server.
CVS UPDATING
The advantage of using cvsup to maintain an uptodate copy of the CVS
repository instead of using it to maintain source trees is that you
can pick and choose when you bring your source tree (or pieces of your
source tree) up to date. By using a cron job to maintain an uptodate
copy of the CVS repository, you can update your source tree at any
time as follows:
(on the main development server)
cd /usr/src
cvs -d /home/ncvs update
cd /usr/src2
cvs -d /home/ncvs update
cd /usr/ports
cvs -d /home/ncvs update
It is that simple, and since you are exporting the whole lot to your
clients, your clients have immediately visibility into the updated
source.
-Matt
----- End forwarded message -----
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030210125230.GA70855>
