linux/scripts/kconfig/Makefile
<<
>>
Prefs
   1# ===========================================================================
   2# Kernel configuration targets
   3# These targets are used from top-level makefile
   4
   5PHONY += oldconfig xconfig gconfig menuconfig config silentoldconfig update-po-config \
   6        localmodconfig localyesconfig
   7
   8ifdef KBUILD_KCONFIG
   9Kconfig := $(KBUILD_KCONFIG)
  10else
  11Kconfig := Kconfig
  12endif
  13
  14xconfig: $(obj)/qconf
  15        $< $(Kconfig)
  16
  17gconfig: $(obj)/gconf
  18        $< $(Kconfig)
  19
  20menuconfig: $(obj)/mconf
  21        $< $(Kconfig)
  22
  23config: $(obj)/conf
  24        $< --oldaskconfig $(Kconfig)
  25
  26nconfig: $(obj)/nconf
  27        $< $(Kconfig)
  28
  29oldconfig: $(obj)/conf
  30        $< --$@ $(Kconfig)
  31
  32silentoldconfig: $(obj)/conf
  33        $(Q)mkdir -p include/generated
  34        $< --$@ $(Kconfig)
  35
  36# if no path is given, then use src directory to find file
  37ifdef LSMOD
  38LSMOD_F := $(LSMOD)
  39ifeq ($(findstring /,$(LSMOD)),)
  40  LSMOD_F := $(objtree)/$(LSMOD)
  41endif
  42endif
  43
  44localmodconfig: $(obj)/streamline_config.pl $(obj)/conf
  45        $(Q)mkdir -p include/generated
  46        $(Q)perl $< $(srctree) $(Kconfig) $(LSMOD_F) > .tmp.config
  47        $(Q)if [ -f .config ]; then                                     \
  48                        cmp -s .tmp.config .config ||                   \
  49                        (mv -f .config .config.old.1;                   \
  50                         mv -f .tmp.config .config;                     \
  51                         $(obj)/conf --silentoldconfig $(Kconfig);      \
  52                         mv -f .config.old.1 .config.old)               \
  53        else                                                            \
  54                        mv -f .tmp.config .config;                      \
  55                        $(obj)/conf --silentoldconfig $(Kconfig);       \
  56        fi
  57        $(Q)rm -f .tmp.config
  58
  59localyesconfig: $(obj)/streamline_config.pl $(obj)/conf
  60        $(Q)mkdir -p include/generated
  61        $(Q)perl $< $(srctree) $(Kconfig) $(LSMOD_F) > .tmp.config
  62        $(Q)sed -i s/=m/=y/ .tmp.config
  63        $(Q)if [ -f .config ]; then                                     \
  64                        cmp -s .tmp.config .config ||                   \
  65                        (mv -f .config .config.old.1;                   \
  66                         mv -f .tmp.config .config;                     \
  67                         $(obj)/conf --silentoldconfig $(Kconfig);      \
  68                         mv -f .config.old.1 .config.old)               \
  69        else                                                            \
  70                        mv -f .tmp.config .config;                      \
  71                        $(obj)/conf --silentoldconfig $(Kconfig);       \
  72        fi
  73        $(Q)rm -f .tmp.config
  74
  75# Create new linux.pot file
  76# Adjust charset to UTF-8 in .po file to accept UTF-8 in Kconfig files
  77# The symlink is used to repair a deficiency in arch/um
  78update-po-config: $(obj)/kxgettext $(obj)/gconf.glade.h
  79        $(Q)echo "  GEN config"
  80        $(Q)xgettext --default-domain=linux              \
  81            --add-comments --keyword=_ --keyword=N_      \
  82            --from-code=UTF-8                            \
  83            --files-from=scripts/kconfig/POTFILES.in     \
  84            --output $(obj)/config.pot
  85        $(Q)sed -i s/CHARSET/UTF-8/ $(obj)/config.pot
  86        $(Q)ln -fs Kconfig.i386 arch/um/Kconfig.arch
  87        $(Q)(for i in `ls arch/*/Kconfig`;               \
  88            do                                           \
  89                echo "  GEN $$i";                        \
  90                $(obj)/kxgettext $$i                     \
  91                     >> $(obj)/config.pot;               \
  92            done )
  93        $(Q)msguniq --sort-by-file --to-code=UTF-8 $(obj)/config.pot \
  94            --output $(obj)/linux.pot
  95        $(Q)rm -f arch/um/Kconfig.arch
  96        $(Q)rm -f $(obj)/config.pot
  97
  98PHONY += allnoconfig allyesconfig allmodconfig alldefconfig randconfig
  99
 100allnoconfig allyesconfig allmodconfig alldefconfig randconfig: $(obj)/conf
 101        $< --$@ $(Kconfig)
 102
 103PHONY += listnewconfig oldnoconfig savedefconfig defconfig
 104
 105listnewconfig oldnoconfig: $(obj)/conf
 106        $< --$@ $(Kconfig)
 107
 108savedefconfig: $(obj)/conf
 109        $< --$@=defconfig $(Kconfig)
 110
 111defconfig: $(obj)/conf
 112ifeq ($(KBUILD_DEFCONFIG),)
 113        $< --defconfig $(Kconfig)
 114else
 115        @echo "*** Default configuration is based on '$(KBUILD_DEFCONFIG)'"
 116        $(Q)$< --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
 117endif
 118
 119%_defconfig: $(obj)/conf
 120        $(Q)$< --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
 121
 122# Help text used by make help
 123help:
 124        @echo  '  config          - Update current config utilising a line-oriented program'
 125        @echo  '  nconfig         - Update current config utilising a ncurses menu based program'
 126        @echo  '  menuconfig      - Update current config utilising a menu based program'
 127        @echo  '  xconfig         - Update current config utilising a QT based front-end'
 128        @echo  '  gconfig         - Update current config utilising a GTK based front-end'
 129        @echo  '  oldconfig       - Update current config utilising a provided .config as base'
 130        @echo  '  localmodconfig  - Update current config disabling modules not loaded'
 131        @echo  '  localyesconfig  - Update current config converting local mods to core'
 132        @echo  '  silentoldconfig - Same as oldconfig, but quietly, additionally update deps'
 133        @echo  '  defconfig       - New config with default from ARCH supplied defconfig'
 134        @echo  '  savedefconfig   - Save current config as ./defconfig (minimal config)'
 135        @echo  '  allnoconfig     - New config where all options are answered with no'
 136        @echo  '  allyesconfig    - New config where all options are accepted with yes'
 137        @echo  '  allmodconfig    - New config selecting modules when possible'
 138        @echo  '  alldefconfig    - New config with all symbols set to default'
 139        @echo  '  randconfig      - New config with random answer to all options'
 140        @echo  '  listnewconfig   - List new options'
 141        @echo  '  oldnoconfig     - Same as silentoldconfig but set new symbols to n (unset)'
 142
 143# lxdialog stuff
 144check-lxdialog  := $(srctree)/$(src)/lxdialog/check-lxdialog.sh
 145
 146# Use recursively expanded variables so we do not call gcc unless
 147# we really need to do so. (Do not call gcc as part of make mrproper)
 148HOST_EXTRACFLAGS += $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags) \
 149                    -DLOCALE
 150
 151# ===========================================================================
 152# Shared Makefile for the various kconfig executables:
 153# conf:   Used for defconfig, oldconfig and related targets
 154# nconf:  Used for the nconfig target.
 155#         Utilizes ncurses
 156# mconf:  Used for the menuconfig target
 157#         Utilizes the lxdialog package
 158# qconf:  Used for the xconfig target
 159#         Based on QT which needs to be installed to compile it
 160# gconf:  Used for the gconfig target
 161#         Based on GTK which needs to be installed to compile it
 162# object files used by all kconfig flavours
 163
 164lxdialog := lxdialog/checklist.o lxdialog/util.o lxdialog/inputbox.o
 165lxdialog += lxdialog/textbox.o lxdialog/yesno.o lxdialog/menubox.o
 166
 167conf-objs       := conf.o  zconf.tab.o
 168mconf-objs     := mconf.o zconf.tab.o $(lxdialog)
 169nconf-objs     := nconf.o zconf.tab.o nconf.gui.o
 170kxgettext-objs  := kxgettext.o zconf.tab.o
 171
 172hostprogs-y := conf qconf gconf kxgettext
 173
 174ifeq ($(MAKECMDGOALS),nconfig)
 175        hostprogs-y += nconf
 176endif
 177
 178ifeq ($(MAKECMDGOALS),menuconfig)
 179        hostprogs-y += mconf
 180endif
 181
 182ifeq ($(MAKECMDGOALS),xconfig)
 183        qconf-target := 1
 184endif
 185ifeq ($(MAKECMDGOALS),gconfig)
 186        gconf-target := 1
 187endif
 188
 189
 190ifeq ($(qconf-target),1)
 191qconf-cxxobjs   := qconf.o
 192qconf-objs      := kconfig_load.o zconf.tab.o
 193endif
 194
 195ifeq ($(gconf-target),1)
 196gconf-objs      := gconf.o kconfig_load.o zconf.tab.o
 197endif
 198
 199clean-files     := lkc_defs.h qconf.moc .tmp_qtcheck \
 200                   .tmp_gtkcheck zconf.tab.c lex.zconf.c zconf.hash.c gconf.glade.h
 201clean-files     += mconf qconf gconf nconf
 202clean-files     += config.pot linux.pot
 203
 204# Check that we have the required ncurses stuff installed for lxdialog (menuconfig)
 205PHONY += $(obj)/dochecklxdialog
 206$(addprefix $(obj)/,$(lxdialog)): $(obj)/dochecklxdialog
 207$(obj)/dochecklxdialog:
 208        $(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTLOADLIBES_mconf)
 209
 210always := dochecklxdialog
 211
 212# Add environment specific flags
 213HOST_EXTRACFLAGS += $(shell $(CONFIG_SHELL) $(srctree)/$(src)/check.sh $(HOSTCC) $(HOSTCFLAGS))
 214
 215# generated files seem to need this to find local include files
 216HOSTCFLAGS_lex.zconf.o  := -I$(src)
 217HOSTCFLAGS_zconf.tab.o  := -I$(src)
 218
 219HOSTLOADLIBES_qconf     = $(KC_QT_LIBS) -ldl
 220HOSTCXXFLAGS_qconf.o    = $(KC_QT_CFLAGS) -D LKC_DIRECT_LINK
 221
 222HOSTLOADLIBES_gconf     = `pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0` -ldl
 223HOSTCFLAGS_gconf.o      = `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \
 224                          -D LKC_DIRECT_LINK
 225
 226HOSTLOADLIBES_mconf   = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
 227
 228HOSTLOADLIBES_nconf     = -lmenu -lpanel -lncurses
 229$(obj)/qconf.o: $(obj)/.tmp_qtcheck
 230
 231ifeq ($(qconf-target),1)
 232$(obj)/.tmp_qtcheck: $(src)/Makefile
 233-include $(obj)/.tmp_qtcheck
 234
 235# QT needs some extra effort...
 236$(obj)/.tmp_qtcheck:
 237        @set -e; echo "  CHECK   qt"; dir=""; pkg=""; \
 238        if ! pkg-config --exists QtCore 2> /dev/null; then \
 239            echo "* Unable to find the QT4 tool qmake. Trying to use QT3"; \
 240            pkg-config --exists qt 2> /dev/null && pkg=qt; \
 241            pkg-config --exists qt-mt 2> /dev/null && pkg=qt-mt; \
 242            if [ -n "$$pkg" ]; then \
 243              cflags="\$$(shell pkg-config $$pkg --cflags)"; \
 244              libs="\$$(shell pkg-config $$pkg --libs)"; \
 245              moc="\$$(shell pkg-config $$pkg --variable=prefix)/bin/moc"; \
 246              dir="$$(pkg-config $$pkg --variable=prefix)"; \
 247            else \
 248              for d in $$QTDIR /usr/share/qt* /usr/lib/qt*; do \
 249                if [ -f $$d/include/qconfig.h ]; then dir=$$d; break; fi; \
 250              done; \
 251              if [ -z "$$dir" ]; then \
 252                echo "*"; \
 253                echo "* Unable to find any QT installation. Please make sure that"; \
 254                echo "* the QT4 or QT3 development package is correctly installed and"; \
 255                echo "* either qmake can be found or install pkg-config or set"; \
 256                echo "* the QTDIR environment variable to the correct location."; \
 257                echo "*"; \
 258                false; \
 259              fi; \
 260              libpath=$$dir/lib; lib=qt; osdir=""; \
 261              $(HOSTCXX) -print-multi-os-directory > /dev/null 2>&1 && \
 262                osdir=x$$($(HOSTCXX) -print-multi-os-directory); \
 263              test -d $$libpath/$$osdir && libpath=$$libpath/$$osdir; \
 264              test -f $$libpath/libqt-mt.so && lib=qt-mt; \
 265              cflags="-I$$dir/include"; \
 266              libs="-L$$libpath -Wl,-rpath,$$libpath -l$$lib"; \
 267              moc="$$dir/bin/moc"; \
 268            fi; \
 269            if [ ! -x $$dir/bin/moc -a -x /usr/bin/moc ]; then \
 270              echo "*"; \
 271              echo "* Unable to find $$dir/bin/moc, using /usr/bin/moc instead."; \
 272              echo "*"; \
 273              moc="/usr/bin/moc"; \
 274            fi; \
 275        else \
 276          cflags="\$$(shell pkg-config QtCore QtGui Qt3Support --cflags)"; \
 277          libs="\$$(shell pkg-config QtCore QtGui Qt3Support --libs)"; \
 278          binpath="\$$(shell pkg-config QtCore --variable=prefix)"; \
 279          moc="$$binpath/bin/moc"; \
 280        fi; \
 281        echo "KC_QT_CFLAGS=$$cflags" > $@; \
 282        echo "KC_QT_LIBS=$$libs" >> $@; \
 283        echo "KC_QT_MOC=$$moc" >> $@
 284endif
 285
 286$(obj)/gconf.o: $(obj)/.tmp_gtkcheck
 287
 288ifeq ($(gconf-target),1)
 289-include $(obj)/.tmp_gtkcheck
 290
 291# GTK needs some extra effort, too...
 292$(obj)/.tmp_gtkcheck:
 293        @if `pkg-config --exists gtk+-2.0 gmodule-2.0 libglade-2.0`; then               \
 294                if `pkg-config --atleast-version=2.0.0 gtk+-2.0`; then                  \
 295                        touch $@;                                                               \
 296                else                                                                    \
 297                        echo "*";                                                       \
 298                        echo "* GTK+ is present but version >= 2.0.0 is required.";     \
 299                        echo "*";                                                       \
 300                        false;                                                          \
 301                fi                                                                      \
 302        else                                                                            \
 303                echo "*";                                                               \
 304                echo "* Unable to find the GTK+ installation. Please make sure that";   \
 305                echo "* the GTK+ 2.0 development package is correctly installed...";    \
 306                echo "* You need gtk+-2.0, glib-2.0 and libglade-2.0.";                 \
 307                echo "*";                                                               \
 308                false;                                                                  \
 309        fi
 310endif
 311
 312$(obj)/zconf.tab.o: $(obj)/lex.zconf.c $(obj)/zconf.hash.c
 313
 314$(obj)/kconfig_load.o: $(obj)/lkc_defs.h
 315
 316$(obj)/qconf.o: $(obj)/qconf.moc $(obj)/lkc_defs.h
 317
 318$(obj)/gconf.o: $(obj)/lkc_defs.h
 319
 320$(obj)/%.moc: $(src)/%.h
 321        $(KC_QT_MOC) -i $< -o $@
 322
 323$(obj)/lkc_defs.h: $(src)/lkc_proto.h
 324        sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/'
 325
 326# Extract gconf menu items for I18N support
 327$(obj)/gconf.glade.h: $(obj)/gconf.glade
 328        intltool-extract --type=gettext/glade $(obj)/gconf.glade
 329
 330###
 331# The following requires flex/bison/gperf
 332# By default we use the _shipped versions, uncomment the following line if
 333# you are modifying the flex/bison src.
 334# LKC_GENPARSER := 1
 335
 336ifdef LKC_GENPARSER
 337
 338$(obj)/zconf.tab.c: $(src)/zconf.y
 339$(obj)/lex.zconf.c: $(src)/zconf.l
 340$(obj)/zconf.hash.c: $(src)/zconf.gperf
 341
 342%.tab.c: %.y
 343        bison -l -b $* -p $(notdir $*) $<
 344        cp $@ $@_shipped
 345
 346lex.%.c: %.l
 347        flex -L -P$(notdir $*) -o$@ $<
 348        cp $@ $@_shipped
 349
 350%.hash.c: %.gperf
 351        gperf < $< > $@
 352        cp $@ $@_shipped
 353
 354endif
 355