Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild-next
[pandora-kernel.git] / scripts / Makefile.build
index 7a17677..5d90030 100644 (file)
@@ -151,14 +151,20 @@ cmd_cc_i_c       = $(CPP) $(c_flags)   -o $@ $<
 $(obj)/%.i: $(src)/%.c FORCE
        $(call if_changed_dep,cc_i_c)
 
+cmd_genksyms =                                                              \
+    $(CPP) -D__GENKSYMS__ $(c_flags) $< |                                   \
+    $(GENKSYMS) -T $@ -A -a $(ARCH)                                         \
+     $(if $(KBUILD_PRESERVE),-p)                                            \
+     $(if $(1),-r $(firstword $(wildcard $(@:.symtypes=.symref) /dev/null)))
+
 quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
-cmd_cc_symtypes_c         = \
-               $(CPP) -D__GENKSYMS__ $(c_flags) $<                     \
-               | $(GENKSYMS) -T $@ >/dev/null;                         \
-               test -s $@ || rm -f $@
+cmd_cc_symtypes_c =                                                         \
+    set -e;                                                                 \
+    $(call cmd_genksyms, true) >/dev/null;                                  \
+    test -s $@ || rm -f $@
 
 $(obj)/%.symtypes : $(src)/%.c FORCE
-       $(call if_changed_dep,cc_symtypes_c)
+       $(call cmd,cc_symtypes_c)
 
 # C (.c) files
 # The C file is compiled and updated dependency information is generated.
@@ -171,30 +177,38 @@ cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
 
 else
 # When module versioning is enabled the following steps are executed:
-# o compile a .tmp_<file>.o from <file>.c
-# o if .tmp_<file>.o doesn't contain a __ksymtab version, i.e. does
-#   not export symbols, we just rename .tmp_<file>.o to <file>.o and
+# o compile a .tmp_<file>.s from <file>.c
+# o if .tmp_<file>.s doesn't contain a __ksymtab version, i.e. does
+#   not export symbols, we just assemble .tmp_<file>.s to <file>.o and
 #   are done.
 # o otherwise, we calculate symbol versions using the good old
 #   genksyms on the preprocessed source and postprocess them in a way
-#   that they are usable as a linker script
-# o generate <file>.o from .tmp_<file>.o using the linker to
-#   replace the unresolved symbols __crc_exported_symbol with
-#   the actual value of the checksum generated by genksyms
+#   that they are usable as assembly source
+# o assemble <file>.o from .tmp_<file>.s forcing inclusion of directives
+#   defining the actual values of __crc_*, followed by objcopy-ing them
+#   to force these symbols to be local to permit stripping them later.
+s_file = $(@D)/.tmp_$(@F:.o=.s)
+v_file = $(@D)/.tmp_$(@F:.o=.v)
+tmp_o_file = $(@D)/.tmp_$(@F)
+no_g_c_flags = $(filter-out -g%,$(c_flags))
+
+cmd_cc_o_c = $(CC) $(c_flags) -S -o $(s_file) $<
 
-cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<
 cmd_modversions =                                                      \
-       if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then     \
-               $(CPP) -D__GENKSYMS__ $(c_flags) $<                     \
-               | $(GENKSYMS) $(if $(KBUILD_SYMTYPES),                  \
-                             -T $(@D)/$(@F:.o=.symtypes)) -a $(ARCH)   \
-               > $(@D)/.tmp_$(@F:.o=.ver);                             \
-                                                                       \
-               $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F)              \
-                       -T $(@D)/.tmp_$(@F:.o=.ver);                    \
-               rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver);        \
+       if grep -q __ksymtab $(s_file); then                            \
+               if $(call cmd_genksyms, $(KBUILD_SYMTYPES)) > $(v_file) \
+                  && $(CC) $(no_g_c_flags) -c -Wa,$(v_file)            \
+                           -o $(tmp_o_file) $(s_file)                  \
+                  && $(OBJCOPY) -L '__crc_*' -L '___crc_*' -w          \
+                                $(tmp_o_file) $@;                      \
+               then                                                    \
+                       : ;                                             \
+               else                                                    \
+                       rm -f $@; exit 1;                               \
+               fi;                                                     \
        else                                                            \
-               mv -f $(@D)/.tmp_$(@F) $@;                              \
+               rm -f $(v_file);                                        \
+               $(CC) $(no_g_c_flags) -c -o $@ $(s_file);               \
        fi;
 endif
 
@@ -211,7 +225,12 @@ define rule_cc_o_c
        $(cmd_record_mcount)                                              \
        scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' >    \
                                                      $(dot-target).tmp;  \
-       rm -f $(depfile);                                                 \
+       if [ -r $(@D)/.tmp_$(@F:.o=.v) ]; then                            \
+               echo >> $(dot-target).tmp;                                \
+               echo '$@: $(GENKSYMS)' >> $(dot-target).tmp;              \
+               echo '$(GENKSYMS):: ;' >> $(dot-target).tmp;              \
+       fi;                                                               \
+       rm -f $(depfile) $(@D)/.tmp_$(@F:.o=.?);                          \
        mv -f $(dot-target).tmp $(dot-target).cmd
 endef