Makefile 20.5 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1
VERSION = 2
Linus Torvalds's avatar
Linus Torvalds committed
2
PATCHLEVEL = 5
Linus Torvalds's avatar
Linus Torvalds committed
3
SUBLEVEL = 21
Linus Torvalds's avatar
Linus Torvalds committed
4
EXTRAVERSION =
Linus Torvalds's avatar
Linus Torvalds committed
5

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
# We are using a recursive build, so we need to do a little thinking
# to get the ordering right.
#
# Most importantly: sub-Makefiles should only ever modify files in
# their own directory. If in some directory we have a dependency on
# a file in another dir (which doesn't happen often, but it's of
# unavoidable when linking the built-in.o targets which finally
# turn into vmlinux), we will call a sub make in that other dir, and
# after that we are sure that everything which is in that other dir
# is now up to date.
#
# The only cases where we need to modify files which have global
# effects are thus separated out and done before the recursive
# descending is started. They are now explicitly listed as the
# prepare rule.

Linus Torvalds's avatar
Linus Torvalds committed
22 23 24
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)

ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
25
KERNELPATH=kernel-$(shell echo $(KERNELRELEASE) | sed -e "s/-//g")
Linus Torvalds's avatar
Linus Torvalds committed
26 27 28 29

CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
	  else if [ -x /bin/bash ]; then echo /bin/bash; \
	  else echo sh; fi ; fi)
Kai Germaschewski's avatar
Kai Germaschewski committed
30
TOPDIR	:= $(CURDIR)
Linus Torvalds's avatar
Linus Torvalds committed
31 32 33 34 35 36 37 38 39

HPATH   	= $(TOPDIR)/include
FINDHPATH	= $(HPATH)/asm $(HPATH)/linux $(HPATH)/scsi $(HPATH)/net

HOSTCC  	= gcc
HOSTCFLAGS	= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer

CROSS_COMPILE 	=

40 41 42 43
# 	That's our default target when none is given on the command line

all:	vmlinux

44 45 46
#	Print entire command lines instead of short version
#	For now, leave the default

47 48 49
ifndef KBUILD_VERBOSE
  KBUILD_VERBOSE = 1
endif
50

51 52
# 	Decide whether to build built-in, modular, or both

53
KBUILD_MODULES := 1
54 55 56 57
KBUILD_BUILTIN := 1

export KBUILD_MODULES KBUILD_BUILTIN

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
# Beautify output
# ---------------------------------------------------------------------------
#
# Normally, we echo the whole command before executing it. By making
# that echo $($(quiet)$(cmd)), we now have the possibility to set
# $(quiet) to choose other forms of output instead, e.g.
#
#         quiet_cmd_cc_o_c = Compiling $(RELDIR)/$@
#         cmd_cc_o_c       = $(CC) $(c_flags) -c -o $@ $<
#
# If $(quiet) is empty, the whole command will be printed.
# If it is set to "quiet_", only the short version will be printed. 
# If it is set to "silent_", nothing wil be printed at all, since
# the variable $(silent_cmd_cc_o_c) doesn't exist.

#	If the user wants quiet mode, echo short versions of the commands 
#	only and suppress the 'Entering/Leaving directory' messages

ifneq ($(KBUILD_VERBOSE),1)
  quiet=quiet_
  MAKEFLAGS += --no-print-directory
endif

#	If the user is running make -s (silent mode), suppress echoing of
#	commands

ifneq ($(findstring s,$(MAKEFLAGS)),)
  quiet=silent_
endif

export quiet

Linus Torvalds's avatar
Linus Torvalds committed
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
#
# Include the make variables (CC, etc...)
#

AS		= $(CROSS_COMPILE)as
LD		= $(CROSS_COMPILE)ld
CC		= $(CROSS_COMPILE)gcc
CPP		= $(CC) -E
AR		= $(CROSS_COMPILE)ar
NM		= $(CROSS_COMPILE)nm
STRIP		= $(CROSS_COMPILE)strip
OBJCOPY		= $(CROSS_COMPILE)objcopy
OBJDUMP		= $(CROSS_COMPILE)objdump
MAKEFILES	= $(TOPDIR)/.config
GENKSYMS	= /sbin/genksyms
DEPMOD		= /sbin/depmod
Kai Germaschewski's avatar
Kai Germaschewski committed
106
PERL		= perl
Linus Torvalds's avatar
Linus Torvalds committed
107
MODFLAGS	= -DMODULE
108
CFLAGS_MODULE   = $(MODFLAGS)
109
AFLAGS_MODULE   = $(MODFLAGS)
Linus Torvalds's avatar
Linus Torvalds committed
110
CFLAGS_KERNEL	=
111
AFLAGS_KERNEL	=
Kai Germaschewski's avatar
Kai Germaschewski committed
112
EXPORT_FLAGS    =
113
NOSTDINC_FLAGS  = -nostdinc -iwithprefix include
Linus Torvalds's avatar
Linus Torvalds committed
114 115 116

