Makefile与内核的编译
注释掉kernel根目录下makefile文件中的-Werror-implicit-function-declaration语句即可。
我们知道,利用Makefile和Kconfig文件并make menuconfig,在编译内核时可以决定哪些目录或者文件将被编译进内核映像。而在内核源码中,该如何通过在Kconfig文件中定义的配置选项来决定是否编译驱动源码中的代码呢?
如,我们在Kconfig文件中定义了config TOUCHSCREEN_XXX,则可在C源文件中做如下定义:
#if defined(CONFIG_TOUCHSCREEN_XXX) ..... #endif
这样,在make menuconfig时,若选中了CONFIG_TOUCHSCREEN_XXX,则C文件中的这部分代码就会被编译,否则则不会被编译。
那么,在Kconfig文件中定义的CONFIG_TOUCHSCREEN_XXX是怎么在C文件中发挥作用的呢?是这样的,在make menuconfig之后,会生成.confi文件,之后,scripts/kconfig会根据这个文件在include\generated目录下生成autoconf.h文件,autoconf.h文件中就编程C语言可以识别的宏定义形式了,这样就能够决定C文件中那部分代码会被编译。
############################################################################# # # Generic Makefile for C/C++ Program # # License: GPL (General Public License) # Author: whyglinux <whyglinux AT gmail DOT com> # Date: 2006/03/04 (version 0.1) # 2007/03/24 (version 0.2) # 2007/04/09 (version 0.3) # 2007/06/26 (version 0.4) # 2008/04/05 (version 0.5) # # Author: kevin1078 <kevin1078@126.com> # Date: 2012/04/24 (version 0.6) #=========================================================================== ## Customizable Section: adapt those variables to suit your program. ##========================================================================== # The extra pre-processor and compiler options. EXTRA_CFLAGS = # The extra linker options. EXTRA_LDFLAGS = -lpthread # Specify the include dirs INCLUDE = -I./inc # The pre-processor options used by the cpp (man cpp for more). CPPFLAGS = -Wall $(INCLUDE) # The options used in linking as well as in any direct use of ld. LDFLAGS = # The directories in which source files reside. # If not specified, all subdirectories of the current directory will be serached. SRCDIRS := # The executable file name. Must be specified. PROGRAM = B3_app ## Implicit Section: change the following only when necessary. ##========================================================================== # The source file types (headers excluded). # .c indicates C source files, and others C++ ones. SRCEXTS = .c .C .cc .cpp .CPP .c++ .cxx .cp # The header file types. HDREXTS = .h .H .hh .hpp .HPP .h++ .hxx .hp # The pre-processor and compiler options. # Users can override those variables from the command line. CFLAGS = -g -O2 CXXFLAGS= -g -O2 # The C program compiler. CC = mipsel-linux-gcc # The C++ program compiler. CXX = g++ # Un-comment the following line to compile C programs as C++ ones. #CC = $(CXX) # The command used to delete file. RM = rm -f ETAGS = etags ETAGSFLAGS = CTAGS = ctags CTAGSFLAGS = ## Stable Section: usually no need to be changed. But you can add more. ##========================================================================== ifeq ($(SRCDIRS),) SRCDIRS := $(shell find $(SRCDIRS) -type d) endif SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS)))) HEADERS = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(HDREXTS)))) SRC_CXX = $(filter-out %.c,$(SOURCES)) OBJS = $(addsuffix .o, $(basename $(SOURCES))) #DEPS = $(OBJS:%.o=%.d) #replace %.d with .%.d (hide dependency files) DEPS = $(foreach f, $(OBJS), $(addprefix $(dir $(f))., $(patsubst %.o, %.d, $(notdir $(f))))) ## Define some useful variables. DEP_OPT = $(shell if `$(CC) --version | grep -i "GCC" >/dev/null`; then \ echo "-MM"; else echo "-M"; fi ) DEPEND.d = $(CC) $(DEP_OPT) $(EXTRA_CFLAGS) $(CFLAGS) $(CPPFLAGS) COMPILE.c = $(CC) $(EXTRA_CFLAGS) $(CFLAGS) $(CPPFLAGS) -c COMPILE.cxx = $(CXX) $(EXTRA_CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c LINK.c = $(CC) $(EXTRA_CFLAGS) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) LINK.cxx = $(CXX) $(EXTRA_CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) .PHONY: all objs tags ctags clean distclean help show # Delete the default suffixes .SUFFIXES: all: $(PROGRAM) cp $(PROGRAM) ../rootfs/usr/neolix # Rules for creating dependency files (.d). #------------------------------------------ .%.d:%.c @echo -n $(dir $<) > $@ @$(DEPEND.d) $< >> $@ .%.d:%.C @echo -n $(dir $<) > $@ @$(DEPEND.d) $< >> $@ .%.d:%.cc @echo -n $(dir $<) > $@ @$(DEPEND.d) $< >> $@ .%.d:%.cpp @echo -n $(dir $<) > $@ @$(DEPEND.d) $< >> $@ .%.d:%.CPP @echo -n $(dir $<) > $@ @$(DEPEND.d) $< >> $@ .%.d:%.c++ @echo -n $(dir $<) > $@ @$(DEPEND.d) $< >> $@ .%.d:%.cp @echo -n $(dir $<) > $@ @$(DEPEND.d) $< >> $@ .%.d:%.cxx @echo -n $(dir $<) > $@ @$(DEPEND.d) $< >> $@ # Rules for generating object files (.o). #---------------------------------------- objs:$(OBJS) %.o:%.c $(COMPILE.c) $< -o $@ %.o:%.C $(COMPILE.cxx) $< -o $@ %.o:%.cc $(COMPILE.cxx) $< -o $@ %.o:%.cpp $(COMPILE.cxx) $< -o $@ %.o:%.CPP $(COMPILE.cxx) $< -o $@ %.o:%.c++ $(COMPILE.cxx) $< -o $@ %.o:%.cp $(COMPILE.cxx) $< -o $@ %.o:%.cxx $(COMPILE.cxx) $< -o $@ # Rules for generating the tags. #------------------------------------- tags: $(HEADERS) $(SOURCES) $(ETAGS) $(ETAGSFLAGS) $(HEADERS) $(SOURCES) ctags: $(HEADERS) $(SOURCES) $(CTAGS) $(CTAGSFLAGS) $(HEADERS) $(SOURCES) # Rules for generating the executable. #------------------------------------- $(PROGRAM):$(OBJS) ifeq ($(SRC_CXX),) # C program $(LINK.c) $(OBJS) $(EXTRA_LDFLAGS) -o $@ @echo Type ./$@ to execute the program. else # C++ program $(LINK.cxx) $(OBJS) $(EXTRA_LDFLAGS) -o $@ @echo Type ./$@ to execute the program. endif #ifndef NODEP #ifneq ($(DEPS),) # sinclude $(DEPS) #endif #endif clean: $(RM) $(OBJS) $(PROGRAM) $(PROGRAM).exe distclean: clean $(RM) $(DEPS) TAGS # Show help. help: @echo 'Generic Makefile for C/C++ Programs (gcmakefile) version 0.5' @echo 'Copyright (C) 2007, 2008 whyglinux <whyglinux@hotmail.com>' @echo @echo 'Usage: make [TARGET]' @echo 'TARGETS:' @echo ' all (=make) compile and link.' @echo ' NODEP=yes make without generating dependencies.' @echo ' objs compile only (no linking).' @echo ' tags create tags for Emacs editor.' @echo ' ctags create ctags for VI editor.' @echo ' clean clean objects and the executable file.' @echo ' distclean clean objects, the executable and dependencies.' @echo ' show show variables (for debug use only).' @echo ' help print this message.' @echo @echo 'Report bugs to <whyglinux AT gmail DOT com>.' # Show variables (for debug use only.) show: @echo 'PROGRAM :' $(PROGRAM) @echo 'SRCDIRS :' $(SRCDIRS) @echo 'HEADERS :' $(HEADERS) @echo 'SOURCES :' $(SOURCES) @echo 'SRC_CXX :' $(SRC_CXX) @echo 'OBJS :' $(OBJS) @echo 'DEPS :' $(DEPS) @echo 'DEPEND :' $(DEPEND) @echo 'DEPEND.d :' $(DEPEND.d) @echo 'COMPILE.c :' $(COMPILE.c) @echo 'COMPILE.cxx :' $(COMPILE.cxx) @echo 'link.c :' $(LINK.c) @echo 'link.cxx :' $(LINK.cxx) ## End of the Makefile ## Suggestions are welcome ## All rights reserved ## #############################################################################