resolved conflicts for merge of 5836d3b3 to jb-mr1-dev

Change-Id: If3d84a7439717ccf7723b3f79e934d73abbb3fea
This commit is contained in:
Joe Onorato 2012-08-17 00:09:27 -07:00
commit cea08a5220
16 changed files with 759 additions and 620 deletions

View File

@ -58,51 +58,30 @@ endif
LOCAL_UNINSTALLABLE_MODULE := $(strip $(LOCAL_UNINSTALLABLE_MODULE))
LOCAL_MODULE_TAGS := $(sort $(LOCAL_MODULE_TAGS))
ifeq (,$(LOCAL_MODULE_TAGS))
ifeq (true,$(LOCAL_UNINSTALLABLE_MODULE))
LOCAL_MODULE_TAGS := optional
else
# Installable modules without tags fall back to user (which is changed to user eng below)
LOCAL_MODULE_TAGS := user
LOCAL_MODULE_TAGS := optional
endif
#$(warning default tags: $(lastword $(filter-out config/% out/%,$(MAKEFILE_LIST))))
# User tags are not allowed anymore. Fail early because it will not be installed
# like it used to be.
ifneq ($(filter $(LOCAL_MODULE_TAGS),user),)
$(warning *** Module name: $(LOCAL_MODULE))
$(warning *** Makefile location: $(LOCAL_MODULE_MAKEFILE))
$(warning * )
$(warning * Module is attempting to use the 'user' tag. This)
$(warning * used to cause the module to be installed automatically.)
$(warning * Now, the module must be listed in the PRODUCT_PACKAGES)
$(warning * section of a product makefile to have it installed.)
$(warning * )
$(error user tag detected on module.)
endif
# Only the tags mentioned in this test are expected to be set by module
# makefiles. Anything else is either a typo or a source of unexpected
# behaviors.
ifneq ($(filter-out user debug eng tests optional samples shell_ash shell_mksh,$(LOCAL_MODULE_TAGS)),)
ifneq ($(filter-out debug eng tests optional samples shell_ash shell_mksh,$(LOCAL_MODULE_TAGS)),)
$(warning unusual tags $(LOCAL_MODULE_TAGS) on $(LOCAL_MODULE) at $(LOCAL_PATH))
endif
ifneq ($(filter $(LOCAL_MODULE_TAGS),user),)
ifeq ($(filter $(GRANDFATHERED_USER_MODULES),$(LOCAL_MODULE)),)
$(warning *** Module name: $(LOCAL_MODULE))
$(warning *** Makefile location: $(LOCAL_PATH))
$(warning * )
$(warning * Each module must use a LOCAL_MODULE_TAGS in its)
$(warning * Android.mk. Possible tags declared by a module:)
$(warning * )
$(warning * optional, debug, eng, tests, samples)
$(warning * )
$(warning * If the module is expected to be in all builds)
$(warning * of a product, then it should use the)
$(warning * "optional" tag: )
$(warning * )
$(warning * Add "LOCAL_MODULE_TAGS := optional" in the)
$(warning * Android.mk for the affected module, and add)
$(warning * the LOCAL_MODULE value for that component)
$(warning * into the PRODUCT_PACKAGES section of product)
$(warning * makefile(s) where necessary, if appropriate.)
$(warning * )
$(warning * If the component should be in EVERY build of ALL)
$(warning * products, then add its LOCAL_MODULE value to the)
$(warning * PRODUCT_PACKAGES section of)
$(warning * build/target/product/core.mk)
$(warning * )
$(error user tag detected on new module - user tags are only supported on legacy modules)
endif
endif
# Add implicit tags.
#
# If the local directory or one of its parents contains a MODULE_LICENSE_GPL
@ -116,27 +95,11 @@ ifneq ($(gpl_license_file),)
ALL_GPL_MODULE_LICENSE_FILES := $(sort $(ALL_GPL_MODULE_LICENSE_FILES) $(gpl_license_file))
endif
#
# If this module is listed on CUSTOM_MODULES, promote it to "user"
# so that it will be installed in $(TARGET_OUT).
#
ifneq (,$(filter $(LOCAL_MODULE),$(CUSTOM_MODULES)))
LOCAL_MODULE_TAGS := $(sort $(LOCAL_MODULE_TAGS) user)
endif
LOCAL_MODULE_CLASS := $(strip $(LOCAL_MODULE_CLASS))
ifneq ($(words $(LOCAL_MODULE_CLASS)),1)
$(error $(LOCAL_PATH): LOCAL_MODULE_CLASS must contain exactly one word, not "$(LOCAL_MODULE_CLASS)")
endif
# Those used to be implicitly ignored, but aren't any more.
# As of 20100110 there are no apps with the user tag.
ifeq ($(LOCAL_MODULE_CLASS),APPS)
ifneq ($(filter $(LOCAL_MODULE_TAGS),user),)
$(warning user tag on app $(LOCAL_MODULE) at $(LOCAL_PATH) - add your app to core.mk instead)
endif
endif
ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE))
ifdef LOCAL_IS_HOST_MODULE
partition_tag :=
@ -543,6 +506,17 @@ $(installed_odex) : $(built_odex) | $(ACP)
$(LOCAL_INSTALLED_MODULE) : $(installed_odex)
endif
# All host modules that are not tagged with optional are automatically installed.
# Save the installed files in ALL_HOST_INSTALLED_FILES.
ifeq ($(LOCAL_IS_HOST_MODULE),true)
ifneq ($(filter optional,$(LOCAL_MODULE_TAGS)),optional)
ALL_HOST_INSTALLED_FILES += $(LOCAL_INSTALLED_MODULE)
endif
ifneq ($(filter debug eng tests, $(LOCAL_MODULE_TAGS)),)
$(error $(LOCAL_MODULE_MAKEFILE): Module "$(LOCAL_MODULE)" has useless module tags: $(filter debug eng tests, $(LOCAL_MODULE_TAGS)). It will be installed anyway.)
endif
endif
endif # !LOCAL_UNINSTALLABLE_MODULE
@ -592,6 +566,8 @@ ALL_MODULES.$(LOCAL_MODULE).EVENT_LOG_TAGS := \
$(ALL_MODULES.$(LOCAL_MODULE).EVENT_LOG_TAGS) $(event_log_tags)
ALL_MODULES.$(LOCAL_MODULE).INTERMEDIATE_SOURCE_DIR := \
$(ALL_MODULES.$(LOCAL_MODULE).INTERMEDIATE_SOURCE_DIR) $(LOCAL_INTERMEDIATE_SOURCE_DIR)
ALL_MODULES.$(LOCAL_MODULE).MAKEFILE := \
$(ALL_MODULES.$(LOCAL_MODULE).MAKEFILE) $(LOCAL_MODULE_MAKEFILE)
ifdef LOCAL_MODULE_OWNER
ALL_MODULES.$(LOCAL_MODULE).OWNER := \
$(strip $(ALL_MODULES.$(LOCAL_MODULE).OWNER) $(LOCAL_MODULE_OWNER))

