linux-old/Rules.make
<<
>>
Prefs
   1#
   2# This file contains rules which are shared between multiple Makefiles.
   3#
   4
   5#
   6# False targets.
   7#
   8.PHONY: dummy
   9
  10#
  11# Special variables which should not be exported
  12#
  13unexport EXTRA_AFLAGS
  14unexport EXTRA_CFLAGS
  15unexport EXTRA_LDFLAGS
  16unexport EXTRA_ARFLAGS
  17unexport SUBDIRS
  18unexport SUB_DIRS
  19unexport ALL_SUB_DIRS
  20unexport MOD_SUB_DIRS
  21unexport O_TARGET
  22unexport ALL_MOBJS
  23
  24unexport obj-y
  25unexport obj-m
  26unexport obj-n
  27unexport obj-
  28unexport export-objs
  29unexport subdir-y
  30unexport subdir-m
  31unexport subdir-n
  32unexport subdir-
  33
  34comma   := ,
  35EXTRA_CFLAGS_nostdinc := $(EXTRA_CFLAGS) $(kbuild_2_4_nostdinc)
  36
  37#
  38# Get things started.
  39#
  40first_rule: sub_dirs
  41        $(MAKE) all_targets
  42
  43both-m          := $(filter $(mod-subdirs), $(subdir-y))
  44SUB_DIRS        := $(subdir-y)
  45MOD_SUB_DIRS    := $(sort $(subdir-m) $(both-m))
  46ALL_SUB_DIRS    := $(sort $(subdir-y) $(subdir-m) $(subdir-n) $(subdir-))
  47
  48
  49#
  50# Common rules
  51#
  52
  53%.s: %.c
  54        $(CC) $(CFLAGS) $(EXTRA_CFLAGS_nostdinc) -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) $(CFLAGS_$@) -S $< -o $@
  55
  56%.i: %.c
  57        $(CPP) $(CFLAGS) $(EXTRA_CFLAGS_nostdinc) -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) $(CFLAGS_$@) $< > $@
  58
  59%.o: %.c
  60        $(CC) $(CFLAGS) $(EXTRA_CFLAGS_nostdinc) -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) $(CFLAGS_$@) -c -o $@ $<
  61        @ ( \
  62            echo 'ifeq ($(strip $(subst $(comma),:,$(CFLAGS) $(EXTRA_CFLAGS_nostdinc) $(CFLAGS_$@))),$$(strip $$(subst $$(comma),:,$$(CFLAGS) $$(EXTRA_CFLAGS_nostdinc) $$(CFLAGS_$@))))' ; \
  63            echo 'FILES_FLAGS_UP_TO_DATE += $@' ; \
  64            echo 'endif' \
  65        ) > $(dir $@)/.$(notdir $@).flags
  66
  67%.o: %.s
  68        $(AS) $(AFLAGS) $(EXTRA_CFLAGS) -o $@ $<
  69
  70# Old makefiles define their own rules for compiling .S files,
  71# but these standard rules are available for any Makefile that
  72# wants to use them.  Our plan is to incrementally convert all
  73# the Makefiles to these standard rules.  -- rmk, mec
  74ifdef USE_STANDARD_AS_RULE
  75
  76%.s: %.S
  77        $(CPP) $(AFLAGS) $(EXTRA_AFLAGS) $(AFLAGS_$@) $< > $@
  78
  79%.o: %.S
  80        $(CC) $(AFLAGS) $(EXTRA_AFLAGS) $(AFLAGS_$@) -c -o $@ $<
  81
  82endif
  83
  84%.lst: %.c
  85        $(CC) $(CFLAGS) $(EXTRA_CFLAGS_nostdinc) $(CFLAGS_$@) -g -c -o $*.o $<
  86        $(TOPDIR)/scripts/makelst $* $(TOPDIR) $(OBJDUMP)
  87#
  88#
  89#
  90all_targets: $(O_TARGET) $(L_TARGET)
  91
  92#
  93# Rule to compile a set of .o files into one .o file
  94#
  95ifdef O_TARGET
  96$(O_TARGET): $(obj-y)
  97        rm -f $@
  98    ifneq "$(strip $(obj-y))" ""
  99        $(LD) $(LDFLAGS) $(EXTRA_LDFLAGS) -r -o $@ $(filter $(obj-y), $^)
 100    else
 101        $(AR) rcs $@
 102    endif
 103        @ ( \
 104            echo 'ifeq ($(strip $(subst $(comma),:,$(LDFLAGS) $(EXTRA_LDFLAGS) $(obj-y))),$$(strip $$(subst $$(comma),:,$$(LDFLAGS) $$(EXTRA_LDFLAGS) $$(obj-y))))' ; \
 105            echo 'FILES_FLAGS_UP_TO_DATE += $@' ; \
 106            echo 'endif' \
 107        ) > $(dir $@)/.$(notdir $@).flags
 108endif # O_TARGET
 109
 110#
 111# Rule to compile a set of .o files into one .a file
 112#
 113ifdef L_TARGET
 114$(L_TARGET): $(obj-y)
 115        rm -f $@
 116        $(AR) $(EXTRA_ARFLAGS) rcs $@ $(obj-y)
 117        @ ( \
 118            echo 'ifeq ($(strip $(subst $(comma),:,$(EXTRA_ARFLAGS) $(obj-y))),$$(strip $$(subst $$(comma),:,$$(EXTRA_ARFLAGS) $$(obj-y))))' ; \
 119            echo 'FILES_FLAGS_UP_TO_DATE += $@' ; \
 120            echo 'endif' \
 121        ) > $(dir $@)/.$(notdir $@).flags
 122endif
 123
 124
 125#
 126# This make dependencies quickly
 127#
 128fastdep: dummy
 129        $(TOPDIR)/scripts/mkdep $(CFLAGS) $(EXTRA_CFLAGS_nostdinc) -- $(wildcard *.[chS]) > .depend
 130ifdef ALL_SUB_DIRS
 131        $(MAKE) $(patsubst %,_sfdep_%,$(ALL_SUB_DIRS)) _FASTDEP_ALL_SUB_DIRS="$(ALL_SUB_DIRS)"
 132endif
 133
 134ifdef _FASTDEP_ALL_SUB_DIRS
 135$(patsubst %,_sfdep_%,$(_FASTDEP_ALL_SUB_DIRS)):
 136        $(MAKE) -C $(patsubst _sfdep_%,%,$@) fastdep
 137endif
 138
 139        
 140#
 141# A rule to make subdirectories
 142#
 143subdir-list = $(sort $(patsubst %,_subdir_%,$(SUB_DIRS)))
 144sub_dirs: dummy $(subdir-list)
 145
 146ifdef SUB_DIRS
 147$(subdir-list) : dummy
 148        $(MAKE) -C $(patsubst _subdir_%,%,$@)
 149endif
 150
 151#
 152# A rule to make modules
 153#
 154ALL_MOBJS = $(filter-out $(obj-y), $(obj-m))
 155ifneq "$(strip $(ALL_MOBJS))" ""
 156MOD_DESTDIR := $(shell $(CONFIG_SHELL) $(TOPDIR)/scripts/pathdown.sh)
 157endif
 158
 159unexport MOD_DIRS
 160MOD_DIRS := $(MOD_SUB_DIRS) $(MOD_IN_SUB_DIRS)
 161ifneq "$(strip $(MOD_DIRS))" ""
 162.PHONY: $(patsubst %,_modsubdir_%,$(MOD_DIRS))
 163$(patsubst %,_modsubdir_%,$(MOD_DIRS)) : dummy
 164        $(MAKE) -C $(patsubst _modsubdir_%,%,$@) modules
 165
 166.PHONY: $(patsubst %,_modinst_%,$(MOD_DIRS))
 167$(patsubst %,_modinst_%,$(MOD_DIRS)) : dummy
 168        $(MAKE) -C $(patsubst _modinst_%,%,$@) modules_install
 169endif
 170
 171.PHONY: modules
 172modules: $(ALL_MOBJS) dummy \
 173         $(patsubst %,_modsubdir_%,$(MOD_DIRS))
 174
 175.PHONY: _modinst__
 176_modinst__: dummy
 177ifneq "$(strip $(ALL_MOBJS))" ""
 178        mkdir -p $(MODLIB)/kernel/$(MOD_DESTDIR)
 179        cp $(sort $(ALL_MOBJS)) $(MODLIB)/kernel/$(MOD_DESTDIR)
 180endif
 181
 182.PHONY: modules_install
 183modules_install: _modinst__ \
 184         $(patsubst %,_modinst_%,$(MOD_DIRS))
 185
 186#
 187# A rule to do nothing
 188#
 189dummy:
 190
 191#
 192# This is useful for testing
 193#
 194script:
 195        $(SCRIPT)
 196
 197#
 198# This sets version suffixes on exported symbols
 199# Separate the object into "normal" objects and "exporting" objects
 200# Exporting objects are: all objects that define symbol tables
 201#
 202ifdef CONFIG_MODULES
 203
 204multi-used      := $(filter $(list-multi), $(obj-y) $(obj-m))
 205multi-objs      := $(foreach m, $(multi-used), $($(basename $(m))-objs))
 206active-objs     := $(sort $(multi-objs) $(obj-y) $(obj-m))
 207
 208ifdef CONFIG_MODVERSIONS
 209ifneq "$(strip $(export-objs))" ""
 210
 211MODINCL = $(TOPDIR)/include/linux/modules
 212
 213# The -w option (enable warnings) for genksyms will return here in 2.1
 214# So where has it gone?
 215#
 216# Added the SMP separator to stop module accidents between uniprocessor
 217# and SMP Intel boxes - AC - from bits by Michael Chastain
 218#
 219
 220ifdef CONFIG_SMP
 221        genksyms_smp_prefix := -p smp_
 222else
 223        genksyms_smp_prefix := 
 224endif
 225
 226$(MODINCL)/%.ver: %.c
 227        @if [ ! -r $(MODINCL)/$*.stamp -o $(MODINCL)/$*.stamp -ot $< ]; then \
 228                echo '$(CC) $(CFLAGS) $(EXTRA_CFLAGS_nostdinc) -E -D__GENKSYMS__ $<'; \
 229                echo '| $(GENKSYMS) $(genksyms_smp_prefix) -k $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) > $@.tmp'; \
 230                $(CC) $(CFLAGS) $(EXTRA_CFLAGS_nostdinc) -E -D__GENKSYMS__ $< \
 231                | $(GENKSYMS) $(genksyms_smp_prefix) -k $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) > $@.tmp; \
 232                if [ -r $@ ] && cmp -s $@ $@.tmp; then echo $@ is unchanged; rm -f $@.tmp; \
 233                else echo mv $@.tmp $@; mv -f $@.tmp $@; fi; \
 234        fi; touch $(MODINCL)/$*.stamp
 235        
 236$(addprefix $(MODINCL)/,$(export-objs:.o=.ver)): $(TOPDIR)/include/linux/autoconf.h
 237
 238# updates .ver files but not modversions.h
 239fastdep: $(addprefix $(MODINCL)/,$(export-objs:.o=.ver))
 240
 241# updates .ver files and modversions.h like before (is this needed?)
 242dep: fastdep update-modverfile
 243
 244endif # export-objs 
 245
 246# update modversions.h, but only if it would change
 247update-modverfile:
 248        @(echo "#ifndef _LINUX_MODVERSIONS_H";\
 249          echo "#define _LINUX_MODVERSIONS_H"; \
 250          echo "#include <linux/modsetver.h>"; \
 251          cd $(TOPDIR)/include/linux/modules; \
 252          for f in *.ver; do \
 253            if [ -f $$f ]; then echo "#include <linux/modules/$${f}>"; fi; \
 254          done; \
 255          echo "#endif"; \
 256        ) > $(TOPDIR)/include/linux/modversions.h.tmp
 257        @if [ -r $(TOPDIR)/include/linux/modversions.h ] && cmp -s $(TOPDIR)/include/linux/modversions.h $(TOPDIR)/include/linux/modversions.h.tmp; then \
 258                echo $(TOPDIR)/include/linux/modversions.h was not updated; \
 259                rm -f $(TOPDIR)/include/linux/modversions.h.tmp; \
 260        else \
 261                echo $(TOPDIR)/include/linux/modversions.h was updated; \
 262                mv -f $(TOPDIR)/include/linux/modversions.h.tmp $(TOPDIR)/include/linux/modversions.h; \
 263        fi
 264
 265$(active-objs): $(TOPDIR)/include/linux/modversions.h
 266
 267else
 268
 269$(TOPDIR)/include/linux/modversions.h:
 270        @echo "#include <linux/modsetver.h>" > $@
 271
 272endif # CONFIG_MODVERSIONS
 273
 274ifneq "$(strip $(export-objs))" ""
 275$(export-objs): $(export-objs:.o=.c) $(TOPDIR)/include/linux/modversions.h
 276        $(CC) $(CFLAGS) $(EXTRA_CFLAGS_nostdinc) -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) $(CFLAGS_$@) -DEXPORT_SYMTAB -c $(@:.o=.c)
 277        @ ( \
 278            echo 'ifeq ($(strip $(subst $(comma),:,$(CFLAGS) $(EXTRA_CFLAGS_nostdinc) $(CFLAGS_$@) -DEXPORT_SYMTAB)),$$(strip $$(subst $$(comma),:,$$(CFLAGS) $$(EXTRA_CFLAGS_nostdinc) $$(CFLAGS_$@) -DEXPORT_SYMTAB)))' ; \
 279            echo 'FILES_FLAGS_UP_TO_DATE += $@' ; \
 280            echo 'endif' \
 281        ) > $(dir $@)/.$(notdir $@).flags
 282endif
 283
 284endif # CONFIG_MODULES
 285
 286
 287#
 288# include dependency files if they exist
 289#
 290ifneq ($(wildcard .depend),)
 291include .depend
 292endif
 293
 294ifneq ($(wildcard $(TOPDIR)/.hdepend),)
 295include $(TOPDIR)/.hdepend
 296endif
 297
 298#
 299# Find files whose flags have changed and force recompilation.
 300# For safety, this works in the converse direction:
 301#   every file is forced, except those whose flags are positively up-to-date.
 302#
 303FILES_FLAGS_UP_TO_DATE :=
 304
 305# For use in expunging commas from flags, which mung our checking.
 306comma = ,
 307
 308FILES_FLAGS_EXIST := $(wildcard .*.flags)
 309ifneq ($(FILES_FLAGS_EXIST),)
 310include $(FILES_FLAGS_EXIST)
 311endif
 312
 313FILES_FLAGS_CHANGED := $(strip \
 314    $(filter-out $(FILES_FLAGS_UP_TO_DATE), \
 315        $(O_TARGET) $(L_TARGET) $(active-objs) \
 316        ))
 317
 318# A kludge: .S files don't get flag dependencies (yet),
 319#   because that will involve changing a lot of Makefiles.  Also
 320#   suppress object files explicitly listed in $(IGNORE_FLAGS_OBJS).
 321#   This allows handling of assembly files that get translated into
 322#   multiple object files (see arch/ia64/lib/idiv.S, for example).
 323FILES_FLAGS_CHANGED := $(strip \
 324    $(filter-out $(patsubst %.S, %.o, $(wildcard *.S) $(IGNORE_FLAGS_OBJS)), \
 325    $(FILES_FLAGS_CHANGED)))
 326
 327ifneq ($(FILES_FLAGS_CHANGED),)
 328$(FILES_FLAGS_CHANGED): dummy
 329endif
 330