export	VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION KERNELRELEASE ARCH \
	CONFIG_SHELL TOPDIR HPATH HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC \
117
	CPP AR NM STRIP OBJCOPY OBJDUMP MAKE MAKEFILES GENKSYMS PERL
Linus Torvalds's avatar
Linus Torvalds committed
118

119
export CPPFLAGS EXPORT_FLAGS NOSTDINC_FLAGS
Kai Germaschewski's avatar
Kai Germaschewski committed
120 121 122
export CFLAGS CFLAGS_KERNEL CFLAGS_MODULE 
export AFLAGS AFLAGS_KERNEL AFLAGS_MODULE

123 124 125
noconfig_targets := xconfig menuconfig config oldconfig randconfig \
		    defconfig allyesconfig allnoconfig allmodconfig \
		    clean mrproper distclean
Linus Torvalds's avatar
Linus Torvalds committed
126

127 128 129 130
ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)

# Here goes the main Makefile
# ===========================================================================
Linus Torvalds's avatar
Linus Torvalds committed
131
#
132 133 134 135
# If the user gave a *config target, it'll be handled in another
# section below, since in this case we cannot include .config
# Same goes for other targets like clean/mrproper etc, which
# don't need .config, either
Linus Torvalds's avatar
Linus Torvalds committed
136

137 138 139 140 141 142 143 144 145 146 147 148
#	In this section, we need .config

-include .config

#	If .config doesn't exist - tough luck

.config:
	@echo '***'
	@echo '*** You have not yet configured your kernel!'
	@echo '*** Please run "make xconfig/menuconfig/config/oldconfig"'
	@echo '***'
	@exit 1
Linus Torvalds's avatar
Linus Torvalds committed
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171

#
# INSTALL_PATH specifies where to place the updated kernel and system map
# images.  Uncomment if you want to place them anywhere other than root.
#

#export	INSTALL_PATH=/boot

#
# INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory
# relocations required by build roots.  This is not defined in the
# makefile but the arguement can be passed to make if needed.
#

MODLIB	:= $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
export MODLIB

#
# standard CFLAGS
#

CPPFLAGS := -D__KERNEL__ -I$(HPATH)

Linus Torvalds's avatar
Linus Torvalds committed
172
CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes -Wno-trigraphs -O2 \
Linus Torvalds's avatar
Linus Torvalds committed
173
	  -fomit-frame-pointer -fno-strict-aliasing -fno-common
Linus Torvalds's avatar
Linus Torvalds committed
174 175
AFLAGS := -D__ASSEMBLY__ $(CPPFLAGS)

Kai Germaschewski's avatar
Kai Germaschewski committed
176 177 178 179
ifdef CONFIG_MODULES
EXPORT_FLAGS := -DEXPORT_SYMTAB
endif

180 181 182 183 184 185 186 187
# Link components for vmlinux
# ---------------------------------------------------------------------------
SUBDIRS		:= init kernel mm fs ipc lib drivers sound net
INIT		:= init/init.o
CORE_FILES	:= kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o
LIBS		:= lib/lib.a
DRIVERS		:= drivers/built-in.o sound/sound.o
NETWORKS	:= net/network.o
Linus Torvalds's avatar
Linus Torvalds committed
188 189 190 191 192

include arch/$(ARCH)/Makefile

export	NETWORKS DRIVERS LIBS HEAD LDFLAGS LINKFLAGS MAKEBOOT ASFLAGS

193
# boot target
194
# ---------------------------------------------------------------------------
Linus Torvalds's avatar
Linus Torvalds committed
195 196

boot: vmlinux
197
	@$(MAKE) -C arch/$(ARCH)/boot
Linus Torvalds's avatar
Linus Torvalds committed
198

