# 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/. DEPTH = @DEPTH@ topsrcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk EXPORT_LIBRARY = 1 # Need this to find all our DOM source files. include $(topsrcdir)/dom/dom-config.mk include $(topsrcdir)/dom/webidl/WebIDL.mk binding_include_path := mozilla/dom all_webidl_files = $(webidl_files) $(generated_webidl_files) $(preprocessed_webidl_files) # Set exported_binding_headers before adding the test IDL to the mix exported_binding_headers := $(subst .webidl,Binding.h,$(all_webidl_files)) # Set linked_binding_cpp_files before adding the test IDL to the mix linked_binding_cpp_files := $(subst .webidl,Binding.cpp,$(all_webidl_files)) all_webidl_files += $(test_webidl_files) binding_header_files := $(subst .webidl,Binding.h,$(all_webidl_files)) binding_cpp_files := $(subst .webidl,Binding.cpp,$(all_webidl_files)) # We want to be able to only regenerate the .cpp and .h files that really need # to change when a .webidl file changes. We do this by making the # binding_dependency_trackers targets have dependencies on the right .webidl # files via generated .pp files, having a .BindingGen target that depends on the # binding_dependency_trackers and which has all the generated binding .h/.cpp # depending on it, and then in the make commands for that target being able to # check which exact binding_dependency_trackers changed. binding_dependency_trackers := $(subst .webidl,Binding,$(all_webidl_files)) globalgen_targets := \ GeneratedAtomList.h \ PrototypeList.h \ RegisterBindings.h \ RegisterBindings.cpp \ UnionTypes.h \ UnionTypes.cpp \ UnionConversions.h \ $(NULL) # Nasty hack: when the test/Makefile.in invokes us to do codegen, it # uses a target of # "export TestExampleInterface-example TestExampleProxyInterface-example". # We don't actually need to load our .o.pp files in that case, so just # pretend like we have no CPPSRCS if that's the target. It makes the # test cycle much faster, which is why we're doing it. # # XXXbz We could try to cheat even more and only include our CPPSRCS # when $(MAKECMDGOALS) contains libs, so that we can skip loading all # those .o.pp when trying to make a single .cpp file too, but that # would break |make FooBinding.o(bj)|. Ah, well. ifneq (export TestExampleInterface-example TestExampleProxyInterface-example,$(MAKECMDGOALS)) CPPSRCS = \ $(linked_binding_cpp_files) \ $(filter %.cpp, $(globalgen_targets)) \ BindingUtils.cpp \ CallbackInterface.cpp \ CallbackObject.cpp \ DOMJSProxyHandler.cpp \ Date.cpp \ $(NULL) endif LOCAL_INCLUDES += -I$(topsrcdir)/js/xpconnect/src \ -I$(topsrcdir)/js/xpconnect/wrappers \ -I$(topsrcdir)/js/ipc \ -I$(topsrcdir)/content/canvas/src \ -I$(topsrcdir)/content/html/content/src \ -I$(topsrcdir)/media/webrtc/signaling/src/peerconnection \ -I$(topsrcdir)/dom/base \ -I$(topsrcdir)/dom/battery \ -I$(topsrcdir)/dom/indexedDB \ -I$(topsrcdir)/content/xslt/src/base \ -I$(topsrcdir)/content/xslt/src/xpath \ -I$(topsrcdir)/content/xml/content/src \ -I$(topsrcdir)/content/xul/content/src \ -I$(topsrcdir)/content/xul/document/src \ -I$(topsrcdir)/content/media/webspeech/recognition \ $(NULL) ifdef MOZ_AUDIO_CHANNEL_MANAGER LOCAL_INCLUDES += \ -I$(topsrcdir)/dom/system/gonk \ $(NULL) endif ifdef MOZ_B2G_RIL LOCAL_INCLUDES += \ -I$(topsrcdir)/dom/icc/src \ $(NULL) endif EXTRA_EXPORT_MDDEPEND_FILES := $(addsuffix .pp,$(binding_dependency_trackers)) EXPORTS_GENERATED_FILES := $(exported_binding_headers) EXPORTS_GENERATED_DEST := $(DIST)/include/$(binding_include_path) EXPORTS_GENERATED_TARGET := export INSTALL_TARGETS += EXPORTS_GENERATED # Install auto-generated GlobalGen files. The rules for the install must # be in the same target/subtier as GlobalGen.py, otherwise the files will not # get installed into the appropriate location as they are generated. globalgen_headers_FILES := \ PrototypeList.h \ RegisterBindings.h \ UnionConversions.h \ UnionTypes.h \ $(NULL) globalgen_headers_DEST = $(DIST)/include/mozilla/dom globalgen_headers_TARGET := webidl INSTALL_TARGETS += globalgen_headers include $(topsrcdir)/config/rules.mk include $(topsrcdir)/ipc/chromium/chromium-config.mk ifdef GNU_CC CXXFLAGS += -Wno-uninitialized endif # If you change bindinggen_dependencies here, change it in # dom/bindings/test/Makefile.in too. bindinggen_dependencies := \ BindingGen.py \ Bindings.conf \ Configuration.py \ Codegen.py \ ParserResults.pkl \ parser/WebIDL.py \ $(GLOBAL_DEPS) \ $(NULL) CSS2Properties.webidl: $(topsrcdir)/layout/style/nsCSSPropList.h \ $(topsrcdir)/layout/style/nsCSSPropAliasList.h \ $(webidl_base)/CSS2Properties.webidl.in \ $(webidl_base)/CSS2PropertiesProps.h \ $(srcdir)/GenerateCSS2PropertiesWebIDL.py \ $(GLOBAL_DEPS) $(CPP) $(DEFINES) $(ACDEFINES) -I$(topsrcdir)/layout/style $(webidl_base)/CSS2PropertiesProps.h | \ PYTHONDONTWRITEBYTECODE=1 $(PYTHON) \ $(srcdir)/GenerateCSS2PropertiesWebIDL.py $(webidl_base)/CSS2Properties.webidl.in > CSS2Properties.webidl $(webidl_files): %: $(webidl_base)/% $(INSTALL) $(IFLAGS1) $(webidl_base)/$* . $(test_webidl_files): %: $(srcdir)/test/% $(INSTALL) $(IFLAGS1) $(srcdir)/test/$* . # We can't easily use PP_TARGETS here because it insists on outputting targets # that look like "$(CURDIR)/foo" whereas we want our target to just be "foo". # Make sure to include $(GLOBAL_DEPS) so we pick up changes to what symbols are # defined. Also make sure to remove $@ before writing to it, because otherwise # if a file goes from non-preprocessed to preprocessed we can end up writing to # a symlink, which will clobber files in the srcdir, which is bad. $(preprocessed_webidl_files): %: $(webidl_base)/% $(GLOBAL_DEPS) $(RM) $@ PYTHONDONTWRITEBYTECODE=1 $(PYTHON) \ $(topsrcdir)/config/Preprocessor.py $(DEFINES) $(ACDEFINES) $(XULPPFLAGS) $(webidl_base)/$* -o $@ # Make is dumb and can get confused between "foo" and "$(CURDIR)/foo". Make # sure that the latter depends on the former, since the latter gets used in .pp # files. all_webidl_files_absolute = $(addprefix $(CURDIR)/,$(all_webidl_files)) $(all_webidl_files_absolute): $(CURDIR)/%: % $(binding_header_files): .BindingGen $(binding_cpp_files): .BindingGen # $(binding_dependency_trackers) pick up additional dependencies via .pp files # The rule: just brings the tracker up to date, if it's out of date, so that # we'll know that we have to redo binding generation and flag this prerequisite # there as being newer than the bindinggen target. $(binding_dependency_trackers): @$(TOUCH) $@ $(globalgen_targets): ParserResults.pkl %-example: .BindingGen PYTHONDONTWRITEBYTECODE=1 $(PYTHON) $(topsrcdir)/config/pythonpath.py \ $(PLY_INCLUDE) -I$(srcdir)/parser \ $(srcdir)/ExampleGen.py \ $(srcdir)/Bindings.conf $* CACHE_DIR = _cache globalgen_dependencies := \ GlobalGen.py \ Bindings.conf \ Configuration.py \ Codegen.py \ parser/WebIDL.py \ ../webidl/WebIDL.mk \ $(all_webidl_files) \ $(CACHE_DIR)/.done \ $(GLOBAL_DEPS) \ $(NULL) $(CACHE_DIR)/.done: $(MKDIR) -p $(CACHE_DIR) @$(TOUCH) $@ # Running GlobalGen.py updates ParserResults.pkl as a side-effect ParserResults.pkl: $(globalgen_dependencies) $(info Generating global WebIDL files) PYTHONDONTWRITEBYTECODE=1 $(PYTHON) $(topsrcdir)/config/pythonpath.py \ $(PLY_INCLUDE) -I$(srcdir)/parser \ $(srcdir)/GlobalGen.py $(srcdir)/Bindings.conf . \ --cachedir=$(CACHE_DIR) \ $(all_webidl_files) $(globalgen_headers_FILES): ParserResults.pkl # Make sure .deps actually exists, since we'll try to write to it from # BindingGen.py but we're typically running in the export phase, which is # before anyone has bothered creating .deps. # Then, pass our long lists through files to try to avoid blowing out the # command line. # Next, BindingGen.py will examine the changed dependency list to figure out # what it really needs to regenerate. # Finally, touch the .BindingGen file so that we don't have to keep redoing # all that until something else actually changes. .BindingGen: $(bindinggen_dependencies) $(binding_dependency_trackers) $(info Generating WebIDL bindings) $(MKDIR) -p .deps echo $(all_webidl_files) > .all-webidl-file-list echo $? > .changed-dependency-list PYTHONDONTWRITEBYTECODE=1 $(PYTHON) $(topsrcdir)/config/pythonpath.py \ $(PLY_INCLUDE) -I$(srcdir)/parser \ $(srcdir)/BindingGen.py \ $(srcdir)/Bindings.conf \ $(CURDIR) \ .all-webidl-file-list \ .changed-dependency-list @$(TOUCH) $@ GARBAGE += \ webidlyacc.py \ parser.out \ $(wildcard *-example.h) \ $(wildcard *-example.cpp) \ .BindingGen \ .all-webidl-file-list \ .changed-dependency-list \ $(binding_dependency_trackers) \ $(NULL) # Make sure all binding header files are created during the export stage, so we # don't have issues with .cpp files being compiled before we've generated the # headers they depend on. This is really only needed for the test files, since # the non-test headers are all exported above anyway. Note that this means that # we do all of our codegen during export. webidl:: $(binding_header_files) .PHONY: webidl distclean:: -$(RM) \ $(binding_header_files) \ $(binding_cpp_files) \ $(all_webidl_files) \ $(globalgen_targets) \ ParserResults.pkl \ $(NULL) # This is only needed to support |make| from this leaf directory/Makefile. NONRECURSIVE_TARGETS := export NONRECURSIVE_TARGETS_export := webidl NONRECURSIVE_TARGETS_export_webidl_DIRECTORY := . NONRECURSIVE_TARGETS_export_webidl_TARGETS := webidl