# This Source Code Form is subject to the terms of the Mozilla Public# License, v. 2.0. If a copy of the MPL was not distributed with this# file, You can obtain one at http://mozilla.org/MPL/2.0/.STANDALONE_MAKEFILE:= 1include $(topsrcdir)/config/rules.mk# Building XPIDLs effectively consists of two steps:## 1) Staging all .idl files to a common directory.# 2) Doing everything with the .idl files.## Each .idl file is processed into a .h file and typelib information.# The .h file shares the same stem as the input file and is installed# in the common headers include directory.## XPIDL files are logically grouped together by modules. The typelib# information for all XPIDLs in the same module is linked together into# an .xpt file having the name of the module.## As an optimization to reduce overall CPU usage, we process all .idl# belonging to a module with a single command invocation. This prevents# redundant parsing of .idl files and significantly reduces CPU cycles.# For dependency files.idl_deps_dir:= .depsdist_idl_dir:=$(DIST)/idldist_include_dir:=$(DIST)/includedist_xpcrs_dir:=$(DIST)/xpcrsprocess_py:=$(topsrcdir)/python/mozbuild/mozbuild/action/xpidl-process.pygenerated_file:=$(topobjdir)/xpcom/reflect/xptinfo/xptdata.cppcode_gen_py:=$(topsrcdir)/xpcom/reflect/xptinfo/xptcodegen.pycode_gen_deps:=$(topsrcdir)/xpcom/ds/tools/perfecthash.py# TODO we should use py_action, but that would require extra directories to be# in the virtualenv.%.xpt:$(REPORT_BUILD)$(PYTHON_PATH)$(PLY_INCLUDE) -I$(topsrcdir)/xpcom/idl-parser -I$(DEPTH)/xpcom/idl-parser/xpidl \$(process_py) --cache-dir $(DEPTH)/xpcom/idl-parser/xpidl --depsdir $(idl_deps_dir)\ --bindings-conf $(topsrcdir)/dom/bindings/Bindings.conf \$(foreach dir,$(all_idl_dirs),-I $(dir))\$(dist_include_dir)$(dist_xpcrs_dir)$(@D)\$(basename $(notdir $@))$($(basename $(notdir $@))_deps)# When some IDL is added or removed, if the actual IDL file was already, or# still is, in the tree, simple dependencies can't detect that the XPT needs# to be rebuilt.# Add the current value of $($(xpidl_module)_deps) in the depend file, such that# we can later check if the value has changed since last build, which will# indicate whether IDLs were added or removed.# Note that removing previously built files is not covered. @echo $(basename $(notdir $@))_deps_built=$($(basename $(notdir $@))_deps) >> $(idl_deps_dir)/$(basename $(notdir $@)).ppxpidl_modules:= @xpidl_modules@xpt_files:=$(addsuffix .xpt,$(xpidl_modules))@xpidl_rules@depends_files:=$(foreach root,$(xpidl_modules),$(idl_deps_dir)/$(root).pp)GARBAGE+=$(xpt_files)$(depends_files)$(generated_file)ifdef COMPILE_ENVIRONMENTxpidl::$(generated_file)endif$(xpt_files):$(process_py)$(callmkdir_deps,$(idl_deps_dir)$(dist_include_dir)$(dist_xpcrs_dir))$(generated_file):$(xpt_files)$(code_gen_py)$(code_gen_deps)$(REPORT_BUILD)$(PYTHON_PATH)$(PLY_INCLUDE)$(code_gen_py)$(generated_file)$(xpt_files)-include $(depends_files)define xpt_deps$(1):$(callmkdir_deps,$(dir$(1)))ifneq ($($(basename $(notdir $(1)))_deps),$($(basename $(notdir $(1)))_deps_built))$(1):FORCEendifendef$(foreachxpt,$(xpt_files),$(eval$(callxpt_deps,$(xpt)))).PHONY:xpidl