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