Makefile.in (3508B)
1 # This Source Code Form is subject to the terms of the Mozilla Public 2 # License, v. 2.0. If a copy of the MPL was not distributed with this 3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 5 STANDALONE_MAKEFILE := 1 6 7 include $(topsrcdir)/config/rules.mk 8 9 # Building XPIDLs effectively consists of two steps: 10 # 11 # 1) Staging all .idl files to a common directory. 12 # 2) Doing everything with the .idl files. 13 # 14 # Each .idl file is processed into a .h file and typelib information. 15 # The .h file shares the same stem as the input file and is installed 16 # in the common headers include directory. 17 # 18 # XPIDL files are logically grouped together by modules. The typelib 19 # information for all XPIDLs in the same module is linked together into 20 # an .xpt file having the name of the module. 21 # 22 # As an optimization to reduce overall CPU usage, we process all .idl 23 # belonging to a module with a single command invocation. This prevents 24 # redundant parsing of .idl files and significantly reduces CPU cycles. 25 26 # For dependency files. 27 idl_deps_dir := .deps 28 29 dist_idl_dir := $(DIST)/idl 30 dist_include_dir := $(DIST)/include 31 dist_xpcrs_dir := $(DIST)/xpcrs 32 stub_file := xptdata.stub 33 process_py := $(topsrcdir)/python/mozbuild/mozbuild/action/xpidl-process.py 34 target_file := $(topobjdir)/xpcom/reflect/xptinfo/xptdata.cpp 35 xptdata_h := $(dist_include_dir)/xptdata.h 36 generated_files := $(target_file) $(xptdata_h) 37 code_gen_py := $(topsrcdir)/xpcom/reflect/xptinfo/xptcodegen.py 38 code_gen_deps := $(topsrcdir)/xpcom/ds/tools/perfecthash.py 39 40 # TODO we should use py_action, but that would require extra directories to be 41 # in the virtualenv. 42 %.xpt: 43 $(REPORT_BUILD) 44 $(call BUILDSTATUS,START_xpt $@) 45 $(PYTHON3) $(process_py) --depsdir $(idl_deps_dir) \ 46 --bindings-conf $(topsrcdir)/dom/bindings/Bindings.conf \ 47 $(foreach dir,$(all_idl_dirs),-I $(dir)) \ 48 $(dist_include_dir) $(dist_xpcrs_dir) $(@D) \ 49 $(basename $(notdir $@)) $($(basename $(notdir $@))_deps) 50 # When some IDL is added or removed, if the actual IDL file was already, or 51 # still is, in the tree, simple dependencies can't detect that the XPT needs 52 # to be rebuilt. 53 # Add the current value of $($(xpidl_module)_deps) in the depend file, such that 54 # we can later check if the value has changed since last build, which will 55 # indicate whether IDLs were added or removed. 56 # Note that removing previously built files is not covered. 57 @echo $(basename $(notdir $@))_deps_built = $($(basename $(notdir $@))_deps) >> $(idl_deps_dir)/$(basename $(notdir $@)).pp 58 $(call BUILDSTATUS,END_xpt $@) 59 60 xpidl_modules := @xpidl_modules@ 61 xpt_files := $(addsuffix .xpt,$(xpidl_modules)) 62 63 @xpidl_rules@ 64 65 depends_files := $(foreach root,$(xpidl_modules),$(idl_deps_dir)/$(root).pp) 66 67 ifdef COMPILE_ENVIRONMENT 68 xpidl:: $(generated_files) 69 endif 70 71 # See bug 1420119 for why we need the semicolon. 72 $(target_file) $(xptdata_h) : $(stub_file) ; 73 74 $(xpt_files): $(process_py) $(call mkdir_deps,$(idl_deps_dir) $(dist_include_dir) $(dist_xpcrs_dir)) 75 76 $(stub_file) : $(xpt_files) $(code_gen_py) $(code_gen_deps) 77 $(REPORT_BUILD) 78 $(call BUILDSTATUS,START_xpt $(notdir $(generated_files))) 79 $(PYTHON3) $(code_gen_py) $(generated_files) $(xpt_files) 80 @touch $@ 81 $(call BUILDSTATUS,END_xpt $(notdir $(generated_files))) 82 83 -include $(depends_files) 84 85 define xpt_deps 86 $(1): $(call mkdir_deps,$(dir $(1))) 87 ifneq ($($(basename $(notdir $(1)))_deps),$($(basename $(notdir $(1)))_deps_built)) 88 $(1): FORCE 89 endif 90 endef 91 92 $(foreach xpt,$(xpt_files),$(eval $(call xpt_deps,$(xpt)))) 93 94 .PHONY: xpidl