blob: cc4eb83a66562110d3bb6bbdba842bed3e86d049 [file] [log] [blame]
# 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 os
import shlex
from enum import Enum, auto
from typing import Optional
from .builder import Builder, BuilderOutput
class MbedApp(Enum):
LOCK = auto()
LIGHT = auto()
ALL_CLUSTERS = auto()
ALL_CLUSTERS_MINIMAL = auto()
PIGWEED = auto()
SHELL = auto()
OTA_REQUESTOR = auto()
@property
def ExampleName(self):
if self == MbedApp.LOCK:
return 'lock-app'
elif self == MbedApp.LIGHT:
return 'lighting-app'
elif self == MbedApp.ALL_CLUSTERS:
return 'all-clusters-app'
elif self == MbedApp.ALL_CLUSTERS_MINIMAL:
return 'all-clusters-minimal-app'
elif self == MbedApp.PIGWEED:
return 'pigweed-app'
elif self == MbedApp.OTA_REQUESTOR:
return 'ota-requestor-app'
elif self == MbedApp.SHELL:
return 'shell'
else:
raise Exception('Unknown app type: %r' % self)
@property
def AppNamePrefix(self):
if self == MbedApp.LOCK:
return 'chip-mbed-lock-app-example'
elif self == MbedApp.LIGHT:
return 'chip-mbed-lighting-app-example'
elif self == MbedApp.ALL_CLUSTERS:
return 'chip-mbed-all-clusters-app-example'
elif self == MbedApp.ALL_CLUSTERS_MINIMAL:
return 'chip-mbed-all-clusters-minimal-app-example'
elif self == MbedApp.PIGWEED:
return 'chip-mbed-pigweed-app-example'
elif self == MbedApp.OTA_REQUESTOR:
return 'chip-mbed-ota-requestor-app-example'
elif self == MbedApp.SHELL:
return 'chip-mbed-shell-example'
else:
raise Exception('Unknown app type: %r' % self)
class MbedBoard(Enum):
CY8CPROTO_062_4343W = auto()
@property
def BoardName(self):
if self == MbedBoard.CY8CPROTO_062_4343W:
return 'CY8CPROTO_062_4343W'
else:
raise Exception('Unknown board type: %r' % self)
class MbedProfile(Enum):
RELEASE = auto()
DEVELOP = auto()
DEBUG = auto()
@property
def ProfileName(self):
if self == MbedProfile.RELEASE:
return 'release'
elif self == MbedProfile.DEVELOP:
return 'develop'
elif self == MbedProfile.DEBUG:
return 'debug'
else:
raise Exception('Unknown board type: %r' % self)
class MbedBuilder(Builder):
def __init__(self,
root,
runner,
app: MbedApp = MbedApp.LOCK,
board: MbedBoard = MbedBoard.CY8CPROTO_062_4343W,
profile: MbedProfile = MbedProfile.RELEASE,
data_model_interface: Optional[str] = None,
):
super(MbedBuilder, self).__init__(root, runner)
self.app = app
self.board = board
self.profile = profile
self.toolchain = "GCC_ARM"
self.mbed_os_path = os.path.join(
self.root, 'third_party', 'mbed-os', 'repo')
self.mbed_os_posix_socket_path = os.path.join(
self.root, 'third_party', 'mbed-os-posix-socket', 'repo')
self.data_model_interface = data_model_interface
@property
def ExamplePath(self):
return os.path.join(self.root, 'examples', self.app.ExampleName, 'mbed')
def generate(self):
if not os.path.exists(self.output_dir):
self._Execute(['mbed-tools', 'configure',
'-t', self.toolchain,
'-m', self.board.BoardName,
'-p', self.ExamplePath,
'-o', self.output_dir,
'--mbed-os-path', self.mbed_os_path,
], title='Generating config ' + self.identifier)
flags = []
flags.append(f"-DMBED_OS_PATH={shlex.quote(self.mbed_os_path)}")
flags.append(f"-DMBED_OS_PATH={shlex.quote(self.mbed_os_path)}")
flags.append(f"-DMBED_OS_POSIX_SOCKET_PATH={shlex.quote(self.mbed_os_posix_socket_path)}")
if self.data_model_interface is not None:
flags.append(f"-DCHIP_DATA_MODEL_INTERFACE={self.data_model_interface}")
if self.options.pregen_dir:
flags.append(f"-DCHIP_CODEGEN_PREGEN_DIR={shlex.quote(self.options.pregen_dir)}")
self._Execute(['cmake', '-S', shlex.quote(self.ExamplePath), '-B', shlex.quote(self.output_dir),
'-GNinja'] + flags, title='Generating ' + self.identifier)
def _build(self):
# Remove old artifacts to force linking
cmd = 'rm -rf {}/chip-*'.format(self.output_dir)
self._Execute(['bash', '-c', cmd],
title='Remove old artifacts ' + self.identifier)
self._Execute(['cmake', '--build', shlex.quote(self.output_dir)],
title='Building ' + self.identifier)
def build_outputs(self):
extensions = ['elf', 'hex']
if self.options.enable_link_map_file:
extensions.append('elf.map')
for ext in extensions:
name = f"{self.app.AppNamePrefix()}.{ext}"
yield BuilderOutput(os.path.join(self.output_dir, name), name)