View File

@ -55,6 +55,11 @@ ALL_MODULE_TAGS:=
# its sub-variables.)
ALL_MODULE_NAME_TAGS:=
# All host modules are automatically installed (i.e. outside
# of the product configuration scheme). This is a list of the
# install targets (LOCAL_INSTALLED_MODULE).
ALL_HOST_INSTALLED_FILES:=
# Full paths to all prebuilt files that will be copied
# (used to make the dependency on acp)
ALL_PREBUILT:=
@ -2054,10 +2059,6 @@ endef
# when requested.
include $(BUILD_SYSTEM)/distdir.mk
# -----------------------------------------------------------------
# The modules allowed to use a user tag
include $(BUILD_SYSTEM)/user_tags.mk
# broken:
# $(foreach file,$^,$(if $(findstring,.a,$(suffix $file)),-l$(file),$(file)))

View File

@ -114,10 +114,10 @@ TARGET_COPY_OUT_RECOVERY := recovery
# variables that we need in order to locate the output files.
include $(BUILD_SYSTEM)/product_config.mk
build_variant := $(filter-out eng user userdebug tests,$(TARGET_BUILD_VARIANT))
build_variant := $(filter-out user userdebug eng tests,$(TARGET_BUILD_VARIANT))
ifneq ($(build_variant)-$(words $(TARGET_BUILD_VARIANT)),-1)
$(warning bad TARGET_BUILD_VARIANT: $(TARGET_BUILD_VARIANT))
$(error must be empty or one of: eng user userdebug tests)
$(error must be empty or one of: user userdebug eng tests)
endif
# ---------------------------------------------------------------

View File

@ -224,13 +224,11 @@ include $(BUILD_SYSTEM)/definitions.mk
# Bring in dex_preopt.mk
include $(BUILD_SYSTEM)/dex_preopt.mk
ifneq ($(filter eng user userdebug,$(MAKECMDGOALS)),)
ifneq ($(filter user userdebug eng,$(MAKECMDGOALS)),)
$(info ***************************************************************)
$(info ***************************************************************)
$(info Don't pass '$(filter eng user userdebug tests,$(MAKECMDGOALS))' on \
$(info Do not pass '$(filter user userdebug eng tests,$(MAKECMDGOALS))' on \
the make command line.)
# XXX The single quote on this line fixes gvim's syntax highlighting.
# Without which, the rest of this file is impossible to read.
$(info Set TARGET_BUILD_VARIANT in buildspec.mk, or use lunch or)
$(info choosecombo.)
$(info ***************************************************************)
@ -279,13 +277,13 @@ endif # HAVE_SELINUX
## user/userdebug ##
user_variant := $(filter userdebug user,$(TARGET_BUILD_VARIANT))
user_variant := $(filter user userdebug,$(TARGET_BUILD_VARIANT))
enable_target_debugging := true
tags_to_install :=
ifneq (,$(user_variant))
# Target is secure in user builds.
ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1
tags_to_install := user
ifeq ($(user_variant),userdebug)
# Pick up some extra useful tools
tags_to_install += debug
@ -333,7 +331,7 @@ endif # !enable_target_debugging
## eng ##
ifeq ($(TARGET_BUILD_VARIANT),eng)
tags_to_install := user debug eng
tags_to_install := debug eng
ifneq ($(filter ro.setupwizard.mode=ENABLED, $(call collapse-pairs, $(ADDITIONAL_BUILD_PROPERTIES))),)
# Don't require the setup wizard on eng builds
ADDITIONAL_BUILD_PROPERTIES := $(filter-out ro.setupwizard.mode=%,\
@ -345,7 +343,7 @@ endif
## tests ##
ifeq ($(TARGET_BUILD_VARIANT),tests)
tags_to_install := user debug eng tests
tags_to_install := debug eng tests
endif
## sdk ##
@ -362,7 +360,7 @@ endif
# TODO: this should be eng I think. Since the sdk is built from the eng
# variant.
tags_to_install := user debug eng
tags_to_install := debug eng
ADDITIONAL_BUILD_PROPERTIES += xmpp.auto-presence=true
ADDITIONAL_BUILD_PROPERTIES += ro.config.nocheckin=yes
else # !sdk
@ -591,51 +589,55 @@ add-required-deps :=
# -------------------------------------------------------------------
# Figure out our module sets.
#
# Of the modules defined by the component makefiles,
# determine what we actually want to build.
Default_MODULES := $(sort $(ALL_DEFAULT_INSTALLED_MODULES) \
$(CUSTOM_MODULES))
# TODO: Remove the 3 places in the tree that use
# ALL_DEFAULT_INSTALLED_MODULES and get rid of it from this list.
ifdef FULL_BUILD
# The base list of modules to build for this product is specified
# by the appropriate product definition file, which was included
# by product_config.make.
user_PACKAGES := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES)
$(call expand-required-modules,user_PACKAGES,$(user_PACKAGES))
user_PACKAGES := $(call module-installed-files, $(user_PACKAGES))
product_MODULES := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES)
$(call expand-required-modules,product_MODULES,$(product_MODULES))
product_FILES := $(call module-installed-files, $(product_MODULES))
ifeq (0,1)
$(info product_FILES for $(TARGET_DEVICE) ($(INTERNAL_PRODUCT)):)
$(foreach p,$(product_FILES),$(info : $(p)))
$(error done)
endif
else
# We're not doing a full build, and are probably only including
# a subset of the module makefiles. Don't try to build any modules
# requested by the product, because we probably won't have rules
# to build them.
user_PACKAGES :=
product_FILES :=
endif
# Use tags to get the non-APPS user modules. Use the product
# definition files to get the APPS user modules.
user_MODULES := $(sort $(call get-tagged-modules,user shell_$(TARGET_SHELL)))
user_MODULES := $(user_MODULES) $(user_PACKAGES)
eng_MODULES := $(sort \
$(call get-tagged-modules,eng) \
$(call module-installed-files, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_ENG)) \
)
# When modules are tagged with debug eng or tests, they are installed
# for those variants regardless of what the product spec says.
debug_MODULES := $(sort \
$(call get-tagged-modules,debug) \
$(call module-installed-files, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_DEBUG)) \
)
eng_MODULES := $(sort \
$(call get-tagged-modules,eng) \
$(call module-installed-files, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_ENG)) \
)
tests_MODULES := $(sort \
$(call get-tagged-modules,tests) \
$(call module-installed-files, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_TESTS)) \
)
ifeq ($(strip $(tags_to_install)),)
$(error ASSERTION FAILED: tags_to_install should not be empty)
endif
modules_to_install := $(sort $(Default_MODULES) \
$(foreach tag,$(tags_to_install),$($(tag)_MODULES)))
# TODO: Remove the 3 places in the tree that use ALL_DEFAULT_INSTALLED_MODULES
# and get rid of it from this list.
# TODO: The shell is chosen by magic. Do we still need this?
modules_to_install := $(sort \
$(ALL_DEFAULT_INSTALLED_MODULES) \
$(product_FILES) \
$(foreach tag,$(tags_to_install),$($(tag)_MODULES)) \
$(call get-tagged-modules, shell_$(TARGET_SHELL)) \
$(CUSTOM_MODULES) \
)
# Some packages may override others using LOCAL_OVERRIDES_PACKAGES.
# Filter out (do not install) any overridden packages.
@ -666,19 +668,21 @@ ifdef is_sdk_build
# Ensure every module listed in PRODUCT_PACKAGES* gets something installed
# TODO: Should we do this for all builds and not just the sdk?
$(foreach m, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES), \
$(if $(strip $(ALL_MODULES.$(m).INSTALLED)),,\
$(error Module '$(m)' in PRODUCT_PACKAGES has nothing to install!)))
$(if $(strip $(ALL_MODULES.$(m).INSTALLED)),,\
$(error $(ALL_MODULES.$(m).MAKEFILE): Module '$(m)' in PRODUCT_PACKAGES has nothing to install!)))
$(foreach m, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_DEBUG), \
$(if $(strip $(ALL_MODULES.$(m).INSTALLED)),,\
$(error Module '$(m)' in PRODUCT_PACKAGES_DEBUG has nothing to install!)))
$(if $(strip $(ALL_MODULES.$(m).INSTALLED)),,\
$(error $(ALL_MODULES.$(m).MAKEFILE): Module '$(m)' in PRODUCT_PACKAGES_DEBUG has nothing to install!)))
$(foreach m, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_ENG), \
$(if $(strip $(ALL_MODULES.$(m).INSTALLED)),,\
$(error Module '$(m)' in PRODUCT_PACKAGES_ENG has nothing to install!)))
$(if $(strip $(ALL_MODULES.$(m).INSTALLED)),,\
$(error $(ALL_MODULES.$(m).MAKEFILE): Module '$(m)' in PRODUCT_PACKAGES_ENG has nothing to install!)))
$(foreach m, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_TESTS), \
$(if $(strip $(ALL_MODULES.$(m).INSTALLED)),,\
$(error Module '$(m)' in PRODUCT_PACKAGES_TESTS has nothing to install!)))
$(if $(strip $(ALL_MODULES.$(m).INSTALLED)),,\
$(error $(ALL_MODULES.$(m).MAKEFILE): Module '$(m)' in PRODUCT_PACKAGES_TESTS has nothing to install!)))
endif
# Install all of the host modules
modules_to_install += $(sort $(modules_to_install) $(ALL_HOST_INSTALLED_FILES))
# build/core/Makefile contains extra stuff that we don't want to pollute this
# top-level makefile with. It expects that ALL_DEFAULT_INSTALLED_MODULES
@ -691,6 +695,7 @@ ALL_DEFAULT_INSTALLED_MODULES :=
endif # dont_bother
# These are additional goals that we build, in order to make sure that there
# is as little code as possible in the tree that doesn't build.
modules_to_check := $(foreach m,$(ALL_MODULES),$(ALL_MODULES.$(m).CHECKED))
@ -903,3 +908,7 @@ modules:
.PHONY: showcommands
showcommands:
@echo >/dev/null
.PHONY: nothing
nothing:
@echo Successfully read the makefiles.