199 200 201 202 203 204 205 206 207 208 209 210
# Build vmlinux
# ---------------------------------------------------------------------------

#	This is a bit tricky: If we need to relink vmlinux, we want
#	the version number incremented, which means recompile init/version.o
#	and relink init/init.o. However, we cannot do this during the
#       normal descending-into-subdirs phase, since at that time
#       we cannot yet know if we will need to relink vmlinux.
#	So we descend into init/ inside the rule for vmlinux again.

vmlinux-objs := $(HEAD) $(INIT) $(CORE_FILES) $(LIBS) $(DRIVERS) $(NETWORKS)

211
quiet_cmd_link_vmlinux = LD     $@
212
cmd_link_vmlinux = $(LD) $(LINKFLAGS) $(HEAD) $(INIT) \
Linus Torvalds's avatar
Linus Torvalds committed
213 214
		--start-group \
		$(CORE_FILES) \
Linus Torvalds's avatar
Linus Torvalds committed
215
		$(LIBS) \
Linus Torvalds's avatar
Linus Torvalds committed
216 217 218 219
		$(DRIVERS) \
		$(NETWORKS) \
		--end-group \
		-o vmlinux
220 221 222 223 224 225 226 227

#	set -e makes the rule exit immediately on error

define rule_link_vmlinux
	set -e
	echo Generating build number
	. scripts/mkversion > .tmpversion
	mv -f .tmpversion .version
228
	$(MAKE) -C init
229
	$(call cmd,cmd_link_vmlinux)
230 231
	$(cmd_link_vmlinux)
	echo 'cmd_$@ := $(cmd_link_vmlinux)' > $(@D)/.$(@F).cmd
Linus Torvalds's avatar
Linus Torvalds committed
232
	$(NM) vmlinux | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map
233 234
endef

235
vmlinux: $(vmlinux-objs) FORCE
236 237
	$(call if_changed_rule,link_vmlinux)

238 239
#	The actual objects are generated when descending, 
#	make sure no implicit rule kicks in
240

241
$(sort $(vmlinux-objs)): $(SUBDIRS) ;
Linus Torvalds's avatar
Linus Torvalds committed
242

243 244
# 	Handle descending into subdirectories listed in $(SUBDIRS)

245
.PHONY: $(SUBDIRS)
246
$(SUBDIRS): .hdepend prepare include/config/MARKER
247
	@$(MAKE) -C $@
248

249 250
#	Things we need done before we descend to build or make
#	module versions are listed in "prepare"
251 252

.PHONY: prepare
253
prepare: include/linux/version.h include/asm
254

255 256 257 258 259 260 261 262 263
# Single targets
# ---------------------------------------------------------------------------

%.s: %.c FORCE
	@$(MAKE) -C $(@D) $(@F)
%.i: %.c FORCE
	@$(MAKE) -C $(@D) $(@F)
%.o: %.c FORCE
	@$(MAKE) -C $(@D) $(@F)
264 265
%.lst: %.c FORCE
	@$(MAKE) -C $(@D) $(@F)
266 267 268 269 270
%.s: %.S FORCE
	@$(MAKE) -C $(@D) $(@F)
%.o: %.S FORCE
	@$(MAKE) -C $(@D) $(@F)

271 272 273
# 	FIXME: The asm symlink changes when $(ARCH) changes. That's
#	hard to detect, but I suppose "make mrproper" is a good idea
#	before switching between archs anyway.
274

275 276 277
include/asm:
	@echo 'Making asm->asm-$(ARCH) symlink'
	@ln -s asm-$(ARCH) $@
278

279
# 	Split autoconf.h into include/linux/config/*
280

Linus Torvalds's avatar
Linus Torvalds committed
281
include/config/MARKER: scripts/split-include include/linux/autoconf.h
282 283 284
	@echo 'Splitting include/linux/autoconf.h -> include/config'
	@scripts/split-include include/linux/autoconf.h include/config
	@touch $@
Linus Torvalds's avatar
Linus Torvalds committed
285

286 287 288 289 290 291 292 293 294 295
# 	if .config is newer than include/linux/autoconf.h, someone tinkered
# 	with it and forgot to run make oldconfig

include/linux/autoconf.h: .config
	@echo '***'
	@echo '*** You changed .config w/o running make *config?'
	@echo '*** Please run "make oldconfig"'
	@echo '***'
	@exit 1

