blob: 7f00ef2038e6cbf5dbb1486f207164ce1a386fc4 [file] [log] [blame] [edit]
# 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