blob: 0232ef4e936b9aabf0f45bde7343453fd7e61a52 [file]
# Copyright (c) 2020 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/build.gni")
import("//build_overrides/chip.gni")
import("//build_overrides/pigweed.gni")
import("$dir_pw_build/python.gni")
import("$dir_pw_build/python_dist.gni")
import("${chip_root}/build/chip/tools.gni")
import("${chip_root}/src/app/common_flags.gni")
import("${chip_root}/src/controller/flags.gni")
import("${chip_root}/src/data-model-providers/codegen/model.gni")
import("${chip_root}/src/platform/python.gni")
import("${chip_root}/src/system/system.gni")
import("${dir_pw_unit_test}/test.gni")
if (current_os == "mac") {
import("${build_root}/config/mac/mac_sdk.gni")
}
declare_args() {
chip_python_version = "1.0.0"
chip_python_requires = ">=3.11"
chip_python_package_prefix = "matter"
chip_python_package_description = "Python-base APIs and tools for Matter SDK"
chip_python_package_url = "https://github.com/project-chip/connectedhomeip"
chip_python_package_classifiers = [
"Intended Audience :: Developers",
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3",
]
chip_python_supports_stack_locking = chip_system_config_locking != "none"
}
config("controller_wno_deprecate") {
cflags = [ "-Wno-deprecated-declarations" ]
}
if (chip_support_commissioning_in_controller) {
_chip_device_ctrl_output_name = "_ChipDeviceCtrl"
} else {
_chip_device_ctrl_output_name = "_ChipServer"
}
shared_library("ChipDeviceCtrl") {
output_name = _chip_device_ctrl_output_name
output_dir = "${target_out_dir}/matter"
include_dirs = [ "." ]
sources = [
"matter/setup_payload/Generator.cpp",
"matter/setup_payload/Parser.cpp",
]
sources += [ "matter/native/CommonStackInit.cpp" ]
defines = []
if (chip_support_commissioning_in_controller) {
sources += [
"ChipCommissionableNodeController-ScriptBinding.cpp",
"ChipDeviceController-Discovery.cpp",
"ChipDeviceController-IssueNocChain.cpp",
"ChipDeviceController-ScriptBinding.cpp",
"ChipDeviceController-ScriptDevicePairingDelegate.cpp",
"ChipDeviceController-ScriptDevicePairingDelegate.h",
"ChipDeviceController-ScriptPairingDeviceDiscoveryDelegate.cpp",
"ChipDeviceController-ScriptPairingDeviceDiscoveryDelegate.h",
"ChipDeviceController-StorageDelegate.cpp",
"ChipDeviceController-StorageDelegate.h",
"JsonTlv.cpp",
"OpCredsBinding.cpp",
"matter/bdx/bdx-transfer.cpp",
"matter/bdx/bdx-transfer.h",
"matter/bdx/bdx.cpp",
"matter/bdx/test-bdx-transfer-server.cpp",
"matter/bdx/test-bdx-transfer-server.h",
"matter/case_capture/CASECapture.cpp",
"matter/case_capture/CASECapture.h",
"matter/clusters/attribute.cpp",
"matter/clusters/command.cpp",
"matter/commissioning/PlaceholderOperationalCredentialsIssuer.h",
"matter/credentials/cert.cpp",
"matter/credentials/cert.h",
"matter/crypto/p256keypair.cpp",
"matter/crypto/p256keypair.h",
"matter/discovery/NodeResolution.cpp",
"matter/fault_injection/FaultInjection.cpp",
"matter/icd/PyChipCheckInDelegate.cpp",
"matter/icd/PyChipCheckInDelegate.h",
"matter/interaction_model/Delegate.cpp",
"matter/interaction_model/Delegate.h",
"matter/internal/ChipThreadWork.cpp",
"matter/internal/ChipThreadWork.h",
"matter/internal/CommissionerImpl.cpp",
"matter/logging/LoggingFilter.cpp",
"matter/logging/LoggingRedirect.cpp",
"matter/native/ChipMainLoopWork.h",
"matter/native/PyChipError.cpp",
"matter/native/PyChipError.h",
"matter/tracing/TracingSetup.cpp",
"matter/utils/DeviceProxyUtils.cpp",
]
if (chip_support_webrtc_python_bindings) {
sources += [
"matter/webrtc/RTCClient.cpp",
"matter/webrtc/WebRTC.cpp",
"matter/webrtc/WebRTC.h",
"matter/webrtc/WebRTCTransportCluster.cpp",
]
}
defines += [ "CHIP_CONFIG_MAX_ACTIVE_TCP_CONNECTIONS=20" ]
defines += [ "CHIP_CONFIG_MAX_GROUP_KEYS_PER_FABRIC=50" ]
defines += [ "CHIP_CONFIG_MAX_GROUPCAST_MEMBERSHIP_COUNT=100" ]
if (chip_python_supports_stack_locking) {
sources += [ "matter/native/ChipMainLoopWork_StackLock.cpp" ]
} else {
sources += [ "matter/native/ChipMainLoopWork_WorkSchedule.cpp" ]
}
} else {
sources += [
"matter/server/Options.cpp",
"matter/server/Options.h",
"matter/server/ServerInit.cpp",
]
}
if (chip_enable_ble) {
if (current_os == "linux") {
sources += [ "matter/ble/LinuxImpl.cpp" ]
} else if (current_os == "mac") {
sources += [
"matter/ble/darwin/AdapterListing.mm",
"matter/ble/darwin/Scanning.mm",
]
cflags = [ "-fobjc-arc" ]
} else if (current_os == "all") {
# current_os="all" is a synthetic aggregation used at generation time.
# Skip selecting a concrete BLE backend in this configuration.
} else {
assert(false, "No BLE implementation available for the current OS.")
}
}
public_deps = [
"${chip_root}/src/app",
"${chip_root}/src/app/icd/client:handler",
"${chip_root}/src/app/server",
"${chip_root}/src/credentials:default_attestation_verifier",
"${chip_root}/src/credentials:test_dac_revocation_delegate",
"${chip_root}/src/lib",
"${chip_root}/src/lib/core",
"${chip_root}/src/lib/dnssd",
"${chip_root}/src/lib/support",
"${chip_root}/src/lib/support:arg_parser",
"${chip_root}/src/lib/support/jsontlv",
"${chip_root}/src/platform",
"${chip_root}/src/platform/logging:default",
"${chip_root}/src/setup_payload",
"${chip_root}/src/transport",
]
if (chip_support_webrtc_python_bindings) {
public_deps += [
"${chip_root}/src/controller/webrtc:chip_webrtc",
"${chip_root}/third_party/libdatachannel:libdatachannel",
]
include_dirs += [
"${chip_root}/src/controller/webrtc/",
"${chip_root}/third_party/libdatachannel/repo/include",
]
}
if (chip_support_commissioning_in_controller) {
public_deps += [
"${chip_root}/src/credentials:file_attestation_trust_store",
"${chip_root}/src/lib/support:testing",
"${chip_root}/src/tracing/json",
"${chip_root}/src/tracing/perfetto",
"${chip_root}/src/tracing/perfetto:file_output",
"${chip_root}/third_party/jsoncpp",
]
deps = [
"${chip_root}/src/tracing/perfetto:event_storage",
"${chip_root}/src/tracing/perfetto:simple_initialization",
]
if (chip_build_controller_dynamic_server) {
defines += [ "CHIP_CONFIG_SKIP_APP_SPECIFIC_GENERATED_HEADER_INCLUDES=1" ]
deps += [ "${chip_root}/src/controller:nodatamodel" ]
# Temporary dependency: InteractionModelEngine NEEDS a codegen data model instance
# defined and application is supposed to provide it. This adds the sources
# in the same way "data_model" implementations do
#
# DynamicDispatcher in src/app:interaction-model implements the actual required
# ember callbacks in this case...
sources += codegen_data_model_SOURCES
public_deps += codegen_data_model_PUBLIC_DEPS
} else {
public_deps += [ "${chip_root}/src/controller/data_model" ]
}
} else {
public_deps += [ "$chip_data_model" ]
}
configs += [ ":controller_wno_deprecate" ]
}
pw_python_package("matter-core-module") {
sources = [
"matter/CertificateAuthority.py",
"matter/ChipBleBase.py",
"matter/ChipBleUtility.py",
"matter/ChipBluezMgr.py",
"matter/ChipCommissionableNodeCtrl.py",
"matter/ChipStack.py",
"matter/FabricAdmin.py",
"matter/MatterTlvJson.py",
"matter/__init__.py",
"matter/bdx/Bdx.py",
"matter/bdx/BdxProtocol.py",
"matter/bdx/BdxTransfer.py",
"matter/bdx/__init__.py",
"matter/ble/__init__.py",
"matter/ble/commissioning/__init__.py",
"matter/ble/get_adapters.py",
"matter/ble/library_handle.py",
"matter/ble/scan_devices.py",
"matter/ble/types.py",
"matter/case_capture/__init__.py",
"matter/commissioning/__init__.py",
"matter/commissioning/commissioning_flow_blocks.py",
"matter/commissioning/pase.py",
"matter/configuration/__init__.py",
"matter/credentials/__init__.py",
"matter/credentials/cert.py",
"matter/crypto/__init__.py",
"matter/crypto/fabric.py",
"matter/crypto/p256keypair.py",
"matter/discovery/__init__.py",
"matter/discovery/library_handle.py",
"matter/discovery/types.py",
"matter/exceptions/__init__.py",
"matter/fault_injection/__init__.py",
"matter/interaction_model/__init__.py",
"matter/interaction_model/delegate.py",
"matter/internal/__init__.py",
"matter/internal/commissioner.py",
"matter/internal/thread.py",
"matter/internal/types.py",
"matter/logging/__init__.py",
"matter/logging/library_handle.py",
"matter/logging/types.py",
"matter/native/__init__.py",
"matter/setup_payload/__init__.py",
"matter/setup_payload/setup_payload.py",
"matter/storage/__init__.py",
"matter/tracing/__init__.py",
"matter/utils/CommissioningBuildingBlocks.py",
"matter/utils/__init__.py",
]
if (chip_support_webrtc_python_bindings) {
sources += [
"matter/webrtc/__init__.py",
"matter/webrtc/async_websocket_client.py",
"matter/webrtc/browser_peer_connection.py",
"matter/webrtc/browser_webrtc_client.py",
"matter/webrtc/command.py",
"matter/webrtc/libdatachannel_peer_connection.py",
"matter/webrtc/libdatachannel_webrtc_client.py",
"matter/webrtc/library_handle.py",
"matter/webrtc/types.py",
"matter/webrtc/utils.py",
"matter/webrtc/webrtc_manager.py",
]
}
if (chip_support_commissioning_in_controller) {
sources += [ "matter/ChipDeviceCtrl.py" ]
} else {
sources += [ "matter/server/__init__.py" ]
}
generate_setup = {
metadata = {
name = "${chip_python_package_prefix}-core-module"
version = chip_python_version
description = chip_python_package_description
url = chip_python_package_url
classifiers = chip_python_package_classifiers
}
options = {
python_requires = chip_python_requires
install_requires = [
"coloredlogs",
"construct",
"cryptography",
"dacite",
"deprecation",
"ecdsa",
"ipdb",
"matter-clusters",
"pyyaml",
"rich",
]
}
}
}
pw_python_distribution("matter-core") {
packages = [ ":matter-core-module" ]
if (current_cpu == "x64") {
cpu_tag = "x86_64"
} else if (current_cpu == "arm64" && current_os == "linux") {
cpu_tag = "aarch64"
} else if (current_cpu == "arm" && current_os == "linux") {
cpu_tag = "armv7l"
} else {
cpu_tag = current_cpu
}
if (current_os == "mac") {
py_platform_tag = string_replace(
string_replace(mac_deployment_target, "macos", "macosx."),
".",
"_")
} else {
py_platform_tag = current_os
}
py_platform_tag = py_platform_tag + "_" + cpu_tag
generate_setup_cfg = {
name = "${chip_python_package_prefix}-core"
version = chip_python_version
include_default_pyproject_file = true
include_extra_files_in_package_data = true
}
extra_files = [ "//LICENSE > matter/LICENSE" ]
_matter_core_wheel_cfg =
"$root_gen_dir/src/controller/python/matter-core-wheel.cfg"
write_file(_matter_core_wheel_cfg,
[
"[options]",
"python_requires = ${chip_python_requires}",
"",
"[bdist_wheel]",
"universal = false",
"py_limited_api = cp311",
"plat_name = ${py_platform_tag}",
"root_is_pure = false",
],
"list lines")
generate_setup_cfg.common_config_file = _matter_core_wheel_cfg
_chip_device_ctrl_out_dir =
get_label_info(":ChipDeviceCtrl", "target_out_dir")
public_deps = [ ":ChipDeviceCtrl" ]
extra_files += [ "${_chip_device_ctrl_out_dir}/matter/${_chip_device_ctrl_output_name}.so > matter/${_chip_device_ctrl_output_name}.so" ]
}
pw_python_package("matter-clusters-module") {
sources = [
"matter/ChipUtility.py",
"matter/clusters/Attribute.py",
"matter/clusters/CHIPClusters.py",
"matter/clusters/ClusterObjects.py",
"matter/clusters/Command.py",
"matter/clusters/Objects.py",
"matter/clusters/TestObjects.py",
"matter/clusters/Types.py",
"matter/clusters/__init__.py",
"matter/clusters/enum.py",
"matter/tlv/__init__.py",
"matter/tlv/tlvlist.py",
]
generate_setup = {
metadata = {
name = "${chip_python_package_prefix}-clusters-module"
version = chip_python_version
description = chip_python_package_description
url = chip_python_package_url
classifiers = chip_python_package_classifiers
}
options = {
python_requires = chip_python_requires
install_requires = [
"aenum",
"construct",
"dacite",
"rich",
]
}
}
python_deps = [ ":matter-core-module" ]
}
pw_python_distribution("matter-clusters") {
packages = [ ":matter-clusters-module" ]
generate_setup_cfg = {
name = "${chip_python_package_prefix}-clusters"
version = chip_python_version
include_default_pyproject_file = true
include_extra_files_in_package_data = true
}
extra_files = [ "//LICENSE > matter/LICENSE" ]
}
pw_python_package("matter-repl-module") {
python_deps = [ ":matter-core-module" ]
sources = [
"matter/ChipCoreBluetoothMgr.py",
"matter/ReplStartup.py",
"matter/repl_main.py",
]
generate_setup = {
options = {
python_requires = chip_python_requires
install_requires = [
"coloredlogs",
# IPython 8.1.0 has a bug which causes issues: https://github.com/ipython/ipython/issues/13554
"ipython>8.1.0",
"rich",
"ipykernel",
"pyobjc-framework-corebluetooth ; sys_platform==\"darwin\"",
"dbus-python==1.2.18 ; sys_platform==\"linux\"",
"pygobject==3.50.0 ; sys_platform==\"linux\"",
"matter-core",
]
entry_points = {
console_scripts = [ "matter-repl = matter.repl_main:main" ]
}
}
metadata = {
name = "${chip_python_package_prefix}-repl-module"
version = chip_python_version
description = chip_python_package_description
url = chip_python_package_url
classifiers = chip_python_package_classifiers
}
}
}
pw_python_distribution("matter-repl") {
packages = [ ":matter-repl-module" ]
generate_setup_cfg = {
name = "${chip_python_package_prefix}-repl"
version = chip_python_version
include_default_pyproject_file = true
include_extra_files_in_package_data = true
}
public_deps = [
":matter-clusters",
":matter-core",
]
extra_files = [ "//LICENSE > matter/LICENSE" ]
}
# Python wheels collection for core Matter controller packages
pw_python_wheels("matter-controller-wheels") {
packages = [
":matter-clusters",
":matter-core",
":matter-repl",
]
}