Makefile 24.7 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 = 27
Linus Torvalds's avatar
Linus Torvalds committed
4
EXTRAVERSION =
Linus Torvalds's avatar
Linus Torvalds committed
5

6 7 8 9 10 11
# *DOCUMENTATION*
# Too see a list of typical targets execute "make help"
# More info can be located in ./Documentation/kbuild
# Comments in this file is targeted only to the developer, do not
# expect to learn how to build the kernel reading this file.

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
# 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
28 29 30
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/)
31
KERNELPATH=kernel-$(shell echo $(KERNELRELEASE) | sed -e "s/-//g")
Linus Torvalds's avatar
Linus Torvalds committed
32 33 34 35

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
36
TOPDIR	:= $(CURDIR)
Linus Torvalds's avatar
Linus Torvalds committed
37 38 39 40 41 42 43 44 45

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

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

CROSS_COMPILE 	=

46 47 48 49
# 	That's our default target when none is given on the command line

all:	vmlinux

50 51 52
#	Print entire command lines instead of short version
#	For now, leave the default

53 54 55
ifndef KBUILD_VERBOSE
  KBUILD_VERBOSE = 1
endif
56

57 58
# 	Decide whether to build built-in, modular, or both.
#	Normally, just do built-in.
59

60
KBUILD_MODULES :=
61 62
KBUILD_BUILTIN := 1

63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
#	If we have only "make modules", don't compile built-in objects.

ifeq ($(MAKECMDGOALS),modules)
  KBUILD_BUILTIN :=
endif

#	If we have "make <whatever> modules", compile modules
#	in addition to whatever we do anyway.

ifneq ($(filter modules,$(MAKECMDGOALS)),)
  KBUILD_MODULES := 1
endif

#	Just "make" or "make all" shall build modules as well

ifeq ($(MAKECMDGOALS),)
  KBUILD_MODULES := 1
endif

ifneq ($(filter all,$(MAKECMDGOALS)),)
  KBUILD_MODULES := 1
endif

86 87
export KBUILD_MODULES KBUILD_BUILTIN

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
# 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
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
#
# 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
136
PERL		= perl
Linus Torvalds's avatar
Linus Torvalds committed
137
MODFLAGS	= -DMODULE
138
CFLAGS_MODULE   = $(MODFLAGS)
139
AFLAGS_MODULE   = $(MODFLAGS)
Linus Torvalds's avatar
Linus Torvalds committed
140
CFLAGS_KERNEL	=
141
AFLAGS_KERNEL	=
Kai Germaschewski's avatar
Kai Germaschewski committed
142
EXPORT_FLAGS    =
143
NOSTDINC_FLAGS  = -nostdinc -iwithprefix include
Linus Torvalds's avatar
Linus Torvalds committed
144 145 146

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

149
export CPPFLAGS EXPORT_FLAGS NOSTDINC_FLAGS OBJCOPYFLAGS
Kai Germaschewski's avatar
Kai Germaschewski committed
150 151 152
export CFLAGS CFLAGS_KERNEL CFLAGS_MODULE 
export AFLAGS AFLAGS_KERNEL AFLAGS_MODULE

153 154 155 156 157 158 159
src	:= .
obj	:= .
srctree := $(TOPDIR)
objtree := $(TOPDIR)

export srctree objtree

160 161
SUBDIRS		:= init kernel mm fs ipc lib drivers sound net security

162

163 164
noconfig_targets := xconfig menuconfig config oldconfig randconfig \
		    defconfig allyesconfig allnoconfig allmodconfig \
165
		    clean mrproper distclean \
166
		    help tags TAGS sgmldocs psdocs pdfdocs htmldocs \
167
		    checkconfig checkhelp checkincludes
Linus Torvalds's avatar
Linus Torvalds committed
168

169 170 171 172
ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)

# Here goes the main Makefile
# ===========================================================================
Linus Torvalds's avatar
Linus Torvalds committed
173
#
174 175 176 177
# 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
178

