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 --- libreboot | 262 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100755 libreboot (limited to 'libreboot') diff --git a/libreboot b/libreboot new file mode 100755 index 00000000..31fc04e1 --- /dev/null +++ b/libreboot @@ -0,0 +1,262 @@ +#!/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 . + +libreboot_usage() { + local action + local target + + printf "$executable [action] [target] [arguments]\n" >&2 + + printf "\nGeneric project actions:\n" >&2 + + for action in $PROJECT_ACTIONS_GENERIC + do + printf " $action\n" >&2 + done + + printf "\nVirtual project actions:\n" >&2 + + printf " sources\n" + printf " produce\n" + printf " test\n" + + printf "\nProject targets:\n" >&2 + + ls -A "$root/$PROJECTS/" | while read target + do + if project_check "$target" + then + printf " $target\n" >&2 + fi + done + + printf "\nGeneric tool actions:\n" >&2 + + for action in $TOOL_ACTIONS_GENERIC + do + printf " $action\n" >&2 + done + + printf "\nTool targets:\n" >&2 + + ls -A "$root/$TOOLS/" | while read target + do + if tool_check "$target" + then + printf " $target\n" >&2 + fi + done + + printf "\nEnvironment variables:\n" >&2 + printf " PROJECTS_FORCE - Projects to always perform actions for\n" >&2 + printf " TOOLS_FORCE - Tools to always perform actions for\n" >&2 + printf " RELEASE_KEY - GPG key to use for release\n" >&2 + printf " TASKS - Number of simultaneous tasks to run\n" >&2 + printf " VERSION - Version string to use\n" >&2 + + printf "\nConfiguration files:\n" >&2 + printf " $BUILD_SYSTEM.conf - Environment variables configuration\n" >&2 +} + +libreboot_project() { + action=$1 + shift + project=$1 + shift + + case $action in + "sources") + ( + set +e + + project_action_arguments "extract" "$project" "$@" + if [ $? -eq 0 ] + then + return 0 + fi + + project_action_arguments "download" "$project" "$@" + if [ $? -eq 0 ] + then + return 0 + fi + ) + ;; + "produce") + for action in "build" "install" "release" + do + project_action_arguments "$action" "$project" "$@" + done + ;; + "test") + for action in $PROJECT_ACTIONS + do + project_action_arguments "$action" "$project" "$@" + done + ;; + *) + if ! project_function_check "$project" "$action" + then + libreboot_usage + exit 1 + fi + + if [ "$action" = "usage" ] + then + project_action "$action" "$project" "$@" + else + project_action_arguments "$action" "$project" "$@" + fi + ;; + esac +} + +libreboot_tool() { + action=$1 + shift + tool=$1 + shift + + case $action in + *) + if ! tool_function_check "$tool" "$action" + then + libreboot_usage + exit 1 + fi + + if [ "$action" = "usage" ] + then + tool_action "$action" "$tool" "$@" + else + tool_action_arguments_recursive "$action" "$tool" "$@" + fi + ;; + esac +} + +libreboot_setup() { + root=$( realpath "$( dirname "$0" )" ) + executable=$( basename "$0" ) + + local requirements="git" + local requirement_path + + libreboot_setup_include + libreboot_setup_variables + + for requirement in $requirements + do + requirement_path=$( which "$requirement" || true ) + + if [ -z "$requirement_path" ] + then + printf "Missing requirement: $requirement\n" >&2 + exit 1 + fi + done +} + +libreboot_setup_include() { + local libs_path="$root/libs" + local conf_path + + . "$libs_path/project" + . "$libs_path/tool" + . "$libs_path/common" + . "$libs_path/git" + + conf_path="$root/$BUILD_SYSTEM.conf" + + if [ -f "$conf_path" ] + then + . "$conf_path" + fi +} + +libreboot_setup_variables() { + local version_path="$root/$DOTVERSION" + local epoch_path="$root/$DOTEPOCH" + + if [ -z "$TASKS" ] + then + TASKS=1 + fi + + if [ -z "$VERSION" ] + then + if git_check "$root" + then + VERSION="$BUILD_SYSTEM-"$( git_describe "$root" 2> /dev/null || echo "git" ) + elif [ -f "$version_path" ] + then + VERSION=$( cat "$version_path" ) + else + VERSION=$BUILD_SYSTEM + fi + fi + + if [ -z "$SOURCE_DATE_EPOCH" ] + then + if git_check "$root" + then + SOURCE_DATE_EPOCH=$( git log -1 --format=%ct ) + elif [ -f "$epoch_path" ] + then + SOURCE_DATE_EPOCH=$( cat "$epoch_path" ) + else + SOURCE_DATE_EPOCH=$( date +%s ) + fi + fi + + if [ -z "$EDITOR" ] + then + EDITOR="nano" + fi +} + +libreboot() { + action=$1 + shift + target=$1 + shift + + set -e + + libreboot_setup "$@" + + if [ -z "$action" ] || [ -z "$target" ] + then + libreboot_usage + exit 1 + fi + + requirements "tar" "sed" "gpg" "sha256sum" + + if project_check "$target" + then + libreboot_project "$action" "$target" "$@" + elif tool_check "$target" + then + libreboot_tool "$action" "$target" "$@" + else + libreboot_usage + exit 1 + fi +} + +libreboot "$@" -- cgit v1.2.3-70-g09d2