296
# Generate some files
297
# ---------------------------------------------------------------------------
Linus Torvalds's avatar
Linus Torvalds committed
298

299 300
#	version.h changes when $(KERNELRELEASE) etc change, as defined in
#	this Makefile
Linus Torvalds's avatar
Linus Torvalds committed
301

302 303
uts_len := 64

304
include/linux/version.h: Makefile
305 306 307 308
	@if expr length "$(KERNELRELEASE)" \> $(uts_len) >/dev/null ; then \
	  echo '"$(KERNELRELEASE)" exceeds $(uts_len) characters' >&2; \
	  exit 1; \
	fi;
309 310 311 312 313 314
	@echo -n 'Generating $@'
	@(echo \#define UTS_RELEASE \"$(KERNELRELEASE)\"; \
	  echo \#define LINUX_VERSION_CODE `expr $(VERSION) \\* 65536 + $(PATCHLEVEL) \\* 256 + $(SUBLEVEL)`; \
	 echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))'; \
	) > $@.tmp
	@$(update-if-changed)
Linus Torvalds's avatar
Linus Torvalds committed
315

316 317
# Helpers built in scripts/
# ---------------------------------------------------------------------------
318

319
scripts/fixdep scripts/split-include : scripts ;
320 321 322

.PHONY: scripts
scripts:
323 324
	@$(MAKE) -C scripts

325
# Generate module versions
326 327
# ---------------------------------------------------------------------------

328 329 330 331 332
# 	The targets are still named depend / dep for traditional
#	reasons, but the only thing we do here is generating
#	the module version checksums.
#	FIXME: For now, we are also calling "archdep" from here,
#	which should be replaced by a more sensible solution.
333

334 335 336
.PHONY: depend dep $(patsubst %,_sfdep_%,$(SUBDIRS))

depend dep: .hdepend
Linus Torvalds's avatar
Linus Torvalds committed
337

338 339
#	.hdepend is our (misnomed) marker for whether we've run
#	generated module versions and made archdep
340

341 342 343
.hdepend: $(if $(filter dep depend,$(MAKECMDGOALS)),FORCE)
	@$(MAKE) archdep include/linux/modversions.h
	@touch $@
344

345
ifdef CONFIG_MODVERSIONS
346

347 348
# 	Update modversions.h, but only if it would change.

349 350 351
include/linux/modversions.h: scripts/fixdep prepare FORCE
	@rm -rf .tmp_export-objs
	@$(MAKE) $(patsubst %,_sfdep_%,$(SUBDIRS))
352
	@echo -n 'Generating $@'
353 354 355 356 357 358 359
	@( echo "#ifndef _LINUX_MODVERSIONS_H";\
	   echo "#define _LINUX_MODVERSIONS_H"; \
	   echo "#include <linux/modsetver.h>"; \
	   for f in `cd .tmp_export-objs; find modules -name \*.ver -print`; do \
	     echo "#include <linux/$${f}>"; \
	   done; \
	   echo "#endif"; \
360 361
	) > $@.tmp; \
	$(update-if-changed)
362

363 364 365
$(patsubst %,_sfdep_%,$(SUBDIRS)): FORCE
	@$(MAKE) -C $(patsubst _sfdep_%, %, $@) fastdep

366 367
else # !CONFIG_MODVERSIONS

368 369 370
.PHONY: include/linux/modversions.h

include/linux/modversions.h:
371 372 373

endif # CONFIG_MODVERSIONS

374 375
# ---------------------------------------------------------------------------
# Modules
Linus Torvalds's avatar
Linus Torvalds committed
376 377

ifdef CONFIG_MODULES
378 379 380

#	Build modules

Linus Torvalds's avatar
Linus Torvalds committed
381
ifdef CONFIG_MODVERSIONS
382
MODFLAGS += -include $(HPATH)/linux/modversions.h
Linus Torvalds's avatar
Linus Torvalds committed
383 384 385
endif

.PHONY: modules
386
modules:
387
	@$(MAKE) KBUILD_BUILTIN= $(SUBDIRS)
Linus Torvalds's avatar
Linus Torvalds committed
388

389 390
#	Install modules

Linus Torvalds's avatar
Linus Torvalds committed
391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411
.PHONY: modules_install
modules_install: _modinst_ $(patsubst %, _modinst_%, $(SUBDIRS)) _modinst_post

