Commit 088205b5 authored by Sam Ravnborg's avatar Sam Ravnborg

[PATCH] Move config tasks to kconfig/Makefile

This fixes a bug with multiple targets.

Olaf Hering reported that the build failed for PowerPc if used like
this: make oldconfig zImage

The reason for this was that .config was not present for any targets
specified in arch/$(ARCH)/Makefile and below.

That's because .config would not be included when oldconfig is present
in the list of targets.  The fix is to move handling of *config task to
the kconfig/Makefile.  Furthermore the logic in top-level makefile has
changed a bit, creating a more logial structure.  When building a fresh
kernel, the user is now told that .config is missing, not an anonymous
report that .config did not exist.

The error has survided this long because the targets used in i386/boot
in general does not use CONFIG_ symbols.

Olaf Hering has tested this patch with success.
parent 30084613
...@@ -243,17 +243,15 @@ export MODVERDIR := .tmp_versions ...@@ -243,17 +243,15 @@ export MODVERDIR := .tmp_versions
comma := , comma := ,
depfile = $(subst $(comma),_,$(@D)/.$(@F).d) depfile = $(subst $(comma),_,$(@D)/.$(@F).d)
noconfig_targets := xconfig gconfig menuconfig config oldconfig randconfig \ # Files to ignore in find ... statements
defconfig allyesconfig allnoconfig allmodconfig \
clean mrproper distclean rpm \
help tags TAGS cscope %docs \
checkconfig checkhelp checkincludes
RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS \) -prune -o RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS \) -prune -o
RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn --exclude CVS RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn --exclude CVS
# ===========================================================================
# Rules shared between *config targets and build targets
# Helpers built in scripts/ # Helpers built in scripts/
# ---------------------------------------------------------------------------
scripts/docproc scripts/fixdep scripts/split-include : scripts ; scripts/docproc scripts/fixdep scripts/split-include : scripts ;
...@@ -261,9 +259,49 @@ scripts/docproc scripts/fixdep scripts/split-include : scripts ; ...@@ -261,9 +259,49 @@ scripts/docproc scripts/fixdep scripts/split-include : scripts ;
scripts: scripts:
$(Q)$(MAKE) $(build)=scripts $(Q)$(MAKE) $(build)=scripts
# Objects we will link into vmlinux / subdirs we need to visit
# ---------------------------------------------------------------------------
# To make sure we do not include .config for any of the *config targets
# catch them early, and hand them over to scripts/kconfig/Makefile
# It is allowed to specify more targets when calling make, including
# mixing *config targets and build targets.
# For example 'make oldconfig all'.
# Detect when mixed targets is specified, and make a second invocation
# of make so .config is not included in this case either (for *config).
config-targets := 0
mixed-targets := 0
ifneq ($(filter config %config,$(MAKECMDGOALS)),)
config-targets := 1
ifneq ($(filter-out config %config,$(MAKECMDGOALS)),)
mixed-targets := 1
endif
endif
ifeq ($(mixed-targets),1)
# ===========================================================================
# We're called with mixed targets (*config and build targets).
# Handle them one by one.
%:: FORCE
$(Q)$(MAKE) $@
else
ifeq ($(config-targets),1)
# ===========================================================================
# *config targets only - make sure prerequisites are updated, and descend
# in scripts/kconfig to make the *config target
%config: scripts/fixdep FORCE
$(Q)$(MAKE) $(build)=scripts/kconfig $@
config : scripts/fixdep FORCE
$(Q)$(MAKE) $(build)=scripts/kconfig $@
else
# ===========================================================================
# Build targets only - this includes vmlinux, arch specific targets, clean
# targets and others. In general all targets except *config targets.
# Objects we will link into vmlinux / subdirs we need to visit
init-y := init/ init-y := init/
drivers-y := drivers/ sound/ drivers-y := drivers/ sound/
net-y := net/ net-y := net/
...@@ -271,14 +309,8 @@ libs-y := lib/ ...@@ -271,14 +309,8 @@ libs-y := lib/
core-y := usr/ core-y := usr/
SUBDIRS := SUBDIRS :=
ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)
export include_config := 1
-include .config -include .config
endif
include arch/$(ARCH)/Makefile include arch/$(ARCH)/Makefile
# Let architecture Makefiles change CPPFLAGS if needed # Let architecture Makefiles change CPPFLAGS if needed
...@@ -304,10 +336,8 @@ libs-y1 := $(patsubst %/, %/lib.a, $(libs-y)) ...@@ -304,10 +336,8 @@ libs-y1 := $(patsubst %/, %/lib.a, $(libs-y))
libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y)) libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y))
libs-y := $(libs-y1) $(libs-y2) libs-y := $(libs-y1) $(libs-y2)
ifdef include_config
# Here goes the main Makefile # Here goes the main Makefile
# =========================================================================== # ---------------------------------------------------------------------------
# #
# If the user gave a *config target, it'll be handled in another # If the user gave a *config target, it'll be handled in another
# section below, since in this case we cannot include .config # section below, since in this case we cannot include .config
...@@ -608,72 +638,6 @@ define filechk_gen-asm-offsets ...@@ -608,72 +638,6 @@ define filechk_gen-asm-offsets
echo "#endif" ) echo "#endif" )
endef endef
else # ifdef include_config
ifeq ($(filter-out $(noconfig_targets),$(MAKECMDGOALS)),)
# Targets which don't need .config
# ===========================================================================
#
# 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.
# Kernel configuration
# ---------------------------------------------------------------------------
.PHONY: oldconfig xconfig gconfig menuconfig config \
make_with_config rpm
scripts/kconfig/conf scripts/kconfig/mconf scripts/kconfig/qconf scripts/kconfig/gconf: scripts/fixdep FORCE
$(Q)$(MAKE) $(build)=scripts/kconfig $@
xconfig: scripts/kconfig/qconf
./scripts/kconfig/qconf arch/$(ARCH)/Kconfig
gconfig: scripts/kconfig/gconf
./scripts/kconfig/gconf arch/$(ARCH)/Kconfig
menuconfig: scripts/kconfig/mconf
$(Q)$(MAKE) $(build)=scripts/lxdialog
./scripts/kconfig/mconf arch/$(ARCH)/Kconfig
config: scripts/kconfig/conf
./scripts/kconfig/conf arch/$(ARCH)/Kconfig
oldconfig: scripts/kconfig/conf
./scripts/kconfig/conf -o arch/$(ARCH)/Kconfig
randconfig: scripts/kconfig/conf
./scripts/kconfig/conf -r arch/$(ARCH)/Kconfig
allyesconfig: scripts/kconfig/conf
./scripts/kconfig/conf -y arch/$(ARCH)/Kconfig
allnoconfig: scripts/kconfig/conf
./scripts/kconfig/conf -n arch/$(ARCH)/Kconfig
allmodconfig: scripts/kconfig/conf
./scripts/kconfig/conf -m arch/$(ARCH)/Kconfig
defconfig: scripts/kconfig/conf
./scripts/kconfig/conf -d arch/$(ARCH)/Kconfig
### ###
# Cleaning is done on three levels. # Cleaning is done on three levels.
...@@ -778,6 +742,8 @@ tags: FORCE ...@@ -778,6 +742,8 @@ tags: FORCE
# RPM target # RPM target
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
.PHONY: rpm
# If you do a make spec before packing the tarball you can rpm -ta it # If you do a make spec before packing the tarball you can rpm -ta it
spec: spec:
...@@ -813,14 +779,7 @@ help: ...@@ -813,14 +779,7 @@ help:
@echo ' mrproper - remove all generated files + config + various backup files' @echo ' mrproper - remove all generated files + config + various backup files'
@echo '' @echo ''
@echo 'Configuration targets:' @echo 'Configuration targets:'
@echo ' oldconfig - Update current config utilising a line-oriented program' @$(MAKE) -f scripts/kconfig/Makefile help
@echo ' menuconfig - Update current config utilising a menu based program'
@echo ' xconfig - Update current config utilising a QT based front-end'
@echo ' gconfig - Update current config utilising a GTK based front-end'
@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 ''
@echo 'Other generic targets:' @echo 'Other generic targets:'
@echo ' all - Build all targets marked with [*]' @echo ' all - Build all targets marked with [*]'
...@@ -833,7 +792,7 @@ help: ...@@ -833,7 +792,7 @@ help:
@echo ' tags/TAGS - Generate tags file for editors' @echo ' tags/TAGS - Generate tags file for editors'
@echo '' @echo ''
@echo 'Documentation targets:' @echo 'Documentation targets:'
@$(MAKE) --no-print-directory -f Documentation/DocBook/Makefile dochelp @$(MAKE) -f Documentation/DocBook/Makefile dochelp
@echo '' @echo ''
@echo 'Architecture specific targets ($(ARCH)):' @echo 'Architecture specific targets ($(ARCH)):'
@$(if $(archhelp),$(archhelp),\ @$(if $(archhelp),$(archhelp),\
...@@ -864,17 +823,8 @@ checkincludes: ...@@ -864,17 +823,8 @@ checkincludes:
-name '*.[hcS]' -type f -print | sort \ -name '*.[hcS]' -type f -print | sort \
| xargs $(PERL) -w scripts/checkincludes.pl | xargs $(PERL) -w scripts/checkincludes.pl
else # ifneq ($(filter-out $(noconfig_targets),$(MAKECMDGOALS)),) endif #ifeq ($(config-targets),1)
endif #ifeq ($(mixed-targets),1)
# We're called with both targets which do and do not need
# .config included. Handle them one after the other.
# ===========================================================================
%:: FORCE
$(Q)$(MAKE) $@
endif # ifeq ($(filter-out $(noconfig_targets),$(MAKECMDGOALS)),)
endif # ifdef include_config
# FIXME Should go into a make.lib or something # FIXME Should go into a make.lib or something
# =========================================================================== # ===========================================================================
...@@ -894,6 +844,7 @@ targets := $(wildcard $(sort $(targets))) ...@@ -894,6 +844,7 @@ targets := $(wildcard $(sort $(targets)))
cmd_files := $(wildcard .*.cmd $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd)) cmd_files := $(wildcard .*.cmd $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))
ifneq ($(cmd_files),) ifneq ($(cmd_files),)
$(cmd_files): ; # Do not try to update included dependency files
include $(cmd_files) include $(cmd_files)
endif endif
......
...@@ -7,9 +7,8 @@ src := $(obj) ...@@ -7,9 +7,8 @@ src := $(obj)
.PHONY: __build .PHONY: __build
__build: __build:
ifdef include_config # Read .config if it exist, otherwise ignore
include .config -include .config
endif
include $(obj)/Makefile include $(obj)/Makefile
......
################# # ===========================================================================
# # Kernel configuration targets
# Shared Makefile for the various lkc executables: # These targets are used from top-level makefile
.PHONY: oldconfig xconfig gconfig menuconfig config
xconfig: scripts/kconfig/qconf
./scripts/kconfig/qconf arch/$(ARCH)/Kconfig
gconfig: scripts/kconfig/gconf
./scripts/kconfig/gconf arch/$(ARCH)/Kconfig
menuconfig: scripts/kconfig/mconf
$(Q)$(MAKE) $(build)=scripts/lxdialog
./scripts/kconfig/mconf arch/$(ARCH)/Kconfig
config: scripts/kconfig/conf
./scripts/kconfig/conf arch/$(ARCH)/Kconfig
oldconfig: scripts/kconfig/conf
./scripts/kconfig/conf -o arch/$(ARCH)/Kconfig
.PHONY: randconfig allyesconfig allnoconfig allmodconfig defconfig
randconfig: scripts/kconfig/conf
./scripts/kconfig/conf -r arch/$(ARCH)/Kconfig
allyesconfig: scripts/kconfig/conf
./scripts/kconfig/conf -y arch/$(ARCH)/Kconfig
allnoconfig: scripts/kconfig/conf
./scripts/kconfig/conf -n arch/$(ARCH)/Kconfig
allmodconfig: scripts/kconfig/conf
./scripts/kconfig/conf -m arch/$(ARCH)/Kconfig
defconfig: scripts/kconfig/conf
./scripts/kconfig/conf -d arch/$(ARCH)/Kconfig
# Help text used by make help
help:
@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 QT based front-end'
@echo ' gconfig - Update current config utilising a GTK based front-end'
@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'
# ===========================================================================
# Shared Makefile for the various kconfig executables:
# conf: Used for defconfig, oldconfig and related targets # conf: Used for defconfig, oldconfig and related targets
# mconf: Used for the mconfig target. # mconf: Used for the mconfig target.
# Utilizes the lxdialog package # Utilizes the lxdialog package
...@@ -8,10 +57,8 @@ ...@@ -8,10 +57,8 @@
# Based on QT which needs to be installed to compile it # Based on QT which needs to be installed to compile it
# gconf: Used for the gconfig target # gconf: Used for the gconfig target
# Based on GTK which needs to be installed to compile it # Based on GTK which needs to be installed to compile it
# # object files used by all kconfig flavours
#################
# object files used by all lkc flavours
libkconfig-objs := zconf.tab.o libkconfig-objs := zconf.tab.o
host-progs := conf mconf qconf gconf host-progs := conf mconf qconf gconf
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment