mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-12-27 18:25:05 +00:00
This adds a 'xrefs' target to create various cross-reference files from the EC sources. In particular, it generates these files in the target build directory: cscope.files - for the cscope browsing tool TAGS - for emacs tags - for vi It parses the dependency files generated by a build, so that only those source files actually used to create the EC binary are scanned. BUG=chrome-os-partner:18343 BRANCH=none TEST=manual Inside the chroot: make BOARD=link xrefs ls -l build/link/cscope.files If you install the ctags and etags programs in the chroot, you should also see build/$BOARD/tags or build/$BOARD/TAGS, respectively. If those programs don't exist, those steps will be silently skipped. Note: You can install ctags with "sudo emerge ctags". AFAICT, installing etags requires the entire emacs suite, so it's probably simpler to just copy the etags binary from your build host into the chroot's /opt/bin/ If you don't have ctags or etags in the chroot, you can still run make BOARD=link CROSS_COMPILE= xrefs outside the chroot, provided you've built the EC image first. Change-Id: I8e16ef19b0f4e79aba887c308e58982fef8fa21f Signed-off-by: Bill Richardson <wfrichar@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/175224
189 lines
5.7 KiB
Makefile
189 lines
5.7 KiB
Makefile
# -*- makefile -*-
|
|
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
#
|
|
# Embedded Controller firmware build system - common targets
|
|
#
|
|
|
|
objs := $(all-y)
|
|
deps := $(objs:%.o=%.o.d)
|
|
build-utils := $(foreach u,$(build-util-bin),$(out)/util/$(u))
|
|
host-utils := $(foreach u,$(host-util-bin),$(out)/util/$(u))
|
|
|
|
# Create output directories if necessary
|
|
_dir_create := $(foreach d,$(dirs),$(shell [ -d $(out)/$(d) ] || \
|
|
mkdir -p $(out)/$(d)))
|
|
_dir_y_create := $(foreach d,$(dirs-y),$(shell [ -d $(out)/$(d) ] || \
|
|
mkdir -p $(out)/$(d)))
|
|
|
|
section = $(subst .,,$(suffix $(1)))
|
|
section_is = $(subst .,,SECTION_IS_$(suffix $(1)))
|
|
|
|
# Decrease verbosity unless you pass V=1
|
|
quiet = $(if $(V),,@echo ' $(2)' $(subst $(out)/,,$@) ; )$(cmd_$(1))
|
|
silent = $(if $(V),,1>/dev/null)
|
|
|
|
# commands to build all targets
|
|
cmd_lds = $(CPP) -P -C -MMD -MF $@.d -MT $@ $(CPPFLAGS) \
|
|
-D$(call section_is,$*) \
|
|
-DSECTION=$(call section,$*) $< -o $@
|
|
cmd_obj_to_bin = $(OBJCOPY) --gap-fill=0xff -O binary $^ $(out)/$*.bin.tmp
|
|
cmd_flat_to_obj = $(CC) -T $(out)/firmware_image.lds -nostdlib $(CPPFLAGS) \
|
|
-Wl,--build-id=none -o $@ $<
|
|
cmd_elf_to_flat = $(OBJCOPY) -O binary $^ $@
|
|
cmd_elf_to_dis = $(OBJDUMP) -D $< > $@
|
|
cmd_elf = $(LD) $(LDFLAGS) $(objs) -o $@ -T $< -Map $(out)/$*.map
|
|
cmd_exe = $(CC) $(HOST_TEST_LDFLAGS) $(objs) -o $@
|
|
cmd_c_to_o = $(CC) $(CFLAGS) -MMD -MF $@.d -c $< -o $@
|
|
cmd_c_to_build = $(BUILDCC) $(BUILD_CFLAGS) $(BUILD_LDFLAGS) \
|
|
-MMD -MF $@.d $< -o $@
|
|
cmd_c_to_host = $(HOSTCC) $(HOST_CFLAGS) -MMD -MF $@.d $(filter %.c, $^) -o $@
|
|
cmd_host_test = ./util/run_host_test $* $(silent)
|
|
cmd_version = ./util/getversion.sh > $@
|
|
cmd_mv_from_tmp = mv $(out)/$*.bin.tmp $(out)/$*.bin
|
|
cmd_extractrw-y = cd $(out) && \
|
|
dump_fmap -x $(PROJECT).bin.tmp RW_SECTION_A $(silent) && \
|
|
mv RW_SECTION_A $(PROJECT).RW.bin
|
|
cmd_copyrw-y = cd $(out) && cp $(PROJECT).RW.flat $(PROJECT).RW.bin
|
|
|
|
# commands to build optional xref files
|
|
cmd_deps_to_list = cat $(deps) | tr -d ':\\' | tr ' ' '\012' \
|
|
| egrep '\.[chS]$$' | sort | uniq > $@
|
|
cmd_etags = etags -o $@ $(shell cat $<)
|
|
cmd_ctags = ctags -o $@ $(shell cat $<)
|
|
targ_if_prog = $(if $(shell which $(1) 2>/dev/null),$(2),)
|
|
|
|
.PHONY: all tests utils hosttests
|
|
all: $(out)/$(PROJECT).bin utils
|
|
|
|
dis-y = $(out)/$(PROJECT).RO.dis $(out)/$(PROJECT).RW.dis
|
|
dis: $(dis-y)
|
|
|
|
utils: $(build-utils) $(host-utils)
|
|
|
|
# On board test binaries
|
|
test-targets=$(foreach t,$(test-list-y),test-$(t))
|
|
.PHONY: $(test-targets)
|
|
|
|
$(test-targets): test-%:
|
|
@set -e ; \
|
|
echo " BUILD $(out)/$*" ; \
|
|
$(MAKE) --no-print-directory BOARD=$(BOARD) PROJECT=$* \
|
|
V=$(V) out=$(out)/$* TEST_BUILD=y; \
|
|
cp $(out)/$*/$*.bin $(out)/test-$*.bin
|
|
|
|
tests: $(test-targets)
|
|
|
|
# Emulator test executables
|
|
host-test-targets=$(foreach t,$(test-list-host),host-$(t))
|
|
run-test-targets=$(foreach t,$(test-list-host),run-$(t))
|
|
.PHONY: $(host-test-targets) $(run-test-targets)
|
|
|
|
$(host-test-targets): host-%:
|
|
@set -e ; \
|
|
echo " BUILD host - build/host/$*" ; \
|
|
$(MAKE) --no-print-directory BOARD=host PROJECT=$* \
|
|
V=$(V) out=build/host/$* TEST_BUILD=y EMU_BUILD=y $(TEST_FLAG) \
|
|
CROSS_COMPILE= build/host/$*/$*.exe
|
|
|
|
$(run-test-targets): run-%: host-%
|
|
$(call quiet,host_test,TEST )
|
|
|
|
hosttests: $(host-test-targets)
|
|
runtests: $(run-test-targets)
|
|
|
|
cov-test-targets=$(foreach t,$(test-list-host),build/host/$(t).info)
|
|
bldversion=$(shell (./util/getversion.sh ; echo VERSION) | $(CPP) -P)
|
|
|
|
# lcov fails when multiple instances run at the same time.
|
|
# We need to run them sequentially by using flock
|
|
cmd_lcov=flock /tmp/ec-lcov-lock -c "lcov -q -o $@ -c -d build/host/$*"
|
|
cmd_report_cov=genhtml -q -o build/host/coverage_rpt -t \
|
|
"EC Unittest "$(bldversion) $^
|
|
|
|
build/host/%.info: run-%
|
|
$(call quiet,lcov,COV )
|
|
|
|
coverage: TEST_FLAG=TEST_COVERAGE=y
|
|
coverage: $(cov-test-targets)
|
|
$(call quiet,report_cov,REPORT )
|
|
|
|
.PHONY: coverage
|
|
|
|
$(out)/firmware_image.lds: common/firmware_image.lds.S
|
|
$(call quiet,lds,LDS )
|
|
$(out)/%.lds: core/$(CORE)/ec.lds.S
|
|
$(call quiet,lds,LDS )
|
|
|
|
$(out)/%.bin: $(out)/%.obj
|
|
$(call quiet,obj_to_bin,OBJCOPY)
|
|
$(if $(sign-y),$(call quiet,sign,SIGN ),)
|
|
$(if $(sign-y),$(call quiet,extractrw-y,EXTR_RW), \
|
|
$(call quiet,copyrw-y,COPY_RW))
|
|
$(call quiet,mv_from_tmp,MV )
|
|
|
|
flat-y = $(out)/$(PROJECT).RO.flat $(out)/$(PROJECT).RW.flat
|
|
|
|
$(out)/%.obj: common/firmware_image.S $(out)/firmware_image.lds $(flat-y)
|
|
$(call quiet,flat_to_obj,CAT )
|
|
|
|
$(out)/%.dis: $(out)/%.elf
|
|
$(call quiet,elf_to_dis,OBJDUMP)
|
|
|
|
$(out)/%.flat: $(out)/%.elf
|
|
$(call quiet,elf_to_flat,OBJCOPY)
|
|
|
|
$(out)/%.elf: $(out)/%.lds $(objs)
|
|
$(call quiet,elf,LD )
|
|
|
|
$(out)/$(PROJECT).exe: $(objs)
|
|
$(call quiet,exe,EXE )
|
|
|
|
$(out)/%.o:%.c
|
|
$(call quiet,c_to_o,CC )
|
|
|
|
$(out)/vboot/%.o:$(VBOOT_SOURCE)/%.c
|
|
$(call quiet,c_to_o,CC )
|
|
|
|
$(out)/%.o:%.S
|
|
$(call quiet,c_to_o,AS )
|
|
|
|
$(out)/common/version.o: $(out)/ec_version.h
|
|
$(out)/ec_version.h: $(filter-out $(out)/common/version.o,$(objs))
|
|
$(call quiet,version,VERSION)
|
|
|
|
$(build-utils): $(out)/%:%.c
|
|
$(call quiet,c_to_build,BUILDCC)
|
|
|
|
$(host-utils): $(out)/%:%.c $(foreach u,$(host-util-common),util/$(u).c) \
|
|
$(foreach u,$(util-lock-objs),util/lock/$(u).c)
|
|
$(call quiet,c_to_host,HOSTCC )
|
|
|
|
$(out)/util/burn_my_ec: $(out)/$(PROJECT).bin
|
|
|
|
$(out)/cscope.files: $(out)/$(PROJECT).bin
|
|
$(call quiet,deps_to_list,SH )
|
|
|
|
$(out)/TAGS: $(out)/cscope.files
|
|
$(call quiet,etags,ETAGS )
|
|
|
|
$(out)/tags: $(out)/cscope.files
|
|
$(call quiet,ctags,CTAGS )
|
|
|
|
.PHONY: xrefs
|
|
xrefs: $(call targ_if_prog,etags,$(out)/TAGS) \
|
|
$(call targ_if_prog,ctags,$(out)/tags)
|
|
|
|
.PHONY: clean
|
|
clean:
|
|
-rm -rf $(out)
|
|
|
|
.PHONY: clobber
|
|
clobber:
|
|
-rm -rf build TAGS cscope.files cscope.out
|
|
|
|
.SECONDARY:
|
|
|
|
-include $(deps)
|