.PHONY: _modinst_
_modinst_:
	@rm -rf $(MODLIB)/kernel
	@rm -f $(MODLIB)/build
	@mkdir -p $(MODLIB)/kernel
	@ln -s $(TOPDIR) $(MODLIB)/build

# If System.map exists, run depmod.  This deliberately does not have a
# dependency on System.map since that would run the dependency tree on
# vmlinux.  This depmod is only for convenience to give the initial
# boot a modules.dep even before / is mounted read-write.  However the
# boot script depmod is the master version.
ifeq "$(strip $(INSTALL_MOD_PATH))" ""
depmod_opts	:=
else
depmod_opts	:= -b $(INSTALL_MOD_PATH) -r
endif
.PHONY: _modinst_post
412
_modinst_post:
Linus Torvalds's avatar
Linus Torvalds committed
413 414 415 416
	if [ -r System.map ]; then $(DEPMOD) -ae -F System.map $(depmod_opts) $(KERNELRELEASE); fi

.PHONY: $(patsubst %, _modinst_%, $(SUBDIRS))
$(patsubst %, _modinst_%, $(SUBDIRS)) :
417
	@$(MAKE) -C $(patsubst _modinst_%, %, $@) modules_install
Linus Torvalds's avatar
Linus Torvalds committed
418

419 420 421 422
else # CONFIG_MODULES

# ---------------------------------------------------------------------------
# Modules not configured
Linus Torvalds's avatar
Linus Torvalds committed
423

424
modules modules_install: FORCE
Linus Torvalds's avatar
Linus Torvalds committed
425 426 427 428 429 430 431
	@echo
	@echo "The present kernel configuration has modules disabled."
	@echo "Type 'make config' and enable loadable module support."
	@echo "Then build a kernel with module support enabled."
	@echo
	@exit 1

432
endif # CONFIG_MODULES
Linus Torvalds's avatar
Linus Torvalds committed
433

434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451
# Scripts to check various things for consistency
# ---------------------------------------------------------------------------

checkconfig:
	find * -name '*.[hcS]' -type f -print | sort | xargs $(PERL) -w scripts/checkconfig.pl

checkhelp:
	find * -name [cC]onfig.in -print | sort | xargs $(PERL) -w scripts/checkhelp.pl

checkincludes:
	find * -name '*.[hcS]' -type f -print | sort | xargs $(PERL) -w scripts/checkincludes.pl

# Generate tags for editors
# ---------------------------------------------------------------------------

TAGS: FORCE
	{ find include/asm-${ARCH} -name '*.h' -print ; \
	find include -type d \( -name "asm-*" -o -name config \) -prune -o -name '*.h' -print ; \
452
	find $(SUBDIRS) init arch/${ARCH} -name '*.[chS]' ; } | grep -v SCCS | etags -
453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494

# 	Exuberant ctags works better with -I
tags: FORCE
	CTAGSF=`ctags --version | grep -i exuberant >/dev/null && echo "-I __initdata,__exitdata,EXPORT_SYMBOL,EXPORT_SYMBOL_NOVERS"`; \
	ctags $$CTAGSF `find include/asm-$(ARCH) -name '*.h'` && \
	find include -type d \( -name "asm-*" -o -name config \) -prune -o -name '*.h' -print | xargs ctags $$CTAGSF -a && \
	find $(SUBDIRS) init -name '*.[ch]' | xargs ctags $$CTAGSF -a

# Assorted miscellaneous targets
# ---------------------------------------------------------------------------

# Documentation targets

sgmldocs psdocs pdfdocs htmldocs:
	@$(MAKE) -C Documentation/DocBook $@


# RPM target
#
#	If you do a make spec before packing the tarball you can rpm -ta it

spec:
	. scripts/mkspec >kernel.spec

#	Build a tar ball, generate an rpm from it and pack the result
#	There arw two bits of magic here
#	1) The use of /. to avoid tar packing just the symlink
#	2) Removing the .dep files as they have source paths in them that
#	   will become invalid

rpm:	clean spec
	find . \( -size 0 -o -name .depend -o -name .hdepend \) -type f -print | xargs rm -f
	set -e; \
	cd $(TOPDIR)/.. ; \
	ln -sf $(TOPDIR) $(KERNELPATH) ; \
	tar -cvz --exclude CVS -f $(KERNELPATH).tar.gz $(KERNELPATH)/. ; \
	rm $(KERNELPATH) ; \
	cd $(TOPDIR) ; \
	. scripts/mkversion > .version ; \
	rpm -ta $(TOPDIR)/../$(KERNELPATH).tar.gz ; \
	rm $(TOPDIR)/../$(KERNELPATH).tar.gz

