|
@ -0,0 +1,133 @@ |
|
|
|
|
|
#!/usr/bin/env python |
|
|
|
|
|
# |
|
|
|
|
|
# Copyright (C) 2019 by Maxim Prokhorov <prokhorov dot max at outlook dot com> |
|
|
|
|
|
# |
|
|
|
|
|
# This program is free software: you can redistribute it and/or modify |
|
|
|
|
|
# it under the terms of the GNU General Public License as published by |
|
|
|
|
|
# the Free Software Foundation, either version 3 of the License, or |
|
|
|
|
|
# (at your option) any later version. |
|
|
|
|
|
# |
|
|
|
|
|
# This program is distributed in the hope that it will be useful, |
|
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
|
|
|
|
# GNU General Public License for more details. |
|
|
|
|
|
# |
|
|
|
|
|
# You should have received a copy of the GNU General Public License |
|
|
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
|
|
|
|
|
|
|
|
from __future__ import print_function |
|
|
|
|
|
|
|
|
|
|
|
import time |
|
|
|
|
|
import glob |
|
|
|
|
|
import argparse |
|
|
|
|
|
import atexit |
|
|
|
|
|
import subprocess |
|
|
|
|
|
import os |
|
|
|
|
|
import sys |
|
|
|
|
|
import datetime |
|
|
|
|
|
from espurna_utils.display import Color, clr, print_warning |
|
|
|
|
|
|
|
|
|
|
|
CUSTOM_HEADER = "espurna/config/custom.h" |
|
|
|
|
|
if os.path.exists(CUSTOM_HEADER): |
|
|
|
|
|
raise SystemExit( |
|
|
|
|
|
clr( |
|
|
|
|
|
Color.YELLOW, |
|
|
|
|
|
"{} already exists, please run this script in a git-worktree(1) or a separate directory".format( |
|
|
|
|
|
CUSTOM_HEADER |
|
|
|
|
|
), |
|
|
|
|
|
) |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def try_remove(path): |
|
|
|
|
|
try: |
|
|
|
|
|
os.remove(path) |
|
|
|
|
|
except: # pylint: disable=bare-except |
|
|
|
|
|
print_warning("Please manually remove the file `{}`".format(path)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
atexit.register(try_remove, CUSTOM_HEADER) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main(args): |
|
|
|
|
|
configurations = [] |
|
|
|
|
|
if not args.no_default: |
|
|
|
|
|
configurations = list(glob.glob(args.default_configurations)) |
|
|
|
|
|
|
|
|
|
|
|
configurations.extend(x for x in (args.add or [])) |
|
|
|
|
|
if not configurations: |
|
|
|
|
|
raise SystemExit(clr(Color.YELLOW, "No configurations selected")) |
|
|
|
|
|
|
|
|
|
|
|
print(clr(Color.BOLD, "> Selected configurations:")) |
|
|
|
|
|
for cfg in configurations: |
|
|
|
|
|
print(cfg) |
|
|
|
|
|
if args.list: |
|
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
if not args.environment: |
|
|
|
|
|
raise SystemExit(clr(Color.YELLOW, "No environment selected")) |
|
|
|
|
|
print(clr(Color.BOLD, "> Selected environment: {}".format(args.environment))) |
|
|
|
|
|
|
|
|
|
|
|
for cfg in configurations: |
|
|
|
|
|
print(clr(Color.BOLD, "> Building {}".format(cfg))) |
|
|
|
|
|
with open(CUSTOM_HEADER, "w") as custom_h: |
|
|
|
|
|
|
|
|
|
|
|
def write(line): |
|
|
|
|
|
sys.stdout.write(line) |
|
|
|
|
|
custom_h.write(line) |
|
|
|
|
|
|
|
|
|
|
|
name, _ = os.path.splitext(cfg) |
|
|
|
|
|
name = os.path.basename(name) |
|
|
|
|
|
write('#define MANUFACTURER "TEST_BUILD"\n') |
|
|
|
|
|
write('#define DEVICE "{}"\n'.format(name.upper())) |
|
|
|
|
|
with open(cfg, "r") as cfg_file: |
|
|
|
|
|
for line in cfg_file: |
|
|
|
|
|
write(line) |
|
|
|
|
|
|
|
|
|
|
|
os_env = os.environ.copy() |
|
|
|
|
|
os_env["PLATFORMIO_SRC_BUILD_FLAGS"] = "-DUSE_CUSTOM_H" |
|
|
|
|
|
os_env["PLATFORMIO_BUILD_CACHE_DIR"] = "test/pio_cache" |
|
|
|
|
|
cmd = ["platformio", "run", "-s", "-e", args.environment] |
|
|
|
|
|
|
|
|
|
|
|
start = time.time() |
|
|
|
|
|
subprocess.check_call(cmd, env=os_env) |
|
|
|
|
|
end = time.time() |
|
|
|
|
|
print( |
|
|
|
|
|
clr( |
|
|
|
|
|
Color.BOLD, |
|
|
|
|
|
"> {}: {} bytes, {}".format( |
|
|
|
|
|
cfg, |
|
|
|
|
|
os.stat( |
|
|
|
|
|
os.path.join(".pio", "build", args.environment, "firmware.bin") |
|
|
|
|
|
).st_size, |
|
|
|
|
|
datetime.timedelta(seconds=(end - start)), |
|
|
|
|
|
), |
|
|
|
|
|
) |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
|
|
parser = argparse.ArgumentParser() |
|
|
|
|
|
parser.add_argument( |
|
|
|
|
|
"-l", "--list", action="store_true", help="List selected configurations" |
|
|
|
|
|
) |
|
|
|
|
|
parser.add_argument( |
|
|
|
|
|
"-n", |
|
|
|
|
|
"--no-default", |
|
|
|
|
|
action="store_true", |
|
|
|
|
|
help="Do not use default configurations (--default-configurations=...)", |
|
|
|
|
|
) |
|
|
|
|
|
parser.add_argument( |
|
|
|
|
|
"-a", |
|
|
|
|
|
"--add", |
|
|
|
|
|
action="append", |
|
|
|
|
|
help="Add path to selected configurations (can specify multiple times)", |
|
|
|
|
|
) |
|
|
|
|
|
parser.add_argument("-e", "--environment", help="PIO environment") |
|
|
|
|
|
parser.add_argument( |
|
|
|
|
|
"--default-configurations", |
|
|
|
|
|
default="test/build/*.h", |
|
|
|
|
|
help="(glob) default configuration headers", |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
main(parser.parse_args()) |