188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# Copyright (C) 2007 The Android Open Source Project
388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# Licensed under the Apache License, Version 2.0 (the "License");
588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# you may not use this file except in compliance with the License.
688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# You may obtain a copy of the License at
788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#      http://www.apache.org/licenses/LICENSE-2.0
988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
1088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# Unless required by applicable law or agreed to in writing, software
1188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# distributed under the License is distributed on an "AS IS" BASIS,
1288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# See the License for the specific language governing permissions and
1488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# limitations under the License.
1588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
1688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
1788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
1888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# Clears a list of variables using ":=".
1988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
2088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# E.g.,
2188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   $(call clear-var-list,A B C)
2288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# would be the same as:
2388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   A :=
2488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   B :=
2588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   C :=
2688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
2788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(1): list of variable names to clear
2888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
2988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectdefine clear-var-list
3088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project$(foreach v,$(1),$(eval $(v):=))
3188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectendef
3288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
3388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
3488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# Copies a list of variables into another list of variables.
3588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# The target list is the same as the source list, but has
3688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# a dotted prefix affixed to it.
3788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
3888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# E.g.,
3988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   $(call copy-var-list, PREFIX, A B)
4088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# would be the same as:
4188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   PREFIX.A := $(A)
4288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   PREFIX.B := $(B)
4388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
4488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(1): destination prefix
4588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(2): list of variable names to copy
4688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
4788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectdefine copy-var-list
4888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project$(foreach v,$(2),$(eval $(strip $(1)).$(v):=$($(v))))
4988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectendef
5088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
5188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
5288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# Moves a list of variables into another list of variables.
5388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# The variable names differ by a prefix.  After moving, the
5488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# source variable is cleared.
5588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
5688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# NOTE: Spaces are not allowed around the prefixes.
5788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
5888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# E.g.,
5988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   $(call move-var-list,SRC,DST,A B)
6088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# would be the same as:
6188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   DST.A := $(SRC.A)
6288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   SRC.A :=
6388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   DST.B := $(SRC.B)
6488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   SRC.B :=
6588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
6688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(1): source prefix
6788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(2): destination prefix
6888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(3): list of variable names to move
6988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
7088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectdefine move-var-list
7188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project$(foreach v,$(3), \
7288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project  $(eval $(2).$(v) := $($(1).$(v))) \
7388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project  $(eval $(1).$(v) :=) \
7488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project )
7588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectendef
7688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
7788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
7888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(1): haystack
7988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(2): needle
8088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
8188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# Guarantees that needle appears at most once in haystack,
8288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# without changing the order of other elements in haystack.
8388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# If needle appears multiple times, only the first occurrance
8488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# will survive.
8588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
8688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# How it works:
8788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
8888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# - Stick everything in haystack into a single word,
8988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   with "|||" separating the words.
9088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# - Replace occurrances of "|||$(needle)|||" with "||| |||",
9188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   breaking haystack back into multiple words, with spaces
9288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   where needle appeared.
9388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# - Add needle between the first and second words of haystack.
9488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# - Replace "|||" with spaces, breaking haystack back into
9588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   individual words.
9688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
9788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectdefine uniq-word
9888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project$(strip \
9901efddb0b8c641a9ebfd955173dd58e015fbe903Jeff Brown  $(if $(filter-out 0 1,$(words $(filter $(2),$(1)))), \
10088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $(eval h := |||$(subst $(space),|||,$(strip $(1)))|||) \
10188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $(eval h := $(subst |||$(strip $(2))|||,|||$(space)|||,$(h))) \
10288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $(eval h := $(word 1,$(h)) $(2) $(wordlist 2,9999,$(h))) \
10388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $(subst |||,$(space),$(h)) \
10488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project   , \
10588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $(1) \
10688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project ))
10788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectendef
10888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
10988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source ProjectINHERIT_TAG := @inherit:
11088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
11188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
11288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# Walks through the list of variables, each qualified by the prefix,
11388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# and finds instances of words beginning with INHERIT_TAG.  Scrape
11488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# off INHERIT_TAG from each matching word, and return the sorted,
11588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# unique set of those words.
11688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
11788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# E.g., given
11888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   PREFIX.A := A $(INHERIT_TAG)aaa B C
11988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   PREFIX.B := B $(INHERIT_TAG)aaa C $(INHERIT_TAG)bbb D E
12088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# Then
12188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   $(call get-inherited-nodes,PREFIX,A B)
12288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# returns
12388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   aaa bbb
12488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
12588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(1): variable prefix
12688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(2): list of variables to check
12788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
12888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectdefine get-inherited-nodes
12988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project$(sort \
13088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project  $(subst $(INHERIT_TAG),, \
13188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $(filter $(INHERIT_TAG)%, \
13288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project      $(foreach v,$(2),$($(1).$(v))) \
13388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project )))
13488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectendef
13588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
13688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
13788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# for each variable ( (prefix + name) * vars ):
13888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#   get list of inherited words; if not empty:
13988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#     for each inherit:
14088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#       replace the first occurrence with (prefix + inherited + var)
14188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#       clear the source var so we can't inherit the value twice
14288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
14388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(1): context prefix
14488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(2): name of this node
14588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(3): list of variable names
14688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
14788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectdefine _expand-inherited-values
14888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project  $(foreach v,$(3), \
14988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $(eval ### "Shorthand for the name of the target variable") \
15088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $(eval _eiv_tv := $(1).$(2).$(v)) \
15188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $(eval ### "Get the list of nodes that this variable inherits") \
15288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $(eval _eiv_i := \
15388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        $(sort \
15488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            $(patsubst $(INHERIT_TAG)%,%, \
15588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project                $(filter $(INHERIT_TAG)%, $($(_eiv_tv)) \
15688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project     )))) \
15788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $(foreach i,$(_eiv_i), \
15888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project      $(eval ### "Make sure that this inherit appears only once") \
15988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project      $(eval $(_eiv_tv) := \
16088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project          $(call uniq-word,$($(_eiv_tv)),$(INHERIT_TAG)$(i))) \
16188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project      $(eval ### "Expand the inherit tag") \
16288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project      $(eval $(_eiv_tv) := \
1631d89773c1dd0e433a2dbd0ef8aedaf4c20f6ff74Doug Zongker          $(strip \
1641d89773c1dd0e433a2dbd0ef8aedaf4c20f6ff74Doug Zongker              $(patsubst $(INHERIT_TAG)$(i),$($(1).$(i).$(v)), \
1651d89773c1dd0e433a2dbd0ef8aedaf4c20f6ff74Doug Zongker                  $($(_eiv_tv))))) \
16688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project      $(eval ### "Clear the child so DAGs don't create duplicate entries" ) \
16788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project      $(eval $(1).$(i).$(v) :=) \
16888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project      $(eval ### "If we just inherited ourselves, it's a cycle.") \
16988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project      $(if $(filter $(INHERIT_TAG)$(2),$($(_eiv_tv))), \
17088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        $(warning Cycle detected between "$(2)" and "$(i)" for context "$(1)") \
17188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        $(error import of "$(2)" failed) \
17288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project      ) \
17388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project     ) \
17488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project   ) \
17588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project   $(eval _eiv_tv :=) \
17688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project   $(eval _eiv_i :=)
17788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectendef
17888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
17988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
18088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(1): context prefix
18188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(2): makefile representing this node
18288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(3): list of node variable names
18388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
1846a5f7f068b54c5cc083a3e8224c010060aab24e9The Android Open Source Project# _include_stack contains the list of included files, with the most recent files first.
18588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectdefine _import-node
1866a5f7f068b54c5cc083a3e8224c010060aab24e9The Android Open Source Project  $(eval _include_stack := $(2) $$(_include_stack))
18788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project  $(call clear-var-list, $(3))
188d47804e929eaa69a41f04a5acb7aed1dfbfb4388Sean McNeil  $(eval LOCAL_PATH := $(patsubst %/,%,$(dir $(2))))
1897b86bfb03ee785cb828139c94bb86817d3249667Joe Onorato  $(eval MAKEFILE_LIST :=)
19088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project  $(eval include $(2))
1917b86bfb03ee785cb828139c94bb86817d3249667Joe Onorato  $(eval _included := $(filter-out $(2),$(MAKEFILE_LIST)))
1927b86bfb03ee785cb828139c94bb86817d3249667Joe Onorato  $(eval MAKEFILE_LIST :=)
193d47804e929eaa69a41f04a5acb7aed1dfbfb4388Sean McNeil  $(eval LOCAL_PATH :=)
19488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project  $(call copy-var-list, $(1).$(2), $(3))
19588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project  $(call clear-var-list, $(3))
19688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
19788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project  $(eval $(1).$(2).inherited := \
19888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project      $(call get-inherited-nodes,$(1).$(2),$(3)))
19988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project  $(call _import-nodes-inner,$(1),$($(1).$(2).inherited),$(3))
20088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
20188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project  $(call _expand-inherited-values,$(1),$(2),$(3))
20288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
20388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project  $(eval $(1).$(2).inherited :=)
2046a5f7f068b54c5cc083a3e8224c010060aab24e9The Android Open Source Project  $(eval _include_stack := $(wordlist 2,9999,$$(_include_stack)))
20588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectendef
20688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
20788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
2087b86bfb03ee785cb828139c94bb86817d3249667Joe Onorato# This will generate a warning for _included above
2097b86bfb03ee785cb828139c94bb86817d3249667Joe Onorato#  $(if $(_included), \
2107b86bfb03ee785cb828139c94bb86817d3249667Joe Onorato#      $(eval $(warning product spec file: $(2)))\
2117b86bfb03ee785cb828139c94bb86817d3249667Joe Onorato#      $(foreach _inc,$(_included),$(eval $(warning $(space)$(space)$(space)includes: $(_inc)))),)
2127b86bfb03ee785cb828139c94bb86817d3249667Joe Onorato#
2137b86bfb03ee785cb828139c94bb86817d3249667Joe Onorato
2147b86bfb03ee785cb828139c94bb86817d3249667Joe Onorato#
21588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(1): context prefix
21688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(2): list of makefiles representing nodes to import
21788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(3): list of node variable names
21888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
21988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#TODO: Make the "does not exist" message more helpful;
22088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#      should print out the name of the file trying to include it.
22188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectdefine _import-nodes-inner
22288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project  $(foreach _in,$(2), \
22388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $(if $(wildcard $(_in)), \
22488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project      $(if $($(1).$(_in).seen), \
22588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        $(eval ### "skipping already-imported $(_in)") \
22688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project       , \
22788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        $(eval $(1).$(_in).seen := true) \
22888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        $(call _import-node,$(1),$(strip $(_in)),$(3)) \
22988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project       ) \
23088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project     , \
23188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project      $(error $(1): "$(_in)" does not exist) \
23288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project     ) \
23388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project   )
23488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectendef
23588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
23688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
23788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(1): output list variable name, like "PRODUCTS" or "DEVICES"
23888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(2): list of makefiles representing nodes to import
23988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project# $(3): list of node variable names
24088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project#
24188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectdefine import-nodes
24288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project$(if \
24388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project  $(foreach _in,$(2), \
24488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $(eval _node_import_context := _nic.$(1).[[$(_in)]]) \
2456a5f7f068b54c5cc083a3e8224c010060aab24e9The Android Open Source Project    $(if $(_include_stack),$(eval $(error ASSERTION FAILED: _include_stack \
2466a5f7f068b54c5cc083a3e8224c010060aab24e9The Android Open Source Project                should be empty here: $(_include_stack))),) \
2476a5f7f068b54c5cc083a3e8224c010060aab24e9The Android Open Source Project    $(eval _include_stack := ) \
24888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $(call _import-nodes-inner,$(_node_import_context),$(_in),$(3)) \
24988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $(call move-var-list,$(_node_import_context).$(_in),$(1).$(_in),$(3)) \
25088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $(eval _node_import_context :=) \
25188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $(eval $(1) := $($(1)) $(_in)) \
2526a5f7f068b54c5cc083a3e8224c010060aab24e9The Android Open Source Project    $(if $(_include_stack),$(eval $(error ASSERTION FAILED: _include_stack \
2536a5f7f068b54c5cc083a3e8224c010060aab24e9The Android Open Source Project                should be empty here: $(_include_stack))),) \
25488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project   ) \
25588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project,)
25688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Projectendef
257