179 180 181 182 183 184 185 186 187
#	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!'
188 189
	@echo '*** Please run some configurator (do "make xconfig" or'
	@echo '*** "make menuconfig" or "make oldconfig" or "make config").'
190 191
	@echo '***'
	@exit 1
Linus Torvalds's avatar
Linus Torvalds committed
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214

#
# 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
215
CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes -Wno-trigraphs -O2 \
Linus Torvalds's avatar
Linus Torvalds committed
216
	  -fomit-frame-pointer -fno-strict-aliasing -fno-common
Linus Torvalds's avatar
Linus Torvalds committed
217 218
AFLAGS := -D__ASSEMBLY__ $(CPPFLAGS)

Kai Germaschewski's avatar
Kai Germaschewski committed
219 220 221 222
ifdef CONFIG_MODULES
EXPORT_FLAGS := -DEXPORT_SYMTAB
endif

223 224
# Link components for vmlinux
# ---------------------------------------------------------------------------
225

226
INIT		:= init/init.o
227
CORE_FILES	:= kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o security/built-in.o
228 229 230
LIBS		:= lib/lib.a
DRIVERS		:= drivers/built-in.o sound/sound.o
NETWORKS	:= net/network.o
Linus Torvalds's avatar
Linus Torvalds committed
231 232 233

include arch/$(ARCH)/Makefile

234
export	NETWORKS DRIVERS LIBS HEAD LDFLAGS MAKEBOOT ASFLAGS
Linus Torvalds's avatar
Linus Torvalds committed
235

236
# boot target
237
# ---------------------------------------------------------------------------
Linus Torvalds's avatar
Linus Torvalds committed
238 239

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

242 243 244 245 246 247 248 249 250 251 252 253
# 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)

254
quiet_cmd_link_vmlinux = LD     $@
255
cmd_link_vmlinux = $(LD) $(LDFLAGS) $(LDFLAGS_$(@F)) $(HEAD) $(INIT) \
Linus Torvalds's avatar
Linus Torvalds committed
256 257
		--start-group \
		$(CORE_FILES) \
Linus Torvalds's avatar
Linus Torvalds committed
258
		$(LIBS) \
Linus Torvalds's avatar
Linus Torvalds committed
259 260 261 262
		$(DRIVERS) \
		$(NETWORKS) \
		--end-group \
		-o vmlinux
263 264 265 266 267

#	set -e makes the rule exit immediately on error

define rule_link_vmlinux
	set -e
268
	echo '  Generating build number'
269 270
	. scripts/mkversion > .tmpversion
	mv -f .tmpversion .version
Kai Germaschewski's avatar
Kai Germaschewski committed
271
	+$(MAKE) -C init
272
	$(call cmd,link_vmlinux)
273 274
	$(cmd_link_vmlinux)
	echo 'cmd_$@ := $(cmd_link_vmlinux)' > $(@D)/.$(@F).cmd
Linus Torvalds's avatar
Linus Torvalds committed
275
	$(NM) vmlinux | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map
276 277
endef

278
vmlinux: $(vmlinux-objs) FORCE
279 280
	$(call if_changed_rule,link_vmlinux)

281 282
#	The actual objects are generated when descending, 
#	make sure no implicit rule kicks in
283

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

286 287
# 	Handle descending into subdirectories listed in $(SUBDIRS)

288
.PHONY: $(SUBDIRS)
289
$(SUBDIRS): .hdepend prepare
290
	@$(MAKE) -C $@
291

292 293
#	Things we need done before we descend to build or make
#	module versions are listed in "prepare"
294 295

.PHONY: prepare
296
prepare: include/linux/version.h include/asm include/config/MARKER
297
	@echo '  Starting the build. KBUILD_BUILTIN=$(KBUILD_BUILTIN) KBUILD_MODULES=$(KBUILD_MODULES)'
298

299 300 301 302 303 304 305 306 307
# Single targets
# ---------------------------------------------------------------------------

%.s: %.c FORCE
	@$(MAKE) -C $(@D) $(@F)
