| # Find the local dir of the make file |
| GET_LOCAL_DIR = $(patsubst %/,%,$(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))) |
| |
| # makes sure the target dir exists |
| MKDIR = if [ ! -d $(dir $@) ]; then mkdir -p $(dir $@); fi |
| |
| # prepends the BUILD_DIR var to each item in the list |
| TOBUILDDIR = $(addprefix $(BUILDDIR)/,$(1)) |
| |
| # converts specified variable to boolean value |
| TOBOOL = $(if $(filter-out 0 false,$1),true,false) |
| |
| # try to find a Trusty external at external/trusty first |
| # (if we moved it there), otherwise try the old directory |
| FIND_EXTERNAL = $(if $(wildcard external/trusty/$1),external/trusty/$1,external/$1) |
| |
| # try to find a Rust crate at external/rust/crates/$CRATE and fall back to |
| # trusty/user/base/host/$CRATE and then trusty/user/base/lib/$CRATE-rust |
| FIND_CRATE = $(if $(wildcard external/rust/crates/$1/rules.mk),external/rust/crates/$1,$(if $(wildcard trusty/user/base/host/$1/rules.mk),trusty/user/base/host/$1,$(if $(wildcard trusty/user/base/host/$1-rust/rules.mk),trusty/user/base/host/$1-rust,trusty/user/base/lib/$1-rust))) |
| |
| # checks if module with a given path exists |
| FIND_MODULE = $(wildcard $1/rules.mk)$(wildcard $(addsuffix /$1/rules.mk,$(.INCLUDE_DIRS))) |
| |
| COMMA := , |
| EMPTY := |
| SPACE := $(EMPTY) $(EMPTY) |
| |
| define NEWLINE |
| |
| |
| endef |
| |
| STRIP_TRAILING_COMMA = $(if $(1),$(subst $(COMMA)END_OF_LIST_MARKER_FOR_STRIP_TRAILING_COMMA,,$(strip $(1))END_OF_LIST_MARKER_FOR_STRIP_TRAILING_COMMA)) |
| |
| # return $1 with the first word removed |
| rest-of-words = $(wordlist 2,$(words $1),$1) |
| # map $1 onto zipped pairs of items from lists $2 and $3 |
| pairmap = $(and $(strip $2),$(strip $3),\ |
| $(call $1,$(firstword $2),$(firstword $3)) $(call pairmap,$1,$(call rest-of-words,$2),$(call rest-of-words,$3))) |
| |
| # test if two files are different, replacing the first |
| # with the second if so |
| # args: $1 - temporary file to test |
| # $2 - file to replace |
| define TESTANDREPLACEFILE |
| if [ -f "$2" ]; then \ |
| if cmp "$1" "$2"; then \ |
| rm -f $1; \ |
| else \ |
| mv $1 $2; \ |
| fi \ |
| else \ |
| mv $1 $2; \ |
| fi |
| endef |
| |
| # generate a header file at $1 with an expanded variable in $2 |
| define MAKECONFIGHEADER |
| $(MKDIR); \ |
| rm -f $1.tmp; \ |
| LDEF=`echo $1 | tr '/\\.-' '_' | sed "s/C++/CPP/g;s/c++/cpp/g"`; \ |
| echo \#ifndef __$${LDEF}_H > $1.tmp; \ |
| echo \#define __$${LDEF}_H >> $1.tmp; \ |
| for d in `echo $($2) | tr '[:lower:]' '[:upper:]'`; do \ |
| echo "#define $$d" | sed "s/=/\ /g;s/-/_/g;s/\//_/g;s/\./_/g;s/\//_/g;s/C++/CPP/g" >> $1.tmp; \ |
| done; \ |
| echo \#endif >> $1.tmp; \ |
| $(call TESTANDREPLACEFILE,$1.tmp,$1) |
| endef |
| |
| # Map LK's arch names into a more common form. |
| define standard_name_for_arch |
| ifeq ($(2),arm) |
| $(1) := arm |
| else |
| ifeq ($(2),arm64) |
| $(1) := aarch64 |
| else |
| ifeq ($(2),x86) |
| ifeq ($(3),x86-64) |
| $(1) := x86_64 |
| else |
| ifeq ($(3),x86-32) |
| $(1) := i386 |
| else |
| $$(error "unknown arch: $(2) / $(3)") |
| endif |
| endif |
| else |
| $$(error "unknown arch: $(2) / $(3)") |
| endif |
| endif |
| endif |
| endef |
| |
| # prints task status message |
| # Format: INFO/ECHO module, status, message |
| ifneq ($(LOG_POSTPROCESSING),) |
| # this output will be postprocessed by python later, insert extra markers |
| # for easier parsing |
| LOG_PREFIX=@log@ |
| LOG_DONE=@done@ |
| LOG_SDONE=@sdone@ |
| LOG_PRINT=@print@ |
| LOG_SEPARATOR=@:@ |
| INFO_LOG = $(info $(LOG_PREFIX)$(LOG_PRINT)$1) |
| INFO = $(info $(LOG_PREFIX)$1$(LOG_SEPARATOR)$2$(LOG_SEPARATOR)$3) |
| INFO_DONE = $(info $(LOG_PREFIX)$(LOG_DONE)$1$(LOG_SEPARATOR)$2$(LOG_SEPARATOR)$3) |
| INFO_DONE_SILENT = $(info $(LOG_PREFIX)$(LOG_SDONE)$1$(LOG_SEPARATOR)$2$(LOG_SEPARATOR)$3) |
| ECHO_LOG = echo $(LOG_PREFIX)$(LOG_PRINT)$1 |
| ECHO = echo $(LOG_PREFIX)$1$(LOG_SEPARATOR)$2$(LOG_SEPARATOR)$3 |
| ECHO_DONE = echo $(LOG_PREFIX)$(LOG_DONE)$1$(LOG_SEPARATOR)$2$(LOG_SEPARATOR)$3 |
| ECHO_DONE_SILENT = echo $(LOG_PREFIX)$(LOG_SDONE)$1$(LOG_SEPARATOR)$2$(LOG_SEPARATOR)$3 |
| else |
| # just output as regular |
| INFO_LOG = $(info $1) |
| INFO = $(info $2 $3 for $1) |
| INFO_DONE = $(info $2 $3 for $1) |
| INFO_DONE_SILENT = |
| ECHO_LOG = echo $1 |
| ECHO = echo $2 $3 |
| ECHO_DONE = echo $2 $3 |
| ECHO_DONE_SILENT = |
| endif |
| |