View File

@ -199,6 +199,12 @@ $(dump-products)
$(error done)
endif
ifeq (a,b)
$(info PRODUCTS -----------)
$(foreach product, $(PRODUCTS), $(info $(PRODUCTS.$(product).PRODUCT_NAME)))# $(product)))
$(error stop)
endif
# Convert a short name like "sooner" into the path to the product
# file defining that product.
#

View File

@ -14,35 +14,127 @@
# limitations under the License.
#
products_pdf := $(OUT_DIR)/products.pdf
products_graph := $(products_pdf:%.pdf=%.dot)
# the foreach and the if remove the single space entries that creep in because of the evals
define gather-all-products
$(sort $(foreach p, \
$(eval _all_products_visited := )
$(call all-products-inner, $(ALL_PRODUCTS)) \
, $(if $(strip $(p)),$(strip $(p)),)) \
)
endef
$(products_graph):
@echo Product graph DOT: $@
define all-products-inner
$(foreach p,$(1),\
$(if $(filter $(p),$(_all_products_visited)),, \
$(p) \
$(eval _all_products_visited += $(p)) \
$(call all-products-inner, $(PRODUCTS.$(strip $(p)).INHERITS_FROM))
) \
)
endef
this_makefile := build/core/tasks/product-graph.mk
products_svg := $(OUT_DIR)/products.svg
products_pdf := $(OUT_DIR)/products.pdf
products_graph := $(OUT_DIR)/products.dot
ifeq ($(strip $(ANDROID_PRODUCT_GRAPH)),)
products_list := $(INTERNAL_PRODUCT)
else
ifeq ($(strip $(ANDROID_PRODUCT_GRAPH)),--all)
products_list := --all
else
products_list := $(foreach prod,$(ANDROID_PRODUCT_GRAPH),$(call resolve-short-product-name,$(prod)))
endif
endif
really_all_products := $(call gather-all-products)
$(products_graph): PRIVATE_PRODUCTS := $(really_all_products)
$(products_graph): PRIVATE_PRODUCTS_FILTER := $(products_list)
$(products_graph): $(this_makefile)
@echo Product graph DOT: $@ for $(PRIVATE_PRODUCTS_FILTER)
$(hide) ( \
echo 'digraph {'; \
echo 'graph [ ratio=.5 ];'; \
$(foreach p,$(ALL_PRODUCTS), \
$(foreach d,$(PRODUCTS.$(strip $(p)).INHERITS_FROM), \
echo \"$(d)\" -\> \"$(p)\";)) \
$(foreach prod, \
$(sort $(foreach p,$(ALL_PRODUCTS), \
$(foreach d,$(PRODUCTS.$(strip $(p)).INHERITS_FROM), \
$(d))) \
$(foreach p,$(ALL_PRODUCTS),$(p))), \
echo \"$(prod)\" [ label=\"$(dir $(prod))\\n$(notdir $(prod))\"];) \
$(foreach p,$(PRIVATE_PRODUCTS), \
$(foreach d,$(PRODUCTS.$(strip $(p)).INHERITS_FROM), echo \"$(d)\" -\> \"$(p)\";)) \
$(foreach prod, $(PRIVATE_PRODUCTS), \
echo \"$(prod)\" [ \
label=\"$(dir $(prod))\\n$(notdir $(prod))\\n\\n$(PRODUCTS.$(strip $(prod)).PRODUCT_MODEL)\\n$(PRODUCTS.$(strip $(prod)).PRODUCT_DEVICE)\" \
$(if $(filter $(prod),$(PRIVATE_PRODUCTS_FILTER)), style=\"filled\" fillcolor=\"#FFFDB0\",) \
fontcolor=\"darkblue\" href=\"products/$(prod).html\" \
];) \
echo '}' \
) > $@
) \
| ./build/tools/filter-product-graph.py $(PRIVATE_PRODUCTS_FILTER) \
> $@
# This rule doesn't include any nodes that don't inherit from
# anything or don't have anything inherit from them, to make the
# graph more readable. To add that, add this line to the rule
# below:
# $(foreach p,$(ALL_PRODUCTS), echo \"$(p)\";) \
# Evaluates to the name of the product file
# $(1) product file
define product-debug-filename
$(OUT_DIR)/products/$(strip $(1)).html
endef
# Makes a rule for the product debug info
# $(1) product file
define transform-product-debug
$(OUT_DIR)/products/$(strip $(1)).txt: $(this_makefile)
@echo Product debug info file: $$@
$(hide) rm -f $$@
$(hide) mkdir -p $$(dir $$@)
$(hide) echo 'FILE=$(strip $(1))' >> $$@
$(hide) echo 'PRODUCT_NAME=$$(PRODUCTS.$(strip $(1)).PRODUCT_NAME)' >> $$@
$(hide) echo 'PRODUCT_MODEL=$$(PRODUCTS.$(strip $(1)).PRODUCT_MODEL)' >> $$@
$(hide) echo 'PRODUCT_LOCALES=$$(PRODUCTS.$(strip $(1)).PRODUCT_LOCALES)' >> $$@
$(hide) echo 'PRODUCT_AAPT_CONFIG=$$(PRODUCTS.$(strip $(1)).PRODUCT_AAPT_CONFIG)' >> $$@
$(hide) echo 'PRODUCT_AAPT_PREF_CONFIG=$$(PRODUCTS.$(strip $(1)).PRODUCT_AAPT_PREF_CONFIG)' >> $$@
$(hide) echo 'PRODUCT_PACKAGES=$$(PRODUCTS.$(strip $(1)).PRODUCT_PACKAGES)' >> $$@
$(hide) echo 'PRODUCT_DEVICE=$$(PRODUCTS.$(strip $(1)).PRODUCT_DEVICE)' >> $$@
$(hide) echo 'PRODUCT_MANUFACTURER=$$(PRODUCTS.$(strip $(1)).PRODUCT_MANUFACTURER)' >> $$@
$(hide) echo 'PRODUCT_PROPERTY_OVERRIDES=$$(PRODUCTS.$(strip $(1)).PRODUCT_PROPERTY_OVERRIDES)' >> $$@
$(hide) echo 'PRODUCT_DEFAULT_PROPERTY_OVERRIDES=$$(PRODUCTS.$(strip $(1)).PRODUCT_DEFAULT_PROPERTY_OVERRIDES)' >> $$@
$(hide) echo 'PRODUCT_CHARACTERISTICS=$$(PRODUCTS.$(strip $(1)).PRODUCT_CHARACTERISTICS)' >> $$@
$(hide) echo 'PRODUCT_COPY_FILES=$$(PRODUCTS.$(strip $(1)).PRODUCT_COPY_FILES)' >> $$@
$(hide) echo 'PRODUCT_OTA_PUBLIC_KEYS=$$(PRODUCTS.$(strip $(1)).PRODUCT_OTA_PUBLIC_KEYS)' >> $$@
$(hide) echo 'PRODUCT_EXTRA_RECOVERY_KEYS=$$(PRODUCTS.$(strip $(1)).PRODUCT_EXTRA_RECOVERY_KEYS)' >> $$@
$(hide) echo 'PRODUCT_PACKAGE_OVERLAYS=$$(PRODUCTS.$(strip $(1)).PRODUCT_PACKAGE_OVERLAYS)' >> $$@
$(hide) echo 'DEVICE_PACKAGE_OVERLAYS=$$(PRODUCTS.$(strip $(1)).DEVICE_PACKAGE_OVERLAYS)' >> $$@
$(hide) echo 'PRODUCT_TAGS=$$(PRODUCTS.$(strip $(1)).PRODUCT_TAGS)' >> $$@
$(hide) echo 'PRODUCT_SDK_ADDON_NAME=$$(PRODUCTS.$(strip $(1)).PRODUCT_SDK_ADDON_NAME)' >> $$@
$(hide) echo 'PRODUCT_SDK_ADDON_COPY_FILES=$$(PRODUCTS.$(strip $(1)).PRODUCT_SDK_ADDON_COPY_FILES)' >> $$@
$(hide) echo 'PRODUCT_SDK_ADDON_COPY_MODULES=$$(PRODUCTS.$(strip $(1)).PRODUCT_SDK_ADDON_COPY_MODULES)' >> $$@
$(hide) echo 'PRODUCT_SDK_ADDON_DOC_MODULES=$$(PRODUCTS.$(strip $(1)).PRODUCT_SDK_ADDON_DOC_MODULES)' >> $$@
$(hide) echo 'PRODUCT_DEFAULT_WIFI_CHANNELS=$$(PRODUCTS.$(strip $(1)).PRODUCT_DEFAULT_WIFI_CHANNELS)' >> $$@
$(hide) echo 'PRODUCT_DEFAULT_DEV_CERTIFICATE=$$(PRODUCTS.$(strip $(1)).PRODUCT_DEFAULT_DEV_CERTIFICATE)' >> $$@
$(hide) echo 'PRODUCT_RESTRICT_VENDOR_FILES=$$(PRODUCTS.$(strip $(1)).PRODUCT_RESTRICT_VENDOR_FILES)' >> $$@
$(hide) echo 'PRODUCT_FACTORY_RAMDISK_MODULES=$$(PRODUCTS.$(strip $(1)).PRODUCT_FACTORY_RAMDISK_MODULES)' >> $$@
$(hide) echo 'PRODUCT_VENDOR_KERNEL_HEADERS=$$(PRODUCTS.$(strip $(1)).PRODUCT_VENDOR_KERNEL_HEADERS)' >> $$@
$(call product-debug-filename, $(p)): \
$(OUT_DIR)/products/$(strip $(1)).txt \
build/tools/product_debug.py \
$(this_makefile)
@echo Product debug html file: $$@
$(hide) mkdir -p $$(dir $$@)
$(hide) cat $$< | build/tools/product_debug.py > $$@
endef
product_debug_files:=
$(foreach p,$(really_all_products), \
$(eval $(call transform-product-debug, $(p))) \
$(eval product_debug_files += $(call product-debug-filename, $(p))) \
)
$(products_pdf): $(products_graph)
@echo Product graph PDF: $@
dot -Tpdf -Nshape=box -o $@ $<
product-graph: $(products_pdf)
$(products_svg): $(products_graph) $(product_debug_files)
@echo Product graph SVG: $@
dot -Tsvg -Nshape=box -o $@ $<
product-graph: $(products_pdf) $(products_svg)

View File

@ -1,498 +0,0 @@
#
# Copyright (C) 2010 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This is the list of modules grandfathered to use a user tag
# DO NOT ADD ANY NEW MODULE TO THIS FILE
#
# user modules are hard to control and audit and we don't want
# to add any new such module in the system
GRANDFATHERED_USER_MODULES :=
-include vendor/google/user_tags.mk
GRANDFATHERED_USER_MODULES += \
20-dns.conf \
95-configured \
aapt \
acp \
adb \
AdbWinApi \
AdbWinUsbApi \
adbd \
aidl \
am \
android \
android-common \
android-common-carousel \
android.policy \
androidprefs \
android.test.runner \
ant \
antlr-2.7.7 \
anttasks \
apicheck \
apkcheck \
applypatch \
app_process \
archquery \
atree \
audio \
badblocks \
badblocks_host \
bb2sym \
bb_dump \
bbprof \
bcc \
bison \
bluetoothd \
bmgr \
bootanimation \
brcm_patchram_plus \
bugreport \
cfassembler \
check_stack \
check_trace \
com.android.phone.common \
com.android.vcard \
commons-compress-1.0 \
content \
copybit.qsd8k \
copybit.s5pc110 \
coverage \
cpufeatures \
cts \
CtsAppSecurityTests \
cts-dalvik-buildutil \
dasm \
dbus-daemon \
ddmlib \
ddmlib-prebuilt \
ddmlibTests \
ddms \
ddmuilib \
debuggerd \
descGen \
dexgen \
dexpreopt \
dex-tools \
dhcpcd \
dhcpcd.conf \
dhcpcd-run-hooks \
dictTest \
dnsmasq \
doclava \
draw9patch \
dumpeventlog \
dumpkey \
dump_regions \
dumpstate \
dumpsys \
dx-tests \
e2fsck \
e2fsck_host \
easymock \
easymocklib \
edify \
elftree \
emmalib \
emulator \
emulator-arm \
emulator-mips \
emulator-core \
emulator-elff \
emulator-hw \
emulator-memcheck \
emulator-tcg \
emulator-ui \
etc1tool \
eventanalyzer \
exc_dump \
fastboot \
framework \
FrameworkCoreHostTests \
frameworks-core-util-lib \
fsck_msdos \
fs_get_stats \
fw_bcm4329_apsta.bin \
fw_bcm4329.bin \
genext2fs \
gps.mahimahi \
gralloc.default \
gralloc.qsd8k \
groovy-all-1.7.0 \
grxmlcompile \
guava \
guavalib \
gzip \
hciattach \
hierarchyviewer \
hierarchyviewer1 \
hierarchyviewer2 \
hierarchyviewerlib \
hist_trace \
hosttestlib \
icudata \
idegen \
ime \
init \
input \
ip \
jarjar \
javax.obex \
jcommon-1.0.12 \
jdiff \
jdwpspy \
jfreechart-1.0.9 \
jfreechart-1.0.9-swt \
jsilver \
jsr305 \
jsr305lib \
junit \
jython \
kxml2-2.3.0 \
launch-wrapper \
layoutlib \
layoutlib_api \
layoutlib_create \
layoutlib_utils \
liba2dp \
libabi \
libandroid \
libandroid_runtime \
libandroid_servers \
libarity \
libastl \
libastl_host \
libaudio \
libaudioeffect_jni \
libaudioflinger \
libaudiointerface \
libaudiopolicy \
libaudiopolicybase \
libbinder \
libbluedroid \
libbluetooth \
libbluetoothd \
libbuiltinplugin \
libbundlewrapper \
libbz \
libc \
libcamera_client \
libcameraservice \
libcamerastub \
libc_common \
libchromium_net \
libc_nomalloc \
libctest \
libcutils \
libdb \
libdbus \
libdiskconfig \
libdiskconfig_host \
libdl \
libdrm1 \
libdrm1_jni \
libebl \
libebl_arm \
libebl_sh \
libebl_mips \
libedify \
libeffects \
libEGL \
libelf \
libESR_Portable \
libESR_Shared \
libETC1 \
libext \
libext2_blkid \
libext2_blkid_host \
libext2_com_err \
libext2_com_err_host \
libext2_e2p \
libext2_e2p_host \
libext2fs \
libext2fs_host \
libext2_profile \
libext2_profile_host \
libext2_uuid \
libext2_uuid_host \
libfdlibm \
libfdlibm-host \
libFFTEm \
libfst \
libft2 \
libgdbus_static \
libgif \
libGLES_android \
libGLESv1_CM \
libGLESv2 \
libglib \
libgui \
libhardware \
libhardware_legacy \
libhost \
libhyphenation \
libiprouteutil \
libiptc \
libjnigraphics \
libjni_latinime \
libjpeg \
libjs \
liblinenoise \
libloc_api-rpc \
liblog \
libm \
libmedia \
libmedia_jni \
libmediaplayerservice \
libmincrypt \
libminelf \
libminui \
libminzip \
libmtdutils \
libmtp \
libmusicbundle \
libneo_cgi \
libneo_cs \
libneo_util \
libnetlink \
libnetutils \
libop \
libOpenSLES \
libopensles_helper \
libOpenSLESUT \
libpcap \
libpixelflinger \
libpixelflinger_static \
libpng \
libpopt \
libpower \
libprotobuf-cpp-2.3.0-full \
libprotobuf-cpp-2.3.0-lite \
libprotobuf-java-2.3.0-lite \
libprotobuf-java-2.3.0-micro \
librecovery_ui_htc \
libreference-ril \
libreverb \
libreverbwrapper \
libril \
librilproto-java \
librpc \
librtp_jni \
libsafe_iop \
libSDL \
libSDLmain \
libsensorservice \
libskia \
libskiagl \
libsonivox \
libsoundpool \
libspeex \
libsqlite \
libsqlite3_android \
libSR_AcousticModels \
libSR_AcousticState \
libSR_AudioIn \
libSR_Core \
libSR_EventLog \
libSR_G2P \
libSR_Grammar \
libSR_Nametag \
libSR_Recognizer \
libSR_Semproc \
libSR_Session \
libSR_Vocabulary \
libstagefright_aacdec \
libstagefright_aacenc \
libstagefright_amrnb_common \
libstagefright_amrnbdec \
libstagefright_amrnbenc \
libstagefright_amrwbdec \
libstagefright_amrwbenc \
libstagefright_avc_common \
libstagefright_avcdec \
libstagefright_avcenc \
libstagefright_color_conversion \
libstagefright_enc_common \
libstagefright_foundation \
libstagefright_g711dec \
libstagefright_httplive \
libstagefrighthw \
libstagefright_id3 \
libstagefright_m4vh263dec \
libstagefright_m4vh263enc \
libstagefright_matroska \
libstagefright_mp3dec \
libstagefright_mpeg2ts \
libstagefright_omx \
libstagefright_rtsp \
libstagefright_vorbisdec \
libstagefright_vpxdec \
libstagefright_yuv \
libstdc++ \
libstlport \
libstlport_static \
libstorage \
libsurfaceflinger \
libsurfaceflinger_client \
libsvoxpico \
libsystem_server \
libsysutils \
libthread_db \
libtinyxml \
libtomcrypt \
libtommath \
libttspico \
libttssynthproxy \
libui \
libunz \
libusbhost \
libutil \
libutils \
libv8 \
libvisualizer \
libvorbisidec \
libvpx \
libwebcore \
libwpa_client \
libwrapsim \
libxml2 \
libxslt \
libzipfile \
lights.kraken \
lights.qsd8k \
line_endings \
linker \
llvm-rs-link \
localize \
logcat \
logwrapper \
lsd \
make_cfst \
makedict \
make_ext4fs \
make_g2g \
makekeycodes \
make_ve_grammar \
mediaserver \
minigzip \
mkbootfs \
mkbootimg \
mke2fs \
mke2fs_host \
mksdcard \
mksnapshot \
mkstubs \
mkuserimg.sh \
mkyaffs2image \
mockrilcontroller \
monkey \
monkeyrunner \
MonkeyRunnerTest \
mtp \
mtpd \
ndc \
netcfg \
netd \
network \
ninepatch \
oauth \
obbtool \
omx_tests \
org.eclipse.core.commands_3.4.0.I20080509-2000 \
org.eclipse.equinox.common_3.4.0.v20080421-2006 \
org.eclipse.jface_3.4.2.M20090107-0800 \
org-netbeans-api-visual \
org-openide-util \
osgi \
pand \
parseStringTest \
ping \
platform.xml \
pm \
post_trace \
pppd \
preload \
profile_pid \
profile_trace \
q2dm \
q2g \
qemu-android \
racoon \
read_addr \
read_method \
read_pid \
read_trace \
resize2fs \
resize2fs_host \
rgb2565 \
rsg-generator \
run-as \
runtime \
schedtest \
screenshot \
screenshot2 \
sdcard \
sdklauncher \
sdklib \
sdkmanager \
sdkstats \
sdkuilib \
sdk_v4 \
sdk_v5 \
sdk_v6 \
sdk_v7 \
sdk_v8 \
sdptool \
service \
servicemanager \
services \
sig \
sig-check \
sig-create \
signapk \
signature-tools \
spec-progress \
sqlite3 \
stack_dump \
stringtemplate \
surfaceflinger \
svc \
swing-worker-1.1 \
swt \
system_server \
tblgen \
tc \
temp_layoutlib \
test_g2g \
test-progress \
test-progress-new \
test_swiarb \
test_zipfile \
toolbox \
traceview \
tune2fs \
tune2fs_host \
usbtest \
vdc \
vm-tests \
vold \
wdsclient \
wpa_supplicant \
yuv420sp2rgb \
zipalign

147
target/product/base.mk Normal file
View File

@ -0,0 +1,147 @@
#
# Copyright (C) 2012 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Base modules (will move elsewhere, previously user tagged)
PRODUCT_PACKAGES += \
20-dns.conf \
95-configured \
adb \
adbd \
am \
android.policy \
android.test.runner \
app_process \
applypatch \
bmgr \
bootanimation \
bugreport \
content \
dbus-daemon \
debuggerd \
dhcpcd \
dhcpcd-run-hooks \
dnsmasq \
dumpstate \
dumpsys \
framework \
fsck_msdos \
gralloc.default \
gzip \
ime \
init \
input \
javax.obex \
libEGL \
libETC1 \
libFFTEm \
libGLES_android \
libGLESv1_CM \
libGLESv2 \
libSR_AudioIn \
libandroid \
libandroid_runtime \
libandroid_servers \
libaudioeffect_jni \
libaudioflinger \
libbinder \
libbundlewrapper \
libc \
libcamera_client \
libcameraservice \
libchromium_net \
libctest \
libcutils \
libdbus \
libdl \
libdrm1 \
libdrm1_jni \
libeffects \
libgui \
libhardware \
libhardware_legacy \
libiprouteutil \
libjni_latinime \
libjnigraphics \
libjpeg \
liblog \
libm \
libmedia \
libmedia_jni \
libmediaplayerservice \
libmtp \
libnetlink \
libnetutils \
libpixelflinger \
libpower \
libreference-ril \
libreverbwrapper \
libril \
librtp_jni \
libsensorservice \
libskia \
libsonivox \
libsoundpool \
libsqlite \
libstagefright \
libstagefright_amrnb_common \
libstagefright_avc_common \
libstagefright_enc_common \
libstagefright_foundation \
libstagefright_omx \
libstagefright_yuv \
libstdc++ \
libstlport \
libsurfaceflinger \
libsurfaceflinger_client \
libsystem_server \
libsysutils \
libthread_db \
libui \
libusbhost \
libutils \
libvisualizer \
libvorbisidec \
libwebcore \
libwpa_client \
linker \
logcat \
logwrapper \
mediaserver \
monkey \
mtpd \
ndc \
netcfg \
netd \
ping \
platform.xml \
pppd \
pm \
racoon \
run-as \
schedtest \
screenshot \
sdcard \
service \
servicemanager \
services \
surfaceflinger \
svc \
system_server \
tc \
toolbox \
vdc \
vold

View File

@ -22,7 +22,7 @@ PRODUCT_PROPERTY_OVERRIDES := \
ro.config.notification_sound=OnTheHunt.ogg \
ro.config.alarm_alert=Alarm_Classic.ogg
PRODUCT_PACKAGES := \
PRODUCT_PACKAGES += \
ApplicationsProvider \
BackupRestoreConfirmation \
Browser \
@ -163,3 +163,6 @@ ifeq ($(HAVE_SELINUX),true)
property_contexts \
mac_permissions.xml
endif
$(call inherit-product, $(SRC_TARGET_DIR)/product/base.mk)

View File

@ -46,6 +46,22 @@ PRODUCT_PACKAGES := \
hostapd \
wpa_supplicant.conf
PRODUCT_PACKAGES += \
audio \
bluetoothd \
brcm_patchram_plus \
dhcpcd.conf \
hciattach \
libbluedroid \
libbluetooth \
libbluetoothd \
libglib \
network \
pand \
pppd \
sdptool \
wpa_supplicant
PRODUCT_PACKAGES += \
icu.dat

View File

@ -51,6 +51,7 @@ PRODUCT_PROPERTY_OVERRIDES += \
ro.config.notification_sound=OnTheHunt.ogg \
ro.config.alarm_alert=Alarm_Classic.ogg
# Please keep this list sorted alphabetically
PRODUCT_PACKAGES += \
ApplicationsProvider \
ContactsProvider \
@ -64,6 +65,8 @@ PRODUCT_PACKAGES += \
UserDictionaryProvider \
abcc \
apache-xml \
audio \
bluetoothd \
bouncycastle \
bu \
cacerts \
@ -81,6 +84,7 @@ PRODUCT_PACKAGES += \
dx \
ext \
framework-res \
hciattach \
hprof-conv \
icu.dat \
installd \
@ -138,13 +142,17 @@ PRODUCT_PACKAGES += \
libwebrtc_audio_preprocessing \
libwilhelm \
libz \
lint \
mdnsd \
mms-common \
network \
pand \
requestsync \
screencap \
sdptool \
sensorservice \
lint \
telephony-common \
mms-common
wpa_supplicant
PRODUCT_COPY_FILES += \
system/core/rootdir/init.usb.rc:root/init.usb.rc \
@ -211,6 +219,7 @@ PRODUCT_PROPERTY_OVERRIDES += \
ro.config.ringtone=Ring_Synth_04.ogg \
ro.config.notification_sound=pixiedust.ogg
$(call inherit-product, $(SRC_TARGET_DIR)/product/base.mk)
$(call inherit-product-if-exists, frameworks/base/data/keyboards/keyboards.mk)
$(call inherit-product-if-exists, frameworks/base/data/fonts/fonts.mk)
$(call inherit-product-if-exists, frameworks/base/data/sounds/AudioPackage5.mk)

View File

@ -41,7 +41,7 @@ function do_builds
do
rm -rf $TEST_BUILD_DIR/$PREFIX-$1
make PRODUCT-$(echo $1 | sed "s/-.*//" )-installclean
make -j6 PRODUCT-$1 dist DIST_DIR=$TEST_BUILD_DIR/$PREFIX-$1
make -j16 PRODUCT-$1 dist DIST_DIR=$TEST_BUILD_DIR/$PREFIX-$1
if [ $? -ne 0 ] ; then
echo FAILED
return

68
tools/filter-product-graph.py Executable file
View File

@ -0,0 +1,68 @@
#!/usr/bin/env python
# vim: ts=2 sw=2 nocindent
import re
import sys
def choose_regex(regs, line):
for func,reg in regs:
m = reg.match(line)
if m:
return (func,m)
return (None,None)
def gather(included, deps):
result = set()
for inc in included:
result.add(inc)
for d in deps:
if inc == d[1]:
result.add(d[0])
return result
def main():
deps = []
infos = []
def dependency(m):
deps.append((m.group(1), m.group(2)))
def info(m):
infos.append((m.group(1), m.group(2)))
REGS = [
(dependency, re.compile(r'"(.*)"\s*->\s*"(.*)"')),
(info, re.compile(r'"(.*)"(\s*\[.*\])')),
]
lines = sys.stdin.readlines()
lines = [line.strip() for line in lines]
for line in lines:
func,m = choose_regex(REGS, line)
if func:
func(m)
# filter
sys.stderr.write("argv: " + str(sys.argv) + "\n")
if not (len(sys.argv) == 2 and sys.argv[1] == "--all"):
targets = sys.argv[1:]
included = set(targets)
prevLen = -1
while prevLen != len(included):
prevLen = len(included)
included = gather(included, deps)
deps = [dep for dep in deps if dep[1] in included]
infos = [info for info in infos if info[0] in included]
print "digraph {"
print "graph [ ratio=.5 ];"
for dep in deps:
print '"%s" -> "%s"' % dep
for info in infos:
print '"%s"%s' % info
print "}"
if __name__ == "__main__":
main()

View File

@ -18,6 +18,5 @@ include $(CLEAR_VARS)
LOCAL_SRC_FILES := fs_config.c
LOCAL_MODULE := fs_config
LOCAL_FORCE_STATIC_EXECUTABLE := true
LOCAL_MODULE_TAGS := eng
include $(BUILD_HOST_EXECUTABLE)

151
tools/parsedeps.py Executable file
View File

@ -0,0 +1,151 @@
#!/usr/bin/env python
# vim: ts=2 sw=2
import optparse
import re
import sys
class Dependency:
def __init__(self, tgt):
self.tgt = tgt
self.pos = ""
self.prereqs = set()
self.visit = 0
def add(self, prereq):
self.prereqs.add(prereq)
class Dependencies:
def __init__(self):
self.lines = {}
self.__visit = 0
self.count = 0
def add(self, tgt, prereq):
t = self.lines.get(tgt)
if not t:
t = Dependency(tgt)
self.lines[tgt] = t
p = self.lines.get(prereq)
if not p:
p = Dependency(prereq)
self.lines[prereq] = p
t.add(p)
self.count = self.count + 1
def setPos(self, tgt, pos):
t = self.lines.get(tgt)
if not t:
t = Dependency(tgt)
self.lines[tgt] = t
t.pos = pos
def get(self, tgt):
if self.lines.has_key(tgt):
return self.lines[tgt]
else:
return None
def __iter__(self):
return self.lines.iteritems()
def trace(self, tgt, prereq):
self.__visit = self.__visit + 1
d = self.lines.get(tgt)
if not d:
return
return self.__trace(d, prereq)
def __trace(self, d, prereq):
if d.visit == self.__visit:
return d.trace
if d.tgt == prereq:
return [ [ d ], ]
d.visit = self.__visit
result = []
for pre in d.prereqs:
recursed = self.__trace(pre, prereq)
for r in recursed:
result.append([ d ] + r)
d.trace = result
return result
def help():
print "Commands:"
print " dep TARGET Print the prerequisites for TARGET"
print " trace TARGET PREREQ Print the paths from TARGET to PREREQ"
def main(argv):
opts = optparse.OptionParser()
opts.add_option("-i", "--interactive", action="store_true", dest="interactive",
help="Interactive mode")
(options, args) = opts.parse_args()
deps = Dependencies()
filename = args[0]
print "Reading %s" % filename
if True:
f = open(filename)
for line in f:
line = line.strip()
if len(line) > 0:
if line[0] == '#':
pos,tgt = line.rsplit(":", 1)
pos = pos[1:].strip()
tgt = tgt.strip()
deps.setPos(tgt, pos)
else:
(tgt,prereq) = line.split(':', 1)
tgt = tgt.strip()
prereq = prereq.strip()
deps.add(tgt, prereq)
f.close()
print "Read %d dependencies. %d targets." % (deps.count, len(deps.lines))
while True:
line = raw_input("target> ")
if not line.strip():
continue
split = line.split()
cmd = split[0]
if len(split) == 2 and cmd == "dep":
tgt = split[1]
d = deps.get(tgt)
if d:
for prereq in d.prereqs:
print prereq.tgt
elif len(split) == 3 and cmd == "trace":
tgt = split[1]
prereq = split[2]
if False:
print "from %s to %s" % (tgt, prereq)
trace = deps.trace(tgt, prereq)
if trace:
width = 0
for g in trace:
for t in g:
if len(t.tgt) > width:
width = len(t.tgt)
for g in trace:
for t in g:
if t.pos:
print t.tgt, " " * (width-len(t.tgt)), " #", t.pos
else:
print t.tgt
print
else:
help()
if __name__ == "__main__":
try:
main(sys.argv)
except KeyboardInterrupt:
print
except EOFError:
print

160
tools/product_debug.py Executable file
View File

@ -0,0 +1,160 @@
#!/usr/bin/env python
#
# Copyright (C) 2012 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import re
import sys
def break_lines(key, val):
# these don't get split
if key in ("PRODUCT_MODEL"):
return (key,val)
return (key, "\n".join(val.split()))
def split_line(line):
words = line.split("=", 1)
if len(words) == 1:
return (words[0], "")
else:
return (words[0], words[1])
def sort_lines(text):
lines = text.split()
lines.sort()
return "\n".join(lines)
def parse_variables(lines):
return [split_line(line) for line in lines if line.strip()]
def render_variables(variables):
variables = dict(variables)
del variables["FILE"]
variables = list(variables.iteritems())
variables.sort(lambda a, b: cmp(a[0], b[0]))
return ("<table id='variables'>"
+ "\n".join([ "<tr><th>%(key)s</th><td>%(val)s</td></tr>" % { "key": key, "val": val }
for key,val in variables])
+"</table>")
def linkify_inherit(variables, text, func_name):
groups = re.split("(\\$\\(call " + func_name + ",.*\\))", text)
result = ""
for i in range(0,len(groups)/2):
i = i * 2
result = result + groups[i]
s = groups[i+1]
href = s.split(",", 1)[1].strip()[:-1]
href = href.replace("$(SRC_TARGET_DIR)", "build/target")
href = ("../" * variables["FILE"].count("/")) + href + ".html"
result = result + "<a href=\"%s\">%s</a>" % (href,s)
result = result + groups[-1]
return result
def render_original(variables, text):
text = linkify_inherit(variables, text, "inherit-product")
text = linkify_inherit(variables, text, "inherit-product-if-exists")
return text
def read_file(fn):
f = file(fn)
text = f.read()
f.close()
return text
def main(argv):
# read the variables
lines = sys.stdin.readlines()
variables = parse_variables(lines)
# format the variables
variables = [break_lines(key,val) for key,val in variables]
# now it's a dict
variables = dict(variables)
sorted_vars = (
"PRODUCT_COPY_FILES",
"PRODUCT_PACKAGES",
"PRODUCT_LOCALES",
"PRODUCT_FACTORY_RAMDISK_MODULES",
"PRODUCT_PROPERTY_OVERRIDES",
)
for key in sorted_vars:
variables[key] = sort_lines(variables[key])
# the original file
original = read_file(variables["FILE"])
# formatting
values = dict(variables)
values.update({
"variables": render_variables(variables),
"original": render_original(variables, original),
})
print """<html>
<head>
<title>%(FILE)s</title>
<style type="text/css">
body {
font-family: Helvetica, Arial, sans-serif;
padding-bottom: 20px;
}
#variables {
border-collapse: collapse;
}
#variables th, #variables td {
vertical-align: top;
text-align: left;
border-top: 1px solid #c5cdde;
border-bottom: 1px solid #c5cdde;
padding: 2px 10px 2px 10px;
}
#variables th {
font-size: 10pt;
background-color: #e2ecff
}
#variables td {
background-color: #ebf2ff;
white-space: pre;
font-size: 10pt;
}
#original {
background-color: #ebf2ff;
border-top: 1px solid #c5cdde;
border-bottom: 1px solid #c5cdde;
padding: 2px 10px 2px 10px;
white-space: pre;
font-size: 10pt;
}
</style>
</head>
<body>
<h1>%(FILE)s</h1>
<a href="#Original">Original</a>
<a href="#Variables">Variables</a>
<h2><a name="Original"></a>Original</h2>
<div id="original">%(original)s</div>
<h2><a name="Variables"></a>Variables</h2>
%(variables)s
</body>
</html>
""" % values
if __name__ == "__main__":
main(sys.argv)