The kbuild system takes advantage of an incorrect behavior in GNU make. Once this behavior is fixed, all files in the kernel rebuild every time, even if nothing has changed. This patch ensures kbuild works with both the incorrect and correct behaviors of GNU make. For more details on the incorrect behavior, see: http://lists.gnu.org/archive/html/bug-make/2006-03/msg00003.html Changes in this patch: - Keep all targets that are to be marked .PHONY in a variable, PHONY. - Add .PHONY: $(PHONY) to mark them properly. - Remove any $(PHONY) files from the $? list when determining whether targets are up-to-date or not. Signed-off-by: Paul Smith <psmith@gnu.org> Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
7.7 KiB
===========================================================================
Kernel configuration targets
These targets are used from top-level makefile
PHONY += oldconfig xconfig gconfig menuconfig config silentoldconfig update-po-config
xconfig: $(obj)/qconf $< arch/$(ARCH)/Kconfig
gconfig: $(obj)/gconf $< arch/$(ARCH)/Kconfig
menuconfig: $(obj)/mconf $(Q)$(MAKE) $(build)=scripts/kconfig/lxdialog $< arch/$(ARCH)/Kconfig
config: $(obj)/conf $< arch/$(ARCH)/Kconfig
oldconfig: $(obj)/conf $< -o arch/$(ARCH)/Kconfig
silentoldconfig: $(obj)/conf $< -s arch/$(ARCH)/Kconfig
update-po-config: $(obj)/kxgettext
xgettext --default-domain=linux
--add-comments --keyword=_ --keyword=N_
--files-from=scripts/kconfig/POTFILES.in
--output scripts/kconfig/config.pot
$(Q)ln -fs Kconfig_i386 arch/um/Kconfig_arch
$(Q)for i in ls arch/;
do
scripts/kconfig/kxgettext arch/$$i/Kconfig
| msguniq -o scripts/kconfig/linux_$${i}.pot;
done
$(Q)msgcat scripts/kconfig/config.pot
find scripts/kconfig/ -type f -name linux_*.pot
--output scripts/kconfig/linux_raw.pot
$(Q)msguniq --sort-by-file scripts/kconfig/linux_raw.pot
--output scripts/kconfig/linux.pot
$(Q)rm -f arch/um/Kconfig_arch
$(Q)rm -f scripts/kconfig/linux_*.pot scripts/kconfig/config.pot
PHONY += randconfig allyesconfig allnoconfig allmodconfig defconfig
randconfig: $(obj)/conf $< -r arch/$(ARCH)/Kconfig
allyesconfig: $(obj)/conf $< -y arch/$(ARCH)/Kconfig
allnoconfig: $(obj)/conf $< -n arch/$(ARCH)/Kconfig
allmodconfig: $(obj)/conf $< -m arch/$(ARCH)/Kconfig
defconfig: $(obj)/conf ifeq ($(KBUILD_DEFCONFIG),) $< -d arch/$(ARCH)/Kconfig else @echo *** Default configuration is based on '$(KBUILD_DEFCONFIG)' $(Q)$< -D arch/$(ARCH)/configs/$(KBUILD_DEFCONFIG) arch/$(ARCH)/Kconfig endif
%_defconfig: $(obj)/conf $(Q)$< -D arch/$(ARCH)/configs/$@ arch/$(ARCH)/Kconfig
Help text used by make help
help: @echo ' config - 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 ' oldconfig - Update current config utilising a provided .config as base' @echo ' randconfig - New config with random answer to all options' @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 config where all options are answered with no'
===========================================================================
Shared Makefile for the various kconfig executables:
conf: Used for defconfig, oldconfig and related targets
mconf: Used for the mconfig target.
Utilizes the lxdialog package
qconf: Used for the xconfig target
Based on QT which needs to be installed to compile it
gconf: Used for the gconfig target
Based on GTK which needs to be installed to compile it
object files used by all kconfig flavours
hostprogs-y := conf mconf qconf gconf kxgettext conf-objs := conf.o zconf.tab.o mconf-objs := mconf.o zconf.tab.o kxgettext-objs := kxgettext.o zconf.tab.o
ifeq ($(MAKECMDGOALS),xconfig) qconf-target := 1 endif ifeq ($(MAKECMDGOALS),gconfig) gconf-target := 1 endif
ifeq ($(qconf-target),1) qconf-cxxobjs := qconf.o qconf-objs := kconfig_load.o zconf.tab.o endif
ifeq ($(gconf-target),1) gconf-objs := gconf.o kconfig_load.o zconf.tab.o endif
clean-files := lkc_defs.h qconf.moc .tmp_qtcheck
.tmp_gtkcheck zconf.tab.c lex.zconf.c zconf.hash.c
subdir- += lxdialog
Needed for systems without gettext
KBUILD_HAVE_NLS := $(shell
if echo "#include <libintl.h>" | $(HOSTCC) $(HOSTCFLAGS) -E - > /dev/null 2>&1 ;
then echo yes ;
else echo no ; fi)
ifeq ($(KBUILD_HAVE_NLS),no)
HOSTCFLAGS += -DKBUILD_NO_NLS
endif
generated files seem to need this to find local include files
HOSTCFLAGS_lex.zconf.o := -I$(src) HOSTCFLAGS_zconf.tab.o := -I$(src)
HOSTLOADLIBES_qconf = $(KC_QT_LIBS) -ldl HOSTCXXFLAGS_qconf.o = $(KC_QT_CFLAGS) -D LKC_DIRECT_LINK
HOSTLOADLIBES_gconf = pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0
HOSTCFLAGS_gconf.o = pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0
-D LKC_DIRECT_LINK
$(obj)/qconf.o: $(obj)/.tmp_qtcheck
ifeq ($(qconf-target),1) $(obj)/.tmp_qtcheck: $(src)/Makefile -include $(obj)/.tmp_qtcheck
QT needs some extra effort...
$(obj)/.tmp_qtcheck:
@set -e; echo " CHECK qt"; dir=""; pkg="";
pkg-config --exists qt 2> /dev/null && pkg=qt;
pkg-config --exists qt-mt 2> /dev/null && pkg=qt-mt;
if [ -n "$$pkg" ]; then
cflags="$$(shell pkg-config $$pkg --cflags)";
libs="$$(shell pkg-config $$pkg --libs)";
moc="$$(shell pkg-config $$pkg --variable=prefix)/bin/moc";
dir="$$(pkg-config $$pkg --variable=prefix)";
else
for d in $$QTDIR /usr/share/qt* /usr/lib/qt*; do
if [ -f $$d/include/qconfig.h ]; then dir=$$d; break; fi;
done;
if [ -z "$$dir" ]; then
echo "";
echo " Unable to find the QT installation. Please make sure that";
echo "* the QT development package is correctly installed and";
echo "* either install pkg-config or set the QTDIR environment";
echo "* variable to the correct location.";
echo "";
false;
fi;
libpath=$$dir/lib; lib=qt; osdir="";
$(HOSTCXX) -print-multi-os-directory > /dev/null 2>&1 &&
osdir=x$$($(HOSTCXX) -print-multi-os-directory);
test -d $$libpath/$$osdir && libpath=$$libpath/$$osdir;
test -f $$libpath/libqt-mt.so && lib=qt-mt;
cflags="-I$$dir/include";
libs="-L$$libpath -Wl,-rpath,$$libpath -l$$lib";
moc="$$dir/bin/moc";
fi;
if [ ! -x $$dir/bin/moc -a -x /usr/bin/moc ]; then
echo "";
echo "* Unable to find $$dir/bin/moc, using /usr/bin/moc instead.";
echo "*";
moc="/usr/bin/moc";
fi;
echo "KC_QT_CFLAGS=$$cflags" > $@;
echo "KC_QT_LIBS=$$libs" >> $@;
echo "KC_QT_MOC=$$moc" >> $@
endif
$(obj)/gconf.o: $(obj)/.tmp_gtkcheck
ifeq ($(gconf-target),1) -include $(obj)/.tmp_gtkcheck
GTK needs some extra effort, too...
$(obj)/.tmp_gtkcheck:
@if pkg-config --exists gtk+-2.0 gmodule-2.0 libglade-2.0; then
if pkg-config --atleast-version=2.0.0 gtk+-2.0; then
touch $@;
else
echo "";
echo " GTK+ is present but version >= 2.0.0 is required.";
echo "";
false;
fi
else
echo "";
echo "* Unable to find the GTK+ installation. Please make sure that";
echo "* the GTK+ 2.0 development package is correctly installed...";
echo "* You need gtk+-2.0, glib-2.0 and libglade-2.0.";
echo "*";
false;
fi
endif
$(obj)/zconf.tab.o: $(obj)/lex.zconf.c $(obj)/zconf.hash.c
$(obj)/kconfig_load.o: $(obj)/lkc_defs.h
$(obj)/qconf.o: $(obj)/qconf.moc $(obj)/lkc_defs.h
$(obj)/gconf.o: $(obj)/lkc_defs.h
$(obj)/%.moc: $(src)/%.h $(KC_QT_MOC) -i $< -o $@
$(obj)/lkc_defs.h: $(src)/lkc_proto.h
sed < $< > $@ 's/P([^,]*,.*/#define \1 (*\1_p)/'
The following requires flex/bison/gperf
By default we use the _shipped versions, uncomment the following line if
you are modifying the flex/bison src.
LKC_GENPARSER := 1
ifdef LKC_GENPARSER
$(obj)/zconf.tab.c: $(src)/zconf.y $(obj)/lex.zconf.c: $(src)/zconf.l $(obj)/zconf.hash.c: $(src)/zconf.gperf
%.tab.c: %.y bison -l -b $* -p $(notdir $*) $< cp $@ $@_shipped
lex.%.c: %.l flex -L -P$(notdir $*) -o$@ $< cp $@ $@_shipped
%.hash.c: %.gperf gperf < $< > $@ cp $@ $@_shipped
endif