110 lines
3.7 KiB
Text
110 lines
3.7 KiB
Text
bmake v3
|
|
|
|
This directory contains a port of the BSD make tool (from NetBSD)
|
|
I have run it on SunOS,Solaris,HP-UX 9 and IRIX.
|
|
|
|
Version 3 is has been re-worked from scratch to better facilitate
|
|
importing newer make(1) versions from NetBSD. The original code base
|
|
was NetBSD-1.0, so version 3 was built by doing a fresh import of the
|
|
NetBSD-1.0 usr.bin/make, adding the autoconf and other portability
|
|
patches to sync it with bmake v2, and then NetBSD's make
|
|
of Feb 20, 2000 was imported and conflicts dealt with.
|
|
NetBSD's make was again imported on June 6 and December 15, 2000.
|
|
|
|
Note: when cvs importing newer versions
|
|
it is important to (in usr.bin/make):
|
|
|
|
mv config.h make-conf.h
|
|
mv Makefile Makefile.in
|
|
|
|
before running cvs import.
|
|
|
|
Building is simply a matter of:
|
|
|
|
configure
|
|
make -f makefile.boot
|
|
make -f makefile.boot install
|
|
make -f makefile.boot install-man
|
|
make -f makefile.boot install-mk
|
|
|
|
The install-mk target is only useful if you unpacked [bsd-]mk.tar.gz
|
|
under the bmake directory.
|
|
|
|
if you have GNU make or a make which supports VPATH, you can build it
|
|
in a separate directory:
|
|
|
|
here=`pwd`
|
|
mkdir /tmp/bmake
|
|
cd /tmp/bmake
|
|
$here/configure
|
|
gmake -f makefile.boot
|
|
gmake -f makefile.boot install
|
|
gmake -f makefile.boot install-man
|
|
gmake -f makefile.boot install-mk
|
|
|
|
To make much use of bmake you will need the bsd.*.mk macros or my
|
|
portable *.mk macros. See
|
|
ftp://ftp.quick.com.au/pub/sjg/bsd-mk.tar.gz
|
|
ftp://ftp.quick.com.au/pub/sjg/mk.tar.gz
|
|
|
|
If you have an earlier version of bmake installed you can use that
|
|
with the generated Makefile.
|
|
|
|
Apart from new features such as .PARSEDIR picked up from the recent
|
|
NetBSD make, this version has improvments (which are also in NetBSD's
|
|
make or soon will be) to facilitate using MAKEOBJDIRPREFIX to support
|
|
true read-only src trees. See also ChangeLog.
|
|
|
|
MAKEOBJDIRPREFIX:
|
|
|
|
When MAKEOBJDIRPREFIX is set in the environment make(1) will attempt
|
|
to chdir(${MAKEOBJDIRPREFIX}${.CUDRIR}) and use that as its objdir.
|
|
Because the directory tree under ${MAKEOBJDIRPREFIX} is a mirror of
|
|
the src tree, make ends up chdir'ing to objdirs that would not exist
|
|
otherwise. That is, when using normal ./obj dirs (or symlinks) only
|
|
Makefiles which include obj.mk get a separate objdir. When using
|
|
MAKEOBJDIRPREFIX any directory which has subdirs that use obj.mk will
|
|
have an objdir, thus Makefiles which were written expecting to process
|
|
in ${.CURDIR} may break. In particular, Makefiles which do:
|
|
|
|
build:
|
|
${.MAKE} something
|
|
${.MAKE} else
|
|
|
|
will break as the sub-make will not find a Makefile in
|
|
${MAKEOBJDIRPREFIX}${.CUDRIR}. Whereas
|
|
|
|
build:
|
|
cd ${.CURDIR} && ${.MAKE} something
|
|
cd ${.CURDIR} && ${.MAKE} else
|
|
|
|
will work fine. To avoid the need to re-work these Makefiles we
|
|
check for running ${.MAKE} or ${.MAKE:T} without a preceeding cd and
|
|
effectively insert one. This feature only operates if
|
|
MAKEOBJDIRPREFIX (or MAKEOBJDIR) is set and can be dissabled by
|
|
defining NOCHECKMAKECHDIR.
|
|
|
|
Another problem arrises from make(1) overriding the physical location
|
|
returned by getcwd() with the logical one from $PWD. We dissable this
|
|
feature if MAKEOBJDIRPREFIX is set to avoid the situation where
|
|
make(1) behaves differently depending on how it got to a directory.
|
|
This avoids lossage like the following example.
|
|
|
|
If /usr/local/src is a symlink to /d3/src:
|
|
|
|
cd /usr/local/src/project
|
|
MAKEOBJDIRPREFIX=/tmp/obj make obj
|
|
===> sub1
|
|
/d3/src/project/sub1 -> /tmp/obj/d3/src/project/sub1
|
|
...
|
|
|
|
cd /usr/local/src/project/sub1
|
|
MAKEOBJDIRPREFIX=/tmp/obj make obj
|
|
/usr/local/src/project/sub1 -> /tmp/obj/usr/local/src/project/sub1
|
|
|
|
the expected objdir changes depending on circumstances - which
|
|
means that 9 times out of 10 you'll end up trying to polute
|
|
curdir because the objdir you expected does not exist.
|
|
|
|
|
|
--sjg
|