aboutsummaryrefslogtreecommitdiff
path: root/sys/Makefile
blob: bd62250cea179873bd7cec7881eb237d32d22bc7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
#	From: /usr/src/sys/Makefile	V1.4			<stacey@guug.de>
#	$Id: Makefile,v 1.1 1994/01/22 07:34:02 rgrimes Exp $
#
#	Copyright Julian Stacey, Munich Oct. 1993, Free Software, No Liability
#	For Legalities see end of file.
#
# OVERVIEW:
#	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:
#		PRIORITY	METHOD
#		Highest:	make CONFIG=your_flavour
#	  else
#		Medium:		edit ${DEFAULT_FLAVOUR} contents to flavour
#	  else
#		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:
#		a)	make CONFIG=LINT
#		b)	echo "GENERICAH" > .config.default ; make
# EXTERNAL ENVIRONMENT VARIABLES:
#	MACHINE		Mandatory.	Must be preset before make is invoked,
#					example: i386.
#	DESTDIR		Optional.	If preset in the environment, 
#					it is recognised.
#	BOOT_SYS	Optional.	Set to enable makes in the i386/boot
#					(mdec) sub directory,
#					(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.
# PENDING:
#	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.
# -----------------------------------------------------------------------------
# MAINTENANCE NOTES
# - 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`.
# - constructs such as:
#	foo:	`bar`
#   won't work.
# - 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
CWD!=		pwd
INFORM=		echo
.if defined(DEBUG_SYS)
CALL_BEFORE=	" /sys/makefile label "
CALL_AFTER=	" has been invoked."
.else
# Suppress chat about what config being made etc. 
DIVERT=		> /dev/null
.endif
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}
	-rm -f ${TRANSIENT}
#	# 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}
	-rm -f -r compile/*
	-rm -f ${TRANSIENT}
	@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}

clean_dest:
	@${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,
depend: boot_depend
	@${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 
#	# make depend

#	This label is callable from /usr/src/Makefile,
obj:	obj_start boot_obj
	@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
#	# working kernel.
	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)
# =============================================================================
lifebelt:
	@${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

boot_all:
	@${INFORM} ${BOOT_START} ${DIVERT}
.if defined (BOOT_SYS)
.if ${MACHINE} == "i386"
#	# 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"
.if defined (DESTDIR)
	@${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.
#	# cpio flags:
#		-a:	Reset the access times of files after reading them,
#			so that it does not look like they have just been
#			read.
#		-d:	Create leading directories where needed.
#		-m:	Retain previous file modification times when creat-
#			ing files.
#		-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
#			the archive.
.endif
.endif
.endif
	@${INFORM} ${BOOT_END} ${DIVERT}

boot_install: boot_start
.if defined (BOOT_SYS)
	@echo "==={> ${MACHINE}/boot"
	cd ./${MACHINE}/boot; make ${BOOT_FLAG} install
	@echo "<}=== ${MACHINE}/boot"
.endif
	@${INFORM} ${BOOT_END} ${DIVERT}

boot_clean: boot_start
.if defined (BOOT_SYS)
	@echo "==={> ${MACHINE}/boot"
	cd ./${MACHINE}/boot; make ${BOOT_FLAG} clean
	@echo "<}=== ${MACHINE}/boot"
.endif
	@${INFORM} ${BOOT_END} ${DIVERT}

boot_cleandir: boot_start
.if defined (BOOT_SYS)
	@echo "==={> ${MACHINE}/boot"
	cd ./${MACHINE}/boot; make ${BOOT_FLAG} cleandir
	@echo "<}=== ${MACHINE}/boot"
.endif
	@${INFORM} ${BOOT_END} ${DIVERT}

boot_depend: boot_start
.if defined (BOOT_SYS)
	@echo "==={> ${MACHINE}/boot"
	cd ./${MACHINE}/boot; make ${BOOT_FLAG} depend
	@echo "<}=== ${MACHINE}/boot"
.endif
	@${INFORM} ${BOOT_END} ${DIVERT}

boot_obj: boot_start
.if defined (BOOT_SYS)
	@echo "==={> ${MACHINE}/boot"
	cd ./${MACHINE}/boot; make ${BOOT_FLAG} obj
	@echo "<}=== ${MACHINE}/boot"
.endif
	@${INFORM} ${BOOT_END} ${DIVERT}

boot_start:
	@${INFORM} ${BOOT_START} ${DIVERT}

# -----------------------------------------------------------------------------
# Stuff to determine which flavour kernel to compile.

config_which:
	@${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 ); \
	then \
		${INFORM} "${DEFAULT_FLAVOUR} is empty" ${DIVERT} ; \
		echo "$(CONFIG)" > ${THIS_FLAVOUR}; \
	else \
		${INFORM} "${DEFAULT_FLAVOUR} is not empty" ${DIVERT} ; \
		echo "`cat ${DEFAULT_FLAVOUR}`" > ${THIS_FLAVOUR}; \
	fi
.else
	@${INFORM} "${DEFAULT_FLAVOUR} not extant." ${DIVERT}
.if defined(CONFIG)
		@${INFORM} "CONFIG Makefile variable in ${THIS_FLAVOUR} set to ${CONFIG}." ${DIVERT}
		@echo ${CONFIG} > ${THIS_FLAVOUR}
.else
		@${INFORM} "CONFIG Makefile variable unset" ${DIVERT}
		@${INFORM} "Assuming existence of $(MACHINE)/conf/`hostname`" ${DIVERT}
		hostname > ${THIS_FLAVOUR}
.endif
.endif
	@${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.
.endif
# -----------------------------------------------------------------------------
# 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.
.endif
	if ( XX==X`cmp ${LAST_FLAVOUR} ${THIS_FLAVOUR}`X ); \
	then \
		${INFORM} -n "Same configuration name as last time," ${DIVERT} ; \
		${INFORM} " no need to remake $(MAKEFILE_KERNEL)." ${DIVERT} ; \
	else \
		${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)" ; \
	fi
# -----------------------------------------------------------------------------
# Make a compile tree (of sources).
.if defined(LOAD_ADDRESS)
T_LD_ADR=LOAD_ADDRESS=${LOAD_ADDRESS}
.else
T_LD_ADR=
.endif
.if defined(DEBUG_SYS)
T_DBG=DEBUG_SYS=YES
.else
T_DBG=
.endif
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)
# needs to be remade.
${FORCE_MAKEFILE}:
	touch $@
# -----------------------------------------------------------------------------
# Make Makefile_sub.
$(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}
# -----------------------------------------------------------------------------
# Compile a tree.
compile_tree:
	@${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}`"
# -----------------------------------------------------------------------------
.include <bsd.subdir.mk>
# 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. 
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 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
# such damage.

# End of Makefile.

#	End of Makefile