From 112003a55671ffa5285145280988dc1248b26b08 Mon Sep 17 00:00:00 2001 From: Paul Kocialkowski Date: Fri, 23 Dec 2016 14:20:24 +0100 Subject: Paper build system initial import into Libreboot This is the initial import of the Paper build system into Libreboot. It was written as a flexible and painless replacement for the Libreboot build system, allowing to support many different configurations. It currently only supports the following CrOS devices: * Chromebook 13 CB5-311 (nyan big) * Chromebook 14 (nyan blaze) * Chromebook 11 (HiSense) (veyron jerry) * Chromebit CS10 (veyron mickey) * Chromebook Flip C100PA (veyron minnie) * Chromebook C201PA (veyron speedy) The build system also supports building various tools and provides various scripts to ease the installation on CrOS devices. Signed-off-by: Paul Kocialkowski --- libs/tool | 287 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 287 insertions(+) create mode 100755 libs/tool (limited to 'libs/tool') diff --git a/libs/tool b/libs/tool new file mode 100755 index 00000000..889ee8d5 --- /dev/null +++ b/libs/tool @@ -0,0 +1,287 @@ +#!/bin/bash + +# Copyright (C) 2016 Paul Kocialkowski +# +# 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 . + +TOOL_ACTIONS_GENERIC="usage update execute" +TOOL_ACTIONS_HELPERS="arguments" +TOOL_FUNCTIONS=$( for action in $TOOL_ACTIONS_GENERIC ; do echo "$action" "$action""_check" ; done ; echo "$TOOL_ACTIONS_HELPERS" ) + +tool_include() { + local tool=$1 + + local tool_path=$( tool_path "$tool" ) + + unset -f $TOOL_FUNCTIONS + + . "$tool_path/$tool" + + tool_helper_include "$tool" +} + +tool_helper_include() { + local tool=$1 + + local tool_path=$( tool_path "$tool" ) + local include="$tool_path/$tool-helper" + + if [ -f "$include" ] + then + . "$include" + fi +} + +tool_check() { + local tool=$1 + + local tool_path=$( tool_path "$tool" ) + + if ! [ -f "$tool_path/$tool" ] + then + return 1 + fi + + return 0 +} + +tool_function_check() { + local tool=$1 + local function=$2 + + tool_include "$tool" + + if ! function_check "$function" + then + return 1 + fi + + return 0 +} + +tool_action() { + local action=$1 + shift + local tool=$1 + shift + local arguments=$@ + + ( + set +e + + if ! tool_check "$tool" + then + printf "Tool $tool check failed\n" >&2 + return 1 + fi + + tool_action_check "$action" "$tool" "$@" + + if [ $? -eq 0 ] + then + return 0 + fi + + tool_include "$tool" + + if ! function_check "$action" + then + return 0 + fi + + printf "Tool $tool $action (with ${arguments:-no argument})\n" >&2 + + ( + set -e + "$action" "$@" + ) + + if [ $? -ne 0 ] + then + printf "\nTool $tool $action (with ${arguments:-no argument}) failed\n" >&2 + return 1 + else + printf "\nTool $tool $action (with ${arguments:-no argument}) completed\n" >&2 + fi + ) +} + +tool_action_check() { + local action=$1 + shift + local tool=$1 + shift + + ( + set +e + + if ! tool_check "$tool" + then + printf "Tool $tool check failed\n" >&2 + return 1 + fi + + tool_include "$tool" + + if ! function_check "$action""_check" + then + return 1 + fi + + for tool_force in $TOOLS_FORCE + do + if [ "$tool_force" = "$tool" ] + then + return 1 + fi + done + + ( + set -e + "$action""_check" "$@" + ) + ) +} + +tool_action_helper() { + local helper=$1 + shift + local tool=$1 + shift + + ( + set +e + + if ! tool_check "$tool" + then + printf "Tool $tool check failed\n" >&2 + return 1 + fi + + tool_include "$tool" + + if ! function_check "$helper" + then + return 0 + fi + + ( + set -e + "$helper" "$@" + ) + ) +} + +tool_action_arguments_recursive() { + local action=$1 + shift + local tool=$1 + shift + + local action_helper_arguments=$( tool_action_helper "arguments" "$tool" "$@" ) + local argument + + if [ $? -ne 0 ] || [ -z "$action_helper_arguments" ] + then + tool_action "$action" "$tool" "$@" + else + echo "$action_helper_arguments" | while read argument + do + tool_action_arguments_recursive "$action" "$tool" "$@" "$argument" + done + fi +} + +tool_path() { + local tool=$1 + + local tool_path="$root/$TOOLS/$tool" + + echo "$tool_path" +} + +tool_sources_path() { + local tool=$1 + shift + + local path="$root/$TOOLS/$tool/$SOURCES" + local argument + + for argument in "" "$@" + do + if ! [ -z "$argument" ] + then + path="$path/$argument" + fi + + if directory_filled_check "$path" + then + echo "$path" + return + fi + done +} + +tool_usage_actions() { + local tool=$1 + shift + + printf "\nGeneric actions:\n" + + for action in $TOOL_ACTIONS_GENERIC + do + if function_check "$action" + then + printf " $action\n" + fi + done + + if [ $# -gt 0 ] + then + printf "\nSpecific actions:\n" + + for action in "$@" + do + printf " $action\n" + done + fi +} + +tool_usage_arguments() { + local tool=$1 + shift + + printf "\nArguments:\n" + + tool_usage_arguments_recursive "$tool" " " "$@" +} + +tool_usage_arguments_recursive() { + local tool=$1 + shift + local spacing=$1 + shift + + local action_helper_arguments=$( tool_action_helper "arguments" "$tool" "$@" ) + local argument + + if ! [ -z "$action_helper_arguments" ] + then + echo "$action_helper_arguments" | while read argument + do + printf "$spacing$argument\n" + tool_usage_arguments_recursive "$tool" " $spacing" "$@" "$argument" + done + fi +} -- cgit v1.2.3-70-g09d2