123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- #!/bin/bash
- #
- # Copyright (c) 2013-2021 Igor Pecovnik, igor.pecovnik@gma**.com
- #
- # This file is licensed under the terms of the GNU General Public
- # License version 2. This program is licensed "as is" without any
- # warranty of any kind, whether express or implied.
- # DO NOT EDIT THIS FILE
- # use configuration files like config-default.conf to set the build configuration
- # Please check Orange Pi documentation for more info
- # http://www.orangepi.cn/downloadresourcescn
- # http://www.orangepi.org/downloadresources
- SRC="$(dirname "$(realpath "${BASH_SOURCE[0]}")")"
- # check for whitespace in ${SRC} and exit for safety reasons
- grep -q "[[:space:]]" <<<"${SRC}" && { echo "\"${SRC}\" contains whitespace. Not supported. Aborting." >&2 ; exit 1 ; }
- cd "${SRC}" || exit
- if [[ "${ORANGEPI_ENABLE_CALL_TRACING}" == "yes" ]]; then
- set -T # inherit return/debug traps
- mkdir -p "${SRC}"/output/debug
- echo -n "" > "${SRC}"/output/debug/calls.txt
- trap 'echo "${BASH_LINENO[@]}|${BASH_SOURCE[@]}|${FUNCNAME[@]}" >> ${SRC}/output/debug/calls.txt ;' RETURN
- fi
- if [[ -f "${SRC}"/scripts/general.sh ]]; then
- # shellcheck source=scripts/general.sh
- source "${SRC}"/scripts/general.sh
- else
- echo "Error: missing build directory structure"
- echo "Please clone the full repository by https://github.com/orangepi-xunlong/orangepi-build"
- exit 255
- fi
- # Add the variables needed at the beginning of the path
- check_args ()
- {
- for p in "$@"; do
- case "${p%=*}" in
- LIB_TAG)
- # Take a variable if the branch exists locally
- if [ "${p#*=}" == "$(git branch | \
- gawk -v b="${p#*=}" '{if ( $NF == b ) {print $NF}}')" ]; then
- echo -e "[\e[0;35m warn \x1B[0m] Setting $p"
- eval "$p"
- else
- echo -e "[\e[0;35m warn \x1B[0m] Skip $p setting as LIB_TAG=\"\""
- eval LIB_TAG=""
- fi
- ;;
- esac
- done
- }
- check_args "$@"
- update_src() {
- cd "${SRC}" || exit
- if [[ ! -f "${SRC}"/.ignore_changes ]]; then
- echo -e "[\e[0;32m o.k. \x1B[0m] This script will try to update"
- CHANGED_FILES=$(git diff --name-only)
- if [[ -n "${CHANGED_FILES}" ]]; then
- echo -e "[\e[0;35m warn \x1B[0m] Can't update since you made changes to: \e[0;32m\n${CHANGED_FILES}\x1B[0m"
- while true; do
- echo -e "Press \e[0;33m<Ctrl-C>\x1B[0m or \e[0;33mexit\x1B[0m to abort compilation"\
- ", \e[0;33m<Enter>\x1B[0m to ignore and continue, \e[0;33mdiff\x1B[0m to display changes"
- read -r
- if [[ "${REPLY}" == "diff" ]]; then
- git diff
- elif [[ "${REPLY}" == "exit" ]]; then
- exit 1
- elif [[ "${REPLY}" == "" ]]; then
- break
- else
- echo "Unknown command!"
- fi
- done
- elif [[ $(git branch | grep "*" | awk '{print $2}') != "${LIB_TAG}" && -n "${LIB_TAG}" ]]; then
- git checkout "${LIB_TAG:-master}"
- git pull
- fi
- fi
- }
- TMPFILE=$(mktemp)
- chmod 644 "${TMPFILE}"
- {
- echo SRC="$SRC"
- echo LIB_TAG="$LIB_TAG"
- declare -f update_src
- #echo "update_src"
- } > "$TMPFILE"
- #do not update/checkout git with root privileges to messup files onwership.
- #due to in docker/VM, we can't su to a normal user, so do not update/checkout git.
- if [[ $(systemd-detect-virt) == 'none' ]]; then
- if [[ "${EUID}" == "0" ]]; then
- su "$(stat --format=%U "${SRC}"/.git)" -c "bash ${TMPFILE}"
- else
- bash "${TMPFILE}"
- fi
- fi
- rm "${TMPFILE}"
- if [[ "${EUID}" == "0" ]] || [[ "${1}" == "vagrant" ]]; then
- :
- elif [[ "${1}" == docker || "${1}" == dockerpurge || "${1}" == docker-shell ]] && grep -q "$(whoami)" <(getent group docker); then
- :
- else
- display_alert "This script requires root privileges, trying to use sudo" "" "wrn"
- sudo "${SRC}/build.sh" "$@"
- exit $?
- fi
- if [ "$OFFLINE_WORK" == "yes" ]; then
- echo -e "\n"
- display_alert "* " "You are working offline."
- display_alert "* " "Sources, time and host will not be checked"
- echo -e "\n"
- sleep 3s
- else
- # check and install the basic utilities here
- prepare_host_basic
- fi
- # Check for Vagrant
- if [[ "${1}" == vagrant && -z "$(command -v vagrant)" ]]; then
- display_alert "Vagrant not installed." "Installing"
- sudo apt-get update
- sudo apt-get install -y vagrant virtualbox
- fi
- # Purge Orange Pi Docker images
- if [[ "${1}" == dockerpurge && -f /etc/debian_version ]]; then
- display_alert "Purging Orange Pi Docker containers" "" "wrn"
- docker container ls -a | grep orangepi | awk '{print $1}' | xargs docker container rm &> /dev/null
- docker image ls | grep orangepi | awk '{print $3}' | xargs docker image rm &> /dev/null
- shift
- set -- "docker" "$@"
- fi
- # Docker shell
- if [[ "${1}" == docker-shell ]]; then
- shift
- #shellcheck disable=SC2034
- SHELL_ONLY=yes
- set -- "docker" "$@"
- fi
- # Install Docker if not there but wanted. We cover only Debian based distro install. On other distros, manual Docker install is needed
- if [[ "${1}" == docker && -f /etc/debian_version && -z "$(command -v docker)" ]]; then
- DOCKER_BINARY="docker-ce"
- # add exception for Ubuntu Focal until Docker provides dedicated binary
- codename=$(cat /etc/os-release | grep VERSION_CODENAME | cut -d"=" -f2)
- codeid=$(cat /etc/os-release | grep ^NAME | cut -d"=" -f2 | awk '{print tolower($0)}' | tr -d '"' | awk '{print $1}')
- [[ "${codename}" == "debbie" ]] && codename="buster" && codeid="debian"
- [[ "${codename}" == "ulyana" || "${codename}" == "jammy" ]] && codename="focal" && codeid="ubuntu"
- # different binaries for some. TBD. Need to check for all others
- [[ "${codename}" =~ focal|hirsute ]] && DOCKER_BINARY="docker containerd docker.io"
- display_alert "Docker not installed." "Installing" "Info"
- sudo bash -c "echo \"deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/${codeid} ${codename} stable\" > /etc/apt/sources.list.d/docker.list"
- sudo bash -c "curl -fsSL \"https://download.docker.com/linux/${codeid}/gpg\" | apt-key add -qq - > /dev/null 2>&1 "
- export DEBIAN_FRONTEND=noninteractive
- sudo apt-get update
- sudo apt-get install -y -qq --no-install-recommends ${DOCKER_BINARY}
- display_alert "Add yourself to docker group to avoid root privileges" "" "wrn"
- "${SRC}/build.sh" "$@"
- exit $?
- fi
- EXTER="${SRC}/external"
- # Create userpatches directory if not exists
- mkdir -p "${SRC}"/userpatches
- # Create example configs if none found in userpatches
- if ! ls "${SRC}"/userpatches/{config-example.conf,config-docker.conf,config-vagrant.conf} 1> /dev/null 2>&1; then
- # Migrate old configs
- if ls "${SRC}"/*.conf 1> /dev/null 2>&1; then
- display_alert "Migrate config files to userpatches directory" "all *.conf" "info"
- cp "${SRC}"/*.conf "${SRC}"/userpatches || exit 1
- rm "${SRC}"/*.conf
- [[ ! -L "${SRC}"/userpatches/config-example.conf ]] && ln -fs config-example.conf "${SRC}"/userpatches/config-default.conf || exit 1
- fi
- display_alert "Create example config file using template" "config-default.conf" "info"
- # Create example config
- if [[ ! -f "${SRC}"/userpatches/config-example.conf ]]; then
- cp "${EXTER}"/config/templates/config-example.conf "${SRC}"/userpatches/config-example.conf || exit 1
- ln -fs config-example.conf "${SRC}"/userpatches/config-default.conf || exit 1
- fi
- # Create Docker config
- if [[ ! -f "${SRC}"/userpatches/config-docker.conf ]]; then
- cp "${EXTER}"/config/templates/config-docker.conf "${SRC}"/userpatches/config-docker.conf || exit 1
- fi
- # Create Docker file
- if [[ ! -f "${SRC}"/userpatches/Dockerfile ]]; then
- cp "${EXTER}"/config/templates/Dockerfile "${SRC}"/userpatches/Dockerfile || exit 1
- fi
- # Create Vagrant config
- if [[ ! -f "${SRC}"/userpatches/config-vagrant.conf ]]; then
- cp "${EXTER}"/config/templates/config-vagrant.conf "${SRC}"/userpatches/config-vagrant.conf || exit 1
- fi
- # Create Vagrant file
- if [[ ! -f "${SRC}"/userpatches/Vagrantfile ]]; then
- cp "${EXTER}"/config/templates/Vagrantfile "${SRC}"/userpatches/Vagrantfile || exit 1
- fi
- fi
- if [[ -z "${CONFIG}" && -n "$1" && -f "${SRC}/userpatches/config-$1.conf" ]]; then
- CONFIG="userpatches/config-$1.conf"
- shift
- fi
- # usind default if custom not found
- if [[ -z "${CONFIG}" && -f "${SRC}/userpatches/config-default.conf" ]]; then
- CONFIG="userpatches/config-default.conf"
- fi
- # source build configuration file
- CONFIG_FILE="$(realpath "${CONFIG}")"
- if [[ ! -f "${CONFIG_FILE}" ]]; then
- display_alert "Config file does not exist" "${CONFIG}" "error"
- exit 254
- fi
- CONFIG_PATH=$(dirname "${CONFIG_FILE}")
- # Source the extensions manager library at this point, before sourcing the config.
- # This allows early calls to enable_extension(), but initialization proper is done later.
- # shellcheck source=scripts/extensions.sh
- source "${SRC}"/scripts/extensions.sh
- display_alert "Using config file" "${CONFIG_FILE}" "info"
- pushd "${CONFIG_PATH}" > /dev/null || exit
- # shellcheck source=/dev/null
- source "${CONFIG_FILE}"
- popd > /dev/null || exit
- [[ -z "${USERPATCHES_PATH}" ]] && USERPATCHES_PATH="${CONFIG_PATH}"
- # Script parameters handling
- while [[ "${1}" == *=* ]]; do
- parameter=${1%%=*}
- value=${1##*=}
- shift
- display_alert "Command line: setting $parameter to" "${value:-(empty)}" "info"
- eval "$parameter=\"$value\""
- done
- if [[ "${BUILD_ALL}" == "yes" || "${BUILD_ALL}" == "demo" ]]; then
- # shellcheck source=scripts/build-all-ng.sh
- source "${SRC}"/scripts/build-all-ng.sh
- else
- # shellcheck source=scripts/main.sh
- source "${SRC}"/scripts/main.sh
- fi
|