%.i: %.c FORCE
	@$(MAKE) -C $(@D) $(@F)
%.o: %.c FORCE
	@$(MAKE) -C $(@D) $(@F)
308 309
%.lst: %.c FORCE
	@$(MAKE) -C $(@D) $(@F)
310 311 312 313 314
%.s: %.S FORCE
	@$(MAKE) -C $(@D) $(@F)
%.o: %.S FORCE
	@$(MAKE) -C $(@D) $(@F)

315 316 317
# 	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.
318

319
include/asm:
320
	@echo '  Making asm->asm-$(ARCH) symlink'
321
	@ln -s asm-$(ARCH) $@
322

323
# 	Split autoconf.h into include/linux/config/*
324

Linus Torvalds's avatar
Linus Torvalds committed
325
include/config/MARKER: scripts/split-include include/linux/autoconf.h
326
	@echo '  SPLIT  include/linux/autoconf.h -> include/config/*'
327 328
	@scripts/split-include include/linux/autoconf.h include/config
	@touch $@
Linus Torvalds's avatar
Linus Torvalds committed
329

330 331 332 333 334 335 336 337 338 339
# 	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

340
# Generate some files
341
# ---------------------------------------------------------------------------
Linus Torvalds's avatar
Linus Torvalds committed
342

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

346 347
uts_len := 64

348
include/linux/version.h: Makefile
349 350 351 352
	@if expr length "$(KERNELRELEASE)" \> $(uts_len) >/dev/null ; then \
	  echo '"$(KERNELRELEASE)" exceeds $(uts_len) characters' >&2; \
	  exit 1; \
	fi;
353
	@echo -n '  Generating $@'
