mirror of
https://github.com/google/pebble.git
synced 2025-03-15 08:41:21 +00:00
112 lines
4.2 KiB
Python
112 lines
4.2 KiB
Python
|
# Copyright 2024 Google LLC
|
||
|
#
|
||
|
# 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
|
||
|
from waflib.Errors import BuildError
|
||
|
|
||
|
import inject_metadata
|
||
|
|
||
|
|
||
|
def configure(conf):
|
||
|
"""
|
||
|
This method is called from the configure method of the pebble_sdk waftool to setup the
|
||
|
environment variables for compiling a 3rd party app
|
||
|
:param conf: the ConfigContext
|
||
|
:return: None
|
||
|
"""
|
||
|
CROSS_COMPILE_PREFIX = 'arm-none-eabi-'
|
||
|
|
||
|
conf.env.AS = CROSS_COMPILE_PREFIX + 'gcc'
|
||
|
conf.env.AR = CROSS_COMPILE_PREFIX + 'ar'
|
||
|
conf.env.CC = CROSS_COMPILE_PREFIX + 'gcc'
|
||
|
conf.env.LD = CROSS_COMPILE_PREFIX + 'ld'
|
||
|
conf.env.SIZE = CROSS_COMPILE_PREFIX + 'size'
|
||
|
|
||
|
optimize_flag = '-Os'
|
||
|
|
||
|
conf.load('gcc')
|
||
|
|
||
|
pebble_cflags = ['-std=c99',
|
||
|
'-mcpu=cortex-m3',
|
||
|
'-mthumb',
|
||
|
'-ffunction-sections',
|
||
|
'-fdata-sections',
|
||
|
'-g',
|
||
|
'-fPIE',
|
||
|
optimize_flag]
|
||
|
c_warnings = ['-Wall',
|
||
|
'-Wextra',
|
||
|
'-Werror',
|
||
|
'-Wno-unused-parameter',
|
||
|
'-Wno-error=unused-function',
|
||
|
'-Wno-error=unused-variable']
|
||
|
|
||
|
if (conf.env.SDK_VERSION_MAJOR == 5) and (conf.env.SDK_VERSION_MINOR > 19):
|
||
|
pebble_cflags.append('-D_TIME_H_')
|
||
|
pebble_cflags.extend(c_warnings)
|
||
|
|
||
|
pebble_linkflags = ['-mcpu=cortex-m3',
|
||
|
'-mthumb',
|
||
|
'-Wl,--gc-sections',
|
||
|
'-Wl,--warn-common',
|
||
|
'-fPIE',
|
||
|
optimize_flag]
|
||
|
|
||
|
conf.env.prepend_value('CFLAGS', pebble_cflags)
|
||
|
conf.env.prepend_value('LINKFLAGS', pebble_linkflags)
|
||
|
conf.env.SHLIB_MARKER = None
|
||
|
conf.env.STLIB_MARKER = None
|
||
|
|
||
|
|
||
|
# -----------------------------------------------------------------------------------
|
||
|
def gen_inject_metadata_rule(bld, src_bin_file, dst_bin_file, elf_file, resource_file, timestamp,
|
||
|
has_pkjs, has_worker):
|
||
|
"""
|
||
|
Copy from src_bin_file to dst_bin_file and inject the correct meta-data into the
|
||
|
header of dst_bin_file
|
||
|
:param bld: the BuildContext
|
||
|
:param src_bin_file: the path to the pebble-app.raw.bin file
|
||
|
:param dst_bin_file: the path to the pebble-app.bin
|
||
|
:param elf_file: the path to the pebble-app.elf file
|
||
|
:param resource_file: the path to the resource pack
|
||
|
:param timestamp: the timestamp of the project build
|
||
|
:param has_pkjs: boolean for whether the project contains code using PebbleKit JS
|
||
|
:param has_worker: boolean for whether the project has a worker binary
|
||
|
"""
|
||
|
|
||
|
def inject_data_rule(task):
|
||
|
bin_path = task.inputs[0].abspath()
|
||
|
elf_path = task.inputs[1].abspath()
|
||
|
if len(task.inputs) >= 3:
|
||
|
res_path = task.inputs[2].abspath()
|
||
|
else:
|
||
|
res_path = None
|
||
|
tgt_path = task.outputs[0].abspath()
|
||
|
|
||
|
# First copy the raw bin that the compiler produced to a new location. This way we'll have
|
||
|
# the raw binary around to inspect just in case anything went wrong while we were injecting
|
||
|
# metadata.
|
||
|
cp_result = task.exec_command('cp "{}" "{}"'.format(bin_path, tgt_path))
|
||
|
if cp_result < 0:
|
||
|
raise BuildError("Failed to copy %s to %s!" % (bin_path, tgt_path))
|
||
|
|
||
|
# Now actually inject the metadata into the new copy of the binary.
|
||
|
inject_metadata.inject_metadata(tgt_path, elf_path, res_path, timestamp,
|
||
|
allow_js=has_pkjs, has_worker=has_worker)
|
||
|
|
||
|
sources = [src_bin_file, elf_file]
|
||
|
if resource_file is not None:
|
||
|
sources.append(resource_file)
|
||
|
bld(rule=inject_data_rule, name='inject-metadata', source=sources, target=dst_bin_file)
|