aboutsummaryrefslogtreecommitdiff
path: root/libreboot
diff options
context:
space:
mode:
Diffstat (limited to 'libreboot')
-rwxr-xr-xlibreboot263
1 files changed, 147 insertions, 116 deletions
diff --git a/libreboot b/libreboot
index f02de202..218e09a5 100755
--- a/libreboot
+++ b/libreboot
@@ -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