# From: /usr/src/sys/Makefile V1.4 <stacey@guug.de>
# Copyright Julian Stacey, Munich Oct. 1993, Free Software, No Liability
# For Legalities see end of file.
# Makefile & Makefile_sub.c are for the FreeBSD kernel usually
# found in /usr/src/sys. They provide:
# - Kernel configuration & make, defaulting to a kernel flavour
# automatically selected on a host name basis.
# - Automatic config prior to make if configuration name changes.
# - depend is done automatically.
# - Overide of default flavour by either "make CONFIG=whatever"
# or by editing default file.
# - Selection precedence order & examples:
# Highest: make CONFIG=your_flavour
# Medium: edit ${DEFAULT_FLAVOUR} contents to flavour
# Lowest: Makefile internally does CONFIG=`hostname`
# TO SELECT YOUR FAVOURITE KERNEL FLAVOUR BY DEFAULT:
# Move your favourite i386/conf configuration file to
# [/sys/]i386/conf/`hostname`
# Examples of how to force compilation of non hostname configurations:
# b) echo "GENERICAH" > .config.default ; make
# EXTERNAL ENVIRONMENT VARIABLES:
# MACHINE Mandatory. Must be preset before make is invoked,
# DESTDIR Optional. If preset in the environment,
# BOOT_SYS Optional. Set to enable makes in the i386/boot
# (may later be un-necessary,
# if we use SUBDIR=${MACHINE}/boot).
# BOOT_FLAG Optional. Set to null (with "BOOT_FLAG=") to
# allow makes in i386/boot,
# (overrides the default make -n).
# CONFIG Optional Usage as shown above.
# DEBUG_SYS Optional Preset to debug makefile.
# REQUIREMENTS: bsd-make, a cpp.
# obj: label needs to be filled out:
# Till then binaries get compiled in source tree,
# which isnt nice for following reasons:
# - If source is on a cd-rom,
# - If source is on a networked source tree serving
# several simultaneous compiles
# Local variants of Makefile_sub .config.now, .config.last
# .config.makefile will collide).
# Work around problem for now by ensuring each compile is
# done in its own seperate writable source tree, with symbolic
# links pointing to each source file (including such as
# Makefile & Makefile_sub.c)
# Review whether I still need .config.import in
# Makefile & Makefile_sub.c
# BUGS: If old config that does not recognise config "386bsd" at 0x...
# complains of syntax error, no error code is received
# the make then later fails.
# -----------------------------------------------------------------------------
# - If changing names ensure consistency in Makefile & Makefile_sub.c.
# - I do not use a method whereby I would assume a local hostname in
# DEFAULT_FLAVOUR, instead I take `hostname` if it is empty
# (as distributed) this avoids problems of:
# a) source tree copied unclean to other systems
# b) source tree shared by several nfs mounted hosts,
# - Cpp is used to generate the $(MAKEFILE_KERNEL), to get dependency labels
# (to the left of the colon) such as CONFIG_TREE_TEST to be recognised
# by freebsd make (I couldnt in a simple makefile use labels like:
# compile/${THIS_FLAVOUR}/386bsd: )
# - The driving source is simply called Makefile to allow default
# make rules to work when recursing down tree from /usr/src/Makefile.
# - make builds a dependency list at startup,
# timestamps are also checked at startup, not on the fly.
# so we have to run a second make to notice if ${FORCE_MAKEFILE} has been
# touched by commands within label `config_makefile`.
# - Cannot have $(MAKEFILE_KERNEL): ${MACHINE}/conf/`cat ${THIS_FLAVOUR}`
# as `cat ${THIS_FLAVOUR}` would not evaluate.
# ----------------------------------------------------------------------------
# INTERNAL ENVIRONMENT VARIABLES, & FILE NAMES:
# Changeable by user (but if changed, do a make cleandir first, and
# leave no gap between assigned variable string and # comment delimiter !
KERNEL_NAME
= 386bsd
# Kernel Name
DEFAULT_FLAVOUR
= .config.default
# Contains name of what to make by default
THIS_FLAVOUR
= .config.now
# Contains what to make now, (a temp variable).
LAST_FLAVOUR
= .config.last
# What MAKEFILE_KERNEL was last produced for.
FORCE_MAKEFILE
= .config.makefile
# If new MAKEFILE_KERNEL to be forcibly built.
BOOT_FLAG
= -n
# Prevents real make in i386/boot/, Can be overridden by bsd_make BOOT_FLAG=
# ----------------------------------------------------------------------------
# INTERNAL ENVIRONMENT VARIABLES:
# Do NOT change these without reading Makefile & Makefile_sub.c.
# Do not add gaps between assigned variable string and # comment delimiter !
MAKEFILE_KERNEL
=Makefile_sub
# also used to refer to Makefile_sub.c
TREE_TEST
= Makefile
# used as: compile/CONFIG_NAME/$TREE_TEST,
# ( typically compile/GENERICAH/Makefile )
# compared with config file date.
# swap386bsd.c is newer, but not sure if
# swap${MACHINE}.c would be an architecture
# independent portable name.
.PATH
= # No directories searched for files not found in current dir.
CONFIG
:= `hostname`# Can be overridden by bsd_make CONFIG=whatever
CALL_BEFORE
= " /sys/makefile label "
CALL_AFTER
= " has been invoked."
# Suppress chat about what config being made etc.
BOOT_START
="Start considering (with make ${BOOT_FLAG}) what could be done in ${MACHINE}/boot:"
BOOT_END
="End of considering ${MACHINE}/boot."
TRANSIENT
= ${LAST_FLAVOUR} ${THIS_FLAVOUR} \
${FORCE_MAKEFILE} ${MAKEFILE_KERNEL} .config.import
# Transient temporary files, created by config_makefile.
# =============================================================================
# EXTERNALLY CALLABLE LABELS
# This label is callable from /usr/src/Makefile.
all: all_start config_tree compile_tree boot_all all_end
# This label is callable from /usr/src/Makefile,
# Clean current-flavour compile tree, but not other flavours.
clean: clean_start lifebelt config_makefile boot_clean
@
${INFORM} "Cleaning compile tree for configuration name `cat $(THIS_FLAVOUR)`".
${DIVERT}
@echo
"==={> compile/`cat $(CWD)/$(THIS_FLAVOUR)`"
-(cd .
/compile
; cd .
/`cat $(CWD)/$(THIS_FLAVOUR)`; make
clean)
@echo
"<}=== compile/`cat $(CWD)/$(THIS_FLAVOUR)`"
# # cd is done in 2 stages in case directory named in $(THIS_FLAVOUR)
# # is not there, else make would recurse endlessly.
# # A more drastic alternative to the above make clean could be:
# # -rm -r -f ./compile/`cat ./$(THIS_FLAVOUR)`/*
@
${INFORM} Removing makefile temporary files.
${DIVERT}
# # Dont move "rm TRANSIENT" before "rm compile/`cat ${THIS_FLAVOUR}`"
@
${INFORM} To do more extensive cleaning
, use make cleandir
${DIVERT}
# This label is callable from /usr/src/Makefile,
cleandir
: cleandir_start boot_cleandir
@
${INFORM} Removing
all kernel compile trees.
${DIVERT}
@echo
"Warning: Removing $(DEFAULT_FLAVOUR)."
@echo Future makes will default to generate a flavour for
`hostname`.
-rm -f
$(DEFAULT_FLAVOUR
)
@
${INFORM} To also
clean kernel in destination tree
, use make clean_dest
${DIVERT}
@
${INFORM} Cleaning destination tree kernel.
${DIVERT}
-rm -f
$(DESTDIR
)/${KERNEL_NAME}.untested.
`cat ${THIS_FLAVOUR}`
-rm -f
$(DESTDIR
)/config.untested.
`cat ${THIS_FLAVOUR}`
# # Suprisingly the - before the rm above is needed for
# # $(DESTDIR)/${KERNEL_NAME}.untested.${CONFIG_NAME} else make clean
# # fails, yet rm exit value bug supposed to have been fixed way back.
# This label is callable from /usr/src/Makefile,
@
${INFORM} "${CALL_BEFORE}'all'${CALL_AFTER}" ${DIVERT}
@echo This a dummy depend label in sys
/Makefile to satisfy possible callers.
# # Currently the config depend gets done from `all', later
# # when I've thought more about it, maybe I'll add `depend:'
# # to be dependent on `config_tree'.
# # As dependencies get evaluated anyway, & as /sys/make call
# This label is callable from /usr/src/Makefile,
@echo
"NOT YET DEVELOPED AN obj ENTRY FOR /sys/Makefile."
@echo
"So compiles are in source directory."
@echo Do not attempt to share a common source directory with others
,
@echo
"as transient files will conflict (eg ${TRANSIENT})"
# This label is callable from /usr/src/Makefile,
install: install_start
all boot_install
install -c
-m
644 compile
/`cat $(THIS_FLAVOUR)`/${KERNEL_NAME} \
$(DESTDIR
)/${KERNEL_NAME}.untested.
`cat $(THIS_FLAVOUR)`
# # Beware: If you remove the word untested, & then `cat $(THIS_FLAVOUR)`
# # does not evaluate properly, you will overwrite your current
install -c
-m
644 ${MACHINE}/conf
/`cat $(THIS_FLAVOUR)` \
$(DESTDIR
)/config.untested.
`cat $(THIS_FLAVOUR)`
sync
# ensure complete kernel in root even if update dead
@
${INFORM} "Looking at kernel sizes (> 593920 may overlap floppy buffers):" ${DIVERT}
-find
$(DESTDIR
)/$(KERNEL_NAME
)* \
! -name \
*.gz
-print | xargs size
@
${INFORM} -n
"For local notes on kernel sizes etc:" ${DIVERT}
@
${INFORM} -n
" cat ${MACHINE}/doc/`cat $(THIS_FLAVOUR)`" ${DIVERT}
@
${INFORM} -n To
test: fasthalt
, wait
, select
$(DESTDIR
)/${KERNEL_NAME}.untested.
${DIVERT}
@
${INFORM} "`cat ${THIS_FLAVOUR}`" ${DIVERT}
# =============================================================================
# LABELS BELOW HERE ARE INTERNAL, (not to be called from outside this Makefile)
# =============================================================================
@
${INFORM} "make clean decides what flavour to clean in a rather complex" ${DIVERT}
@
${INFORM} "way using tools such as cpp. If make clean breaks" ${DIVERT}
@
${INFORM} "call the more simplistic make cleandir." ${DIVERT}
clean_start cleandir_start all_start install_start obj_start all_end
:
@
${INFORM} "${CALL_BEFORE}$@${CALL_AFTER}" ${DIVERT}
# -----------------------------------------------------------------------------
# STUFF TO SUPERCEDE ../Makefile mdec:
# (maybe to be in turn superceeded by SUBDIR=${MACHINE}/boot
@
${INFORM} ${BOOT_START} ${DIVERT}
# # mdec work is called from /usr/src/Makefile, this was done before
# # this /usr/src/sys/Makefile was written, boot_all work could/should
# # now be moved down to here
# # (but not until people have had time to object)
@
${INFORM} /usr
/src
/Makefile currently deals with mdec work.
${DIVERT}
@echo
"==={> ${MACHINE}/boot"
cd .
/${MACHINE}/boot
; make
${BOOT_FLAG} depend
all install ${CLEANDIR}
@echo
"<}=== ${MACHINE}/boot"
@
${INFORM} -n
"NOT DOING: " ${DIVERT}
@
${INFORM} "cd /usr/mdec; find . | cpio -pdamuv ${DESTDIR}/usr/mdec" ${DIVERT}
# # The above is what /usr/src/Makefile does,
# # however it should be improved,
# # because boot blocks going to DESTDIR should come from the obj tree,
# # not from out current live /usr/mdec.
# -a: Reset the access times of files after reading them,
# so that it does not look like they have just been
# -d: Create leading directories where needed.
# -m: Retain previous file modification times when creat-
# -p: Run in copy-pass mode.
# -u: Replace all files, without asking whether to
# replace existing newer files with older files.
# -v: List the files processed, or with -t, give an `ls
# -l' style table of contents listing. In a verbose
# table of contents of a ustar archive, user and
# group names in the archive that do not exist on the
# local system are replaced by the names that corre-
# spond locally to the numeric UID and GID stored in
@
${INFORM} ${BOOT_END} ${DIVERT}
@echo
"==={> ${MACHINE}/boot"
cd .
/${MACHINE}/boot
; make
${BOOT_FLAG} install
@echo
"<}=== ${MACHINE}/boot"
@
${INFORM} ${BOOT_END} ${DIVERT}
@echo
"==={> ${MACHINE}/boot"
cd .
/${MACHINE}/boot
; make
${BOOT_FLAG} clean
@echo
"<}=== ${MACHINE}/boot"
@
${INFORM} ${BOOT_END} ${DIVERT}
boot_cleandir
: boot_start
@echo
"==={> ${MACHINE}/boot"
cd .
/${MACHINE}/boot
; make
${BOOT_FLAG} cleandir
@echo
"<}=== ${MACHINE}/boot"
@
${INFORM} ${BOOT_END} ${DIVERT}
@echo
"==={> ${MACHINE}/boot"
cd .
/${MACHINE}/boot
; make
${BOOT_FLAG} depend
@echo
"<}=== ${MACHINE}/boot"
@
${INFORM} ${BOOT_END} ${DIVERT}
@echo
"==={> ${MACHINE}/boot"
cd .
/${MACHINE}/boot
; make
${BOOT_FLAG} obj
@echo
"<}=== ${MACHINE}/boot"
@
${INFORM} ${BOOT_END} ${DIVERT}
@
${INFORM} ${BOOT_START} ${DIVERT}
# -----------------------------------------------------------------------------
# Stuff to determine which flavour kernel to compile.
@
${INFORM} Determining which kernel flavour to make.
${DIVERT}
@
${INFORM} CONFIG variable is
$(CONFIG
).
${DIVERT}
.if exists
(${DEFAULT_FLAVOUR})
@
${INFORM} "${DEFAULT_FLAVOUR} exists" ${DIVERT}
@
${INFORM} Seeing if
${DEFAULT_FLAVOUR} has contents.
${DIVERT}
if
( XX
==X
`cat ${DEFAULT_FLAVOUR}`X
); \
${INFORM} "${DEFAULT_FLAVOUR} is empty" ${DIVERT} ; \
echo
"$(CONFIG)" > ${THIS_FLAVOUR}; \
${INFORM} "${DEFAULT_FLAVOUR} is not empty" ${DIVERT} ; \
echo
"`cat ${DEFAULT_FLAVOUR}`" > ${THIS_FLAVOUR}; \
@
${INFORM} "${DEFAULT_FLAVOUR} not extant." ${DIVERT}
@
${INFORM} "CONFIG Makefile variable in ${THIS_FLAVOUR} set to ${CONFIG}." ${DIVERT}
@echo
${CONFIG} > ${THIS_FLAVOUR}
@
${INFORM} "CONFIG Makefile variable unset" ${DIVERT}
@
${INFORM} "Assuming existence of $(MACHINE)/conf/`hostname`" ${DIVERT}
hostname
> ${THIS_FLAVOUR}
@
${INFORM} "Flavour to be worked on is `cat ${THIS_FLAVOUR}`." ${DIVERT}
.if
!exists
(${LAST_FLAVOUR})
@
${INFORM} "Creating a dummy ${LAST_FLAVOUR} as no previous make" ${DIVERT}
cp
/dev
/null
${LAST_FLAVOUR}
# # ${LAST_FLAVOUR} is used to sense change of configuration to be made.
# -----------------------------------------------------------------------------
# Decide if Makefile_sub should be remade.
config_makefile
: config_which
$(MAKEFILE_KERNEL
)
@
${INFORM} Determining if
$(MAKEFILE_KERNEL
) needs to be remade.
${DIVERT}
.if
!exists
(${FORCE_MAKEFILE})
touch
${FORCE_MAKEFILE} ;
# # This touch only needs to be in the "then", not the "else",
# # however getting it there causes problems with backslash delimeters.
if
( XX
==X
`cmp ${LAST_FLAVOUR} ${THIS_FLAVOUR}`X
); \
${INFORM} -n
"Same configuration name as last time," ${DIVERT} ; \
${INFORM} " no need to remake $(MAKEFILE_KERNEL)." ${DIVERT} ; \
${INFORM} -n
"Configuration changed from " ${DIVERT} ; \
${INFORM} "`cat ${LAST_FLAVOUR}` to `cat ${THIS_FLAVOUR}`." ${DIVERT} ; \
${INFORM} "Forcing a new $(MAKEFILE_KERNEL)" ${DIVERT} ; \
touch
${FORCE_MAKEFILE}; \
echo
"==={> $(MAKEFILE_KERNEL)" ; \
make
$(MAKEFILE_KERNEL
); \
echo
"<}=== $(MAKEFILE_KERNEL)" ; \
# -----------------------------------------------------------------------------
# Make a compile tree (of sources).
.if defined
(LOAD_ADDRESS
)
T_LD_ADR
=LOAD_ADDRESS
=${LOAD_ADDRESS}
config_tree
: config_makefile
@
${INFORM} Determining if compile tree needs to be remade.
${DIVERT}
@echo
"==={> $(MAKEFILE_KERNEL)"
make
-f
$(MAKEFILE_KERNEL
) ${T_DBG} ${T_LD_ADR} \
compile
/`cat ${THIS_FLAVOUR}`/${TREE_TEST}
@echo
"<}=== $(MAKEFILE_KERNEL)"
# -----------------------------------------------------------------------------
# Create a file who's sole purpose is to be a timestamp,
# if this file is newer than $(MAKEFILE_KERNEL), then $(MAKEFILE_KERNEL)
# -----------------------------------------------------------------------------
$(MAKEFILE_KERNEL
): Makefile
${MAKEFILE_KERNEL}.c
${FORCE_MAKEFILE}
@
${INFORM} "${CALL_BEFORE}$@${CALL_AFTER}" ${DIVERT}
cpp -P
-DCONFIG_NAME
=`cat ${THIS_FLAVOUR}` -Ui386 \
-DCONFIG_TREE_TEST
=compile
/`cat ${THIS_FLAVOUR}`/${TREE_TEST} \
-DMAKEFILE_KERNEL
=${MAKEFILE_KERNEL} \
${MAKEFILE_KERNEL}.c
> $(MAKEFILE_KERNEL
) \
# # -Ui386 avoids damage to names like .../i386/conf/...
cp
${THIS_FLAVOUR} ${LAST_FLAVOUR}
# -----------------------------------------------------------------------------
@
${INFORM} $(MAKEFILE
) label
$@
${DIVERT}
@
${INFORM} "Making kernel compilation tree for `cat ${THIS_FLAVOUR}`." ${DIVERT}
@echo
"==={> compile/`cat ${THIS_FLAVOUR}`"
cd .
/compile
/`cat ${THIS_FLAVOUR}`; make
@echo
"<}=== compile/`cat ${THIS_FLAVOUR}`"
# -----------------------------------------------------------------------------
# Maybe a subsidiary make in compile/something or i386/boot will want bsd.subdir.mk,
# but Makefile_sub.c does not need it, (neither does it cause harm).
# -----------------------------------------------------------------------------
# LEGALITIES (as refered to from top of file).
# Copyright (c) 1993 Julian Stacey, Munich, Germany.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# This software is provided by Julian Stacey (and subsequent
# contributors) ``as is'' and
# any express or implied warranties, including, but not limited to, the
# implied warranties of merchantability and fitness for a particular purpose
# are disclaimed. In no event shall Julian Stacey (and subsequent
# contributors) be liable
# for any direct, indirect, incidental, special, exemplary, or consequential
# damages (including, but not limited to, procurement of substitute goods
# or services; loss of use, data, or profits; or business interruption)
# however caused and on any theory of liability, whether in contract, strict
# liability, or tort (including negligence or otherwise) arising in any way
# out of the use of this software, even if advised of the possibility of