forked from KeystoneHQ/keystone3-firmware
-
Notifications
You must be signed in to change notification settings - Fork 0
/
build.py
93 lines (79 loc) · 3.29 KB
/
build.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# -*- coding: utf-8 -*-
# !/usr/bin/python
import shutil
import platform
import subprocess
import argparse
import os
source_path = os.path.dirname(os.path.abspath(__file__))
build_dir = "build"
build_path = source_path + '/' + build_dir
argParser = argparse.ArgumentParser()
argParser.add_argument("-e", "--environment", help="please specific which enviroment you are building, dev or production")
argParser.add_argument("-p", "--purpose", help="please specific what purpose you are building, set it to `debug` for building unsigned firmware.")
argParser.add_argument("-o", "--options", nargs="?", help="specify the required features you are building")
argParser.add_argument("-t", "--type", help="please specific which type you are building, btc_only or general")
def build_firmware(environment, options, bin_type):
is_release = environment == "production"
is_btc_only = bin_type == "btc_only"
if not os.path.exists(build_dir):
os.makedirs(build_dir)
padding_script = os.path.join(build_dir, "padding_bin_file.py")
if not os.path.exists(padding_script):
shutil.copy(os.path.join("tools/padding_bin_file", "padding_bin_file.py"), build_dir)
os.chdir(build_path)
if platform.system() == 'Darwin':
cmd = 'cmake -G "Unix Makefiles" .. -DLIB_RUST_C=ON -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++'
else:
cmd = 'cmake -G "Unix Makefiles" .. -DLIB_RUST_C=ON'
if is_release:
cmd += ' -DBUILD_PRODUCTION=true'
if is_btc_only:
cmd += ' -DBTC_ONLY=true'
for option in options:
if option == "screenshot":
cmd += ' -DENABLE_SCREEN_SHOT=true'
if option == "debugmemory":
cmd += ' -DDEBUG_MEMORY=true'
# add more option here.
cmd_result = os.system(cmd)
if cmd_result != 0:
return cmd_result
make_result = os.system('make -j')
if make_result != 0:
return make_result
return os.system('python padding_bin_file.py mh1903.bin')
def ota_maker():
os.chdir(source_path)
if platform.system() == 'Darwin':
cpu = platform.processor()
if cpu == "arm":
args = ("./tools/mac_arm/ota-maker", "--source", "./build/mh1903.bin", "--destination", "./build/keystone3.bin")
else:
args = ("./tools/mac/ota-maker", "--source", "./build/mh1903.bin", "--destination", "./build/keystone3.bin")
popen = subprocess.Popen(args, stdout=subprocess.PIPE)
popen.wait()
if __name__ == '__main__':
args = argParser.parse_args()
print("=============================================")
print("--")
print(f"Building firmware for { args.environment if args.environment else 'dev'}")
print(f"Building firmware type { args.type if args.type else 'general'}")
if args.options:
print(f"Options: {args.options}")
print("--")
print("=============================================")
env = args.environment
options = []
if args.options:
options = args.options.split(",")
bin_type = args.type
shutil.rmtree(build_path, ignore_errors=True)
build_result = build_firmware(env, options, bin_type)
if build_result != 0:
exit(1)
if platform.system() == 'Darwin':
ota_maker()
purpose = args.purpose
if purpose and purpose == "debug":
ota_maker()