Bug 868536 - Move ipdl.mk files to moz.build; r=gps
authorMike Shal <mshal@mozilla.com>
Mon, 01 Jul 2013 09:56:28 -0400
changeset 149666 42800e239ff0ce0b7c51214fa462fb45fb45cd3e
parent 149665 56a63eee73b491a465084beefd03057c6a510067
child 149667 8490662688813751fb15783b635b19e9813581d9
push idunknown
push userunknown
push dateunknown
reviewersgps
bugs868536
milestone25.0a1
Bug 868536 - Move ipdl.mk files to moz.build; r=gps Author: Mike Shal <mshal@mozilla.com>
content/media/webspeech/synth/ipc/ipdl.mk
content/media/webspeech/synth/moz.build
dom/bluetooth/ipc/ipdl.mk
dom/bluetooth/moz.build
dom/devicestorage/ipdl.mk
dom/devicestorage/moz.build
dom/indexedDB/ipc/ipdl.mk
dom/indexedDB/ipc/moz.build
dom/ipc/ipdl.mk
dom/ipc/moz.build
dom/mobilemessage/src/ipc/ipdl.mk
dom/mobilemessage/src/moz.build
dom/network/src/ipdl.mk
dom/network/src/moz.build
dom/plugins/ipc/ipdl.mk
dom/plugins/ipc/moz.build
dom/src/storage/ipdl.mk
dom/src/storage/moz.build
gfx/layers/ipc/ipdl.mk
gfx/layers/moz.build
hal/moz.build
hal/sandbox/ipdl.mk
ipc/glue/ipdl.mk
ipc/glue/moz.build
ipc/ipdl/Makefile.in
ipc/ipdl/moz.build
ipc/ipdl/test/cxx/ipdl.mk
ipc/ipdl/test/cxx/moz.build
ipc/testshell/ipdl.mk
ipc/testshell/moz.build
js/ipc/ipdl.mk
js/ipc/moz.build
layout/ipc/ipdl.mk
layout/ipc/moz.build
netwerk/cookie/ipdl.mk
netwerk/cookie/moz.build
netwerk/ipc/ipdl.mk
netwerk/ipc/moz.build
netwerk/protocol/ftp/ipdl.mk
netwerk/protocol/ftp/moz.build
netwerk/protocol/http/ipdl.mk
netwerk/protocol/http/moz.build
netwerk/protocol/websocket/ipdl.mk
netwerk/protocol/websocket/moz.build
netwerk/protocol/wyciwyg/ipdl.mk
netwerk/protocol/wyciwyg/moz.build
python/mozbuild/mozbuild/backend/recursivemake.py
python/mozbuild/mozbuild/frontend/data.py
python/mozbuild/mozbuild/frontend/emitter.py
python/mozbuild/mozbuild/frontend/sandbox_symbols.py
python/mozbuild/mozbuild/test/backend/common.py
python/mozbuild/mozbuild/test/backend/data/ipdl_sources/bar/moz.build
python/mozbuild/mozbuild/test/backend/data/ipdl_sources/foo/moz.build
python/mozbuild/mozbuild/test/backend/data/ipdl_sources/moz.build
python/mozbuild/mozbuild/test/backend/test_recursivemake.py
python/mozbuild/mozbuild/test/frontend/data/ipdl_sources/bar/moz.build
python/mozbuild/mozbuild/test/frontend/data/ipdl_sources/foo/moz.build
python/mozbuild/mozbuild/test/frontend/data/ipdl_sources/moz.build
python/mozbuild/mozbuild/test/frontend/test_emitter.py
uriloader/exthandler/ipdl.mk
uriloader/exthandler/moz.build
uriloader/prefetch/ipdl.mk
uriloader/prefetch/moz.build
deleted file mode 100644
--- a/content/media/webspeech/synth/ipc/ipdl.mk
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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/.
-
-IPDLSRCS = \
-  PSpeechSynthesis.ipdl \
-  PSpeechSynthesisRequest.ipdl \
-  $(NULL)
--- a/content/media/webspeech/synth/moz.build
+++ b/content/media/webspeech/synth/moz.build
@@ -32,8 +32,12 @@ CPP_SOURCES += [
     'SpeechSynthesisChild.cpp',
     'SpeechSynthesisParent.cpp',
     'SpeechSynthesisUtterance.cpp',
     'SpeechSynthesisVoice.cpp',
     'nsSpeechTask.cpp',
     'nsSynthVoiceRegistry.cpp',
 ]
 
+IPDL_SOURCES += [
+    'ipc/PSpeechSynthesis.ipdl',
+    'ipc/PSpeechSynthesisRequest.ipdl',
+]
deleted file mode 100644
--- a/dom/bluetooth/ipc/ipdl.mk
+++ /dev/null
@@ -1,9 +0,0 @@
-# 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/.
-
-IPDLSRCS = \
-  BluetoothTypes.ipdlh \
-  PBluetooth.ipdl \
-  PBluetoothRequest.ipdl \
-  $(NULL)
--- a/dom/bluetooth/moz.build
+++ b/dom/bluetooth/moz.build
@@ -64,8 +64,13 @@ if CONFIG['MOZ_B2G_BT']:
 EXPORTS.mozilla.dom.bluetooth.ipc += [
     'ipc/BluetoothMessageUtils.h',
 ]
 
 EXPORTS.mozilla.dom.bluetooth += [
     'BluetoothCommon.h',
 ]
 
+IPDL_SOURCES += [
+    'ipc/BluetoothTypes.ipdlh',
+    'ipc/PBluetooth.ipdl',
+    'ipc/PBluetoothRequest.ipdl',
+]
deleted file mode 100644
--- a/dom/devicestorage/ipdl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-# 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/.
-
-IPDLSRCS = \
-  PDeviceStorageRequest.ipdl \
-  $(NULL)
--- a/dom/devicestorage/moz.build
+++ b/dom/devicestorage/moz.build
@@ -21,8 +21,11 @@ EXPORTS.mozilla.dom.devicestorage += [
 ]
 
 CPP_SOURCES += [
     'DeviceStorageRequestChild.cpp',
     'DeviceStorageRequestParent.cpp',
     'nsDeviceStorage.cpp',
 ]
 
