The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/scripts/Makefile.build

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 # ==========================================================================
    2 # Building
    3 # ==========================================================================
    4 
    5 src := $(obj)
    6 
    7 PHONY := __build
    8 __build:
    9 
   10 # Init all relevant variables used in kbuild files so
   11 # 1) they have correct type
   12 # 2) they do not inherit any value from the environment
   13 obj-y :=
   14 obj-m :=
   15 lib-y :=
   16 lib-m :=
   17 always :=
   18 targets :=
   19 subdir-y :=
   20 subdir-m :=
   21 EXTRA_AFLAGS   :=
   22 EXTRA_CFLAGS   :=
   23 EXTRA_CPPFLAGS :=
   24 EXTRA_LDFLAGS  :=
   25 asflags-y  :=
   26 ccflags-y  :=
   27 cppflags-y :=
   28 ldflags-y  :=
   29 
   30 subdir-asflags-y :=
   31 subdir-ccflags-y :=
   32 
   33 # Read auto.conf if it exists, otherwise ignore
   34 -include include/config/auto.conf
   35 
   36 include scripts/Kbuild.include
   37 
   38 # For backward compatibility check that these variables do not change
   39 save-cflags := $(CFLAGS)
   40 
   41 # The filename Kbuild has precedence over Makefile
   42 kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
   43 kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
   44 include $(kbuild-file)
   45 
   46 # If the save-* variables changed error out
   47 ifeq ($(KBUILD_NOPEDANTIC),)
   48         ifneq ("$(save-cflags)","$(CFLAGS)")
   49                 $(error CFLAGS was changed in "$(kbuild-file)". Fix it to use ccflags-y)
   50         endif
   51 endif
   52 
   53 #
   54 # make W=... settings
   55 #
   56 # W=1 - warnings that may be relevant and does not occur too often
   57 # W=2 - warnings that occur quite often but may still be relevant
   58 # W=3 - the more obscure warnings, can most likely be ignored
   59 #
   60 # $(call cc-option, -W...) handles gcc -W.. options which
   61 # are not supported by all versions of the compiler
   62 ifdef KBUILD_ENABLE_EXTRA_GCC_CHECKS
   63 warning-  := $(empty)
   64 
   65 warning-1 := -Wextra -Wunused -Wno-unused-parameter
   66 warning-1 += -Wmissing-declarations
   67 warning-1 += -Wmissing-format-attribute
   68 warning-1 += -Wmissing-prototypes
   69 warning-1 += -Wold-style-definition
   70 warning-1 += $(call cc-option, -Wmissing-include-dirs)
   71 warning-1 += $(call cc-option, -Wunused-but-set-variable)
   72 warning-1 += $(call cc-disable-warning, missing-field-initializers)
   73 
   74 warning-2 := -Waggregate-return
   75 warning-2 += -Wcast-align
   76 warning-2 += -Wdisabled-optimization
   77 warning-2 += -Wnested-externs
   78 warning-2 += -Wshadow
   79 warning-2 += $(call cc-option, -Wlogical-op)
   80 warning-2 += $(call cc-option, -Wmissing-field-initializers)
   81 
   82 warning-3 := -Wbad-function-cast
   83 warning-3 += -Wcast-qual
   84 warning-3 += -Wconversion
   85 warning-3 += -Wpacked
   86 warning-3 += -Wpadded
   87 warning-3 += -Wpointer-arith
   88 warning-3 += -Wredundant-decls
   89 warning-3 += -Wswitch-default
   90 warning-3 += $(call cc-option, -Wpacked-bitfield-compat)
   91 warning-3 += $(call cc-option, -Wvla)
   92 
   93 warning := $(warning-$(findstring 1, $(KBUILD_ENABLE_EXTRA_GCC_CHECKS)))
   94 warning += $(warning-$(findstring 2, $(KBUILD_ENABLE_EXTRA_GCC_CHECKS)))
   95 warning += $(warning-$(findstring 3, $(KBUILD_ENABLE_EXTRA_GCC_CHECKS)))
   96 
   97 ifeq ("$(strip $(warning))","")
   98         $(error W=$(KBUILD_ENABLE_EXTRA_GCC_CHECKS) is unknown)
   99 endif
  100 
  101 KBUILD_CFLAGS += $(warning)
  102 endif
  103 
  104 include scripts/Makefile.lib
  105 
  106 ifdef host-progs
  107 ifneq ($(hostprogs-y),$(host-progs))
  108 $(warning kbuild: $(obj)/Makefile - Usage of host-progs is deprecated. Please replace with hostprogs-y!)
  109 hostprogs-y += $(host-progs)
  110 endif
  111 endif
  112 
  113 # Do not include host rules unless needed
  114 ifneq ($(hostprogs-y)$(hostprogs-m),)
  115 include scripts/Makefile.host
  116 endif
  117 
  118 ifneq ($(KBUILD_SRC),)
  119 # Create output directory if not already present
  120 _dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj))
  121 
  122 # Create directories for object files if directory does not exist
  123 # Needed when obj-y := dir/file.o syntax is used
  124 _dummy := $(foreach d,$(obj-dirs), $(shell [ -d $(d) ] || mkdir -p $(d)))
  125 endif
  126 
  127 ifndef obj
  128 $(warning kbuild: Makefile.build is included improperly)
  129 endif
  130 
  131 # ===========================================================================
  132 
  133 ifneq ($(strip $(lib-y) $(lib-m) $(lib-n) $(lib-)),)
  134 lib-target := $(obj)/lib.a
  135 endif
  136 
  137 ifneq ($(strip $(obj-y) $(obj-m) $(obj-n) $(obj-) $(subdir-m) $(lib-target)),)
  138 builtin-target := $(obj)/built-in.o
  139 endif
  140 
  141 modorder-target := $(obj)/modules.order
  142 
  143 # We keep a list of all modules in $(MODVERDIR)
  144 
  145 __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
  146          $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \
  147          $(subdir-ym) $(always)
  148         @:
  149 
  150 # Linus' kernel sanity checking tool
  151 ifneq ($(KBUILD_CHECKSRC),0)
  152   ifeq ($(KBUILD_CHECKSRC),2)
  153     quiet_cmd_force_checksrc = CHECK   $<
  154           cmd_force_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $< ;
  155   else
  156       quiet_cmd_checksrc     = CHECK   $<
  157             cmd_checksrc     = $(CHECK) $(CHECKFLAGS) $(c_flags) $< ;
  158   endif
  159 endif
  160 
  161 # Do section mismatch analysis for each module/built-in.o
  162 ifdef CONFIG_DEBUG_SECTION_MISMATCH
  163   cmd_secanalysis = ; scripts/mod/modpost $@
  164 endif
  165 
  166 # Compile C sources (.c)
  167 # ---------------------------------------------------------------------------
  168 
  169 # Default is built-in, unless we know otherwise
  170 modkern_cflags =                                          \
  171         $(if $(part-of-module),                           \
  172                 $(KBUILD_CFLAGS_MODULE) $(CFLAGS_MODULE), \
  173                 $(KBUILD_CFLAGS_KERNEL) $(CFLAGS_KERNEL))
  174 quiet_modtag := $(empty)   $(empty)
  175 
  176 $(real-objs-m)        : part-of-module := y
  177 $(real-objs-m:.o=.i)  : part-of-module := y
  178 $(real-objs-m:.o=.s)  : part-of-module := y
  179 $(real-objs-m:.o=.lst): part-of-module := y
  180 
  181 $(real-objs-m)        : quiet_modtag := [M]
  182 $(real-objs-m:.o=.i)  : quiet_modtag := [M]
  183 $(real-objs-m:.o=.s)  : quiet_modtag := [M]
  184 $(real-objs-m:.o=.lst): quiet_modtag := [M]
  185 
  186 $(obj-m)              : quiet_modtag := [M]
  187 
  188 # Default for not multi-part modules
  189 modname = $(basetarget)
  190 
  191 $(multi-objs-m)         : modname = $(modname-multi)
  192 $(multi-objs-m:.o=.i)   : modname = $(modname-multi)
  193 $(multi-objs-m:.o=.s)   : modname = $(modname-multi)
  194 $(multi-objs-m:.o=.lst) : modname = $(modname-multi)
  195 $(multi-objs-y)         : modname = $(modname-multi)
  196 $(multi-objs-y:.o=.i)   : modname = $(modname-multi)
  197 $(multi-objs-y:.o=.s)   : modname = $(modname-multi)
  198 $(multi-objs-y:.o=.lst) : modname = $(modname-multi)
  199 
  200 quiet_cmd_cc_s_c = CC $(quiet_modtag)  $@
  201 cmd_cc_s_c       = $(CC) $(c_flags) -fverbose-asm -S -o $@ $<
  202 
  203 $(obj)/%.s: $(src)/%.c FORCE
  204         $(call if_changed_dep,cc_s_c)
  205 
  206 quiet_cmd_cc_i_c = CPP $(quiet_modtag) $@
  207 cmd_cc_i_c       = $(CPP) $(c_flags)   -o $@ $<
  208 
  209 $(obj)/%.i: $(src)/%.c FORCE
  210         $(call if_changed_dep,cc_i_c)
  211 
  212 cmd_gensymtypes =                                                           \
  213     $(CPP) -D__GENKSYMS__ $(c_flags) $< |                                   \
  214     $(GENKSYMS) $(if $(1), -T $(2)) -a $(ARCH)                              \
  215      $(if $(KBUILD_PRESERVE),-p)                                            \
  216      -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
  217 
  218 quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
  219 cmd_cc_symtypes_c =                                                         \
  220     set -e;                                                                 \
  221     $(call cmd_gensymtypes,true,$@) >/dev/null;                             \
  222     test -s $@ || rm -f $@
  223 
  224 $(obj)/%.symtypes : $(src)/%.c FORCE
  225         $(call cmd,cc_symtypes_c)
  226 
  227 # C (.c) files
  228 # The C file is compiled and updated dependency information is generated.
  229 # (See cmd_cc_o_c + relevant part of rule_cc_o_c)
  230 
  231 quiet_cmd_cc_o_c = CC $(quiet_modtag)  $@
  232 
  233 ifndef CONFIG_MODVERSIONS
  234 cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
  235 
  236 else
  237 # When module versioning is enabled the following steps are executed:
  238 # o compile a .tmp_<file>.o from <file>.c
  239 # o if .tmp_<file>.o doesn't contain a __ksymtab version, i.e. does
  240 #   not export symbols, we just rename .tmp_<file>.o to <file>.o and
  241 #   are done.
  242 # o otherwise, we calculate symbol versions using the good old
  243 #   genksyms on the preprocessed source and postprocess them in a way
  244 #   that they are usable as a linker script
  245 # o generate <file>.o from .tmp_<file>.o using the linker to
  246 #   replace the unresolved symbols __crc_exported_symbol with
  247 #   the actual value of the checksum generated by genksyms
  248 
  249 cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<
  250 cmd_modversions =                                                               \
  251         if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then             \
  252                 $(call cmd_gensymtypes,$(KBUILD_SYMTYPES),$(@:.o=.symtypes))    \
  253                     > $(@D)/.tmp_$(@F:.o=.ver);                                 \
  254                                                                                 \
  255                 $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F)                      \
  256                         -T $(@D)/.tmp_$(@F:.o=.ver);                            \
  257                 rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver);                \
  258         else                                                                    \
  259                 mv -f $(@D)/.tmp_$(@F) $@;                                      \
  260         fi;
  261 endif
  262 
  263 ifdef CONFIG_FTRACE_MCOUNT_RECORD
  264 ifdef BUILD_C_RECORDMCOUNT
  265 ifeq ("$(origin RECORDMCOUNT_WARN)", "command line")
  266   RECORDMCOUNT_FLAGS = -w
  267 endif
  268 # Due to recursion, we must skip empty.o.
  269 # The empty.o file is created in the make process in order to determine
  270 #  the target endianness and word size. It is made before all other C
  271 #  files, including recordmcount.
  272 sub_cmd_record_mcount =                                 \
  273         if [ $(@) != "scripts/mod/empty.o" ]; then      \
  274                 $(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)";   \
  275         fi;
  276 recordmcount_source := $(srctree)/scripts/recordmcount.c \
  277                     $(srctree)/scripts/recordmcount.h
  278 else
  279 sub_cmd_record_mcount = set -e ; perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \
  280         "$(if $(CONFIG_CPU_BIG_ENDIAN),big,little)" \
  281         "$(if $(CONFIG_64BIT),64,32)" \
  282         "$(OBJDUMP)" "$(OBJCOPY)" "$(CC) $(KBUILD_CFLAGS)" \
  283         "$(LD)" "$(NM)" "$(RM)" "$(MV)" \
  284         "$(if $(part-of-module),1,0)" "$(@)";
  285 recordmcount_source := $(srctree)/scripts/recordmcount.pl
  286 endif
  287 cmd_record_mcount =                                             \
  288         if [ "$(findstring -pg,$(_c_flags))" = "-pg" ]; then    \
  289                 $(sub_cmd_record_mcount)                        \
  290         fi;
  291 endif
  292 
  293 define rule_cc_o_c
  294         $(call echo-cmd,checksrc) $(cmd_checksrc)                         \
  295         $(call echo-cmd,cc_o_c) $(cmd_cc_o_c);                            \
  296         $(cmd_modversions)                                                \
  297         $(call echo-cmd,record_mcount)                                    \
  298         $(cmd_record_mcount)                                              \
  299         scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' >    \
  300                                                       $(dot-target).tmp;  \
  301         rm -f $(depfile);                                                 \
  302         mv -f $(dot-target).tmp $(dot-target).cmd
  303 endef
  304 
  305 # Built-in and composite module parts
  306 $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
  307         $(call cmd,force_checksrc)
  308         $(call if_changed_rule,cc_o_c)
  309 
  310 # Single-part modules are special since we need to mark them in $(MODVERDIR)
  311 
  312 $(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
  313         $(call cmd,force_checksrc)
  314         $(call if_changed_rule,cc_o_c)
  315         @{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod)
  316 
  317 quiet_cmd_cc_lst_c = MKLST   $@
  318       cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \
  319                      $(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \
  320                                      System.map $(OBJDUMP) > $@
  321 
  322 $(obj)/%.lst: $(src)/%.c FORCE
  323         $(call if_changed_dep,cc_lst_c)
  324 
  325 # Compile assembler sources (.S)
  326 # ---------------------------------------------------------------------------
  327 
  328 modkern_aflags := $(KBUILD_AFLAGS_KERNEL) $(AFLAGS_KERNEL)
  329 
  330 $(real-objs-m)      : modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
  331 $(real-objs-m:.o=.s): modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
  332 
  333 quiet_cmd_as_s_S = CPP $(quiet_modtag) $@
  334 cmd_as_s_S       = $(CPP) $(a_flags)   -o $@ $< 
  335 
  336 $(obj)/%.s: $(src)/%.S FORCE
  337         $(call if_changed_dep,as_s_S)
  338 
  339 quiet_cmd_as_o_S = AS $(quiet_modtag)  $@
  340 cmd_as_o_S       = $(CC) $(a_flags) -c -o $@ $<
  341 
  342 $(obj)/%.o: $(src)/%.S FORCE
  343         $(call if_changed_dep,as_o_S)
  344 
  345 targets += $(real-objs-y) $(real-objs-m) $(lib-y)
  346 targets += $(extra-y) $(MAKECMDGOALS) $(always)
  347 
  348 # Linker scripts preprocessor (.lds.S -> .lds)
  349 # ---------------------------------------------------------------------------
  350 quiet_cmd_cpp_lds_S = LDS     $@
  351       cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -C -U$(ARCH) \
  352                              -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $<
  353 
  354 $(obj)/%.lds: $(src)/%.lds.S FORCE
  355         $(call if_changed_dep,cpp_lds_S)
  356 
  357 # ASN.1 grammar
  358 # ---------------------------------------------------------------------------
  359 quiet_cmd_asn1_compiler = ASN.1   $@
  360       cmd_asn1_compiler = $(objtree)/scripts/asn1_compiler $< \
  361                                 $(subst .h,.c,$@) $(subst .c,.h,$@)
  362 
  363 .PRECIOUS: $(objtree)/$(obj)/%-asn1.c $(objtree)/$(obj)/%-asn1.h
  364 
  365 $(obj)/%-asn1.c $(obj)/%-asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler
  366         $(call cmd,asn1_compiler)
  367 
  368 # Build the compiled-in targets
  369 # ---------------------------------------------------------------------------
  370 
  371 # To build objects in subdirs, we need to descend into the directories
  372 $(sort $(subdir-obj-y)): $(subdir-ym) ;
  373 
  374 #
  375 # Rule to compile a set of .o files into one .o file
  376 #
  377 ifdef builtin-target
  378 quiet_cmd_link_o_target = LD      $@
  379 # If the list of objects to link is empty, just create an empty built-in.o
  380 cmd_link_o_target = $(if $(strip $(obj-y)),\
  381                       $(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^) \
  382                       $(cmd_secanalysis),\
  383                       rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@)
  384 
  385 $(builtin-target): $(obj-y) FORCE
  386         $(call if_changed,link_o_target)
  387 
  388 targets += $(builtin-target)
  389 endif # builtin-target
  390 
  391 #
  392 # Rule to create modules.order file
  393 #
  394 # Create commands to either record .ko file or cat modules.order from
  395 # a subdirectory
  396 modorder-cmds =                                         \
  397         $(foreach m, $(modorder),                       \
  398                 $(if $(filter %/modules.order, $m),     \
  399                         cat $m;, echo kernel/$m;))
  400 
  401 $(modorder-target): $(subdir-ym) FORCE
  402         $(Q)(cat /dev/null; $(modorder-cmds)) > $@
  403 
  404 #
  405 # Rule to compile a set of .o files into one .a file
  406 #
  407 ifdef lib-target
  408 quiet_cmd_link_l_target = AR      $@
  409 cmd_link_l_target = rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@ $(lib-y)
  410 
  411 $(lib-target): $(lib-y) FORCE
  412         $(call if_changed,link_l_target)
  413 
  414 targets += $(lib-target)
  415 endif
  416 
  417 #
  418 # Rule to link composite objects
  419 #
  420 #  Composite objects are specified in kbuild makefile as follows:
  421 #    <composite-object>-objs := <list of .o files>
  422 #  or
  423 #    <composite-object>-y    := <list of .o files>
  424 link_multi_deps =                     \
  425 $(filter $(addprefix $(obj)/,         \
  426 $($(subst $(obj)/,,$(@:.o=-objs)))    \
  427 $($(subst $(obj)/,,$(@:.o=-y)))), $^)
  428  
  429 quiet_cmd_link_multi-y = LD      $@
  430 cmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis)
  431 
  432 quiet_cmd_link_multi-m = LD [M]  $@
  433 cmd_link_multi-m = $(cmd_link_multi-y)
  434 
  435 # We would rather have a list of rules like
  436 #       foo.o: $(foo-objs)
  437 # but that's not so easy, so we rather make all composite objects depend
  438 # on the set of all their parts
  439 $(multi-used-y) : %.o: $(multi-objs-y) FORCE
  440         $(call if_changed,link_multi-y)
  441 
  442 $(multi-used-m) : %.o: $(multi-objs-m) FORCE
  443         $(call if_changed,link_multi-m)
  444         @{ echo $(@:.o=.ko); echo $(link_multi_deps); } > $(MODVERDIR)/$(@F:.o=.mod)
  445 
  446 targets += $(multi-used-y) $(multi-used-m)
  447 
  448 
  449 # Descending
  450 # ---------------------------------------------------------------------------
  451 
  452 PHONY += $(subdir-ym)
  453 $(subdir-ym):
  454         $(Q)$(MAKE) $(build)=$@
  455 
  456 # Add FORCE to the prequisites of a target to force it to be always rebuilt.
  457 # ---------------------------------------------------------------------------
  458 
  459 PHONY += FORCE
  460 
  461 FORCE:
  462 
  463 # Read all saved command lines and dependencies for the $(targets) we
  464 # may be building above, using $(if_changed{,_dep}). As an
  465 # optimization, we don't need to read them if the target does not
  466 # exist, we will rebuild anyway in that case.
  467 
  468 targets := $(wildcard $(sort $(targets)))
  469 cmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))
  470 
  471 ifneq ($(cmd_files),)
  472   include $(cmd_files)
  473 endif
  474 
  475 # Declare the contents of the .PHONY variable as phony.  We keep that
  476 # information in a variable se we can use it in if_changed and friends.
  477 
  478 .PHONY: $(PHONY)

Cache object: 2c403abc7225085ec3bfe8fd34f7d787


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.