#!/usr/bin/env bash # Copyright (C) 2016 Paul Kocialkowski # Copyright (C) 2017 Andrew Robbins # # Ce programme est un logiciel libre: vous pouvez le redistribuer et/ou # le modifier sous les termes de la License Publique GNU Générale publiée # comme telle par la Free Software Foundation, soit la version 3 de la License, # ou (selon votre choix) n'importe quelle version plus récente. # # Ce programme est fournit dans l'espoir qu'il sera utile, mais SANS AUCUNE # GARANTIE; sans même la garantie implicite de MARCHANBILITÉ ou de RÉPONSE # À UN BUT PARTICULIER. Voyez la License Publique GNU générale pour plus # de détails. # # Vous devriez avoir reçu une copie de la License Publique GNU générale # avec ce programme. Si ce n'est pas le cas, visitez # . # GLOBIGNORE=".:.." # This enables the shell option 'dotglob' as well. shopt -s nullglob extglob libreboot_usage() { local action local target printf '%s\n' "$executable [action] [cible] [arguments]" printf '\n%s\n' 'Actions de projet génerique:' for action in "${PROJECT_ACTIONS_GENERIC[@]}"; do printf '%s\n' " $action" done printf '\n%s\n' 'Actions de projet virtuelles:' printf '%s\n' ' sources' printf '%s\n' ' produit' printf '%s\n' ' test' printf '\n%s\n' 'Cibles du projet:' for target in "$root/$PROJECTS"/*; do if project_check "$target"; then printf '%s\n' " ${target##*/}" fi done printf '\n%s\n' "Actions d'outil génériques:" for action in "${TOOL_ACTIONS_GENERIC[@]}"; do printf '%s\n' " $action" done printf '\n%s\n' "Cibles d'un outil:" for target in "$root/$TOOLS"/*; do if tool_check "$target"; then printf '%s\n' " ${target##*/}" fi done printf '\n%s\n' "Variables d'environnement" printf '%s\n' ' RELEASE_KEY - Clé GPG à utiliser pour la version' printf '%s\n' ' PROJECTS_FORCE - Projets dont il faut toujours exécuter les actions pour' printf '%s\n' ' TOOLS_FORCE - Outils dont il faut toujours exécuter les actions pour' printf '%s\n' ' VBOOT_KEYS_PATH - Chemin vers les clés vboot' printf '%s\n' ' LIBFAKETIME_PATH - Chemin vers libfaketime' printf '%s\n' ' TASKS - Nombre de tâches simultanées à exécuter' printf '%s\n' ' VERSION - Numéro de version à utiliser' printf '\n%s\n' 'Fichiers de configuration:' printf '%s\n' " $BUILD_SYSTEM.conf - Configuration des variables d'environnement." } libreboot_project() { action="$1" shift project="$1" shift case "$action" in 'sources') if project_action_arguments 'extract' "$project" "$@"; then return else printf 1>&2 '\n%s\n\n' 'Tentative de téléchargement...' project_action_arguments 'download' "$project" "$@" 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 elif [[ $action == usage ]]; then project_action_usage "$project" "$@" else project_action_arguments "$action" "$project" "$@" fi ;; esac } libreboot_tool() { action="$1" shift tool="$1" shift 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")" libreboot_setup_include libreboot_setup_tool_actions libreboot_setup_project_actions requirements tar sed gpg sha256sum git mmd mcopy grep mkfs.fat libreboot_setup_variables } libreboot_setup_include() { local libs_path="$root/libs" local conf_path source "$libs_path/project" source "$libs_path/tool" source "$libs_path/common" source "$libs_path/git" conf_path="$root/$BUILD_SYSTEM.conf" if [[ -f "$conf_path" ]]; then source "$conf_path" fi } libreboot_setup_tool_actions() { local ignore="${TOOL_ACTIONS_GENERIC_IGNORE_CHECK[*]}" local -a tool_actions for ((i=0, nogeneric=${#TOOL_ACTIONS_GENERIC[@]}; i /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 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 RANDOM_SEED="$RANDOM" # True randomness is unnecessary fi export RANDOM_SEED fi # 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="$(< "$epoch_path")" else SOURCE_DATE_EPOCH="$(date +%s)" fi export SOURCE_DATE_EPOCH fi # Relevant only when libfaketime path is given in $BUILD_SYSTEM.conf 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' export BUILD_DATE_FMT BUILD_DATE FAKETIME LC_ALL LD_PRELOAD TZ fi } libreboot() { action="$1" shift target="$1" shift set -e libreboot_setup "$@" 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 "$@"