+IPDL_SOURCES += [
+    'PDeviceStorageRequest.ipdl',
+]
deleted file mode 100644
--- a/dom/indexedDB/ipc/ipdl.mk
+++ /dev/null
@@ -1,14 +0,0 @@
-# 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/.
-
-IPDLSRCS = \
-  PIndexedDB.ipdl \
-  PIndexedDBCursor.ipdl \
-  PIndexedDBDatabase.ipdl \
-  PIndexedDBDeleteDatabaseRequest.ipdl \
-  PIndexedDBIndex.ipdl \
-  PIndexedDBObjectStore.ipdl \
-  PIndexedDBRequest.ipdl \
-  PIndexedDBTransaction.ipdl \
-  $(NULL)
--- a/dom/indexedDB/ipc/moz.build
+++ b/dom/indexedDB/ipc/moz.build
@@ -12,8 +12,19 @@ EXPORTS.mozilla.dom.indexedDB += [
 
 # Need to enable these tests sometime soon.
 #XPCSHELL_TESTS_MANIFESTS += ['unit/xpcshell.ini']
 
 CPP_SOURCES += [
     'IndexedDBChild.cpp',
     'IndexedDBParent.cpp',
 ]
+
+IPDL_SOURCES += [
+    'PIndexedDB.ipdl',
+    'PIndexedDBCursor.ipdl',
+    'PIndexedDBDatabase.ipdl',
+    'PIndexedDBDeleteDatabaseRequest.ipdl',
+    'PIndexedDBIndex.ipdl',
+    'PIndexedDBObjectStore.ipdl',
+    'PIndexedDBRequest.ipdl',
+    'PIndexedDBTransaction.ipdl',
+]
deleted file mode 100644
--- a/dom/ipc/ipdl.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-# 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/.
-
-IPDLSRCS = \
-  DOMTypes.ipdlh \
-  PBlob.ipdl \
-  PBlobStream.ipdl \
-  PBrowser.ipdl \
-  PContent.ipdl \
-  PContentDialog.ipdl \
-  PCrashReporter.ipdl \
-  PDocumentRenderer.ipdl \
-  PContentPermissionRequest.ipdl \
-  PMemoryReportRequest.ipdl \
-  $(NULL)
--- a/dom/ipc/moz.build
+++ b/dom/ipc/moz.build
@@ -52,8 +52,20 @@ CPP_SOURCES += [
     'ProcessPriorityManager.cpp',
     'StructuredCloneUtils.cpp',
     'TabParent.cpp',
     'TabChild.cpp',
     'TabContext.cpp',
     'TabMessageUtils.cpp',
 ]
 
+IPDL_SOURCES += [
+    'DOMTypes.ipdlh',
+    'PBlob.ipdl',
+    'PBlobStream.ipdl',
+    'PBrowser.ipdl',
+    'PContent.ipdl',
+    'PContentDialog.ipdl',
+    'PContentPermissionRequest.ipdl',
+    'PCrashReporter.ipdl',
+    'PDocumentRenderer.ipdl',
+    'PMemoryReportRequest.ipdl',
+]
deleted file mode 100644
--- a/dom/mobilemessage/src/ipc/ipdl.mk
+++ /dev/null
@@ -1,10 +0,0 @@
-# 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/.
-
-IPDLSRCS = \
-  SmsTypes.ipdlh \
-  PSms.ipdl \
-  PSmsRequest.ipdl \
-  PMobileMessageCursor.ipdl \
-  $(NULL)
--- a/dom/mobilemessage/src/moz.build
+++ b/dom/mobilemessage/src/moz.build
@@ -61,8 +61,14 @@ CPP_SOURCES += [
     'SmsManager.cpp',
     'SmsMessage.cpp',
     'SmsParent.cpp',
     'SmsSegmentInfo.cpp',
     'SmsService.cpp',
     'SmsServicesFactory.cpp',
 ]
 
+IPDL_SOURCES += [
+    'ipc/PMobileMessageCursor.ipdl',
+    'ipc/PSms.ipdl',
+    'ipc/PSmsRequest.ipdl',
+    'ipc/SmsTypes.ipdlh',
+]
deleted file mode 100644
--- a/dom/network/src/ipdl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-# 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/.
-
-IPDLSRCS = \
-  PTCPSocket.ipdl \
-  $(NULL)
--- a/dom/network/src/moz.build
+++ b/dom/network/src/moz.build
@@ -34,8 +34,12 @@ EXTRA_COMPONENTS += [
     'TCPSocketParentIntermediary.js',
 ]
 
 if CONFIG['MOZ_B2G_RIL']:
     EXTRA_COMPONENTS += [
         'NetworkStatsManager.js',
         'NetworkStatsManager.manifest',
     ]
+
+IPDL_SOURCES += [
+    'PTCPSocket.ipdl',
+]
deleted file mode 100644
--- a/dom/plugins/ipc/ipdl.mk
+++ /dev/null
@@ -1,15 +0,0 @@
-# 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/.
-
-IPDLSRCS = \
-  PPluginBackgroundDestroyer.ipdl \
-  PPluginModule.ipdl \
-  PPluginIdentifier.ipdl \
-  PPluginInstance.ipdl \
-  PPluginScriptableObject.ipdl \
-  PBrowserStream.ipdl \
-  PPluginStream.ipdl \
-  PStreamNotify.ipdl \
-  PPluginSurface.ipdl \
-  $(NULL)
--- a/dom/plugins/ipc/moz.build
+++ b/dom/plugins/ipc/moz.build
@@ -80,14 +80,25 @@ CPP_SOURCES += [
     'PluginProcessChild.cpp',
     'PluginProcessParent.cpp',
     'PluginScriptableObjectChild.cpp',
     'PluginScriptableObjectParent.cpp',
     'PluginStreamChild.cpp',
     'PluginStreamParent.cpp',
 ]
 
-
 if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
     CMMSRCS += [
         'PluginInterposeOSX.mm',
         'PluginUtilsOSX.mm',
     ]
+
+IPDL_SOURCES += [
+    'PBrowserStream.ipdl',
+    'PPluginBackgroundDestroyer.ipdl',
+    'PPluginIdentifier.ipdl',
+    'PPluginInstance.ipdl',
+    'PPluginModule.ipdl',
+    'PPluginScriptableObject.ipdl',
+    'PPluginStream.ipdl',
+    'PPluginSurface.ipdl',
+    'PStreamNotify.ipdl',
+]
deleted file mode 100644
--- a/dom/src/storage/ipdl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-# 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/.
-
-IPDLSRCS = \
-  PStorage.ipdl \
-  $(NULL)
--- a/dom/src/storage/moz.build
+++ b/dom/src/storage/moz.build
@@ -14,8 +14,11 @@ CPP_SOURCES += [
     'DOMStorage.cpp',
     'DOMStorageCache.cpp',
     'DOMStorageDBThread.cpp',
     'DOMStorageIPC.cpp',
     'DOMStorageManager.cpp',
     'DOMStorageObserver.cpp',
 ]
 
+IPDL_SOURCES += [
+    'PStorage.ipdl',
+]
deleted file mode 100644
--- a/gfx/layers/ipc/ipdl.mk
+++ /dev/null
@@ -1,14 +0,0 @@
-# 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/.
-
-IPDLSRCS = \
-  LayersSurfaces.ipdlh \
-  LayerTransaction.ipdlh \
-  PCompositable.ipdl \
-  PCompositor.ipdl \
-  PGrallocBuffer.ipdl \
-  PImageBridge.ipdl \
-  PLayer.ipdl \
-  PLayerTransaction.ipdl \
-  $(NULL)
--- a/gfx/layers/moz.build
+++ b/gfx/layers/moz.build
@@ -243,8 +243,18 @@ CPP_SOURCES += [
     'ThebesLayerBuffer.cpp',
     'ThebesLayerComposite.cpp',
     'ThebesLayerOGL.cpp',
     'TiledContentClient.cpp',
     'TiledContentHost.cpp',
     'YCbCrImageDataSerializer.cpp',
 ]
 
+IPDL_SOURCES = [
+    'ipc/LayerTransaction.ipdlh',
+    'ipc/LayersSurfaces.ipdlh',
+    'ipc/PCompositable.ipdl',
+    'ipc/PCompositor.ipdl',
+    'ipc/PGrallocBuffer.ipdl',
+    'ipc/PImageBridge.ipdl',
+    'ipc/PLayer.ipdl',
+    'ipc/PLayerTransaction.ipdl',
+]
--- a/hal/moz.build
+++ b/hal/moz.build
@@ -140,8 +140,12 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] != 'andr
         'FallbackNetwork.cpp'
     ]
 
 if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
     CMMSRCS += [
         'CocoaSensor.mm',
         'smslib.mm',
     ]
