diff options
Diffstat (limited to 'libreboot')
-rwxr-xr-x | libreboot | 263 |
1 files changed, 147 insertions, 116 deletions
@@ -1,6 +1,7 @@ -#!/bin/bash +#!/usr/bin/env bash # Copyright (C) 2016 Paul Kocialkowski <contact@paulk.fr> +# Copyright (C) 2017 Andrew Robbins <contact@andrewrobbins.info> # # 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 @@ -16,58 +17,58 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. GLOBIGNORE=".:.." # This enables the shell option 'dotglob' as well. -shopt -s nullglob +shopt -s nullglob extglob libreboot_usage() { local action local target - printf "${executable} [action] [target] [arguments]\n" >&2 + printf '%s\n' "$executable [action] [target] [arguments]" >&2 - printf "\nGeneric project actions:\n" >&2 + printf '\n%s\n' 'Generic project actions:' >&2 - for action in ${PROJECT_ACTIONS_GENERIC}; do - printf " ${action}\n" >&2 + for action in "${PROJECT_ACTIONS_GENERIC[@]}"; do + printf '%s\n' " $action" >&2 done - printf "\nVirtual project actions:\n" >&2 + printf '\n%s\n' 'Virtual project actions:' >&2 + printf '%s\n' ' sources' + printf '%s\n' ' produce' + printf '%s\n' ' test' - printf " sources\n" - printf " produce\n" - printf " test\n" + printf '\n%s\n' 'Project targets:' >&2 - printf "\nProject targets:\n" >&2 - - for target in "${root}/${PROJECTS}"/*; do - if project_check "${target}"; then - printf " ${target}\n" >&2 + for target in "$root/$PROJECTS"/*; do + if project_check "$target"; then + printf '%s\n' " $target" >&2 fi done - printf "\nGeneric tool actions:\n" >&2 + printf '\n%s\n' 'Generic tool actions:' >&2 - for action in ${TOOL_ACTIONS_GENERIC}; do - printf " ${action}\n" >&2 + for action in "${TOOL_ACTIONS_GENERIC[@]}"; do + printf '%s\n' " $action" >&2 done - printf "\nTool targets:\n" >&2 + printf '\n%s\n' 'Tool targets:' >&2 - for target in "${root}/${TOOLS}"/*; do - if tool_check "${target}"; then - printf " ${target}\n" >&2 + for target in "$root/$TOOLS"/*; do + if tool_check "$target"; then + printf '%s\n' " $target" >&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 " VBOOT_KEYS_PATH - Path to the vboot keys\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 + printf '\n%s\n' 'Environment variables:' >&2 + printf '%s\n' ' PROJECTS_FORCE - Projects to always perform actions for' >&2 + printf '%s\n' ' TOOLS_FORCE - Tools to always perform actions for' >&2 + printf '%s\n' ' RELEASE_KEY - GPG key to use for release' >&2 + printf '%s\n' ' VBOOT_KEYS_PATH - Path to the vboot keys' >&2 + printf '%s\n' ' LIBFAKETIME_PATH - Path to the libfaketime shared library' >&2 + printf '%s\n' ' TASKS - Number of simultaneous tasks to run' >&2 + printf '%s\n' ' VERSION - Version string to use' >&2 + + printf '\n%s\n' 'Configuration files:' >&2 + printf '%s\n' " $BUILD_SYSTEM.conf - Environment variables configuration" >&2 } libreboot_project() { @@ -76,35 +77,33 @@ libreboot_project() { project="$1" shift - case ${action} in - "sources") - ( - set +e - - project_action_arguments "extract" "${project}" "$@" && return 0 - project_action_arguments "download" "${project}" "$@" && return 0 - ) + case "$action" in + 'sources') + if project_action_arguments 'extract' "$project" "$@"; then + return + else + printf '\n%s\n\n' 'Attempting to download instead...' + project_action_arguments 'download' "$project" "$@" + fi ;; - "produce") - for action in "build" "install" "release"; do - project_action_arguments "${action}" "${project}" "$@" + '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}" "$@" + 'test') + for action in "${PROJECT_ACTIONS[@]}"; do + project_action_arguments "$action" "$project" "$@" done ;; *) - if ! project_function_check "${project}" "${action}"; then + if ! project_function_check "$project" "$action"; then libreboot_usage exit 1 - fi - - if [[ "${action}" == "usage" ]]; then - project_action "${action}" "${project}" "$@" + elif [[ "$action" == 'usage' ]]; then + project_action "$action" "$project" "$@" else - project_action_arguments "${action}" "${project}" "$@" + project_action_arguments "$action" "$project" "$@" fi ;; esac @@ -116,93 +115,132 @@ libreboot_tool() { 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 + if ! tool_function_check "$tool" "$action"; then + libreboot_usage + exit 1 + elif [[ "$action" == 'usage' ]]; then + tool_action "$action" "$tool" "$@" + else + tool_action_arguments_recursive "$action" "$tool" "$@" + fi } libreboot_setup() { root="$(readlink -f "$(dirname "$0")")" executable="$(basename "$0")" - local requirements="git" - local requirement_path - libreboot_setup_include - libreboot_setup_variables + libreboot_setup_tool_actions + libreboot_setup_project_actions - for requirement in ${requirements}; do - requirement_path="$(which "${requirement}" || true)" + requirements 'tar' 'sed' 'gpg' 'sha256sum' 'git' - if [[ -z "${requirement_path}" ]]; then - printf "Missing requirement: ${requirement}\n" >&2 - exit 1 - fi - done + libreboot_setup_variables } libreboot_setup_include() { - local libs_path="${root}/libs" + local libs_path="$root/libs" local conf_path - source "${libs_path}/project" - source "${libs_path}/tool" - source "${libs_path}/common" - source "${libs_path}/git" + source "$libs_path/project" + source "$libs_path/tool" + source "$libs_path/common" + source "$libs_path/git" - conf_path="${root}/${BUILD_SYSTEM}.conf" + conf_path="$root/$BUILD_SYSTEM.conf" - if [[ -f "${conf_path}" ]]; then - source "${conf_path}" + if [[ -f "$conf_path" ]]; then + source "$conf_path" fi } +libreboot_setup_tool_actions() { + local -i tool_actions_count="${#TOOL_ACTIONS_GENERIC[@]}" + local ignore="${TOOL_ACTIONS_GENERIC_IGNORE_CHECK[*]}" + + local -a tool_actions + + for ((i=0; i<"$tool_actions_count"; i++)); do + tool_actions+=("${TOOL_ACTIONS_GENERIC[i]}") + + if [[ "${TOOL_ACTIONS_GENERIC[i]}" == !(${ignore// /|}) ]]; then + tool_actions+=("${TOOL_ACTIONS_GENERIC[i]/%/_check}") + fi + done + + TOOL_ACTIONS=("${TOOL_ACTIONS_HELPERS[@]}" "${tool_actions[@]}") +} + +libreboot_setup_project_actions() { + local -i project_actions_count="${#PROJECT_ACTIONS_GENERIC[@]}" + local ignore="${PROJECT_ACTIONS_GENERIC_IGNORE_CHECK[*]}" + + local -a project_actions + + for ((i=0; i<"$project_actions_count"; i++)); do + project_actions+=("${PROJECT_ACTIONS_GENERIC[i]}") + + if [[ "${PROJECT_ACTIONS_GENERIC[i]}" == !(${ignore// /|}) ]]; then + project_actions+=("${PROJECT_ACTIONS_GENERIC[i]/%/_check}") + fi + done + + PROJECT_ACTIONS=("${PROJECT_ACTIONS_HELPERS[@]}" "${project_actions[@]}") +} + libreboot_setup_variables() { local vboot_tools_path="$(project_install_path 'vboot' 'tools')" - local version_path="${root}/${DOTVERSION}" - local epoch_path="${root}/${DOTEPOCH}" + local version_path="$root/$DOTVERSION" - if [[ -z "${TASKS}" ]]; then - TASKS=1 + 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="$(< "$version_path")" + else + VERSION="$BUILD_SYSTEM" + fi + fi + + if [[ -d "$vboot_tools_path/devkeys/" ]]; then + VBOOT_KEYS_PATH="${VBOOT_KEYS_PATH:-$vboot_tools_path/devkeys/}" 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}")" + libreboot_setup_reproducible_builds_variables +} + +libreboot_setup_reproducible_builds_variables() { + local epoch_path="$root/$DOTEPOCH" + local rnd_seed_path="$root/$DOTRNDSEED" + + # Used by GCC, e.g., -frandom-seed="$RANDOM_SEED" + if [[ -z "$RANDOM_SEED" ]]; then + if [[ -f "$rnd_seed_path" ]]; then + RANDOM_SEED="$(< "$rnd_seed_path")" else - VERSION="${BUILD_SYSTEM}" + RANDOM_SEED="$RANDOM" # True randomness is unnecessary fi fi - if [[ -z "${SOURCE_DATE_EPOCH}" ]]; then - if git_check "${root}"; then + # Also used by GCC, but as an environment variable + 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}")" + elif [[ -f "$epoch_path" ]]; then + SOURCE_DATE_EPOCH="$(< "$epoch_path")" else SOURCE_DATE_EPOCH="$(date +%s)" fi fi - if [[ -z "${VBOOT_KEYS_PATH}" ]] && [[ -d "${vboot_tools_path}/devkeys/" ]]; then - VBOOT_KEYS_PATH="${vboot_tools_path}/devkeys/" - fi - - if [[ -z "${EDITOR}" ]]; then - EDITOR="vi" + # Relevant only when libfaketime is preloaded + if [[ -n "$LIBFAKETIME_PATH" ]]; then + BUILD_DATE_FMT="%Y-%m-%d %H:%M:%S" + BUILD_DATE="$(date -u -d "@$SOURCE_DATE_EPOCH" "+$BUILD_DATE_FMT" 2>/dev/null || date -u -r "$SOURCE_DATE_EPOCH" "+$BUILD_DATE_FMT" 2>/dev/null || date -u "+$BUILD_DATE_FMT")" + FAKETIME="@$BUILD_DATE" + LC_ALL='C.UTF-8' + LD_PRELOAD="$LIBFAKETIME_PATH" + TZ='UTC' fi } @@ -216,17 +254,10 @@ libreboot() { 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}" "$@" + if project_check "$target"; then + libreboot_project "$action" "$target" "$@" + elif tool_check "$target"; then + libreboot_tool "$action" "$target" "$@" else libreboot_usage exit 1 |