354 355 356 357 358
	@(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
359

360 361
# Helpers built in scripts/
# ---------------------------------------------------------------------------
362

363
scripts/fixdep scripts/split-include : scripts ;
364 365 366

.PHONY: scripts
scripts:
367 368
	@$(MAKE) -C scripts

369
# Generate module versions
370 371
# ---------------------------------------------------------------------------

372 373 374
# 	The targets are still named depend / dep for traditional
#	reasons, but the only thing we do here is generating
#	the module version checksums.
375

376 377 378
.PHONY: depend dep $(patsubst %,_sfdep_%,$(SUBDIRS))

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

380
#	.hdepend is our (misnomed) marker for whether we've run
Kai Germaschewski's avatar
Kai Germaschewski committed
381
#	generated module versions
382

383
.hdepend: $(if $(filter dep depend,$(MAKECMDGOALS)),FORCE)
Kai Germaschewski's avatar
Kai Germaschewski committed
384
	@$(MAKE) include/linux/modversions.h
385
	@touch $@
386

387
ifdef CONFIG_MODVERSIONS
388

389 390
# 	Update modversions.h, but only if it would change.

391 392 393
include/linux/modversions.h: scripts/fixdep prepare FORCE
	@rm -rf .tmp_export-objs
	@$(MAKE) $(patsubst %,_sfdep_%,$(SUBDIRS))
394
	@echo -n '  Generating $@'
395 396 397
	@( echo "#ifndef _LINUX_MODVERSIONS_H";\
	   echo "#define _LINUX_MODVERSIONS_H"; \
	   echo "#include <linux/modsetver.h>"; \
398
	   for f in `cd .tmp_export-objs; find modules -name SCCS -prune -o -name BitKeeper -prune -o -name \*.ver -print | sort`; do \
399 400 401
	     echo "#include <linux/$${f}>"; \
	   done; \
	   echo "#endif"; \
402 403
	) > $@.tmp; \
	$(update-if-changed)
404

405 406 407
$(patsubst %,_sfdep_%,$(SUBDIRS)): FORCE
	@$(MAKE) -C $(patsubst _sfdep_%, %, $@) fastdep

408 409
else # !CONFIG_MODVERSIONS

410 411 412
.PHONY: include/linux/modversions.h

include/linux/modversions.h:
413 414 415

endif # CONFIG_MODVERSIONS

416 417
# ---------------------------------------------------------------------------
# Modules
Linus Torvalds's avatar
Linus Torvalds committed
418 419

ifdef CONFIG_MODULES
420 421 422

#	Build modules

Linus Torvalds's avatar
Linus Torvalds committed
423
ifdef CONFIG_MODVERSIONS
424
MODFLAGS += -include $(HPATH)/linux/modversions.h
Linus Torvalds's avatar
Linus Torvalds committed
425 426 427
endif

.PHONY: modules
428
modules: $(SUBDIRS)
Linus Torvalds's avatar
Linus Torvalds committed
429

430 431
#	Install modules

Linus Torvalds's avatar
Linus Torvalds committed
432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452
.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
453
_modinst_post:
Linus Torvalds's avatar
Linus Torvalds committed
454 455 456 457
	if [ -r System.map ]; then $(DEPMOD) -ae -F System.map $(depmod_opts) $(KERNELRELEASE); fi

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

460 461 462
else # CONFIG_MODULES

# Modules not configured
463
# ---------------------------------------------------------------------------
Linus Torvalds's avatar
Linus Torvalds committed
464

465
modules modules_install: FORCE
Linus Torvalds's avatar
Linus Torvalds committed
466 467 468 469 470 471 472
	@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

473
endif # CONFIG_MODULES
Linus Torvalds's avatar
Linus Torvalds committed
474

475 476 477 478 479 480 481 482 483 484 485 486 487 488
# Generate asm-offsets.h 
# ---------------------------------------------------------------------------

define generate-asm-offsets.h
	(set -e; \
	 echo "#ifndef __ASM_OFFSETS_H__"; \
	 echo "#define __ASM_OFFSETS_H__"; \
	 echo "/*"; \
	 echo " * DO NOT MODIFY."; \
	 echo " *"; \
	 echo " * This file was generated by arch/$(ARCH)/Makefile"; \
	 echo " *"; \
	 echo " */"; \
	 echo ""; \
489
	 sed -ne "/^->/{s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; s:->::; p;}"; \
490 491 492 493
	 echo ""; \
	 echo "#endif" )
endef

494
# RPM target
495 496 497 498 499 500 501 502 503 504 505 506 507 508
# ---------------------------------------------------------------------------

#	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
509 510 511
	find . -name SCCS -prune -o -name BitKeeper -prune -o \
		\( -size 0 -o -name .depend -o -name .hdepend \) \
		-type f -print | xargs rm -f
512 513 514 515 516 517 518 519 520 521
	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

522 523
else # ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)

524 525
ifeq ($(filter-out $(noconfig_targets),$(MAKECMDGOALS)),)

526 527
# Targets which don't need .config
# ===========================================================================
528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547
#
# 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.
548 549 550 551

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

552 553
.PHONY: oldconfig xconfig menuconfig config \
	make_with_config
554 555 556 557 558 559

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

menuconfig:
560
	@$(MAKE) -C scripts lxdialog
561 562 563 564 565
	$(CONFIG_SHELL) scripts/Menuconfig arch/$(ARCH)/config.in

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

566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583
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

584 585 586 587 588
# Cleaning up
# ---------------------------------------------------------------------------

#	files removed with 'make clean'
CLEAN_FILES += \
Kai Germaschewski's avatar
Kai Germaschewski committed
589
	include/linux/compile.h \
590 591 592 593
	vmlinux System.map \
	drivers/char/consolemap_deftbl.c drivers/video/promcon_tbl.c \
	drivers/char/conmakehash \
	drivers/char/drm/*-mod.c \
594
	drivers/char/defkeymap.c drivers/char/qtronixmap.c \
595 596 597 598
	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} \
599 600
	drivers/scsi/aic7xxx/aic7xxx_seq.h \
	drivers/scsi/aic7xxx/aic7xxx_reg.h \
601 602 603 604
	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 \
605 606 607
	drivers/scsi/53c700_d.h drivers/scsi/sim710_d.h \
	drivers/scsi/53c7xx_d.h drivers/scsi/53c7xx_u.h \
	drivers/scsi/53c8xx_d.h drivers/scsi/53c8xx_u.h \
608 609 610
	net/802/cl2llc.c net/802/transit/pdutr.h net/802/transit/timertr.h \
	net/802/pseudo/pseudocode.h \
	net/khttpd/make_times_h net/khttpd/times.h \
611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630
	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 \
631 632
	.hdepend scripts/split-include scripts/docproc \
	scripts/fixdep $(TOPDIR)/include/linux/modversions.h \
633
	tags TAGS kernel.spec \
Kai Germaschewski's avatar
Kai Germaschewski committed
634
	.tmpversion
635 636 637

# 	directories removed with 'make mrproper'
MRPROPER_DIRS += \
Kai Germaschewski's avatar
Kai Germaschewski committed
638
	.tmp_export-objs \
639 640 641
	include/config \
	$(TOPDIR)/include/linux/modules

642 643 644
#	That's our way to know about arch specific cleanup.

include arch/$(ARCH)/Makefile
Linus Torvalds's avatar
Linus Torvalds committed
645 646

clean:	archclean
647
	@echo 'Cleaning up'
648 649 650
	@find . -name SCCS -prune -o -name BitKeeper -prune -o \
		\( -name \*.[oas] -o -name core -o -name .\*.cmd -o \
		-name .\*.tmp -o -name .\*.d \) -type f -print \
Linus Torvalds's avatar
Linus Torvalds committed
651
		| grep -v lxdialog/ | xargs rm -f
Kai Germaschewski's avatar
Kai Germaschewski committed
652
	@rm -f $(CLEAN_FILES)
653
	@$(MAKE) -C Documentation/DocBook clean
Linus Torvalds's avatar
Linus Torvalds committed
654 655

mrproper: clean archmrproper
656
	@echo 'Making mrproper'
657 658 659
	@find . -name SCCS -prune -o -name BitKeeper -prune -o \
		\( -name .depend -o -name .\*.cmd \) \
		-type f -print | xargs rm -f
660 661
	@rm -f $(MRPROPER_FILES)
	@rm -rf $(MRPROPER_DIRS)
662
	@$(MAKE) -C Documentation/DocBook mrproper
Linus Torvalds's avatar
Linus Torvalds committed
663 664

distclean: mrproper
665
	@echo 'Making distclean'
666 667
	@find . -name SCCS -prune -o -name BitKeeper -prune -o \
		\( -not -type d \) -and \
668
	 	\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
Linus Torvalds's avatar
Linus Torvalds committed
669
		-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
670 671
	 	-o -name '.*.rej' -o -name '.SUMS' -o -size 0 \) -type f \
		-print | xargs rm -f
Linus Torvalds's avatar
Linus Torvalds committed
672

673 674 675 676
# Generate tags for editors
# ---------------------------------------------------------------------------

TAGS: FORCE
677 678 679 680 681 682 683 684
	{ find include/asm-${ARCH} -name SCCS -prune -o -name BitKeeper -prune \
		-o -name '*.h' -print ; \
	find include -name SCCS -prune -o -name BitKeeper -prune -o \
		-type d \( -name "asm-*" -o -name config \) -prune -o \
		-name '*.h' -print ; \
	find $(SUBDIRS) init arch/${ARCH} \
		-name SCCS -prune -o -name BitKeeper -prune -o \
		-name '*.[chS]' -print ; } | grep -v SCCS | etags -
685 686 687 688

# 	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"`; \
689 690 691 692 693 694
	ctags $$CTAGSF `find include/asm-$(ARCH) -name SCCS -prune -o -name BitKeeper -prune -o -name '*.h' -print` && \
	find include -name SCCS -prune -o -name BitKeeper -prune -o \
		-type d \( -name "asm-*" -o -name config \) -prune -o \
		-name '*.h' -print | xargs ctags $$CTAGSF -a && \
	find $(SUBDIRS) init -name SCCS -prune -o -name BitKeeper -prune -o \
		-name '*.[ch]' -print | xargs ctags $$CTAGSF -a
695

696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732
# Brief documentation of the typical targets used
# ---------------------------------------------------------------------------

help:
	@echo  'Cleaning targets:'
	@echo  '  clean		- remove most generated files but keep the config'
	@echo  '  mrproper	- remove all generated files including the config'
	@echo  '  distclean	- mrproper + remove files generated by editors and patch'
	@echo  ''
	@echo  'Configuration targets:'
	@echo  '  oldconfig	- Update current config utilising a line-oriented program'
	@echo  '  menuconfig	- Update current config utilising a menu based program'
	@echo  '  xconfig	- Update current config utilising a X-based program'
	@echo  '  defconfig	- New config with default answer to all options'
	@echo  '  allmodconfig	- New config selecting modules when possible'
	@echo  '  allyesconfig	- New config where all options are accepted with yes'
	@echo  '  allnoconfig	- New minimal config'
	@echo  ''
	@echo  'Other generic targets:'
	@echo  '  all		- Build all targets marked with [*]'
	@echo  '  dep           - Create module version information'
	@echo  '* vmlinux	- Build the bare kernel'
	@echo  '* modules	- Build all modules'
	@echo  '  dir/file.[ois]- Build specified target only'
	@echo  '  rpm		- Build a kernel as an RPM package'
	@echo  '  tags/TAGS	- Generate tags file for editors'
	@echo  ''
	@echo  'Documentation targets:'
	@$(MAKE) --no-print-directory -f Documentation/DocBook/Makefile dochelp
	@echo  ''
	@echo  'Architecture specific targets ($(ARCH)):'
	@$(MAKE) --no-print-directory -f arch/$(ARCH)/boot/Makefile archhelp
	@echo  ''
	@echo  'Execute "make" or "make all" to build all targets marked with [*] '
	@echo  'For further info browse Documentation/kbuild/*'
 

733 734 735 736 737 738 739 740 741 742 743
# Documentation targets
# ---------------------------------------------------------------------------

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


# Scripts to check various things for consistency
# ---------------------------------------------------------------------------

checkconfig:
744 745 746
	find * -name SCCS -prune -o -name BitKeeper -prune -o \
		-name '*.[hcS]' -type f -print | sort \
		| xargs $(PERL) -w scripts/checkconfig.pl
747 748

checkhelp:
749 750 751
	find * -name SCCS -prune -o -name BitKeeper -prune -o \
		-name [cC]onfig.in -print | sort \
		| xargs $(PERL) -w scripts/checkhelp.pl
752 753

checkincludes:
754 755 756
	find * -name SCCS -prune -o -name BitKeeper -prune -o \
		-name '*.[hcS]' -type f -print | sort \
		| xargs $(PERL) -w scripts/checkincludes.pl
757

758 759 760 761 762 763 764 765 766 767 768 769
else # ifneq ($(filter-out $(noconfig_targets),$(MAKECMDGOALS)),)

# We're called with both targets which do and do not need
# .config included. Handle them one after the other.
# ===========================================================================

%:: FORCE
	$(MAKE) $@

endif # ifeq ($(filter-out $(noconfig_targets),$(MAKECMDGOALS)),)
endif # ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)

770
# FIXME Should go into a make.lib or something 
771
# ===========================================================================
772

773 774 775 776 777 778 779 780 781 782 783
# 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)

784 785 786 787 788
if_changed_rule = $(if $(strip $? \
		               $(filter-out $(cmd_$(1)),$(cmd_$(@F)))\
			       $(filter-out $(cmd_$(@F)),$(cmd_$(1)))),\
	               @$(rule_$(1)))

789
# If quiet is set, only print short version of command
790

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

793 794 795 796 797 798 799 800 801 802
define update-if-changed
	if [ -r $@ ] && cmp -s $@ $@.tmp; then \
		echo ' (unchanged)'; \
		rm -f $@.tmp; \
	else \
		echo ' (updated)'; \
		mv -f $@.tmp $@; \
	fi
endef

803

804
FORCE: