Centralize data model specification of examples (#5882)

Currently different samples repeat the same sources for ZAP generated &
common cluster files. Reduce duplication by centralizing these in a
template that is parameterized by the clusters to enable.
diff --git a/examples/all-clusters-app/all-clusters-common/BUILD.gn b/examples/all-clusters-app/all-clusters-common/BUILD.gn
index b0fdf86..bcccf42 100644
--- a/examples/all-clusters-app/all-clusters-common/BUILD.gn
+++ b/examples/all-clusters-app/all-clusters-common/BUILD.gn
@@ -14,66 +14,35 @@
 
 import("//build_overrides/chip.gni")
 
-config("includes") {
-  include_dirs = [
-    ".",
-    "include",
-  ]
-}
+import("${chip_root}/src/app/chip_data_model.gni")
 
-source_set("all-clusters-common") {
-  sources = [
-    "${chip_root}/src/app/clusters/account-login-server/account-login-server.cpp",
-    "${chip_root}/src/app/clusters/application-launcher-server/application-launcher-server.cpp",
-    "${chip_root}/src/app/clusters/audio-output-server/audio-output-server.cpp",
-    "${chip_root}/src/app/clusters/barrier-control-server/barrier-control-server.cpp",
-    "${chip_root}/src/app/clusters/basic/basic.cpp",
-    "${chip_root}/src/app/clusters/bindings/bindings.cpp",
-    "${chip_root}/src/app/clusters/color-control-server/color-control-server.cpp",
-    "${chip_root}/src/app/clusters/content-launch-server/content-launch-server.cpp",
-    "${chip_root}/src/app/clusters/door-lock-server/door-lock-server-core.cpp",
-    "${chip_root}/src/app/clusters/door-lock-server/door-lock-server-logging.cpp",
-    "${chip_root}/src/app/clusters/door-lock-server/door-lock-server-schedule.cpp",
-    "${chip_root}/src/app/clusters/door-lock-server/door-lock-server-user.cpp",
-    "${chip_root}/src/app/clusters/general-commissioning-server/general-commissioning-server.cpp",
-    "${chip_root}/src/app/clusters/groups-server/groups-server.cpp",
-    "${chip_root}/src/app/clusters/ias-zone-server/ias-zone-server.cpp",
-    "${chip_root}/src/app/clusters/identify/identify.cpp",
-    "${chip_root}/src/app/clusters/keypad-input-server/keypad-input-server.cpp",
-    "${chip_root}/src/app/clusters/level-control/level-control.cpp",
-    "${chip_root}/src/app/clusters/low-power-server/low-power-server.cpp",
-    "${chip_root}/src/app/clusters/media-input-server/media-input-server.cpp",
-    "${chip_root}/src/app/clusters/media-playback-server/media-playback-server.cpp",
-    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning-ember.cpp",
-    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning.cpp",
-    "${chip_root}/src/app/clusters/on-off-server/on-off.cpp",
-    "${chip_root}/src/app/clusters/scenes/scenes.cpp",
-    "${chip_root}/src/app/clusters/target-navigator-server/target-navigator-server.cpp",
-    "${chip_root}/src/app/clusters/temperature-measurement-server/temperature-measurement-server.cpp",
-    "${chip_root}/src/app/clusters/tv-channel-server/tv-channel-server.cpp",
-    "${chip_root}/src/app/reporting/reporting-default-configuration.cpp",
-    "${chip_root}/src/app/reporting/reporting.cpp",
-    "${chip_root}/src/app/server/DataModelHandler.cpp",
-    "${chip_root}/src/app/util/af-event.cpp",
-    "${chip_root}/src/app/util/af-main-common.cpp",
-    "${chip_root}/src/app/util/attribute-size.cpp",
-    "${chip_root}/src/app/util/attribute-storage.cpp",
-    "${chip_root}/src/app/util/attribute-table.cpp",
-    "${chip_root}/src/app/util/binding-table.cpp",
-    "${chip_root}/src/app/util/chip-message-send.cpp",
-    "${chip_root}/src/app/util/client-api.cpp",
-    "${chip_root}/src/app/util/ember-print.cpp",
-    "${chip_root}/src/app/util/message.cpp",
-    "${chip_root}/src/app/util/process-cluster-message.cpp",
-    "${chip_root}/src/app/util/process-global-message.cpp",
-    "${chip_root}/src/app/util/util.cpp",
-    "gen/call-command-handler.cpp",
-    "gen/callback-stub.cpp",
+chip_data_model("all-clusters-common") {
+  cluster_sources = [
+    "account-login-server",
+    "application-launcher-server",
+    "audio-output-server",
+    "barrier-control-server",
+    "basic",
+    "bindings",
+    "color-control-server",
+    "content-launch-server",
+    "door-lock-server",
+    "general-commissioning-server",
+    "groups-server",
+    "ias-zone-server",
+    "identify",
+    "keypad-input-server",
+    "level-control",
+    "low-power-server",
+    "media-input-server",
+    "media-playback-server",
+    "network-commissioning",
+    "on-off-server",
+    "scenes",
+    "target-navigator-server",
+    "temperature-measurement-server",
+    "tv-channel-server",
   ]
 
-  cflags = [ "-Wconversion" ]
-
-  deps = [ "${chip_root}/src/lib" ]
-
-  public_configs = [ ":includes" ]
+  zap_pregenerated_dir = "gen"
 }
diff --git a/examples/bridge-app/bridge-common/BUILD.gn b/examples/bridge-app/bridge-common/BUILD.gn
index 90d5518..4c19d98 100644
--- a/examples/bridge-app/bridge-common/BUILD.gn
+++ b/examples/bridge-app/bridge-common/BUILD.gn
@@ -14,42 +14,16 @@
 
 import("//build_overrides/chip.gni")
 
-config("includes") {
-  include_dirs = [
-    ".",
-    "include",
-  ]
-}
+import("${chip_root}/src/app/chip_data_model.gni")
 
-source_set("bridge-common") {
-  sources = [
-    "${chip_root}/src/app/clusters/basic/basic.cpp",
-    "${chip_root}/src/app/clusters/bindings/bindings.cpp",
-    "${chip_root}/src/app/clusters/level-control/level-control.cpp",
-    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning-ember.cpp",
-    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning.cpp",
-    "${chip_root}/src/app/clusters/on-off-server/on-off.cpp",
-    "${chip_root}/src/app/reporting/reporting-default-configuration.cpp",
-    "${chip_root}/src/app/reporting/reporting.cpp",
-    "${chip_root}/src/app/server/DataModelHandler.cpp",
-    "${chip_root}/src/app/util/af-event.cpp",
-    "${chip_root}/src/app/util/af-main-common.cpp",
-    "${chip_root}/src/app/util/attribute-size.cpp",
-    "${chip_root}/src/app/util/attribute-storage.cpp",
-    "${chip_root}/src/app/util/attribute-table.cpp",
-    "${chip_root}/src/app/util/binding-table.cpp",
-    "${chip_root}/src/app/util/chip-message-send.cpp",
-    "${chip_root}/src/app/util/client-api.cpp",
-    "${chip_root}/src/app/util/ember-print.cpp",
-    "${chip_root}/src/app/util/message.cpp",
-    "${chip_root}/src/app/util/process-cluster-message.cpp",
-    "${chip_root}/src/app/util/process-global-message.cpp",
-    "${chip_root}/src/app/util/util.cpp",
-    "gen/call-command-handler.cpp",
-    "gen/callback-stub.cpp",
+chip_data_model("bridge-common") {
+  cluster_sources = [
+    "basic",
+    "bindings",
+    "level-control",
+    "network-commissioning",
+    "on-off-server",
   ]
 
-  deps = [ "${chip_root}/src/lib" ]
-
-  public_configs = [ ":includes" ]
+  zap_pregenerated_dir = "gen"
 }
diff --git a/examples/chip-tool-darwin/BUILD.gn b/examples/chip-tool-darwin/BUILD.gn
index 6bb03ed..e710aca 100644
--- a/examples/chip-tool-darwin/BUILD.gn
+++ b/examples/chip-tool-darwin/BUILD.gn
@@ -20,46 +20,11 @@
 assert(chip_build_tools)
 
 config("includes") {
-  include_dirs = [
-    ".",
-    "${chip_root}/src/darwin/Framework",
-    "${chip_root}/src/darwin/Framework/CHIP",
-  ]
+  include_dirs = [ "." ]
 }
 
 executable("chip-tool-darwin") {
-  sources = [
-    "${chip_root}/src/app/clusters/media-playback-client/media-playback-client.cpp",
-    "${chip_root}/src/app/reporting/reporting-default-configuration.cpp",
-    "${chip_root}/src/app/reporting/reporting.cpp",
-    "${chip_root}/src/app/server/DataModelHandler.cpp",
-    "${chip_root}/src/app/util/af-event.cpp",
-    "${chip_root}/src/app/util/af-main-common.cpp",
-    "${chip_root}/src/app/util/attribute-size.cpp",
-    "${chip_root}/src/app/util/attribute-storage.cpp",
-    "${chip_root}/src/app/util/attribute-table.cpp",
-    "${chip_root}/src/app/util/binding-table.cpp",
-    "${chip_root}/src/app/util/chip-message-send.cpp",
-    "${chip_root}/src/app/util/client-api.cpp",
-    "${chip_root}/src/app/util/ember-print.cpp",
-    "${chip_root}/src/app/util/message.cpp",
-    "${chip_root}/src/app/util/process-cluster-message.cpp",
-    "${chip_root}/src/app/util/process-global-message.cpp",
-    "${chip_root}/src/app/util/util.cpp",
-    "${chip_root}/src/darwin/Framework/CHIP/CHIPDevice.mm",
-    "${chip_root}/src/darwin/Framework/CHIP/CHIPDeviceController.mm",
-    "${chip_root}/src/darwin/Framework/CHIP/CHIPDevicePairingDelegateBridge.mm",
-    "${chip_root}/src/darwin/Framework/CHIP/CHIPError.mm",
-    "${chip_root}/src/darwin/Framework/CHIP/CHIPManualSetupPayloadParser.mm",
-    "${chip_root}/src/darwin/Framework/CHIP/CHIPPersistentStorageDelegateBridge.mm",
-    "${chip_root}/src/darwin/Framework/CHIP/CHIPQRCodeSetupPayloadParser.mm",
-    "${chip_root}/src/darwin/Framework/CHIP/CHIPSetupPayload.mm",
-    "${chip_root}/src/darwin/Framework/CHIP/gen/CHIPClientCallbacks.cpp",
-    "${chip_root}/src/darwin/Framework/CHIP/gen/CHIPClustersObjc.mm",
-    "${chip_root}/src/darwin/Framework/CHIP/gen/call-command-handler.cpp",
-    "${chip_root}/src/darwin/Framework/CHIP/gen/callback-stub.cpp",
-    "main.m",
-  ]
+  sources = [ "main.m" ]
 
   cflags = [
     "-Wconversion",
@@ -68,6 +33,7 @@
 
   public_deps = [
     "${chip_root}/src/app/server",
+    "${chip_root}/src/darwin/Framework/CHIP",
     "${chip_root}/src/lib",
     "${chip_root}/src/platform",
     "${chip_root}/third_party/inipp",
diff --git a/examples/chip-tool/BUILD.gn b/examples/chip-tool/BUILD.gn
index c83a641..c9b7d8f 100644
--- a/examples/chip-tool/BUILD.gn
+++ b/examples/chip-tool/BUILD.gn
@@ -16,6 +16,7 @@
 import("//build_overrides/chip.gni")
 
 import("${chip_root}/build/chip/tools.gni")
+import("${chip_root}/src/app/chip_data_model.gni")
 
 assert(chip_build_tools)
 
@@ -23,25 +24,16 @@
   include_dirs = [ "." ]
 }
 
+chip_data_model("data_model") {
+  cluster_sources = [ "media-playback-client" ]
+
+  zap_pregenerated_dir = "gen"
+
+  use_default_client_callbacks = true
+}
+
 executable("chip-tool") {
   sources = [
-    "${chip_root}/src/app/clusters/media-playback-client/media-playback-client.cpp",
-    "${chip_root}/src/app/reporting/reporting-default-configuration.cpp",
-    "${chip_root}/src/app/reporting/reporting.cpp",
-    "${chip_root}/src/app/server/DataModelHandler.cpp",
-    "${chip_root}/src/app/util/af-event.cpp",
-    "${chip_root}/src/app/util/af-main-common.cpp",
-    "${chip_root}/src/app/util/attribute-size.cpp",
-    "${chip_root}/src/app/util/attribute-storage.cpp",
-    "${chip_root}/src/app/util/attribute-table.cpp",
-    "${chip_root}/src/app/util/binding-table.cpp",
-    "${chip_root}/src/app/util/chip-message-send.cpp",
-    "${chip_root}/src/app/util/client-api.cpp",
-    "${chip_root}/src/app/util/ember-print.cpp",
-    "${chip_root}/src/app/util/message.cpp",
-    "${chip_root}/src/app/util/process-cluster-message.cpp",
-    "${chip_root}/src/app/util/process-global-message.cpp",
-    "${chip_root}/src/app/util/util.cpp",
     "commands/clusters/ModelCommand.cpp",
     "commands/common/Command.cpp",
     "commands/common/Commands.cpp",
@@ -50,15 +42,13 @@
     "commands/payload/SetupPayloadParseCommand.cpp",
     "commands/reporting/ReportingCommand.cpp",
     "config/PersistentStorage.cpp",
-    "gen/CHIPClientCallbacks.cpp",
-    "gen/call-command-handler.cpp",
-    "gen/callback-stub.cpp",
     "main.cpp",
   ]
 
   cflags = [ "-Wconversion" ]
 
   public_deps = [
+    ":data_model",
     "${chip_root}/src/app/server",
     "${chip_root}/src/lib",
     "${chip_root}/src/platform",
diff --git a/examples/lighting-app/lighting-common/BUILD.gn b/examples/lighting-app/lighting-common/BUILD.gn
index 7080d33..004618e 100644
--- a/examples/lighting-app/lighting-common/BUILD.gn
+++ b/examples/lighting-app/lighting-common/BUILD.gn
@@ -14,6 +14,7 @@
 
 import("//build_overrides/chip.gni")
 import("${chip_root}/examples/lighting-app/lighting-common/lighting.gni")
+import("${chip_root}/src/app/chip_data_model.gni")
 import("${chip_root}/src/app/common_flags.gni")
 import("${chip_root}/src/lib/core/core.gni")
 
@@ -36,41 +37,13 @@
   }
 }
 
-source_set("lighting-common") {
-  sources = [
-    "${chip_root}/src/app/clusters/bindings/bindings.cpp",
-    "${chip_root}/src/app/clusters/level-control/level-control.cpp",
-    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning-ember.cpp",
-    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning.cpp",
-    "${chip_root}/src/app/clusters/on-off-server/on-off.cpp",
-    "${chip_root}/src/app/reporting/reporting-default-configuration.cpp",
-    "${chip_root}/src/app/reporting/reporting.cpp",
-    "${chip_root}/src/app/server/DataModelHandler.cpp",
-    "${chip_root}/src/app/util/af-event.cpp",
-    "${chip_root}/src/app/util/af-main-common.cpp",
-    "${chip_root}/src/app/util/attribute-size.cpp",
-    "${chip_root}/src/app/util/attribute-storage.cpp",
-    "${chip_root}/src/app/util/attribute-table.cpp",
-    "${chip_root}/src/app/util/binding-table.cpp",
-    "${chip_root}/src/app/util/chip-message-send.cpp",
-    "${chip_root}/src/app/util/client-api.cpp",
-    "${chip_root}/src/app/util/ember-print.cpp",
-    "${chip_root}/src/app/util/message.cpp",
-    "${chip_root}/src/app/util/process-cluster-message.cpp",
-    "${chip_root}/src/app/util/process-global-message.cpp",
-    "${chip_root}/src/app/util/util.cpp",
-    "gen/call-command-handler.cpp",
-    "gen/callback-stub.cpp",
+chip_data_model("lighting-common") {
+  cluster_sources = [
+    "bindings",
+    "level-control",
+    "network-commissioning",
+    "on-off-server",
   ]
 
-  if (chip_enable_interaction_model) {
-    sources += [
-      "${chip_root}/src/app/util/ember-compatibility-functions.cpp",
-      "gen/IMClusterCommandHandler.cpp",
-    ]
-  }
-
-  deps = [ "${chip_root}/src/lib" ]
-
-  public_configs = [ ":includes" ]
+  zap_pregenerated_dir = "gen"
 }
diff --git a/examples/lighting-app/nrfconnect/CMakeLists.txt b/examples/lighting-app/nrfconnect/CMakeLists.txt
index 5ef1900..cbd847d 100644
--- a/examples/lighting-app/nrfconnect/CMakeLists.txt
+++ b/examples/lighting-app/nrfconnect/CMakeLists.txt
@@ -64,7 +64,7 @@
                ${CHIP_ROOT}/src/app/util/process-global-message.cpp
                ${CHIP_ROOT}/src/app/util/util.cpp
                ${CHIP_ROOT}/src/app/clusters/bindings/bindings.cpp
-               ${CHIP_ROOT}/src/app/clusters/on-off-server/on-off.cpp
+               ${CHIP_ROOT}/src/app/clusters/on-off-server/on-off-server.cpp
                ${CHIP_ROOT}/src/app/clusters/level-control/level-control.cpp
                ${CHIP_ROOT}/src/app/clusters/network-commissioning/network-commissioning-ember.cpp
                ${CHIP_ROOT}/src/app/clusters/network-commissioning/network-commissioning.cpp
diff --git a/examples/lock-app/lock-common/BUILD.gn b/examples/lock-app/lock-common/BUILD.gn
index e58c95d..61d7675 100644
--- a/examples/lock-app/lock-common/BUILD.gn
+++ b/examples/lock-app/lock-common/BUILD.gn
@@ -14,41 +14,14 @@
 
 import("//build_overrides/chip.gni")
 
-config("includes") {
-  include_dirs = [
-    ".",
-    "include",
-    "${chip_root}/src",
-  ]
-}
+import("${chip_root}/src/app/chip_data_model.gni")
 
-source_set("lock-common") {
-  sources = [
-    "${chip_root}/src/app/clusters/bindings/bindings.cpp",
-    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning-ember.cpp",
-    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning.cpp",
-    "${chip_root}/src/app/clusters/on-off-server/on-off.cpp",
-    "${chip_root}/src/app/reporting/reporting-default-configuration.cpp",
-    "${chip_root}/src/app/reporting/reporting.cpp",
-    "${chip_root}/src/app/server/DataModelHandler.cpp",
-    "${chip_root}/src/app/util/af-event.cpp",
-    "${chip_root}/src/app/util/af-main-common.cpp",
-    "${chip_root}/src/app/util/attribute-size.cpp",
-    "${chip_root}/src/app/util/attribute-storage.cpp",
-    "${chip_root}/src/app/util/attribute-table.cpp",
-    "${chip_root}/src/app/util/binding-table.cpp",
-    "${chip_root}/src/app/util/chip-message-send.cpp",
-    "${chip_root}/src/app/util/client-api.cpp",
-    "${chip_root}/src/app/util/ember-print.cpp",
-    "${chip_root}/src/app/util/message.cpp",
-    "${chip_root}/src/app/util/process-cluster-message.cpp",
-    "${chip_root}/src/app/util/process-global-message.cpp",
-    "${chip_root}/src/app/util/util.cpp",
-    "gen/call-command-handler.cpp",
-    "gen/callback-stub.cpp",
+chip_data_model("lock-common") {
+  cluster_sources = [
+    "bindings",
+    "network-commissioning",
+    "on-off-server",
   ]
 
-  deps = [ "${chip_root}/src/lib" ]
-
-  public_configs = [ ":includes" ]
+  zap_pregenerated_dir = "gen"
 }
diff --git a/examples/lock-app/nrfconnect/CMakeLists.txt b/examples/lock-app/nrfconnect/CMakeLists.txt
index 0f40226..d7295e2 100644
--- a/examples/lock-app/nrfconnect/CMakeLists.txt
+++ b/examples/lock-app/nrfconnect/CMakeLists.txt
@@ -66,4 +66,4 @@
                ${CHIP_ROOT}/src/app/clusters/bindings/bindings.cpp
                ${CHIP_ROOT}/src/app/clusters/network-commissioning/network-commissioning-ember.cpp
                ${CHIP_ROOT}/src/app/clusters/network-commissioning/network-commissioning.cpp
-               ${CHIP_ROOT}/src/app/clusters/on-off-server/on-off.cpp)
+               ${CHIP_ROOT}/src/app/clusters/on-off-server/on-off-server.cpp)
diff --git a/examples/tv-app/linux/BUILD.gn b/examples/tv-app/linux/BUILD.gn
index f479d3f..20cae28 100644
--- a/examples/tv-app/linux/BUILD.gn
+++ b/examples/tv-app/linux/BUILD.gn
@@ -23,8 +23,6 @@
   include_dirs = [
     ".",
     "include",
-    "${chip_root}/src/app/util",
-    "${chip_root}/src/app/server",
   ]
 }
 
diff --git a/examples/tv-app/tv-common/BUILD.gn b/examples/tv-app/tv-common/BUILD.gn
index d9931ca..38b85ba 100644
--- a/examples/tv-app/tv-common/BUILD.gn
+++ b/examples/tv-app/tv-common/BUILD.gn
@@ -14,62 +14,31 @@
 
 import("//build_overrides/chip.gni")
 
-config("includes") {
-  include_dirs = [
-    ".",
-    "include",
-  ]
-}
+import("${chip_root}/src/app/chip_data_model.gni")
 
-source_set("tv-common") {
-  sources = [
-    "${chip_root}/src/app/clusters/barrier-control-server/barrier-control-server.cpp",
-    "${chip_root}/src/app/clusters/basic/basic.cpp",
-    "${chip_root}/src/app/clusters/bindings/bindings.cpp",
-    "${chip_root}/src/app/clusters/color-control-server/color-control-server.cpp",
-    "${chip_root}/src/app/clusters/content-launch-server/content-launch-server.cpp",
-    "${chip_root}/src/app/clusters/door-lock-client/door-lock-client.cpp",
-    "${chip_root}/src/app/clusters/door-lock-server/door-lock-server-core.cpp",
-    "${chip_root}/src/app/clusters/door-lock-server/door-lock-server-logging.cpp",
-    "${chip_root}/src/app/clusters/door-lock-server/door-lock-server-schedule.cpp",
-    "${chip_root}/src/app/clusters/door-lock-server/door-lock-server-user.cpp",
-    "${chip_root}/src/app/clusters/groups-client/groups-client.cpp",
-    "${chip_root}/src/app/clusters/groups-server/groups-server.cpp",
-    "${chip_root}/src/app/clusters/ias-zone-server/ias-zone-server.cpp",
-    "${chip_root}/src/app/clusters/identify-client/identify-client.cpp",
-    "${chip_root}/src/app/clusters/identify/identify.cpp",
-    "${chip_root}/src/app/clusters/level-control/level-control.cpp",
-    "${chip_root}/src/app/clusters/low-power-server/low-power-server.cpp",
-    "${chip_root}/src/app/clusters/media-playback-server/media-playback-server.cpp",
-    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning-ember.cpp",
-    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning.cpp",
-    "${chip_root}/src/app/clusters/on-off-server/on-off.cpp",
-    "${chip_root}/src/app/clusters/scenes-client/scenes-client.cpp",
-    "${chip_root}/src/app/clusters/scenes/scenes.cpp",
-    "${chip_root}/src/app/clusters/temperature-measurement-server/temperature-measurement-server.cpp",
-    "${chip_root}/src/app/reporting/reporting-default-configuration.cpp",
-    "${chip_root}/src/app/reporting/reporting.cpp",
-    "${chip_root}/src/app/server/DataModelHandler.cpp",
-    "${chip_root}/src/app/util/af-event.cpp",
-    "${chip_root}/src/app/util/af-main-common.cpp",
-    "${chip_root}/src/app/util/attribute-size.cpp",
-    "${chip_root}/src/app/util/attribute-storage.cpp",
-    "${chip_root}/src/app/util/attribute-table.cpp",
-    "${chip_root}/src/app/util/binding-table.cpp",
-    "${chip_root}/src/app/util/chip-message-send.cpp",
-    "${chip_root}/src/app/util/client-api.cpp",
-    "${chip_root}/src/app/util/ember-print.cpp",
-    "${chip_root}/src/app/util/message.cpp",
-    "${chip_root}/src/app/util/process-cluster-message.cpp",
-    "${chip_root}/src/app/util/process-global-message.cpp",
-    "${chip_root}/src/app/util/util.cpp",
-    "gen/call-command-handler.cpp",
-    "gen/callback-stub.cpp",
+chip_data_model("tv-common") {
+  cluster_sources = [
+    "barrier-control-server",
+    "basic",
+    "bindings",
+    "color-control-server",
+    "content-launch-server",
+    "door-lock-client",
+    "door-lock-server",
+    "groups-client",
+    "groups-server",
+    "ias-zone-server",
+    "identify",
+    "identify-client",
+    "level-control",
+    "low-power-server",
+    "media-playback-server",
+    "network-commissioning",
+    "on-off-server",
+    "scenes",
+    "scenes-client",
+    "temperature-measurement-server",
   ]
 
-  cflags = [ "-Wconversion" ]
-
-  deps = [ "${chip_root}/src/lib" ]
-
-  public_configs = [ ":includes" ]
+  zap_pregenerated_dir = "gen"
 }
diff --git a/examples/window-app/common/BUILD.gn b/examples/window-app/common/BUILD.gn
index 366b86a..cae0395 100644
--- a/examples/window-app/common/BUILD.gn
+++ b/examples/window-app/common/BUILD.gn
@@ -13,49 +13,14 @@
 # limitations under the License.
 
 import("//build_overrides/chip.gni")
-import("${chip_root}/src/app/common_flags.gni")
-import("${chip_root}/src/lib/core/core.gni")
 
-config("includes") {
-  include_dirs = [
-    ".",
-    "include",
-  ]
-}
+import("${chip_root}/src/app/chip_data_model.gni")
 
-source_set("window-common") {
-  sources = [
-    "${chip_root}/src/app/clusters/bindings/bindings.cpp",
-    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning-ember.cpp",
-    "${chip_root}/src/app/clusters/network-commissioning/network-commissioning.cpp",
-    "${chip_root}/src/app/reporting/reporting-default-configuration.cpp",
-    "${chip_root}/src/app/reporting/reporting.cpp",
-    "${chip_root}/src/app/server/DataModelHandler.cpp",
-    "${chip_root}/src/app/util/af-event.cpp",
-    "${chip_root}/src/app/util/af-main-common.cpp",
-    "${chip_root}/src/app/util/attribute-size.cpp",
-    "${chip_root}/src/app/util/attribute-storage.cpp",
-    "${chip_root}/src/app/util/attribute-table.cpp",
-    "${chip_root}/src/app/util/binding-table.cpp",
-    "${chip_root}/src/app/util/chip-message-send.cpp",
-    "${chip_root}/src/app/util/client-api.cpp",
-    "${chip_root}/src/app/util/ember-print.cpp",
-    "${chip_root}/src/app/util/message.cpp",
-    "${chip_root}/src/app/util/process-cluster-message.cpp",
-    "${chip_root}/src/app/util/process-global-message.cpp",
-    "${chip_root}/src/app/util/util.cpp",
-    "gen/call-command-handler.cpp",
-    "gen/callback-stub.cpp",
+chip_data_model("window-common") {
+  cluster_sources = [
+    "bindings",
+    "network-commissioning",
   ]
 
-  if (chip_enable_interaction_model) {
-    sources += [
-      "${chip_root}/src/app/util/ember-compatibility-functions.cpp",
-      "gen/IMClusterCommandHandler.cpp",
-    ]
-  }
-
-  deps = [ "${chip_root}/src/lib" ]
-
-  public_configs = [ ":includes" ]
+  zap_pregenerated_dir = "gen"
 }
diff --git a/src/app/chip_data_model.gni b/src/app/chip_data_model.gni
new file mode 100644
index 0000000..f2468ba
--- /dev/null
+++ b/src/app/chip_data_model.gni
@@ -0,0 +1,156 @@
+# Copyright (c) 2021 Project CHIP Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build_overrides/chip.gni")
+
+import("${chip_root}/src/lib/core/core.gni")
+
+_app_root = get_path_info(".", "abspath")
+
+# Defines a source_set for CHIP data model.
+#
+# Arguments:
+#  zap_pregenerated_dir
+#    Path to the ZAP "gen" dir.
+#
+#  cluster_sources
+#    Names of the clusters to compile.
+#
+#  use_default_client_callbacks
+#    Include CHIPClientCallbacks.cpp.
+#
+# Forwards all the remaining variables to the source_set.
+#
+template("chip_data_model") {
+  _data_model_name = target_name
+
+  config("${_data_model_name}_config") {
+    include_dirs = []
+
+    if (defined(invoker.zap_pregenerated_dir)) {
+      include_dirs += [ "${invoker.zap_pregenerated_dir}/.." ]
+    }
+  }
+
+  _use_default_client_callbacks =
+      defined(invoker.use_default_client_callbacks) &&
+      invoker.use_default_client_callbacks
+
+  source_set(_data_model_name) {
+    forward_variables_from(invoker,
+                           "*",
+                           [
+                             "zap_pregenerated_dir",
+                             "cluster_sources",
+                             "use_default_client_callbacks",
+                           ])
+
+    if (!defined(sources)) {
+      sources = []
+    }
+
+    sources += [
+      "${_app_root}/clusters/barrier-control-server/barrier-control-server.h",
+      "${_app_root}/clusters/basic/basic.h",
+      "${_app_root}/clusters/color-control-server/color-control-server.h",
+      "${_app_root}/clusters/door-lock-server/door-lock-server.h",
+      "${_app_root}/clusters/groups-server/groups-server.h",
+      "${_app_root}/clusters/ias-zone-client/ias-zone-client.h",
+      "${_app_root}/clusters/ias-zone-server/ias-zone-server-tokens.h",
+      "${_app_root}/clusters/ias-zone-server/ias-zone-server.h",
+      "${_app_root}/clusters/identify/identify.h",
+      "${_app_root}/clusters/level-control/level-control.h",
+      "${_app_root}/clusters/messaging-client/messaging-client.h",
+      "${_app_root}/clusters/messaging-server/messaging-server.h",
+      "${_app_root}/clusters/network-commissioning/network-commissioning.h",
+      "${_app_root}/clusters/on-off-server/on-off-server.h",
+      "${_app_root}/clusters/scenes-client/scenes-client.h",
+      "${_app_root}/clusters/scenes/scenes-tokens.h",
+      "${_app_root}/clusters/scenes/scenes.h",
+      "${_app_root}/clusters/temperature-measurement-server/temperature-measurement-server.h",
+      "${_app_root}/clusters/zll-level-control-server/zll-level-control-server.h",
+      "${_app_root}/clusters/zll-on-off-server/zll-on-off-server.h",
+      "${_app_root}/clusters/zll-scenes-server/zll-scenes-server.h",
+      "${_app_root}/reporting/reporting-default-configuration.cpp",
+      "${_app_root}/reporting/reporting.cpp",
+      "${_app_root}/server/DataModelHandler.cpp",
+      "${_app_root}/util/af-event.cpp",
+      "${_app_root}/util/af-main-common.cpp",
+      "${_app_root}/util/attribute-size.cpp",
+      "${_app_root}/util/attribute-storage.cpp",
+      "${_app_root}/util/attribute-table.cpp",
+      "${_app_root}/util/binding-table.cpp",
+      "${_app_root}/util/chip-message-send.cpp",
+      "${_app_root}/util/client-api.cpp",
+      "${_app_root}/util/ember-compatibility-functions.cpp",
+      "${_app_root}/util/ember-print.cpp",
+      "${_app_root}/util/message.cpp",
+      "${_app_root}/util/process-cluster-message.cpp",
+      "${_app_root}/util/process-global-message.cpp",
+      "${_app_root}/util/util.cpp",
+    ]
+
+    if (defined(invoker.cluster_sources)) {
+      foreach(cluster, invoker.cluster_sources) {
+        if (cluster == "door-lock-server") {
+          sources += [
+            "${_app_root}/clusters/${cluster}/door-lock-server-core.cpp",
+            "${_app_root}/clusters/${cluster}/door-lock-server-logging.cpp",
+            "${_app_root}/clusters/${cluster}/door-lock-server-schedule.cpp",
+            "${_app_root}/clusters/${cluster}/door-lock-server-user.cpp",
+          ]
+        } else if (cluster == "network-commissioning") {
+          sources += [
+            "${_app_root}/clusters/${cluster}/${cluster}-ember.cpp",
+            "${_app_root}/clusters/${cluster}/${cluster}.cpp",
+          ]
+        } else {
+          sources += [ "${_app_root}/clusters/${cluster}/${cluster}.cpp" ]
+        }
+      }
+    }
+
+    if (defined(invoker.zap_pregenerated_dir)) {
+      sources += [
+        "${invoker.zap_pregenerated_dir}/call-command-handler.cpp",
+        "${invoker.zap_pregenerated_dir}/callback-stub.cpp",
+      ]
+
+      if (_use_default_client_callbacks) {
+        sources += [ "${invoker.zap_pregenerated_dir}/CHIPClientCallbacks.cpp" ]
+      }
+
+      if (chip_enable_interaction_model) {
+        sources +=
+            [ "${invoker.zap_pregenerated_dir}/IMClusterCommandHandler.cpp" ]
+      }
+    }
+
+    if (!defined(public_deps)) {
+      public_deps = []
+    }
+
+    public_deps += [
+      "${chip_root}/src/app",
+      "${chip_root}/src/lib/core",
+      "${chip_root}/src/lib/support",
+    ]
+
+    if (!defined(public_configs)) {
+      public_configs = []
+    }
+
+    public_configs += [ ":${_data_model_name}_config" ]
+  }
+}
diff --git a/src/app/clusters/level-control/level-control.cpp b/src/app/clusters/level-control/level-control.cpp
index 7ba20de..df43112 100644
--- a/src/app/clusters/level-control/level-control.cpp
+++ b/src/app/clusters/level-control/level-control.cpp
@@ -57,7 +57,7 @@
 #endif // EMBER_AF_PLUGIN_SCENES
 
 #ifdef EMBER_AF_PLUGIN_ON_OFF
-#include <app/clusters/on-off-server/on-off.h>
+#include <app/clusters/on-off-server/on-off-server.h>
 #endif // EMBER_AF_PLUGIN_ON_OFF
 
 #ifdef EMBER_AF_PLUGIN_ZLL_LEVEL_CONTROL_SERVER
diff --git a/src/app/clusters/on-off-server/on-off.cpp b/src/app/clusters/on-off-server/on-off-server.cpp
similarity index 99%
rename from src/app/clusters/on-off-server/on-off.cpp
rename to src/app/clusters/on-off-server/on-off-server.cpp
index ade2784..3ab529d 100644
--- a/src/app/clusters/on-off-server/on-off.cpp
+++ b/src/app/clusters/on-off-server/on-off-server.cpp
@@ -38,7 +38,7 @@
  *implements the On-Off server cluster.
  *******************************************************************************
  ******************************************************************************/
-#include "on-off.h"
+#include "on-off-server.h"
 
 #include "af.h"
 
diff --git a/src/app/clusters/on-off-server/on-off.h b/src/app/clusters/on-off-server/on-off-server.h
similarity index 100%
rename from src/app/clusters/on-off-server/on-off.h
rename to src/app/clusters/on-off-server/on-off-server.h
diff --git a/src/darwin/Framework/CHIP/BUILD.gn b/src/darwin/Framework/CHIP/BUILD.gn
new file mode 100644
index 0000000..6ed64ec
--- /dev/null
+++ b/src/darwin/Framework/CHIP/BUILD.gn
@@ -0,0 +1,77 @@
+# Copyright (c) 2021 Project CHIP Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build_overrides/chip.gni")
+
+import("${chip_root}/src/app/chip_data_model.gni")
+
+config("darwin_config") {
+  include_dirs = [ ".." ]
+
+  cflags = [
+    "-Wconversion",
+    "-fobjc-arc",
+  ]
+}
+
+static_library("framework") {
+  sources = [
+    "CHIP.h",
+    "CHIPDevice.h",
+    "CHIPDevice.mm",
+    "CHIPDeviceController.h",
+    "CHIPDeviceController.mm",
+    "CHIPDevicePairingDelegate.h",
+    "CHIPDevicePairingDelegateBridge.h",
+    "CHIPDevicePairingDelegateBridge.mm",
+    "CHIPDevice_Internal.h",
+    "CHIPError.h",
+    "CHIPError.mm",
+    "CHIPLogging.h",
+    "CHIPManualSetupPayloadParser.h",
+    "CHIPManualSetupPayloadParser.mm",
+    "CHIPPersistentStorageDelegate.h",
+    "CHIPPersistentStorageDelegateBridge.h",
+    "CHIPPersistentStorageDelegateBridge.mm",
+    "CHIPQRCodeSetupPayloadParser.h",
+    "CHIPQRCodeSetupPayloadParser.mm",
+    "CHIPSetupPayload.h",
+    "CHIPSetupPayload.mm",
+  ]
+
+  public_deps = [
+    "${chip_root}/src/controller",
+    "${chip_root}/src/lib/core",
+    "${chip_root}/src/lib/support",
+  ]
+
+  public_configs = [ ":darwin_config" ]
+}
+
+chip_data_model("darwin_data_model") {
+  cluster_sources = [ "media-playback-client" ]
+
+  zap_pregenerated_dir = "gen"
+
+  public_configs = [ ":darwin_config" ]
+
+  use_default_client_callbacks = true
+}
+
+group("CHIP") {
+  public_deps = [
+    ":darwin_data_model",
+    ":framework",
+  ]
+}