+
+IPDL_SOURCES = [
+    'sandbox/PHal.ipdl',
+]
deleted file mode 100644
--- a/hal/sandbox/ipdl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-# 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/.
-
-IPDLSRCS = \
-  PHal.ipdl \
-  $(NULL)
deleted file mode 100644
--- a/ipc/glue/ipdl.mk
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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/.
-
-IPDLSRCS = \
-  InputStreamParams.ipdlh \
-  URIParams.ipdlh \
-  $(NULL)
--- a/ipc/glue/moz.build
+++ b/ipc/glue/moz.build
@@ -91,8 +91,12 @@ CPP_SOURCES += [
     'ScopedXREEmbed.cpp',
     'SharedMemory.cpp',
     'Shmem.cpp',
     'StringUtil.cpp',
     'SyncChannel.cpp',
     'URIUtils.cpp',
 ]
 
+IPDL_SOURCES = [
+    'InputStreamParams.ipdlh',
+    'URIParams.ipdlh',
+]
--- a/ipc/ipdl/Makefile.in
+++ b/ipc/ipdl/Makefile.in
@@ -12,64 +12,18 @@ include $(DEPTH)/config/autoconf.mk
 GARBAGE_DIRS += _ipdlheaders
 GARBAGE += ipdl_lextab.py ipdl_yacctab.py $(wildcard *.pyc $(srcdir)/ipdl/*.pyc $(srcdir)/ipdl/cxx/*.pyc)
 
 LIBRARY_NAME = mozipdlgen_s
 FORCE_STATIC_LIB = 1
 LIBXUL_LIBRARY = 1
 EXPORT_LIBRARY = 1
 
-##-----------------------------------------------------------------------------
-## When you add IPDL files to a source directory, list the directory here.
-##
-IPDLDIRS =  \
-  uriloader/exthandler \
-  content/media/webspeech/synth/ipc \
-  dom/devicestorage \
-  dom/indexedDB/ipc \
-  dom/bluetooth/ipc \
-  dom/plugins/ipc  \
-  dom/ipc \
-  dom/mobilemessage/src/ipc \
-  dom/src/storage \
-  dom/network/src \
-  gfx/layers/ipc \
-  hal/sandbox \
-  ipc/glue  \
-  ipc/testshell  \
-  js/ipc  \
-  layout/ipc \
-  netwerk/ipc  \
-  netwerk/protocol/ftp \
-  netwerk/protocol/http  \
-  netwerk/protocol/wyciwyg \
-  netwerk/protocol/websocket \
-  netwerk/cookie  \
-  uriloader/prefetch  \
-  $(NULL)
-
-ifdef MOZ_IPDL_TESTS #{
-IPDLDIRS += ipc/ipdl/test/cxx
-endif #}
-##-----------------------------------------------------------------------------
-
-vpath %.ipdl $(topsrcdir)
-vpath %.ipdlh $(topsrcdir)
-
-define ADD_IPDLDIR
-include $(topsrcdir)/$(IPDLDIR)/ipdl.mk
-ALL_IPDLSRCS += $$(IPDLSRCS:%=$(IPDLDIR)/%)
-PROTOCOLS += $$(IPDLSRCS)
-endef
-
-ALL_IPDLSRCS :=
-PROTOCOLS :=
-
-$(foreach IPDLDIR,$(IPDLDIRS),$(eval $(ADD_IPDLDIR)))
-
+# This file is generated by the moz.build backend.
+include ipdlsrcs.mk
 
 GARBAGE += $(CPPSRCS)
 
 LOCAL_INCLUDES += -I$(DEPTH)/ipc/ipdl/_ipdlheaders
 
 
 include $(topsrcdir)/config/config.mk
 include $(topsrcdir)/ipc/chromium/chromium-config.mk
@@ -79,14 +33,14 @@ include $(topsrcdir)/config/rules.mk
 # NB: the IPDL compiler manages .ipdl-->.h/.cpp dependencies itself,
 # which is why we don't have explicit .h/.cpp targets here
 export:: $(ALL_IPDLSRCS)
 	$(PYTHON) $(topsrcdir)/config/pythonpath.py \
 	  $(PLY_INCLUDE) \
 	  $(srcdir)/ipdl.py \
 	  --outheaders-dir=_ipdlheaders \
 	  --outcpp-dir=. \
-	  $(IPDLDIRS:%=-I$(topsrcdir)/%) \
+	  $(IPDLDIRS:%=-I%) \
 	  $^
 
 # We #include some things in the dom/plugins/ directory that rely on
 # toolkit libraries.
 CXXFLAGS    += $(TK_CFLAGS)
--- a/ipc/ipdl/moz.build
+++ b/ipc/ipdl/moz.build
@@ -3,16 +3,8 @@
 # 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/.
 
 if CONFIG['MOZ_IPDL_TESTS']:
     DIRS += ['test']
 
 MODULE = 'ipdlgen'
-
-CPP_SOURCES += [
-    '$(PROTOCOLS:%.ipdl=%.cpp)',
-    '$(PROTOCOLS:%.ipdl=%Child.cpp)',
-    '$(PROTOCOLS:%.ipdl=%Parent.cpp)',
-    '$(PROTOCOLS:%.ipdlh=%.cpp)',
-]
-
deleted file mode 100644
--- a/ipc/ipdl/test/cxx/ipdl.mk
+++ /dev/null
@@ -1,57 +0,0 @@
-IPDLSRCS =					\
-  PTestActorPunning.ipdl			\
-  PTestActorPunningPunned.ipdl			\
-  PTestActorPunningSub.ipdl			\
-  PTestBridgeMain.ipdl				\
-  PTestBridgeSub.ipdl				\
-  PTestBridgeMainSub.ipdl			\
-  PTestCrashCleanup.ipdl			\
-  PTestDataStructures.ipdl			\
-  PTestDataStructuresCommon.ipdlh		\
-  PTestDataStructuresSub.ipdl			\
-  PTestDesc.ipdl				\
-  PTestDescSub.ipdl				\
-  PTestDescSubsub.ipdl				\
-  PTestFailedCtor.ipdl				\
-  PTestFailedCtorSub.ipdl			\
-  PTestFailedCtorSubsub.ipdl			\
-  PTestHandle.ipdl				\
-  PTestHangs.ipdl				\
-  PTestJSON.ipdl				\
-  PTestLatency.ipdl				\
-  PTestManyChildAllocs.ipdl			\
-  PTestManyChildAllocsSub.ipdl			\
-  PTestMultiMgrs.ipdl				\
-  PTestMultiMgrsLeft.ipdl			\
-  PTestMultiMgrsRight.ipdl			\
-  PTestMultiMgrsBottom.ipdl			\
-  PTestNestedLoops.ipdl				\
-  PTestOpens.ipdl				\
-  PTestOpensOpened.ipdl				\
-  PTestRaceDeferral.ipdl			\
-  PTestRacyReentry.ipdl				\
-  PTestRacyRPCReplies.ipdl			\
-  PTestRacyUndefer.ipdl				\
-  PTestRPCErrorCleanup.ipdl			\
-  PTestRPCRaces.ipdl				\
-  PTestRPCShutdownRace.ipdl			\
-  PTestSanity.ipdl				\
-  PTestSelfManage.ipdl				\
-  PTestSelfManageRoot.ipdl			\
-  PTestShmem.ipdl				\
-  PTestShutdown.ipdl				\
-  PTestShutdownSub.ipdl				\
-  PTestShutdownSubsub.ipdl			\
-  PTestStackHooks.ipdl				\
-  PTestSyncError.ipdl                           \
-  PTestSyncHang.ipdl                            \
-  PTestSyncWakeup.ipdl				\
-  PTestSysVShmem.ipdl				\
-  PTestBadActor.ipdl                            \
-  PTestBadActorSub.ipdl                         \
-  PTestUrgency.ipdl \
-  PTestIndirectProtocolParam.ipdlh	        \
-  PTestIndirectProtocolParamManage.ipdl         \
-  PTestIndirectProtocolParamFirst.ipdl	        \
-  PTestIndirectProtocolParamSecond.ipdl	        \
-  $(NULL)
--- a/ipc/ipdl/test/cxx/moz.build
+++ b/ipc/ipdl/test/cxx/moz.build
@@ -17,8 +17,65 @@ EXPORTS.mozilla._ipdltest += [
 
 CPP_SOURCES += [
     '$(IPDLTESTSRCS)',
     'IPDLUnitTestProcessChild.cpp',
     'IPDLUnitTestSubprocess.cpp',
     'IPDLUnitTests.cpp',
 ]
 
+IPDL_SOURCES += [
+    'PTestActorPunning.ipdl',
+    'PTestActorPunningPunned.ipdl',
+    'PTestActorPunningSub.ipdl',
+    'PTestBadActor.ipdl',
+    'PTestBadActorSub.ipdl',
+    'PTestBridgeMain.ipdl',
+    'PTestBridgeMainSub.ipdl',
+    'PTestBridgeSub.ipdl',
+    'PTestCrashCleanup.ipdl',
+    'PTestDataStructures.ipdl',
+    'PTestDataStructuresCommon.ipdlh',
+    'PTestDataStructuresSub.ipdl',
+    'PTestDesc.ipdl',
+    'PTestDescSub.ipdl',
+    'PTestDescSubsub.ipdl',
+    'PTestFailedCtor.ipdl',
+    'PTestFailedCtorSub.ipdl',
+    'PTestFailedCtorSubsub.ipdl',
+    'PTestHandle.ipdl',
+    'PTestHangs.ipdl',
+    'PTestIndirectProtocolParam.ipdlh',
+    'PTestIndirectProtocolParamFirst.ipdl',
+    'PTestIndirectProtocolParamManage.ipdl',
+    'PTestIndirectProtocolParamSecond.ipdl',
+    'PTestJSON.ipdl',
+    'PTestLatency.ipdl',
+    'PTestManyChildAllocs.ipdl',
+    'PTestManyChildAllocsSub.ipdl',
+    'PTestMultiMgrs.ipdl',
+    'PTestMultiMgrsBottom.ipdl',
+    'PTestMultiMgrsLeft.ipdl',
+    'PTestMultiMgrsRight.ipdl',
+    'PTestNestedLoops.ipdl',
+    'PTestOpens.ipdl',
+    'PTestOpensOpened.ipdl',
+    'PTestRPCErrorCleanup.ipdl',
+    'PTestRPCRaces.ipdl',
+    'PTestRPCShutdownRace.ipdl',
+    'PTestRaceDeferral.ipdl',
+    'PTestRacyRPCReplies.ipdl',
+    'PTestRacyReentry.ipdl',
+    'PTestRacyUndefer.ipdl',
+    'PTestSanity.ipdl',
+    'PTestSelfManage.ipdl',
+    'PTestSelfManageRoot.ipdl',
+    'PTestShmem.ipdl',
+    'PTestShutdown.ipdl',
+    'PTestShutdownSub.ipdl',
+    'PTestShutdownSubsub.ipdl',
+    'PTestStackHooks.ipdl',
+    'PTestSyncError.ipdl',
+    'PTestSyncHang.ipdl',
+    'PTestSyncWakeup.ipdl',
+    'PTestSysVShmem.ipdl',
+    'PTestUrgency.ipdl',
+]
deleted file mode 100644
--- a/ipc/testshell/ipdl.mk
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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/.
-
-IPDLSRCS = \
-  PTestShell.ipdl \
-  PTestShellCommand.ipdl \
-  $(NULL)
--- a/ipc/testshell/moz.build
+++ b/ipc/testshell/moz.build
@@ -16,8 +16,13 @@ EXPORTS.mozilla.ipc += [
 if CONFIG['OS_ARCH'] != 'Darwin':
     XPCSHELL_TESTS_MANIFESTS += ['tests/xpcshell.ini']
 
 CPP_SOURCES += [
     'TestShellChild.cpp',
     'TestShellParent.cpp',
     'XPCShellEnvironment.cpp',
 ]
+
+IPDL_SOURCES = [
+    'PTestShell.ipdl',
+    'PTestShellCommand.ipdl',
+]
deleted file mode 100644
--- a/js/ipc/ipdl.mk
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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/.
-
-IPDLSRCS = \
-  JavaScriptTypes.ipdlh \
-  PJavaScript.ipdl \
-  $(NULL)
--- a/js/ipc/moz.build
+++ b/js/ipc/moz.build
@@ -7,8 +7,12 @@
 MODULE = 'js'
 
 CPP_SOURCES += [
     'JavaScriptChild.cpp',
     'JavaScriptParent.cpp',
     'JavaScriptShared.cpp',
 ]
 
+IPDL_SOURCES += [
+    'JavaScriptTypes.ipdlh',
+    'PJavaScript.ipdl',
+]
deleted file mode 100644
--- a/layout/ipc/ipdl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-# 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/.
-
-IPDLSRCS = \
-  PRenderFrame.ipdl \
-  $(NULL)
--- a/layout/ipc/moz.build
+++ b/layout/ipc/moz.build
@@ -12,8 +12,11 @@ EXPORTS.mozilla.layout += [
     'RenderFrameUtils.h',
 ]
 
 CPP_SOURCES += [
     'RenderFrameChild.cpp',
     'RenderFrameParent.cpp',
 ]
 
+IPDL_SOURCES = [
+    'PRenderFrame.ipdl',
+]
deleted file mode 100644
--- a/netwerk/cookie/ipdl.mk
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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/.
-
-IPDLSRCS =            \
-  PCookieService.ipdl \
-  $(NULL)
-
--- a/netwerk/cookie/moz.build
+++ b/netwerk/cookie/moz.build
@@ -30,8 +30,12 @@ if CONFIG['NECKO_COOKIES']:
     ]
 
 if CONFIG['NECKO_COOKIES']:
     XPCSHELL_TESTS_MANIFESTS += ['test/unit/xpcshell.ini']
 
 # FIXME/bug 575918: out-of-process xpcshell is broken on OS X
 if CONFIG['NECKO_COOKIES'] and CONFIG['OS_ARCH'] != 'Darwin':
     XPCSHELL_TESTS_MANIFESTS += ['test/unit_ipc/xpcshell.ini']
+
+IPDL_SOURCES = [
+    'PCookieService.ipdl',
+]
deleted file mode 100644
--- a/netwerk/ipc/ipdl.mk
+++ /dev/null
@@ -1,10 +0,0 @@
-# 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/.
-
-IPDLSRCS =          \
-  PNecko.ipdl       \
-  PRemoteOpenFile.ipdl \
-  NeckoChannelParams.ipdlh \
-  $(NULL)
-
--- a/netwerk/ipc/moz.build
+++ b/netwerk/ipc/moz.build
@@ -26,8 +26,13 @@ CPP_SOURCES += [
     'ChannelEventQueue.cpp',
     'NeckoChild.cpp',
     'NeckoCommon.cpp',
     'NeckoParent.cpp',
     'RemoteOpenFileChild.cpp',
     'RemoteOpenFileParent.cpp',
 ]
 
+IPDL_SOURCES = [
+    'NeckoChannelParams.ipdlh',
+    'PNecko.ipdl',
+    'PRemoteOpenFile.ipdl',
+]
deleted file mode 100644
--- a/netwerk/protocol/ftp/ipdl.mk
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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/.
-
-IPDLSRCS =         \
-  PFTPChannel.ipdl \
-  $(NULL)
-
--- a/netwerk/protocol/ftp/moz.build
+++ b/netwerk/protocol/ftp/moz.build
@@ -25,8 +25,11 @@ CPP_SOURCES += [
     'FTPChannelChild.cpp',
     'FTPChannelParent.cpp',
     'nsFTPChannel.cpp',
     'nsFtpConnectionThread.cpp',
     'nsFtpControlConnection.cpp',
     'nsFtpProtocolHandler.cpp',
 ]
 
+IPDL_SOURCES += [
+    'PFTPChannel.ipdl',
+]
deleted file mode 100644
--- a/netwerk/protocol/http/ipdl.mk
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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/.
-
-IPDLSRCS =          \
-  PHttpChannel.ipdl \
-  $(NULL)
-
--- a/netwerk/protocol/http/moz.build
+++ b/netwerk/protocol/http/moz.build
@@ -72,11 +72,14 @@ CPP_SOURCES += [
     'nsHttpHeaderArray.cpp',
     'nsHttpNTLMAuth.cpp',
     'nsHttpPipeline.cpp',
     'nsHttpRequestHead.cpp',
     'nsHttpResponseHead.cpp',
     'nsHttpTransaction.cpp',
 ]
 
+IPDL_SOURCES += [
+    'PHttpChannel.ipdl',
+]
 EXTRA_JS_MODULES += [
     'UserAgentOverrides.jsm',
 ]
deleted file mode 100644
--- a/netwerk/protocol/websocket/ipdl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-# 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/.
-
-IPDLSRCS =        \
-  PWebSocket.ipdl \
-  $(NULL)
--- a/netwerk/protocol/websocket/moz.build
+++ b/netwerk/protocol/websocket/moz.build
@@ -22,8 +22,11 @@ EXPORTS.mozilla.net += [
 
 CPP_SOURCES += [
     'BaseWebSocketChannel.cpp',
     'WebSocketChannel.cpp',
     'WebSocketChannelChild.cpp',
     'WebSocketChannelParent.cpp',
 ]
 
+IPDL_SOURCES += [
+    'PWebSocket.ipdl',
+]
deleted file mode 100644
--- a/netwerk/protocol/wyciwyg/ipdl.mk
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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/.
-
-IPDLSRCS =          \
-  PWyciwygChannel.ipdl \
-  $(NULL)
-
--- a/netwerk/protocol/wyciwyg/moz.build
+++ b/netwerk/protocol/wyciwyg/moz.build
@@ -24,8 +24,11 @@ EXPORTS.mozilla.net += [
 CPP_SOURCES += [
     'WyciwygChannelChild.cpp',
     'WyciwygChannelParent.cpp',
     'nsWyciwyg.cpp',
     'nsWyciwygChannel.cpp',
     'nsWyciwygProtocolHandler.cpp',
 ]
 
+IPDL_SOURCES += [
+    'PWyciwygChannel.ipdl',
+]
--- a/python/mozbuild/mozbuild/backend/recursivemake.py
+++ b/python/mozbuild/mozbuild/backend/recursivemake.py
@@ -4,23 +4,25 @@
 
 from __future__ import unicode_literals
 
 import errno
 import logging
 import os
 import types
 
+import mozpack.path
 from mozpack.copier import FilePurger
 from mozpack.manifests import PurgeManifest
 
 from .base import BuildBackend
 from ..frontend.data import (
     ConfigFileSubstitution,
     DirectoryTraversal,
+    IPDLFile,
     SandboxDerived,
     VariablePassthru,
     Exports,
     Program,
     XpcshellManifests,
 )
 from ..util import FileAvoidWrite
 
@@ -105,16 +107,17 @@ class RecursiveMakeBackend(BuildBackend)
 
     This backend may eventually evolve to write out non-recursive make files.
     However, as long as there are Makefile.in files in the tree, we are tied to
     recursive make and thus will need this backend.
     """
 
     def _init(self):
         self._backend_files = {}
+        self._ipdl_sources = set()
 
         self.summary.managed_count = 0
         self.summary.created_count = 0
         self.summary.updated_count = 0
         self.summary.unchanged_count = 0
 
         def detailed(summary):
             return '{:d} total backend files. {:d} created; {:d} updated; {:d} unchanged'.format(
@@ -172,16 +175,19 @@ class RecursiveMakeBackend(BuildBackend)
                     for item in v:
                         backend_file.write('%s += %s\n' % (k, item))
 
                 else:
                     backend_file.write('%s := %s\n' % (k, v))
         elif isinstance(obj, Exports):
             self._process_exports(obj.exports, backend_file)
 
+        elif isinstance(obj, IPDLFile):
+            self._ipdl_sources.add(mozpack.path.join(obj.srcdir, obj.basename))
+
         elif isinstance(obj, Program):
             self._process_program(obj.program, backend_file)
 
         elif isinstance(obj, XpcshellManifests):
             self._process_xpcshell_manifests(obj, backend_file)
 
         self._backend_files[obj.srcdir] = backend_file
 
@@ -229,16 +235,38 @@ class RecursiveMakeBackend(BuildBackend)
                 aw = FileAvoidWrite(makefile)
                 aw.write(STUB_MAKEFILE.format(**params))
                 self._update_from_avoid_write(aw.close())
                 self.summary.managed_count += 1
 
             self._update_from_avoid_write(bf.close())
             self.summary.managed_count += 1
 
+
+        # Write out a master list of all IPDL source files.
+        ipdls = FileAvoidWrite(os.path.join(self.environment.topobjdir,
+            'ipc', 'ipdl', 'ipdlsrcs.mk'))
+        for p in sorted(self._ipdl_sources):
+            ipdls.write('ALL_IPDLSRCS += %s\n' % p)
+            base = os.path.basename(p)
+            root, ext = os.path.splitext(base)
+
+            # Both .ipdl and .ipdlh become .cpp files
+            ipdls.write('CPPSRCS += %s.cpp\n' % root)
+            if ext == '.ipdl':
+                # .ipdl also becomes Child/Parent.cpp files
+                ipdls.write('CPPSRCS += %sChild.cpp\n' % root)
+                ipdls.write('CPPSRCS += %sParent.cpp\n' % root)
+
+        ipdls.write('IPDLDIRS := %s\n' % ' '.join(sorted(set(os.path.dirname(p)
+            for p in self._ipdl_sources))))
+
+        self._update_from_avoid_write(ipdls.close())
+        self.summary.managed_count += 1
+
         # Write out a dependency file used to determine whether a config.status
         # re-run is needed.
         backend_built_path = os.path.join(self.environment.topobjdir,
             'backend.%s.built' % self.__class__.__name__).replace(os.sep, '/')
         backend_deps = FileAvoidWrite('%s.pp' % backend_built_path)
         inputs = sorted(p.replace(os.sep, '/') for p in self.backend_input_files)
 
         # We need to use $(DEPTH) so the target here matches what's in
--- a/python/mozbuild/mozbuild/frontend/data.py
+++ b/python/mozbuild/mozbuild/frontend/data.py
@@ -144,16 +144,28 @@ class Exports(SandboxDerived):
     HierarchicalStringList, which is created when parsing EXPORTS.
     """
     __slots__ = ('exports')
 
     def __init__(self, sandbox, exports):
         SandboxDerived.__init__(self, sandbox)
         self.exports = exports
 
+class IPDLFile(SandboxDerived):
+    """Describes an individual .ipdl source file."""
+
+    __slots__ = (
+        'basename',
+    )
+
+    def __init__(self, sandbox, path):
+        SandboxDerived.__init__(self, sandbox)
+
+        self.basename = path
+
 class Program(SandboxDerived):
     """Sandbox container object for PROGRAM, which is a unicode string.
 
     This class handles automatically appending BIN_SUFFIX to the PROGRAM value.
     If BIN_SUFFIX is not defined, PROGRAM is unchanged.
     Otherwise, if PROGRAM ends in BIN_SUFFIX, it is unchanged
     Otherwise, BIN_SUFFIX is appended to PROGRAM
     """
--- a/python/mozbuild/mozbuild/frontend/emitter.py
+++ b/python/mozbuild/mozbuild/frontend/emitter.py
@@ -5,16 +5,17 @@
 from __future__ import unicode_literals
 
 import os
 
 from .data import (
     ConfigFileSubstitution,
     DirectoryTraversal,
     Exports,
+    IPDLFile,
     Program,
     ReaderSummary,
     VariablePassthru,
     XpcshellManifests,
 )
 
 from .reader import MozbuildSandbox
 
@@ -118,16 +119,19 @@ class TreeMetadataEmitter(object):
 
         program = sandbox.get('PROGRAM')
         if program:
             yield Program(sandbox, program, sandbox['CONFIG']['BIN_SUFFIX'])
 
         for manifest in sandbox.get('XPCSHELL_TESTS_MANIFESTS', []):
             yield XpcshellManifests(sandbox, manifest)
 
+        for ipdl in sandbox.get('IPDL_SOURCES', []):
+            yield IPDLFile(sandbox, ipdl)
+
     def _emit_directory_traversal_from_sandbox(self, sandbox):
         o = DirectoryTraversal(sandbox)
         o.dirs = sandbox.get('DIRS', [])
         o.parallel_dirs = sandbox.get('PARALLEL_DIRS', [])
         o.tool_dirs = sandbox.get('TOOL_DIRS', [])
         o.test_dirs = sandbox.get('TEST_DIRS', [])
         o.test_tool_dirs = sandbox.get('TEST_TOOL_DIRS', [])
         o.external_make_dirs = sandbox.get('EXTERNAL_MAKE_DIRS', [])
--- a/python/mozbuild/mozbuild/frontend/sandbox_symbols.py
+++ b/python/mozbuild/mozbuild/frontend/sandbox_symbols.py
@@ -336,16 +336,22 @@ VARIABLES = {
     'XPIDL_FLAGS': (list, list, [],
         """XPCOM Interface Definition Module Flags.
 
         This is a list of extra flags that are passed to the IDL compiler.
         Typically this is a set of -I flags that denote extra include
         directories to search for included .idl files.
         """),
 
+    'IPDL_SOURCES': (StrictOrderingOnAppendList, list, [],
+        """IPDL source files.
+
+        These are .ipdl files that will be parsed and converted to .cpp files.
+        """),
+
     'XPCSHELL_TESTS_MANIFESTS': (StrictOrderingOnAppendList, list, [],
         """XPCSHELL Test Manifest list
 
         This is a list of xpcshell.ini manifest files.
         Formerly XPCSHELL_TESTS=
         """),
 }
 
--- a/python/mozbuild/mozbuild/test/backend/common.py
+++ b/python/mozbuild/mozbuild/test/backend/common.py
@@ -65,16 +65,21 @@ CONFIGS = {
     },
     'xpcshell_manifests': {
         'defines': [],
         'non_global_defines': [],
         'substs': [
             ('XPCSHELL_TESTS_MANIFESTS', 'XPCSHELL_TESTS'),
             ],
     },
+    'ipdl_sources': {
+        'defines': [],
+        'non_global_defines': [],
+        'substs': [],
+    },
 }
 
 
 class BackendTester(unittest.TestCase):
     def _get_environment(self, name):
         """Obtain a new instance of a ConfigEnvironment for a known profile.
 
         A new temporary object directory is created for the environment. The
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/backend/data/ipdl_sources/bar/moz.build
@@ -0,0 +1,10 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+IPDL_SOURCES += [
+    'bar.ipdl',
+    'bar2.ipdlh',
+]
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/backend/data/ipdl_sources/foo/moz.build
@@ -0,0 +1,10 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+IPDL_SOURCES += [
+    'foo.ipdl',
+    'foo2.ipdlh',
+]
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/backend/data/ipdl_sources/moz.build
@@ -0,0 +1,10 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+DIRS += [
+    'bar',
+    'foo',
+]
--- a/python/mozbuild/mozbuild/test/backend/test_recursivemake.py
+++ b/python/mozbuild/mozbuild/test/backend/test_recursivemake.py
@@ -312,11 +312,38 @@ class TestRecursiveMakeBackend(BackendTe
         os.makedirs(purge_dir)
         m = PurgeManifest()
         m.write_file(manifest_path)
 
         self.assertTrue(os.path.exists(manifest_path))
         self._consume('stub0', RecursiveMakeBackend, env)
         self.assertFalse(os.path.exists(manifest_path))
 
+    def test_ipdl_sources(self):
+        """Test that IPDL_SOURCES are written to ipdlsrcs.mk correctly."""
+        env = self._consume('ipdl_sources', RecursiveMakeBackend)
+
+        manifest_path = os.path.join(env.topobjdir,
+            'ipc', 'ipdl', 'ipdlsrcs.mk')
+        lines = [l.strip() for l in open(manifest_path, 'rt').readlines()]
+
+        # Handle Windows paths correctly
+        topsrcdir = env.topsrcdir.replace(os.sep, '/')
+
+        expected = [
+            "ALL_IPDLSRCS += %s/bar/bar.ipdl" % topsrcdir,
+            "CPPSRCS += bar.cpp",
+            "CPPSRCS += barChild.cpp",
+            "CPPSRCS += barParent.cpp",
+            "ALL_IPDLSRCS += %s/bar/bar2.ipdlh" % topsrcdir,
+            "CPPSRCS += bar2.cpp",
+            "ALL_IPDLSRCS += %s/foo/foo.ipdl" % topsrcdir,
+            "CPPSRCS += foo.cpp",
+            "CPPSRCS += fooChild.cpp",
+            "CPPSRCS += fooParent.cpp",
+            "ALL_IPDLSRCS += %s/foo/foo2.ipdlh" % topsrcdir,
+            "CPPSRCS += foo2.cpp",
+            "IPDLDIRS := %s/bar %s/foo" % (topsrcdir, topsrcdir),
+        ]
+        self.assertEqual(lines, expected)
 
 if __name__ == '__main__':
     main()
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/frontend/data/ipdl_sources/bar/moz.build
@@ -0,0 +1,10 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+IPDL_SOURCES += [
+    'bar.ipdl',
+    'bar2.ipdlh',
+]
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/frontend/data/ipdl_sources/foo/moz.build
@@ -0,0 +1,10 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+IPDL_SOURCES += [
+    'foo.ipdl',
+    'foo2.ipdlh',
+]
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/frontend/data/ipdl_sources/moz.build
@@ -0,0 +1,10 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+DIRS += [
+    'bar',
+    'foo',
+]
--- a/python/mozbuild/mozbuild/test/frontend/test_emitter.py
+++ b/python/mozbuild/mozbuild/test/frontend/test_emitter.py
@@ -12,16 +12,17 @@ from mozunit import main
 from mozbuild.frontend.data import (
     ConfigFileSubstitution,
     DirectoryTraversal,
     ReaderSummary,
     VariablePassthru,
     Exports,
     Program,
     XpcshellManifests,
+    IPDLFile,
 )
 from mozbuild.frontend.emitter import TreeMetadataEmitter
 from mozbuild.frontend.reader import BuildReader
 
 from mozbuild.test.common import MockConfig
 
 
 data_path = os.path.abspath(os.path.dirname(__file__))
@@ -217,10 +218,28 @@ class TestEmitterBasic(unittest.TestCase
             'bar/xpcshell.ini',
             'enabled_var/xpcshell.ini',
             'foo/xpcshell.ini',
             'tans/xpcshell.ini',
             ]
 
         self.assertEqual(sorted(inis), iniByDir)
 
+    def test_ipdl_sources(self):
+        reader = self.reader('ipdl_sources')
+        objs = self.read_topsrcdir(reader)
+
+        ipdls = []
+        for o in objs:
+            if isinstance(o, IPDLFile):
+                ipdls.append('%s/%s' % (o.relativedir, o.basename))
+
+        expected = [
+            'bar/bar.ipdl',
+            'bar/bar2.ipdlh',
+            'foo/foo.ipdl',
+            'foo/foo2.ipdlh',
+        ]
+
+        self.assertEqual(ipdls, expected)
+
 if __name__ == '__main__':
     main()
deleted file mode 100644
--- a/uriloader/exthandler/ipdl.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-# 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/.
-
-IPDLSRCS = \
-	PExternalHelperApp.ipdl \
-	$(NULL)
--- a/uriloader/exthandler/moz.build
+++ b/uriloader/exthandler/moz.build
@@ -106,8 +106,12 @@ if CONFIG['MOZ_ENABLE_MEEGOTOUCHSHARE']:
     CPP_SOURCES += [
         'nsMeegoExternalSharingAppService.cpp',
     ]
 
 if CONFIG['MOZ_ENABLE_CONTENTACTION']:
     CPP_SOURCES += [
         'nsContentHandlerApp.cpp',
     ]
+
+IPDL_SOURCES += [
+    'PExternalHelperApp.ipdl',
+]
deleted file mode 100644
--- a/uriloader/prefetch/ipdl.mk
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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/.
-
-IPDLSRCS =          \
-  POfflineCacheUpdate.ipdl \
-  $(NULL)
-
--- a/uriloader/prefetch/moz.build
+++ b/uriloader/prefetch/moz.build
@@ -24,8 +24,11 @@ CPP_SOURCES += [
     'OfflineCacheUpdateChild.cpp',
     'OfflineCacheUpdateGlue.cpp',
     'OfflineCacheUpdateParent.cpp',
     'nsOfflineCacheUpdate.cpp',
     'nsOfflineCacheUpdateService.cpp',
     'nsPrefetchService.cpp',
 ]
 
+IPDL_SOURCES += [
+    'POfflineCacheUpdate.ipdl',
+]