#!/usr/bin/env python

"""
script to test build all of our peripheral firmwares
"""

import os
import shutil
import subprocess
import sys
import fnmatch
import board_list

# get command line arguments
from argparse import ArgumentParser
parser = ArgumentParser(description='build_peripherals')
parser.add_argument("pattern", type=str, default='*', help="board wildcard pattern")
parser.add_argument("--debug", action='store_true', default=False, help="build with debug symbols")
parser.add_argument("--stop", action='store_true', default=False, help="stop on a failed build")
parser.add_argument("--configure-only", action='store_true', default=False, help="only run configure")
parser.add_argument("--noclean", action='store_true', default=False, help="don't run waf clean")
args = parser.parse_args()

os.environ['PYTHONUNBUFFERED'] = '1'

failed_boards = set()

def run_program(cmd_list):
    print("Running (%s)" % " ".join(cmd_list))
    retcode = subprocess.call(cmd_list)
    if retcode != 0:
        print("Build failed: %s" % ' '.join(cmd_list))
        return False
    return True

def build_board(board):
    configure_args = "--board %s --no-submodule-update --Werror" % board
    configure_args = configure_args.split()
    if args.debug:
        print("Building with debug symbols")
        configure_args.append("--debug")
    if not run_program(["./waf", "configure"] + configure_args):
        return False
    if args.configure_only:
        return True
    if not args.noclean and not run_program(["./waf", "clean"]):
        return False
    if not run_program(["./waf", "AP_Periph"]):
        return False
    return True

boards = board_list.BoardList().find_ap_periph_boards()

for board in boards:
    if not fnmatch.fnmatch(board, args.pattern):
        continue
    print("Building for %s" % board)
    if not build_board(board):
        failed_boards.add(board)
        if args.stop:
            break
        continue

if len(failed_boards):
    print("Failed boards: %s" % list(failed_boards))
else:
    print("No failed builds")