Home | History | Annotate | Download | only in kconfig
      1 # SPDX-License-Identifier: GPL-2.0
      2 # ===========================================================================
      3 # Kernel configuration targets
      4 # These targets are used from top-level makefile
      5 
      6 PHONY += xconfig gconfig menuconfig config syncconfig update-po-config \
      7 	localmodconfig localyesconfig
      8 
      9 # Added for U-Boot
     10 #  Linux has defconfig files in arch/$(SRCARCH)/configs/,
     11 #  on the other hand, U-Boot does in configs/.
     12 #  Set SRCARCH to .. fake this Makefile.
     13 SRCARCH := ..
     14 
     15 ifdef KBUILD_KCONFIG
     16 Kconfig := $(KBUILD_KCONFIG)
     17 else
     18 Kconfig := Kconfig
     19 endif
     20 
     21 ifeq ($(quiet),silent_)
     22 silent := -s
     23 endif
     24 
     25 # We need this, in case the user has it in its environment
     26 unexport CONFIG_
     27 
     28 xconfig: $(obj)/qconf
     29 	$< $(silent) $(Kconfig)
     30 
     31 gconfig: $(obj)/gconf
     32 	$< $(silent) $(Kconfig)
     33 
     34 menuconfig: $(obj)/mconf
     35 	$< $(silent) $(Kconfig)
     36 
     37 config: $(obj)/conf
     38 	$< $(silent) --oldaskconfig $(Kconfig)
     39 
     40 nconfig: $(obj)/nconf
     41 	$< $(silent) $(Kconfig)
     42 
     43 # This has become an internal implementation detail and is now deprecated
     44 # for external use.
     45 syncconfig: $(obj)/conf
     46 	$(Q)mkdir -p include/config include/generated
     47 	$< $(silent) --$@ $(Kconfig)
     48 
     49 localyesconfig localmodconfig: $(obj)/conf
     50 	$(Q)mkdir -p include/config include/generated
     51 	$(Q)perl $(srctree)/$(src)/streamline_config.pl --$@ $(srctree) $(Kconfig) > .tmp.config
     52 	$(Q)if [ -f .config ]; then 					\
     53 			cmp -s .tmp.config .config ||			\
     54 			(mv -f .config .config.old.1;			\
     55 			 mv -f .tmp.config .config;			\
     56 			 $< $(silent) --oldconfig $(Kconfig);		\
     57 			 mv -f .config.old.1 .config.old)		\
     58 	else								\
     59 			mv -f .tmp.config .config;			\
     60 			$< $(silent) --oldconfig $(Kconfig);		\
     61 	fi
     62 	$(Q)rm -f .tmp.config
     63 
     64 # Create new linux.pot file
     65 # Adjust charset to UTF-8 in .po file to accept UTF-8 in Kconfig files
     66 update-po-config: $(obj)/kxgettext $(obj)/gconf.glade.h
     67 	$(Q)$(kecho) "  GEN     config.pot"
     68 	$(Q)xgettext --default-domain=linux                         \
     69 	    --add-comments --keyword=_ --keyword=N_                 \
     70 	    --from-code=UTF-8                                       \
     71 	    --files-from=$(srctree)/scripts/kconfig/POTFILES.in     \
     72 	    --directory=$(srctree) --directory=$(objtree)           \
     73 	    --output $(obj)/config.pot
     74 	$(Q)sed -i s/CHARSET/UTF-8/ $(obj)/config.pot
     75 	$(Q)(for i in `ls $(srctree)/arch/*/Kconfig      \
     76 	    $(srctree)/arch/*/um/Kconfig`;               \
     77 	    do                                           \
     78 		$(kecho) "  GEN     $$i";                    \
     79 		$(obj)/kxgettext $$i                     \
     80 		     >> $(obj)/config.pot;               \
     81 	    done )
     82 	$(Q)$(kecho) "  GEN     linux.pot"
     83 	$(Q)msguniq --sort-by-file --to-code=UTF-8 $(obj)/config.pot \
     84 	    --output $(obj)/linux.pot
     85 	$(Q)rm -f $(obj)/config.pot
     86 
     87 # These targets map 1:1 to the commandline options of 'conf'
     88 simple-targets := oldconfig allnoconfig allyesconfig allmodconfig \
     89 	alldefconfig randconfig listnewconfig olddefconfig
     90 PHONY += $(simple-targets)
     91 
     92 $(simple-targets): $(obj)/conf
     93 	$< $(silent) --$@ $(Kconfig)
     94 
     95 PHONY += oldnoconfig silentoldconfig savedefconfig defconfig
     96 
     97 # oldnoconfig is an alias of olddefconfig, because people already are dependent
     98 # on its behavior (sets new symbols to their default value but not 'n') with the
     99 # counter-intuitive name.
    100 oldnoconfig: olddefconfig
    101 	@echo "  WARNING: \"oldnoconfig\" target will be removed after Linux 4.19"
    102 	@echo "            Please use \"olddefconfig\" instead, which is an alias."
    103 
    104 # We do not expect manual invokcation of "silentoldcofig" (or "syncconfig").
    105 silentoldconfig: syncconfig
    106 	@echo "  WARNING: \"silentoldconfig\" has been renamed to \"syncconfig\""
    107 	@echo "            and is now an internal implementation detail."
    108 	@echo "            What you want is probably \"oldconfig\"."
    109 	@echo "            \"silentoldconfig\" will be removed after Linux 4.19"
    110 
    111 savedefconfig: $(obj)/conf
    112 	$< $(silent) --$@=defconfig $(Kconfig)
    113 
    114 defconfig: $(obj)/conf
    115 ifeq ($(KBUILD_DEFCONFIG),)
    116 	$< $(silent) --defconfig $(Kconfig)
    117 else
    118 ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)),)
    119 	@$(kecho) "*** Default configuration is based on '$(KBUILD_DEFCONFIG)'"
    120 	$(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
    121 else
    122 	@$(kecho) "*** Default configuration is based on target '$(KBUILD_DEFCONFIG)'"
    123 	$(Q)$(MAKE) -f $(srctree)/Makefile $(KBUILD_DEFCONFIG)
    124 endif
    125 endif
    126 
    127 %_defconfig: $(obj)/conf
    128 	$(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
    129 
    130 # Added for U-Boot (backward compatibility)
    131 %_config: %_defconfig
    132 	@:
    133 
    134 configfiles=$(wildcard $(srctree)/kernel/configs/$@ $(srctree)/arch/$(SRCARCH)/configs/$@)
    135 
    136 %.config: $(obj)/conf
    137 	$(if $(call configfiles),, $(error No configuration exists for this target on this architecture))
    138 	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m .config $(configfiles)
    139 	+$(Q)yes "" | $(MAKE) -f $(srctree)/Makefile oldconfig
    140 
    141 PHONY += kvmconfig
    142 kvmconfig: kvm_guest.config
    143 	@:
    144 
    145 PHONY += xenconfig
    146 xenconfig: xen.config
    147 	@:
    148 
    149 PHONY += tinyconfig
    150 tinyconfig:
    151 	$(Q)$(MAKE) -f $(srctree)/Makefile allnoconfig tiny.config
    152 
    153 # CHECK: -o cache_dir=<path> working?
    154 PHONY += testconfig
    155 testconfig: $(obj)/conf
    156 	$(PYTHON3) -B -m pytest $(srctree)/$(src)/tests \
    157 	-o cache_dir=$(abspath $(obj)/tests/.cache) \
    158 	$(if $(findstring 1,$(KBUILD_VERBOSE)),--capture=no)
    159 clean-dirs += tests/.cache
    160 
    161 # Help text used by make help
    162 help:
    163 	@echo  '  config	  - Update current config utilising a line-oriented program'
    164 	@echo  '  nconfig         - Update current config utilising a ncurses menu based'
    165 	@echo  '                    program'
    166 	@echo  '  menuconfig	  - Update current config utilising a menu based program'
    167 	@echo  '  xconfig	  - Update current config utilising a Qt based front-end'
    168 	@echo  '  gconfig	  - Update current config utilising a GTK+ based front-end'
    169 	@echo  '  oldconfig	  - Update current config utilising a provided .config as base'
    170 	@echo  '  localmodconfig  - Update current config disabling modules not loaded'
    171 	@echo  '  localyesconfig  - Update current config converting local mods to core'
    172 	@echo  '  defconfig	  - New config with default from ARCH supplied defconfig'
    173 	@echo  '  savedefconfig   - Save current config as ./defconfig (minimal config)'
    174 	@echo  '  allnoconfig	  - New config where all options are answered with no'
    175 	@echo  '  allyesconfig	  - New config where all options are accepted with yes'
    176 	@echo  '  allmodconfig	  - New config selecting modules when possible'
    177 	@echo  '  alldefconfig    - New config with all symbols set to default'
    178 	@echo  '  randconfig	  - New config with random answer to all options'
    179 	@echo  '  listnewconfig   - List new options'
    180 	@echo  '  olddefconfig	  - Same as oldconfig but sets new symbols to their'
    181 	@echo  '                    default value without prompting'
    182 #	@echo  '  kvmconfig	  - Enable additional options for kvm guest kernel support'
    183 #	@echo  '  xenconfig       - Enable additional options for xen dom0 and guest kernel support'
    184 #	@echo  '  tinyconfig	  - Configure the tiniest possible kernel'
    185 
    186 # lxdialog stuff
    187 check-lxdialog  := $(srctree)/$(src)/lxdialog/check-lxdialog.sh
    188 
    189 # Use recursively expanded variables so we do not call gcc unless
    190 # we really need to do so. (Do not call gcc as part of make mrproper)
    191 HOST_EXTRACFLAGS += $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags) \
    192                     -DLOCALE
    193 
    194 # ===========================================================================
    195 # Shared Makefile for the various kconfig executables:
    196 # conf:	  Used for defconfig, oldconfig and related targets
    197 # nconf:  Used for the nconfig target.
    198 #         Utilizes ncurses
    199 # mconf:  Used for the menuconfig target
    200 #         Utilizes the lxdialog package
    201 # qconf:  Used for the xconfig target
    202 #         Based on Qt which needs to be installed to compile it
    203 # gconf:  Used for the gconfig target
    204 #         Based on GTK+ which needs to be installed to compile it
    205 # object files used by all kconfig flavours
    206 
    207 lxdialog := lxdialog/checklist.o lxdialog/util.o lxdialog/inputbox.o
    208 lxdialog += lxdialog/textbox.o lxdialog/yesno.o lxdialog/menubox.o
    209 
    210 conf-objs	:= conf.o  zconf.tab.o
    211 mconf-objs     := mconf.o zconf.tab.o $(lxdialog)
    212 nconf-objs     := nconf.o zconf.tab.o nconf.gui.o
    213 kxgettext-objs	:= kxgettext.o zconf.tab.o
    214 qconf-cxxobjs	:= qconf.o
    215 qconf-objs	:= zconf.tab.o
    216 gconf-objs	:= gconf.o zconf.tab.o
    217 
    218 hostprogs-y := conf nconf mconf kxgettext qconf gconf
    219 
    220 targets		+= zconf.lex.c
    221 clean-files	:= qconf.moc .tmp_qtcheck .tmp_gtkcheck
    222 clean-files	+= gconf.glade.h
    223 clean-files     += config.pot linux.pot
    224 
    225 # Check that we have the required ncurses stuff installed for lxdialog (menuconfig)
    226 PHONY += $(obj)/dochecklxdialog
    227 $(addprefix $(obj)/, mconf.o $(lxdialog)): $(obj)/dochecklxdialog
    228 $(obj)/dochecklxdialog:
    229 	$(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTLOADLIBES_mconf)
    230 
    231 always := dochecklxdialog
    232 
    233 # Add environment specific flags
    234 HOST_EXTRACFLAGS += $(shell $(CONFIG_SHELL) $(srctree)/$(src)/check.sh $(HOSTCC) $(HOSTCFLAGS))
    235 HOST_EXTRACXXFLAGS += $(shell $(CONFIG_SHELL) $(srctree)/$(src)/check.sh $(HOSTCXX) $(HOSTCXXFLAGS))
    236 
    237 # generated files seem to need this to find local include files
    238 HOSTCFLAGS_zconf.lex.o	:= -I$(src)
    239 HOSTCFLAGS_zconf.tab.o	:= -I$(src)
    240 
    241 HOSTLOADLIBES_qconf	= $(KC_QT_LIBS)
    242 HOSTCXXFLAGS_qconf.o	= $(KC_QT_CFLAGS)
    243 
    244 HOSTLOADLIBES_gconf	= `pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0`
    245 HOSTCFLAGS_gconf.o	= `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \
    246                           -Wno-missing-prototypes
    247 
    248 HOSTLOADLIBES_mconf   = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
    249 
    250 HOSTLOADLIBES_nconf	= $(shell \
    251 				pkg-config --libs menuw panelw ncursesw 2>/dev/null \
    252 				|| pkg-config --libs menu panel ncurses 2>/dev/null \
    253 				|| echo "-lmenu -lpanel -lncurses"  )
    254 $(obj)/qconf.o: $(obj)/.tmp_qtcheck
    255 
    256 ifeq ($(MAKECMDGOALS),xconfig)
    257 $(obj)/.tmp_qtcheck: $(src)/Makefile
    258 -include $(obj)/.tmp_qtcheck
    259 
    260 # Qt needs some extra effort...
    261 $(obj)/.tmp_qtcheck:
    262 	@set -e; $(kecho) "  CHECK   qt"; \
    263 	if pkg-config --exists Qt5Core; then \
    264 	    cflags="-std=c++11 -fPIC `pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets`"; \
    265 	    libs=`pkg-config --libs Qt5Core Qt5Gui Qt5Widgets`; \
    266 	    moc=`pkg-config --variable=host_bins Qt5Core`/moc; \
    267 	elif pkg-config --exists QtCore; then \
    268 	    cflags=`pkg-config --cflags QtCore QtGui`; \
    269 	    libs=`pkg-config --libs QtCore QtGui`; \
    270 	    moc=`pkg-config --variable=moc_location QtCore`; \
    271 	else \
    272 	    echo >&2 "*"; \
    273 	    echo >&2 "* Could not find Qt via pkg-config."; \
    274 	    echo >&2 "* Please install either Qt 4.8 or 5.x. and make sure it's in PKG_CONFIG_PATH"; \
    275 	    echo >&2 "*"; \
    276 	    exit 1; \
    277 	fi; \
    278 	echo "KC_QT_CFLAGS=$$cflags" > $@; \
    279 	echo "KC_QT_LIBS=$$libs" >> $@; \
    280 	echo "KC_QT_MOC=$$moc" >> $@
    281 endif
    282 
    283 $(obj)/gconf.o: $(obj)/.tmp_gtkcheck
    284 
    285 ifeq ($(MAKECMDGOALS),gconfig)
    286 -include $(obj)/.tmp_gtkcheck
    287 
    288 # GTK+ needs some extra effort, too...
    289 $(obj)/.tmp_gtkcheck:
    290 	@if `pkg-config --exists gtk+-2.0 gmodule-2.0 libglade-2.0`; then		\
    291 		if `pkg-config --atleast-version=2.0.0 gtk+-2.0`; then			\
    292 			touch $@;								\
    293 		else									\
    294 			echo >&2 "*"; 							\
    295 			echo >&2 "* GTK+ is present but version >= 2.0.0 is required.";	\
    296 			echo >&2 "*";							\
    297 			false;								\
    298 		fi									\
    299 	else										\
    300 		echo >&2 "*"; 								\
    301 		echo >&2 "* Unable to find the GTK+ installation. Please make sure that"; 	\
    302 		echo >&2 "* the GTK+ 2.0 development package is correctly installed..."; 	\
    303 		echo >&2 "* You need gtk+-2.0, glib-2.0 and libglade-2.0."; 		\
    304 		echo >&2 "*"; 								\
    305 		false;									\
    306 	fi
    307 endif
    308 
    309 $(obj)/zconf.tab.o: $(obj)/zconf.lex.c
    310 
    311 $(obj)/qconf.o: $(obj)/qconf.moc
    312 
    313 quiet_cmd_moc = MOC     $@
    314       cmd_moc = $(KC_QT_MOC) -i $< -o $@
    315 
    316 $(obj)/%.moc: $(src)/%.h $(obj)/.tmp_qtcheck
    317 	$(call cmd,moc)
    318 
    319 # Extract gconf menu items for i18n support
    320 $(obj)/gconf.glade.h: $(obj)/gconf.glade
    321 	$(Q)intltool-extract --type=gettext/glade --srcdir=$(srctree) \
    322 	$(obj)/gconf.glade
    323