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 137381 42800e239ff0ce0b7c51214fa462fb45fb45cd3e
parent 137380 56a63eee73b491a465084beefd03057c6a510067
child 137382 8490662688813751fb15783b635b19e9813581d9
push id24920
push userphilringnalda@gmail.com
push dateThu, 04 Jul 2013 17:03:47 +0000
treeherdermozilla-central@efa23d6bd3fa [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersgps
bugs868536
milestone25.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
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',
+]