495 496
else # ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)

497 498
# Targets which don't need .config
# ===========================================================================
499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518
#
# These targets basically have their own Makefile - not quite, but at
# least its own exclusive section in the same Makefile. The reason for
# this is the following:
# To know the configuration, the main Makefile has to include
# .config. That's a obviously a problem when .config doesn't exist
# yet, but that could be kludged around with only including it if it
# exists.
# However, the larger problem is: If you run make *config, make will
# include the old .config, then execute your *config. It will then
# notice that a piece it included (.config) did change and restart from
# scratch. Which will cause execution of *config again. You get the
# picture.
# If we don't explicitly let the Makefile know that .config is changed
# by *config (the old way), it won't reread .config after *config,
# thus working with possibly stale values - we don't that either.
#
# So we divide things: This part here is for making *config targets,
# and other targets which should work when no .config exists yet.
# The main part above takes care of the rest after a .config exists.
519 520 521 522

# Kernel configuration
# ---------------------------------------------------------------------------

523 524
.PHONY: oldconfig xconfig menuconfig config \
	make_with_config
525 526 527 528 529 530

xconfig:
	@$(MAKE) -C scripts kconfig.tk
	wish -f scripts/kconfig.tk

menuconfig:
531
	@$(MAKE) -C scripts lxdialog
532 533 534 535 536
	$(CONFIG_SHELL) scripts/Menuconfig arch/$(ARCH)/config.in

config:
	$(CONFIG_SHELL) scripts/Configure arch/$(ARCH)/config.in

537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554
oldconfig:
	$(CONFIG_SHELL) scripts/Configure -d arch/$(ARCH)/config.in

randconfig:
	$(CONFIG_SHELL) scripts/Configure -r arch/$(ARCH)/config.in

allyesconfig:
	$(CONFIG_SHELL) scripts/Configure -y arch/$(ARCH)/config.in

allnoconfig:
	$(CONFIG_SHELL) scripts/Configure -n arch/$(ARCH)/config.in

allmodconfig:
	$(CONFIG_SHELL) scripts/Configure -m arch/$(ARCH)/config.in

defconfig:
	yes '' | $(CONFIG_SHELL) scripts/Configure -d arch/$(ARCH)/config.in

555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570
#	How we generate .config depends on which *config the
#	user chose when calling make

.config: $(filter oldconfig xconfig menuconfig config,$(MAKECMDGOALS)) ;

#	If the user gave commands from both the need / need not
#	.config sections, we need to call make again after
#	.config is generated, now to take care of the remaining
#	targets we know nothing about in this section

remaining_targets := $(filter-out $(noconfig_targets),$(MAKECMDGOALS))

$(remaining_targets) : make_with_config

make_with_config: .config
	@$(MAKE) $(remaining_targets)
571

572 573 574 575 576 577 578 579 580 581 582 583 584 585 586
# Cleaning up
# ---------------------------------------------------------------------------

