linux-imx/scripts/kconfig/Makefile
Paul Smith 4f1933620f kbuild: change kbuild to not rely on incorrect GNU make behavior
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>
2006-03-06 00:09:51 +01:00

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