make: decouple rw and ro object file sets

When building EC image, in the majority of cases the RW and RO images
are built from exactly the same set of object files, and the RO set of
objects is used as a template to derive the RW set of objects.

This is not necessarily correct in all cases, let's just create an
abstract set of object files and use it to derive the sets for RO, RW
and sharedlib as appropriate.

BRANCH=None
BUG=chrome-os-partner:43025
TEST=tested as follows:
  - changed the Makefile to sort all object files in a single list
    (instead of sorting them by directory, with the directory list
    unchanged). Built all targets, saved all .smap files. Then applied
    this change and again built all targets. Compare all smap files,
    there were no differences.
  - modified board/samus/board.h to trigger building sharedlib
    objects, verified that build/samus/sharedlib built fine.

Change-Id: Ie563aca62028cae9e16f067ba20b5e2930355cf5
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/310389
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
This commit is contained in:
Vadim Bendebury
2015-11-02 14:24:50 -08:00
committed by chrome-bot
parent a25c7025e1
commit d5e49bc23d

View File

@@ -119,7 +119,7 @@ $(eval CHIP_VARIANT_$(UC_CHIP_VARIANT)=y)
$(eval CHIP_FAMILY_$(UC_CHIP_FAMILY)=y)
# Private subdirectories may call this from their build.mk
ro-objs_from_dir=$(sort $(foreach obj, $($(2)-y), $(out)/RO/$(1)/$(obj)))
objs_from_dir=$(foreach obj, $($(2)-y), $(1)/$(obj))
# Get build configuration from sub-directories
# Note that this re-includes the board and chip makefiles
@@ -140,27 +140,28 @@ include util/signer/build.mk
includes+=$(includes-y)
# Get all sources to build
all-ro-y+=$(call ro-objs_from_dir,core/$(CORE),core)
all-ro-y+=$(call ro-objs_from_dir,chip/$(CHIP),chip)
all-ro-y+=$(call ro-objs_from_dir,$(BDIR),board)
all-ro-y+=$(call ro-objs_from_dir,private,private)
all-ro-y+=$(call ro-objs_from_dir,private-cr51,private-cr51)
all-ro-y+=$(call ro-objs_from_dir,common,common)
all-ro-y+=$(call ro-objs_from_dir,driver,driver)
all-ro-y+=$(call ro-objs_from_dir,power,power)
all-ro-y+=$(call ro-objs_from_dir,test,$(PROJECT))
all-obj-y+=$(call objs_from_dir,core/$(CORE),core)
all-obj-y+=$(call objs_from_dir,chip/$(CHIP),chip)
all-obj-y+=$(call objs_from_dir,$(BDIR),board)
all-obj-y+=$(call objs_from_dir,private,private)
all-obj-y+=$(call objs_from_dir,private-cr51,private-cr51)
all-obj-y+=$(call objs_from_dir,common,common)
all-obj-y+=$(call objs_from_dir,driver,driver)
all-obj-y+=$(call objs_from_dir,power,power)
all-obj-y+=$(call objs_from_dir,test,$(PROJECT))
dirs=core/$(CORE) chip/$(CHIP) $(BDIR) common power test
dirs+= private private-cr51
dirs+=$(shell find driver -type d)
common_dirs=util
ro-objs := $(all-ro-y)
ro-objs := $(sort $(foreach obj, $(all-obj-y), $(out)/RO/$(obj)))
rw-objs := $(sort $(foreach obj, $(all-obj-y), $(out)/RW/$(obj)))
# Don't include the shared objects in the RO/RW image if we're enabling
# the shared objects library.
ifeq ($(CONFIG_SHAREDLIB),y)
ro-objs := $(filter-out %_sharedlib.o, $(ro-objs))
endif
rw-objs := $(ro-objs:$(out)/RO/%=$(out)/RW/%)
ro-deps := $(ro-objs:%.o=%.o.d)
rw-deps := $(rw-objs:%.o=%.o.d)
deps := $(ro-deps) $(rw-deps)
@@ -181,8 +182,8 @@ rw: $(libsharedobjs_elf-y) $(out)/RW/$(PROJECT).RW.flat
# Shared objects library
SHOBJLIB := libsharedobjs
sharedlib-objs := $(filter %_sharedlib.o, $(all-ro-y))
sharedlib-objs := $(sharedlib-objs:$(out)/RO/%=$(out)/$(SHOBJLIB)/%)
sharedlib-objs := $(filter %_sharedlib.o, $(all-obj-y))
sharedlib-objs := $(foreach obj, $(sharedlib-objs), $(out)/$(SHOBJLIB)/$(obj))
sharedlib-deps := $(sharedlib-objs:%.o=%.o.d)
deps += $(sharedlib-deps)
def_libsharedobjs_deps := $(sharedlib-objs)