#	files removed with 'make clean'
CLEAN_FILES += \
	kernel/ksyms.lst include/linux/compile.h \
	vmlinux System.map \
	.tmp* \
	drivers/char/consolemap_deftbl.c drivers/video/promcon_tbl.c \
	drivers/char/conmakehash \
	drivers/char/drm/*-mod.c \
	drivers/pci/devlist.h drivers/pci/classlist.h drivers/pci/gen-devlist \
	drivers/zorro/devlist.h drivers/zorro/gen-devlist \
	sound/oss/bin2hex sound/oss/hex2hex \
	drivers/atm/fore200e_mkfirm drivers/atm/{pca,sba}*{.bin,.bin1,.bin2} \
587 588
	drivers/scsi/aic7xxx/aic7xxx_seq.h \
	drivers/scsi/aic7xxx/aic7xxx_reg.h \
589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615
	drivers/scsi/aic7xxx/aicasm/aicasm_gram.c \
	drivers/scsi/aic7xxx/aicasm/aicasm_scan.c \
	drivers/scsi/aic7xxx/aicasm/y.tab.h \
	drivers/scsi/aic7xxx/aicasm/aicasm \
	drivers/scsi/53c700_d.h \
	net/khttpd/make_times_h \
	net/khttpd/times.h \
	submenu*

# 	files removed with 'make mrproper'
MRPROPER_FILES += \
	include/linux/autoconf.h include/linux/version.h \
	drivers/net/hamradio/soundmodem/sm_tbl_{afsk1200,afsk2666,fsk9600}.h \
	drivers/net/hamradio/soundmodem/sm_tbl_{hapn4800,psk4800}.h \
	drivers/net/hamradio/soundmodem/sm_tbl_{afsk2400_7,afsk2400_8}.h \
	drivers/net/hamradio/soundmodem/gentbl \
	sound/oss/*_boot.h sound/oss/.*.boot \
	sound/oss/msndinit.c \
	sound/oss/msndperm.c \
	sound/oss/pndsperm.c \
	sound/oss/pndspini.c \
	drivers/atm/fore200e_*_fw.c drivers/atm/.fore200e_*.fw \
	.version .config* config.in config.old \
	scripts/tkparse scripts/kconfig.tk scripts/kconfig.tmp \
	scripts/lxdialog/*.o scripts/lxdialog/lxdialog \
	.menuconfig.log \
	include/asm \
616 617
	.hdepend scripts/split-include scripts/docproc \
	scripts/fixdep $(TOPDIR)/include/linux/modversions.h \
618
	tags TAGS kernel.spec \
619 620 621 622 623 624

# 	directories removed with 'make mrproper'
MRPROPER_DIRS += \
	include/config \
	$(TOPDIR)/include/linux/modules

625 626 627
#	That's our way to know about arch specific cleanup.

include arch/$(ARCH)/Makefile
Linus Torvalds's avatar
Linus Torvalds committed
628 629

clean:	archclean
630
	@echo 'Cleaning up'
631 632
	@find . \( -name \*.[oas] -o -name core -o -name .\*.cmd -o \
		   -name .\*.tmp -o -name .\*.d \) -type f -print \
Linus Torvalds's avatar
Linus Torvalds committed
633
		| grep -v lxdialog/ | xargs rm -f
634
	@rm -rf $(CLEAN_FILES)
635
	@$(MAKE) -C Documentation/DocBook clean
Linus Torvalds's avatar
Linus Torvalds committed
636 637

mrproper: clean archmrproper
638 639 640 641
	@echo 'Making mrproper'
	@find . \( -size 0 -o -name .depend \) -type f -print | xargs rm -f
	@rm -f $(MRPROPER_FILES)
	@rm -rf $(MRPROPER_DIRS)
642
	@$(MAKE) -C Documentation/DocBook mrproper
Linus Torvalds's avatar
Linus Torvalds committed
643 644

distclean: mrproper
645 646 647
	@echo 'Making distclean'
	@find . \( -not -type d \) -and \
	 	\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
Linus Torvalds's avatar
Linus Torvalds committed
648
		-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
649 650
	 	-o -name '.*.rej' -o -name '.SUMS' -o -size 0 \) -type f \
		-print | xargs rm -f
Linus Torvalds's avatar
Linus Torvalds committed
651

652 653
endif # ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)

654
# FIXME Should go into a make.lib or something 
655
# ===========================================================================
656

657 658 659 660 661 662 663 664 665 666 667
# read all saved command lines

cmd_files := $(wildcard .*.cmd)
ifneq ($(cmd_files),)
  include $(cmd_files)
endif

# Usage: $(call if_changed_rule,foo)
# will check if $(cmd_foo) changed, or any of the prequisites changed,
# and if so will execute $(rule_foo)

668 669 670 671 672
if_changed_rule = $(if $(strip $? \
		               $(filter-out $(cmd_$(1)),$(cmd_$(@F)))\
			       $(filter-out $(cmd_$(@F)),$(cmd_$(1)))),\
	               @$(rule_$(1)))

673 674 675 676
# If quiet is set, only print short version of rule

cmd = @$(if $($(quiet)$(1)),echo '  $($(quiet)$(1))' &&) $($(1))

677 678 679 680 681 682 683 684 685 686
define update-if-changed
	if [ -r $@ ] && cmp -s $@ $@.tmp; then \
		echo ' (unchanged)'; \
		rm -f $@.tmp; \
	else \
		echo ' (updated)'; \
		mv -f $@.tmp $@; \
	fi
endef

687

688
FORCE: