Skip to content
Snippets Groups Projects
Commit ea4dcdf7 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "xpcom.mk: Avoid unnecessary re-making of targets"

include $(CLEAR_VARS)
LOCAL_ADDITIONAL_INSTALL_DEPENDENCIES :=
LOCAL_INSTALLED_REQUIRED_XPCOM_IDL_HEADERS :=
LOCAL_INSTALLED_XPCOM_IDLS :=
LOCAL_INSTALLED_XPCOM_IDL_HEADERS :=
LOCAL_JS_NOTICE :=
LOCAL_JS_SRC_FILES :=
LOCAL_XPCOM_IDLS :=
LOCAL_XPCOM_STATIC_LIBRARIES :=
LOCAL_XPCOM_SHARED_LIBRARIES :=
LOCAL_XPCOM_MODULE :=
LOCAL_XPIDL_PATH :=
LOCAL_XPCOM_INSTALL_DIR :=
LOCAL_XPCOM_MODULE_OBJDIR :=
LOCAL_XPIDL_OUT :=
LOCAL_XPCOM_SHARED_LIBRARIES :=
LOCAL_XPCOM_STATIC_LIBRARIES :=
LOCAL_XPIDL_FLAGS :=
LOCAL_XPCOM_INSTALL_DIR :=
LOCAL_JS_NOTICE :=
LOCAL_JS_SRC_FILES :=
LOCAL_XPIDL_OUT :=
......@@ -3,42 +3,27 @@
# and typelibs, along with installing into Gecko
#
# Global note: If any of the make rule commands include references to
# $(LOCAL...) variables, they have to be saved in target private variables
# otherwise they will have whatever value they happen to have when the
# target is executed, which is not what we want.
# The reason is that rules don't execute in the first pass through
# the makefile, and by the time they execute, any variable references
# in the rule are essentially environment variables, with whatever
# value they were last assigned to (not necessarily what the source
# makefile assigned to them in the first pass)
#
# For example
# $(LOCAL_XPCOM_MODULE)-somerule:
# @mkdir $(LOCAL_XPCOM_MODULE)_objdir
# is incorrect. Replace with:
# $(LOCAL_XPCOM_MODULE)-somerule: PRIVATE_XPCOM_MODULE := $(LOCAL_XPCOM_MODULE)
# $(LOCAL_XPCOM_MODULE)-somerule:
# @mkdir $(PRIVATE_XPCOM_MODULE)_objdir
# Setting up module name and directories
# Name of module
LOCAL_XPCOM_MODULE := $(LOCAL_MODULE)
# Home directory of the module source
LOCAL_XPIDL_PATH := $(LOCAL_PATH)
# The directory where this component's intermediates will be put by Android build system
LOCAL_XPCOM_MODULE_OBJDIR := $(TARGET_OUT_INTERMEDIATES)/SHARED_LIBRARIES/$(LOCAL_XPCOM_MODULE)_intermediates
LOCAL_XPCOM_MODULE_OBJDIR := $(TARGET_OUT_INTERMEDIATES)/SHARED_LIBRARIES/$(LOCAL_MODULE)_intermediates
# The directory where all the objs generated by idl compilation will go
LOCAL_XPIDL_OUT := $(LOCAL_XPCOM_MODULE_OBJDIR)/xpidl_obj
# The directory where the final xpcom module will be installed to
LOCAL_MODULE_PATH := $(TARGET_OUT)/b2g/distribution/bundles/$(LOCAL_MODULE)
# Extract Javascript sources into a separate macro
LOCAL_JS_SRC_FILES := $(filter %.js,$(LOCAL_SRC_FILES))
LOCAL_SRC_FILES := $(filter-out %.js,$(LOCAL_SRC_FILES))
# Add Gecko as a dependency of this module.
LOCAL_REQUIRED_MODULES := $(LOCAL_REQUIRED_MODULES) gecko
# Add Gecko headers to include path
LOCAL_C_INCLUDES := $(LOCAL_C_INCLUDES) \
$(ANDROID_PRODUCT_OUT)/obj/objdir-gecko/dist/include \
$(ANDROID_PRODUCT_OUT)/obj/objdir-gecko/dist/include/nspr \
$(LOCAL_XPIDL_OUT)
$(TARGET_OUT_HEADERS)/xpcom
# Compiler flags required by many Gecko libraries/sources
LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS) -std=c++0x
......@@ -50,30 +35,19 @@ ifneq ($(filter eng, $(TARGET_BUILD_VARIANT)),)
LOCAL_CFLAGS += -DDEBUG
endif
# Gecko locations
# Gecko locations (hardcoded! fragile!)
GECKO_DIR := $(ANDROID_BUILD_TOP)/gecko
GECKO_OBJDIR := $(ANDROID_PRODUCT_OUT)/obj/objdir-gecko
LIBXUL_DIST := $(GECKO_OBJDIR)/dist
# Flags to be used by idl compilation
LOCAL_XPIDL_FLAGS := -I$(LOCAL_XPIDL_PATH) -I$(LIBXUL_DIST)/idl
# Although we added Gecko as a dependency, that only prevents the link step
# from happening until Gecko is built. But the IDL generators and other
# headers have no make dependency on Gecko and will fall over in
# parallel make. Add the define below as a pre-req to every Gecko file and path
# that we depend on
DEPENDS_ON_GECKO := $(TARGET_OUT)/b2g/distribution
LOCAL_XPIDL_FLAGS := -I$(LOCAL_PATH) -I$(LIBXUL_DIST)/idl
ifeq ($(ONE_SHOT_MAKEFILE),)
$(TARGET_OUT)/b2g/distribution: $(TARGET_OUT)/gecko
DEPENDS_ON_GECKO := $(TARGET_OUT)/gecko
endif
$(LOCAL_XPCOM_MODULE)-xpidl_prereqs: PRIVATE_XPIDL_OUT := $(LOCAL_XPIDL_OUT)
$(LOCAL_XPCOM_MODULE)-xpidl_prereqs:
@mkdir -p $(PRIVATE_XPIDL_OUT)
XPIDL_DEPS := $(LIBXUL_DIST)/sdk/bin/header.py \
$(LIBXUL_DIST)/sdk/bin/typelib.py \
$(LIBXUL_DIST)/sdk/bin/xpidl.py \
......@@ -133,102 +107,75 @@ $(foreach lib,$(___LIBS),\
LOCAL_SHARED_LIBRARIES := $(LOCAL_SHARED_LIBRARIES) $(LOCAL_XPCOM_SHARED_LIBRARIES)
LOCAL_INSTALLED_XPCOM_IDL_HEADERS := $(patsubst %.idl,$(TARGET_OUT_HEADERS)/xpcom/%.h,$(LOCAL_XPCOM_IDLS))
LOCAL_INSTALLED_REQUIRED_XPCOM_IDL_HEADERS := $(patsubst %.idl,$(TARGET_OUT_HEADERS)/xpcom/%.h,$(LOCAL_REQUIRED_XPCOM_IDLS))
# Make the module being built by Android.mk depend on the following:
# 1. The .h corresponding to the .idls found in the directory
# 2. The corresponding .xpt files
# 3. The overall module .xpt file
# 4. The export rules to copy idls and headers to $(LIBXUL_DIST)
# Dependencies for IDL files
ifneq (,$(strip $(LOCAL_XPCOM_IDLS)))
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_ADDITIONAL_DEPENDENCIES) $(patsubst %.idl,$(LOCAL_XPIDL_OUT)/%.h,$(LOCAL_XPCOM_IDLS))
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_ADDITIONAL_DEPENDENCIES) $(patsubst %.idl,$(LOCAL_XPIDL_OUT)/%.xpt,$(LOCAL_XPCOM_IDLS))
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_ADDITIONAL_DEPENDENCIES) $(LOCAL_XPIDL_OUT)/$(LOCAL_XPCOM_MODULE).xpt
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_ADDITIONAL_DEPENDENCIES) $(LOCAL_XPCOM_MODULE)-export_headers $(LOCAL_XPCOM_MODULE)-export_idls
endif
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_ADDITIONAL_DEPENDENCIES) $(LOCAL_XPCOM_MODULE)-xpcom_install
$(LOCAL_INSTALLED_XPCOM_IDL_HEADERS): $(TARGET_OUT_HEADERS)/xpcom/%.h: $(LOCAL_XPIDL_OUT)/%.h
@mkdir -p $(@D)
$(INSTALL) $(INSTALL_FLAGS) $^ $(@D)
LOCAL_XPCOM_INSTALL_DIR := $(TARGET_OUT)/b2g/distribution/bundles/$(LOCAL_XPCOM_MODULE)
$(LOCAL_XPCOM_MODULE)-xpidl_install_prereqs: PRIVATE_XPCOM_INSTALL_DIR := $(LOCAL_XPCOM_INSTALL_DIR)
$(LOCAL_XPCOM_MODULE)-xpidl_install_prereqs: $(DEPENDS_ON_GECKO)
@mkdir -p $(PRIVATE_XPCOM_INSTALL_DIR)
LOCAL_ADDITIONAL_INSTALL_DEPENDENCIES += $(patsubst %.idl,$(LOCAL_XPIDL_OUT)/%.xpt,$(LOCAL_XPCOM_IDLS))
LOCAL_ADDITIONAL_INSTALL_DEPENDENCIES += $(LOCAL_MODULE_PATH)/$(LOCAL_MODULE).xpt
endif
$(LOCAL_XPIDL_OUT)/%.h: $(LOCAL_XPIDL_PATH)/%.idl $(XPIDL_DEPS) $(LOCAL_XPCOM_MODULE)-xpidl_prereqs
$(LOCAL_XPIDL_OUT)/%.h: $(LOCAL_PATH)/%.idl $(XPIDL_DEPS)
@mkdir -p $(@D)
$(REPORT_BUILD)
$(PYTHON_PATH) $(PLY_INCLUDE) $(LIBXUL_DIST)/sdk/bin/header.py $(LOCAL_XPIDL_FLAGS) $(CURRENT_IDLS) -o $@
# generate intermediate .xpt files into $(LOCAL_XPIDL_OUT), then link
# into $(LOCAL_XPCOM_MODULE).xpt and export it to $(LOCAL_XPCOM_INSTALL_DIR)
$(LOCAL_XPIDL_OUT)/%.xpt: $(LOCAL_XPIDL_PATH)/%.idl $(XPIDL_DEPS) $(LOCAL_XPCOM_MODULE)-xpidl_prereqs
$(LOCAL_XPIDL_OUT)/%.xpt: $(LOCAL_PATH)/%.idl $(XPIDL_DEPS)
@mkdir -p $(@D)
$(REPORT_BUILD)
$(PYTHON_PATH) $(PLY_INCLUDE) -I$(GECKO_DIR)/xpcom/typelib/xpt/tools $(LIBXUL_DIST)/sdk/bin/typelib.py $(LOCAL_XPIDL_FLAGS) $(CURRENT_IDLS) -o $@
$(LOCAL_XPIDL_OUT)/$(LOCAL_XPCOM_MODULE).xpt: PRIVATE_XPCOM_INSTALL_DIR := $(LOCAL_XPCOM_INSTALL_DIR)
$(LOCAL_XPIDL_OUT)/$(LOCAL_XPCOM_MODULE).xpt: $(patsubst %.idl,$(LOCAL_XPIDL_OUT)/%.xpt,$(LOCAL_XPCOM_IDLS)) $(LOCAL_XPCOM_MODULE)-xpidl_install_prereqs
$(XPIDL_LINK) $@ $(filter-out %-xpidl_install_prereqs, $^)
$(INSTALL) $(INSTALL_FLAGS) $@ $(PRIVATE_XPCOM_INSTALL_DIR)
LOCAL_JS_SRC_FILES := $(filter %.js,$(LOCAL_SRC_FILES))
LOCAL_SRC_FILES := $(filter-out %.js,$(LOCAL_SRC_FILES))
# Invoke Android build system to build the shared library
include $(BUILD_SHARED_LIBRARY)
$(LOCAL_XPIDL_OUT)/$(LOCAL_MODULE).xpt: $(patsubst %.idl,$(LOCAL_XPIDL_OUT)/%.xpt,$(LOCAL_XPCOM_IDLS)) $(DEPENDS_ON_GECKO)
$(XPIDL_LINK) $@ $(filter-out $(DEPENDS_ON_GECKO), $^)
# Install the .so only if its not a pure JS component
ifneq (,$(strip $(LOCAL_SRC_FILES)))
$(LOCAL_INSTALLED_MODULE): $(LOCAL_XPCOM_INSTALL_DIR)/$(LOCAL_XPCOM_MODULE).so
$(LOCAL_XPCOM_INSTALL_DIR)/$(LOCAL_XPCOM_MODULE).so : \
$(LOCAL_XPCOM_MODULE_OBJDIR)/LINKED/$(LOCAL_XPCOM_MODULE).so | $(TARGET_STRIP)
$(transform-to-stripped)
# Override the install rule supplied by BUILD_SHARED_LIBRARY
# TODO: This could be done in a cleaner fashion...
$(LOCAL_INSTALLED_MODULE):
$(hide) true
endif
$(LOCAL_MODULE_PATH)/$(LOCAL_MODULE).xpt: $(LOCAL_XPIDL_OUT)/$(LOCAL_MODULE).xpt
@mkdir -p $(@D)
$(INSTALL) $(INSTALL_FLAGS) $^ $(@D)
$(LOCAL_XPCOM_MODULE)-export_idls: PRIVATE_XPCOM_INSTALL_DIR := $(LIBXUL_DIST)/idl
$(LOCAL_XPCOM_MODULE)-export_idls: $(patsubst %.idl,$(LOCAL_XPIDL_PATH)/%.idl,$(LOCAL_XPCOM_IDLS)) $(LOCAL_XPCOM_MODULE)-xpidl_install_prereqs
$(INSTALL) $(INSTALL_FLAGS) $(filter-out %-xpidl_install_prereqs, $^) $(PRIVATE_XPCOM_INSTALL_DIR)
$(LIBXUL_DIST)/idl: $(DEPENDS_ON_GECKO)
ifneq (,$(strip $(LOCAL_XPCOM_IDLS)))
LOCAL_ADDITIONAL_INSTALL_DEPENDENCIES += $(LOCAL_MODULE_PATH)/interfaces.manifest
$(LOCAL_XPCOM_MODULE)-export_headers: PRIVATE_XPCOM_INSTALL_DIR := $(LIBXUL_DIST)/include
$(LOCAL_XPCOM_MODULE)-export_headers: $(patsubst %.idl,$(LOCAL_XPIDL_OUT)/%.h,$(LOCAL_XPCOM_IDLS)) $(LOCAL_XPCOM_MODULE)-xpidl_install_prereqs
$(INSTALL) $(INSTALL_FLAGS) $(filter-out %-xpidl_install_prereqs, $^) $(PRIVATE_XPCOM_INSTALL_DIR)
$(LOCAL_MODULE_PATH)/interfaces.manifest: PRIVATE_LOCAL_MODULE := $(LOCAL_MODULE)
$(LOCAL_MODULE_PATH)/interfaces.manifest: $(GECKO_DIR)/config/buildlist.py
$(PYTHON) $(GECKO_DIR)/config/buildlist.py $@ "interfaces $(PRIVATE_LOCAL_MODULE).xpt"
endif
$(LIBXUL_DIST)/include: $(DEPENDS_ON_GECKO)
$(LOCAL_XPCOM_MODULE)-install_js_srcs:
INSTALLED_JS_FILES := $(addprefix $(LOCAL_MODULE_PATH)/,$(LOCAL_JS_SRC_FILES))
LOCAL_ADDITIONAL_INSTALL_DEPENDENCIES += $(INSTALLED_JS_FILES)
ifneq (,$(strip $(LOCAL_JS_SRC_FILES)))
JSMIN := $(BUILD_OUT_EXECUTABLES)/jsmin$(BUILD_EXECUTABLE_SUFFIX)
$(LOCAL_XPCOM_MODULE)-install_js_srcs: PRIVATE_JS_SRC_FILES := $(LOCAL_JS_SRC_FILES)
$(LOCAL_XPCOM_MODULE)-install_js_srcs: PRIVATE_XPIDL_PATH := $(LOCAL_XPIDL_PATH)
$(LOCAL_XPCOM_MODULE)-install_js_srcs: PRIVATE_XPCOM_INSTALL_DIR := $(LOCAL_XPCOM_INSTALL_DIR)
ifdef USE_JSMIN
$(LOCAL_XPCOM_MODULE)-install_js_srcs: PRIVATE_JS_NOTICE := $(LOCAL_JS_NOTICE)
$(LOCAL_XPCOM_MODULE)-install_js_srcs: $(LOCAL_XPCOM_MODULE)-xpidl_install_prereqs $(JSMIN)
$(foreach js,$(PRIVATE_JS_SRC_FILES),$(JSMIN) < $(PRIVATE_XPIDL_PATH)/$(js) > $(PRIVATE_XPCOM_INSTALL_DIR)/$(notdir $(js)) '$(PRIVATE_JS_NOTICE)' && ) true
JSMIN := $(BUILD_OUT_EXECUTABLES)/jsmin$(BUILD_EXECUTABLE_SUFFIX)
$(INSTALLED_JS_FILES): PRIVATE_JS_NOTICE := $(LOCAL_JS_NOTICE)
$(INSTALLED_JS_FILES): $(LOCAL_MODULE_PATH)/%.js: $(LOCAL_PATH)/%.js $(JSMIN) $(DEPENDS_ON_GECKO)
@mkdir -p $(@D)
$(JSMIN) < $< > $@ '$(PRIVATE_JS_NOTICE)'
else
$(LOCAL_XPCOM_MODULE)-install_js_srcs: $(LOCAL_XPCOM_MODULE)-xpidl_install_prereqs $(ACP)
$(foreach js,$(PRIVATE_JS_SRC_FILES),$(ACP) $(PRIVATE_XPIDL_PATH)/$(js) $(PRIVATE_XPCOM_INSTALL_DIR) && ) true
$(INSTALLED_JS_FILES): $(LOCAL_MODULE_PATH)/%.js: $(LOCAL_PATH)/%.js $(ACP) $(DEPENDS_ON_GECKO)
@mkdir -p $(@D)
$(ACP) $< $@
endif
endif
LOCAL_ADDITIONAL_INSTALL_DEPENDENCIES += $(LOCAL_MODULE_PATH)/chrome.manifest
$(LOCAL_XPCOM_MODULE)-xpcom_install: PRIVATE_XPIDL_PATH := $(LOCAL_XPIDL_PATH)
$(LOCAL_XPCOM_MODULE)-xpcom_install: PRIVATE_XPCOM_INSTALL_DIR := $(LOCAL_XPCOM_INSTALL_DIR)
$(LOCAL_XPCOM_MODULE)-xpcom_install: PRIVATE_XPCOM_MODULE := $(LOCAL_XPCOM_MODULE)
$(LOCAL_XPCOM_MODULE)-xpcom_install: $(LOCAL_XPCOM_MODULE)-xpidl_install_prereqs $(LOCAL_XPCOM_MODULE)-install_js_srcs $(GECKO_DIR)/config/buildlist.py $(LOCAL_XPIDL_PATH)/chrome.manifest
@cp $(PRIVATE_XPIDL_PATH)/chrome.manifest $(PRIVATE_XPCOM_INSTALL_DIR)
$(LOCAL_MODULE_PATH)/chrome.manifest: $(LOCAL_PATH)/chrome.manifest $(GECKO_DIR)/config/buildlist.py $(ACP)
@mkdir -p $(@D)
$(ACP) $< $@
ifneq (,$(strip $(LOCAL_XPCOM_IDLS)))
$(PYTHON) $(GECKO_DIR)/config/buildlist.py $(PRIVATE_XPCOM_INSTALL_DIR)/interfaces.manifest "interfaces $(PRIVATE_XPCOM_MODULE).xpt"
$(PYTHON) $(GECKO_DIR)/config/buildlist.py $(PRIVATE_XPCOM_INSTALL_DIR)/chrome.manifest "manifest interfaces.manifest"
$(PYTHON) $(GECKO_DIR)/config/buildlist.py $@ "manifest interfaces.manifest"
endif
$(GECKO_DIR)/config/buildlist.py: $(DEPENDS_ON_GECKO)
include $(BUILD_SHARED_LIBRARY)
$(all_objects): $(DEPENDS_ON_GECKO) $(LOCAL_INSTALLED_XPCOM_IDL_HEADERS) $(LOCAL_INSTALLED_REQUIRED_XPCOM_IDL_HEADERS)
$(LOCAL_INSTALLED_MODULE): $(LOCAL_ADDITIONAL_INSTALL_DEPENDENCIES)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment