diff --git a/scripts/build b/scripts/build index d53436d9fe..b3a3960619 100755 --- a/scripts/build +++ b/scripts/build @@ -74,11 +74,9 @@ case "${TARGET}" in ;; esac -if is_sequential_build; then - for p in ${_pkg_depends}; do - ${SCRIPTS}/build "${p}" "${PARENT_PKG}" - done -fi +for p in ${_pkg_depends}; do + ${SCRIPTS}/build "${p}" "${PARENT_PKG}" +done # virtual packages are not built as they only contain dependencies, so dont go further here if [ "${PKG_SECTION}" = "virtual" ]; then @@ -167,12 +165,21 @@ TARGET_CMAKE_OPTS="-DCMAKE_TOOLCHAIN_FILE=${CMAKE_CONF} \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" +case ${ARCH} in + arm|i686) + BUILD_OPTS_TARGET_LIBDIR=/usr/lib32 + ;; + *) + BUILD_OPTS_TARGET_LIBDIR=/usr/lib + ;; +esac + TARGET_MESON_OPTS="--prefix=/usr \ --bindir=/usr/bin \ --sbindir=/usr/sbin \ --sysconfdir=/etc \ - --libdir=/usr/lib \ - --libexecdir=/usr/lib \ + --libdir=${BUILD_OPTS_TARGET_LIBDIR} \ + --libexecdir=${BUILD_OPTS_TARGET_LIBDIR} \ --localstatedir=/var \ --buildtype=${MESON_BUILD_TYPE}" if [ "${BUILD_WITH_DEBUG}" != "yes" ] && flag_enabled "strip" "yes"; then @@ -255,18 +262,18 @@ fi # create wrapper scripts in build dir and use them for CC/CXX when # building for host and local-cc build flag is set if [ "${TARGET}" = "host" ] && flag_enabled "local-cc" "no"; then - cat >libreelec-local-cc <rocknix-local-cc <libreelec-local-cxx <rocknix-local-cxx < lib to make 32-bit apps agnostic of dependencies' libdir +if [ ! -d "${SYSROOT_PREFIX}${BUILD_OPTS_TARGET_LIBDIR}" ]; then + ln -s lib "${SYSROOT_PREFIX}${BUILD_OPTS_TARGET_LIBDIR}" +fi record_timestamp BUILD_MAKEINSTALL @@ -584,7 +595,7 @@ if [ "${TARGET}" = "target" -o "${TARGET}" = "init" ]; then fi if [ -n "${INSTALL}" -a -d "${INSTALL}" ]; then - echo "INFO_PKG_NAME=\"${PKG_NAME}\"" >"${INSTALL}/.libreelec-package" + echo "INFO_PKG_NAME=\"${PKG_NAME}\"" >"${INSTALL}/.rocknix-package" fi cd ${ROOT} diff --git a/scripts/build_compat b/scripts/build_compat new file mode 100755 index 0000000000..5af9525eed --- /dev/null +++ b/scripts/build_compat @@ -0,0 +1,97 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2024-present ROCKNIX (https://github.com/ROCKNIX) + +unset _CACHE_PACKAGE_LOCAL _CACHE_PACKAGE_GLOBAL _DEBUG_DEPENDS_LIST _DEBUG_PACKAGE_LIST + +. config/options "" +. config/multithread +. config/show_config + +show_config + +${SCRIPTS}/checkdeps + +# Setup both toolchain cmake configs to avoid potentially racy behaviour later. +# Use a fork for host to isolate any variable modifications. +( setup_toolchain host ) +setup_toolchain target + +function do_mkimage() { + # Variables used in mkimage script must be passed + env \ + ROOT="${ROOT}" \ + SCRIPTS="${SCRIPTS}" \ + TOOLCHAIN="${TOOLCHAIN}" \ + PROJECT_DIR="${PROJECT_DIR}" \ + PROJECT="${PROJECT}" \ + DEVICE="${DEVICE}" \ + DISTRO="${DISTRO}" \ + TARGET_IMG="${TARGET_IMG}" \ + BUILD_NAME="${IMAGE_NAME}" \ + IMAGE_NAME="${1:-${IMAGE_NAME}}" \ + BOOTLOADER="${BOOTLOADER}" \ + KERNEL_NAME="${KERNEL_NAME}" \ + TARGET_KERNEL_ARCH="${TARGET_KERNEL_ARCH}" \ + RELEASE_DIR="${RELEASE_DIR}" \ + UUID_SYSTEM="${UUID_SYSTEM}" \ + UUID_STORAGE="${UUID_STORAGE}" \ + DISTRO_BOOTLABEL="${DISTRO_BOOTLABEL}" \ + DISTRO_DISKLABEL="${DISTRO_DISKLABEL}" \ + UBOOT_SYSTEM="${UBOOT_SYSTEM}" \ + UBOOT_VERSION="${UBOOT_VERSION}" \ + EXTRA_CMDLINE="${EXTRA_CMDLINE}" \ + SYSTEM_SIZE="${SYSTEM_SIZE}" \ + SYSTEM_PART_START="${SYSTEM_PART_START}" \ + SUBDEVICE="${SUBDEVICE}" \ + ${SCRIPTS}/mkimage +} + +if [ -n "${CUSTOM_GIT_HASH}" ]; then + GIT_HASH="${CUSTOM_GIT_HASH}" +else + GIT_HASH=$(git rev-parse HEAD) +fi + +# Get origin url, fix git:// and git@github.com: urls if necessary +ORIGIN_URL="$(git remote -v | awk '$1 == "origin" { print $2 }' | head -1 | sed 's#\.git$##;s#^git:#https:#;s#^git@github\.com:#https://github.com/#')" + +if [ -n "${CUSTOM_VERSION}" ]; then + export OS_VERSION="${CUSTOM_VERSION}" +fi + +OS_ARCH="${DEVICE:-${PROJECT}}.${TARGET_ARCH}" +TARGET_VERSION="${OS_ARCH}-${OS_VERSION}" + +if [ -n "${CUSTOM_IMAGE_NAME}" ]; then + IMAGE_NAME="${CUSTOM_IMAGE_NAME}" +else + IMAGE_NAME="${DISTRONAME}-${TARGET_VERSION}" +fi + +if [ -n "${IMAGE_SUFFIX}" ]; then + IMAGE_NAME="${IMAGE_NAME}-${IMAGE_SUFFIX}" +fi + +echo "${IMAGE_NAME}" > ${BUILD}/BUILD_FILENAME + +# Setup fakeroot +rm -rf ${FAKEROOT_SCRIPT} # remove ${FAKEROOT_SCRIPT} if it exist +touch ${FAKEROOT_SCRIPT} # create an empty ${FAKEROOT_SCRIPT} +chmod +x ${FAKEROOT_SCRIPT} # make ${FAKEROOT_SCRIPT} executable +echo "chown -R 0:0 ${INSTALL}" >> ${FAKEROOT_SCRIPT} + +# Clean old install dirs +rm -rf ${INSTALL} +rm -rf ${STAMPS_INSTALL} +mkdir -p ${INSTALL} + +# Create base layout of ROCKNIX read-only file system +for directory in etc dev proc run sys tmp usr var flash storage; do + mkdir -p ${INSTALL}/${directory} +done + +MTADDONBUILD=no start_multithread_build ${1} || die "Parallel build failure. Time of failure: $(date)" +echo "Successful build! Building compatibility root..." >&2 +exit 0 + diff --git a/scripts/build_distro b/scripts/build_distro new file mode 100755 index 0000000000..893e0f8f12 --- /dev/null +++ b/scripts/build_distro @@ -0,0 +1,107 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2024-present ROCKNIX (https://github.com/ROCKNIX) + +### +### Simple script to build ROCKNX +### + +set -e + +scripts/checkdeps + +if [ -z "${ARCH}" ]; then + echo "Please export ARCH before building." + exit 1 +fi + +. config/options "" +. projects/${PROJECT}/devices/${DEVICE}/options + +echo "Building ${DISTRO} for ${DEVICE}" + +# Collect packages to clean +PKG_CLEAN="" + +if [ "${ENABLE_32BIT}" == "true" ]; then + PKG_CLEAN+=" ${CLEAN_EMU_32BIT}" +fi + +if [ "${WINDOWMANAGER}" == "weston" ]; then + PKG_CLEAN+=" ${CLEAN_WESTON}" +fi + +# Handle DEVICE_ROOT logic +if [ -n "${DEVICE_ROOT}" ]; then + if [ "${DEVICE_ROOT}" != "${DEVICE}" ]; then + # Remove existing build directory if present + if [ -d "build.${DISTRO}-${DEVICE}.${ARCH}" ]; then + echo "Removing stale build root." + rm -rf build.${DISTRO}-${DEVICE}.${ARCH} + fi + + # Ensure DEVICE_ROOT is built before DEVICE + if [ ! -d "build.${DISTRO}-${DEVICE_ROOT}.${ARCH}" ]; then + echo "ERROR: Can't find build root build.${DISTRO}-${DEVICE_ROOT}.${ARCH}" + echo "You need to build ${DEVICE_ROOT} before ${DEVICE}" + exit 1 + fi + + # Link build directory to DEVICE_ROOT + if [ ! -L "build.${DISTRO}-${DEVICE}.${ARCH}" ]; then + ln -sf build.${DISTRO}-${DEVICE_ROOT}.${ARCH} build.${DISTRO}-${DEVICE}.${ARCH} + fi + + # Link sources if necessary + if [ -d "sources-${DEVICE_ROOT}" ] && [ ! -L "sources-${DEVICE}" ]; then + ln -sf sources-${DEVICE_ROOT} sources-${DEVICE} + fi + fi + PKG_CLEAN+=" ${CLEAN_DEVICE_ROOT}" +fi + +# Add standard packages to clean +PKG_CLEAN+=" ${CLEAN_NETWORK} ${CLEAN_OS_BASE} ${CLEAN_PACKAGES}" + +if [ -z "${DIRTY}" ]; then + # Clean packages to ensure build date and version are updated + for package in ${PKG_CLEAN}; do + echo "Clean: ${package}" + ./scripts/clean "${package}" 2>/dev/null || true + done + rm -rf build.${DISTRO}-${DEVICE_ROOT}.${ARCH}/{.stamps/initramfs,initramfs} +fi + +# Prune old releases +echo "Prune old releases: ${DISTRO}-${DEVICE}.${ARCH}-*" +rm -f ./release/${DISTRO}-${DEVICE}.${ARCH}-* + +# Remove image root +rm -rf ./build.${DISTRO}-${DEVICE}.${ARCH}/image + +case "${ARCH}" in + arm) + if [ "${BASE_ONLY}" == "true" ] || [ "${ENABLE_32BIT}" != "true" ]; then + exit 0 + fi + export PKG_BUILD_PERF=no + scripts/build_compat arm + scripts/install arm + ;; + i686) + if [ "${BASE_ONLY}" == "true" ] || [ "${ENABLE_32BIT}" != "true" ]; then + exit 0 + fi + export PKG_BUILD_PERF=no + scripts/build_compat x86 + scripts/install x86 + ;; + *) + make image + ;; +esac + +if [ $? -ne 0 ]; then + echo "Build failed..exiting." + exit 1 +fi diff --git a/scripts/clean b/scripts/clean index 3418483ba2..4c9678b2b1 100755 --- a/scripts/clean +++ b/scripts/clean @@ -18,15 +18,15 @@ clean_package() { for i in "${BUILD}/build/${1}-"* \ "${BUILD}/install_pkg/${1}-"* \ "${BUILD}/install_init/${1}-"*; do - if [ -d "${i}" -a -f "${i}/.libreelec-unpack" ]; then - . "${i}/.libreelec-unpack" + if [ -d "${i}" -a -f "${i}/.rocknix-unpack" ]; then + . "${i}/.rocknix-unpack" if [ "${STAMP_PKG_NAME}" = "${1}" ]; then build_msg "CLR_WARNING" "*" "$(print_color "CLR_WARNING_DIM" "Removing ${i} ...")" rm -rf "${i}" fi - elif [ -d "${i}" -a -f "${i}/.libreelec-package" ]; then + elif [ -d "${i}" -a -f "${i}/.rocknix-package" ]; then # force clean if no stamp found (previous unpack failed) - . "${i}/.libreelec-package" + . "${i}/.rocknix-package" if [ "${INFO_PKG_NAME}" = "${1}" ]; then build_msg "CLR_WARNING" "*" "$(print_color "CLR_WARNING_DIM" "Removing ${i} ...")" rm -rf "${i}" diff --git a/scripts/extract b/scripts/extract index 02d753f56e..1fe7d96327 100755 --- a/scripts/extract +++ b/scripts/extract @@ -71,6 +71,11 @@ case "${PKG_SOURCE_NAME}" in *.diff.gz | *.patch.gz | patch-*.gz) zcat "${FULL_SOURCE_PATH}" | patch -d "${2}" -p1 ;; + *.AppImage) + FULL_DEST_PATH="${2}/${PKG_NAME}-${PKG_VERSION}" + mkdir -p "${DESTDIR}" + cp -f "${FULL_SOURCE_PATH}" "${DESTDIR}" + ;; *) FULL_DEST_PATH="${2}/${PKG_NAME}-${PKG_VERSION}" mkdir "${FULL_DEST_PATH}" diff --git a/scripts/get_archive b/scripts/get_archive index 1753c08378..74817e1e4b 100755 --- a/scripts/get_archive +++ b/scripts/get_archive @@ -20,39 +20,37 @@ build_msg "CLR_GET" "GET" "${1} (archive)" "indent" pkg_lock_status "GETPKG" "${PKG_NAME}" "unpack" "downloading package..." -PACKAGE_MIRROR="${DISTRO_MIRROR}/${PKG_NAME}/${PKG_SOURCE_NAME}" - -[ "${VERBOSE}" != "yes" ] && GET_OPT="--silent --show-error" -GET_CMD="curl ${GET_OPT} --fail --connect-timeout 30 --retry 3 --continue-at - --location --max-redirs 5 --output ${PACKAGE}" +PACKAGE_MIRROR="${DISTRO_MIRROR}/${PKG_SOURCE_NAME}" +[ "${VERBOSE}" != "yes" ] && WGET_OPT=-q +WGET_CMD="wget --secure-protocol=TLSv1_2 --output-file=- --timeout=30 --tries=3 --passive-ftp --no-check-certificate -c ${WGET_OPT} --progress=bar:force --retry-connrefused --waitretry=5 --retry-on-http-error=429,500,502,503,504 --show-progress -O ${PACKAGE}" # unset LD_LIBRARY_PATH to stop wget from using toolchain/lib and loading libssl.so/libcrypto.so instead of host libraries unset LD_LIBRARY_PATH rm -f "${STAMP_URL}" "${STAMP_SHA}" -NBGET=10 -NBCHKS=2 -while [ ${NBGET} -gt 0 -a ${NBCHKS} -gt 0 ]; do - for url in "${PKG_URL}" "${PACKAGE_MIRROR}"; do +PKG_URLS="${PKG_URL}" +if [ -n "${PACKAGE_MIRROR}" ] +then + PKG_URLS="${PKG_URL} ${PACKAGE_MIRROR}" +fi + +NBWGET=10 +while [ ${NBWGET} -gt 0 ]; do + for url in ${PKG_URLS}; do rm -f "${PACKAGE}" - if ${GET_CMD} "${url}"; then + if ${WGET_CMD} "${url}"; then CALC_SHA256=$(sha256sum "${PACKAGE}" | cut -d" " -f1) [ -z "${PKG_SHA256}" -o "${PKG_SHA256}" = "${CALC_SHA256}" ] && break 2 - if [ "${CHANGE_HASH}" = "yes" ]; then - sed -e "s|^PKG_SHA256=.*|PKG_SHA256=\"${CALC_SHA256}\"|" -i "${PKG_DIR}/package.mk" - break 2 - else - build_msg "CLR_WARNING" "WARNING" "Incorrect checksum calculated on downloaded file: got ${CALC_SHA256} wanted ${PKG_SHA256}" - NBCHKS=$((NBCHKS - 1)) - fi + build_msg "CLR_WARNING" "WARNING" "Incorrect checksum calculated on downloaded file: got ${CALC_SHA256} wanted ${PKG_SHA256}" fi done - NBGET=$((NBGET - 1)) + NBWGET=$((NBWGET - 1)) done -if [ ${NBGET} -eq 0 -o ${NBCHKS} -eq 0 ]; then +if [ ${NBWGET} -eq 0 ]; then die "\nCannot get ${1} sources : ${PKG_URL}\nTry later!" else build_msg "CLR_INFO" "INFO" "Calculated checksum: ${CALC_SHA256}" diff --git a/scripts/get_env b/scripts/get_env new file mode 100755 index 0000000000..c33693818b --- /dev/null +++ b/scripts/get_env @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +for var in $(compgen -e); do echo "$var=${!var}"; done diff --git a/scripts/get_git b/scripts/get_git index 15b2885ea2..17d02ce9a8 100755 --- a/scripts/get_git +++ b/scripts/get_git @@ -1,3 +1,4 @@ +#!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) @@ -11,125 +12,221 @@ # PKG_GIT_CLONE_DEPTH (optional) history to clone, must be a number # PKG_GIT_SUBMODULE_DEPTH (optional) history of submodules to clone, must be a number -_get_repo_already_downloaded() { - if [ -d "${PACKAGE}" ]; then - ( - cd "${PACKAGE}" - _get_repo_clean - [ -n "$(git ls-remote . | grep -m1 HEAD | awk "/^${PKG_VERSION}/ {print \$1;}")" ] || die "ERROR: ${PACKAGE}: failed to determine git HEAD" - [ "${PKG_URL}" = "$(git remote get-url origin)" ] || die "ERROR: ${PACKAGE}: failed to obtain URL of origin" - [ -z "${PKG_GIT_CLONE_BRANCH}" ] && exit 0 - [ "${PKG_GIT_CLONE_BRANCH}" = "$(git branch | grep ^\* | cut -d ' ' -f2)" ] || die "ERROR: ${PACKAGE}: failed to determine current git branch" - exit 0 - ) - return - else - return 1 - fi -} +set -e +set -o pipefail -_get_repo_clean() { + +#_debug=true +if [[ "${_debug}" ]] ; then + export PS4='+${BASH_SOURCE}:${LINENO}: ' + set -x +fi + + +_clean_repo() { git clean -fdx - git checkout -- . + git restore --staged . || git switch --force # Clear changes and ensure correct branch } -# Latest file already present, exit now... -_get_repo_already_downloaded && exit 0 +_repo_exists_and_valid() { + if [[ -d "${PACKAGE}" ]]; then + pushd "${PACKAGE}" > /dev/null + _clean_repo || return 1 -lock_source_dir "${1}" + if ! git ls-remote . | grep -q -m1 "^${PKG_VERSION}"; then + echo "ERROR: ${PACKAGE}: failed to determine git HEAD" >&2 + return 1 + fi -# Check again in case of concurrent access - if nothing needs to be downloaded, exit now... -_get_repo_already_downloaded && exit 0 + if [[ "${PKG_URL}" != "$(git remote get-url origin)" ]]; then + echo "ERROR: ${PACKAGE}: failed to obtain URL of origin" >&2 + return 1 + fi -# At this point, we need to download something... -build_msg "CLR_GET" "GET" "${1} (git)" "indent" + if [[ -n "${PKG_GIT_CLONE_BRANCH}" && "${PKG_GIT_CLONE_BRANCH}" != "$(git rev-parse --abbrev-ref HEAD)" ]]; then + echo "ERROR: ${PACKAGE}: failed to determine current git branch" >&2 + return 1 + fi -pkg_lock_status "GETPKG" "${PKG_NAME}" "unpack" "processing package repository..." - -rm -f "${STAMP_URL}" "${STAMP_SHA}" - -GIT_CLONE_PARAMS="" -GIT_SUBMODULE_PARAMS="" - -[ -n "${PKG_GIT_CLONE_BRANCH}" ] && GIT_CLONE_PARAMS="${GIT_CLONE_PARAMS} --branch ${PKG_GIT_CLONE_BRANCH}" -[ "${PKG_GIT_CLONE_SINGLE}" = "yes" ] && GIT_CLONE_PARAMS="${GIT_CLONE_PARAMS} --single-branch" - -if [ -n "${PKG_GIT_CLONE_DEPTH}" ]; then - if [[ "${PKG_GIT_CLONE_DEPTH}" =~ ^[0-9]+$ ]]; then - GIT_CLONE_PARAMS="${GIT_CLONE_PARAMS} --depth ${PKG_GIT_CLONE_DEPTH}" - else - die "ERROR: PKG_GIT_CLONE_DEPTH is not a number! (${PKG_GIT_CLONE_DEPTH})" + popd > /dev/null + return 0 fi -fi + return 1 +} -if [ -n "${PKG_GIT_SUBMODULE_DEPTH}" ]; then - if [[ "${PKG_GIT_SUBMODULE_DEPTH}" =~ ^[0-9]+$ ]]; then - GIT_SUBMODULE_PARAMS="${GIT_SUBMODULE_PARAMS} --depth ${PKG_GIT_SUBMODULE_DEPTH}" +_update_submodules() { + if [[ -n "${GIT_SUBMODULE_PARAMS}" ]]; then + submodules=$(git config --file .gitmodules --get-regexp path | awk '{ print $2 }') else - die "ERROR: PKG_GIT_SUBMODULE_DEPTH is not a number! (${PKG_GIT_SUBMODULE_DEPTH})" + submodules=$(git submodule | awk '{ print $2 }') fi -fi -GIT_FOUND="no" -opwd="$(pwd)" -for d in "${SOURCES}/${1}/${1}-"*/ ; do - if [ -d "${d}.git" ]; then - if [ "${GIT_FOUND}" = "no" ]; then - cd "${d}" - if [ "${PKG_URL}" = "$(git remote get-url origin)" ]; then - if [[ -z "${PKG_GIT_CLONE_BRANCH}" ]] || [[ $(git branch | grep "^\* ${PKG_GIT_CLONE_BRANCH}$" | wc -l) -eq 1 ]]; then - GIT_FOUND="yes" - GIT_DIR="${d}" - _get_repo_clean - elif [ $(git branch | grep "^ ${PKG_GIT_CLONE_BRANCH}$" | wc -l) -eq 1 ]; then - GIT_FOUND="yes" - GIT_DIR="${d}" - _get_repo_clean - git checkout "${PKG_GIT_CLONE_BRANCH}" - elif [ $(git branch -a | grep "^ remotes/origin/${PKG_GIT_CLONE_BRANCH}$" | wc -l) -eq 1 ]; then - GIT_FOUND="yes" - GIT_DIR="${d}" - _get_repo_clean - git checkout -b "${PKG_GIT_CLONE_BRANCH}" "origin/${PKG_GIT_CLONE_BRANCH}" - else - build_msg "CLR_CLEAN" "DELETE" "(${d})" - cd "${opwd}" - rm -rf "${d}" - fi - if [ "${GIT_FOUND}" = "yes" ]; then - build_msg "CLR_GET" "GIT PULL" "${1}" - git pull - cd "${opwd}" - fi - else - build_msg "CLR_CLEAN" "DELETE" "(${d})" - cd "${opwd}" - rm -rf "${d}" + for submodule in $submodules; do + echo "Updating submodule: $submodule" + + # Try to update the submodule + git submodule update --init --recursive ${GIT_SUBMODULE_PARAMS} -- "${submodule}" + _rv=$? + + if [[ $_rv != 0 ]] ; then + echo "Failed to update submodule: $submodule" + + # Deinit, sync, and reinit the submodule + echo "Deinitializing submodule: $submodule" + git submodule deinit -f "${submodule}" + + echo "Syncing submodule: $submodule" + git submodule sync -- "${submodule}" + + echo "Reinitializing submodule: $submodule" + git submodule update --init --recursive ${GIT_SUBMODULE_PARAMS} -- "${submodule}" + _rv=$? + if [[ $_rv != 0 ]] ; then + echo "Failed to reinitialize submodule: $submodule" + return 1 fi fi - else - build_msg "CLR_CLEAN" "DELETE" "(${d})" - rm -rf "${d}" + + #popd > /dev/null + done + + return 0 +} + + +_get_repo() { + local git_params=("--recursive" "--shallow-submodules" "--filter=blob:none" "--no-tags") + + [[ -n "${PKG_GIT_CLONE_BRANCH}" ]] && git_params+=("--branch" "${PKG_GIT_CLONE_BRANCH}") + [[ "${PKG_GIT_CLONE_SINGLE}" == "yes" ]] && git_params+=("--single-branch") + + if [[ -n "${PKG_GIT_CLONE_DEPTH}" ]]; then + if [[ "${PKG_GIT_CLONE_DEPTH}" =~ ^[0-9]+$ ]]; then + git_params+=("--depth" "${PKG_GIT_CLONE_DEPTH}") + else + echo "ERROR: PKG_GIT_CLONE_DEPTH is not a number! (${PKG_GIT_CLONE_DEPTH})" >&2 + return 1 + fi fi -done -cd "${opwd}" -if [ "${GIT_FOUND}" = "no" ]; then - build_msg "CLR_GET" "GIT CLONE" "${1}" - git clone ${GIT_CLONE_PARAMS} "${PKG_URL}" "${PACKAGE}" -elif [ ! "${GIT_DIR}" = "${PACKAGE}/" ]; then - mv "${GIT_DIR}" "${PACKAGE}" -fi + if [[ -n "${PKG_GIT_SUBMODULE_DEPTH}" ]]; then + if [[ "${PKG_GIT_SUBMODULE_DEPTH}" =~ ^[0-9]+$ ]]; then + GIT_SUBMODULE_PARAMS="${GIT_SUBMODULE_PARAMS} --depth ${PKG_GIT_SUBMODULE_DEPTH}" + else + die "ERROR: PKG_GIT_SUBMODULE_DEPTH is not a number! (${PKG_GIT_SUBMODULE_DEPTH})" + fi + fi -( cd "${PACKAGE}" - [ $(git log --oneline --pretty=tformat:"%H" | grep "^${PKG_VERSION}" | wc -l) -eq 1 ] || die "There is no commit '${PKG_VERSION}' on branch '$(git branch | grep ^\* | cut -d ' ' -f2)' of package '${1}'! Aborting!" - git reset --hard "${PKG_VERSION}" - build_msg "CLR_GET" "GIT SUBMODULE" "${1}" - git submodule update --init --recursive ${GIT_SUBMODULE_PARAMS} -) + # Check if the destination directory exists and is non-empty + if [[ -d "${PACKAGE}" && "$(ls -A "${PACKAGE}")" ]]; then + echo "Directory ${PACKAGE} already exists and is not empty. Removing it." + rm -rf "${PACKAGE}" && mkdir "${PACKAGE}" || return 1 + fi -GIT_SHA="$(git ls-remote "${PACKAGE}" | grep -m1 HEAD | awk '{print $1;}')" + cd .. -if [ -n "${PKG_GIT_SHA}" -a "${PKG_GIT_SHA}" != "${GIT_SHA}" ]; then - build_msg "CLR_WARNING" "WARNING" "Incorrect git hash in repository: got ${GIT_SHA}, wanted ${PKG_GIT_SHA}" -fi + echo "Cloning repository with parameters: ${git_params[*]}" + git clone "${git_params[@]}" "${PKG_URL}" "${PACKAGE}" || return 1 + + pushd "${PACKAGE}" > /dev/null + + echo "Resetting to commit: ${PKG_VERSION}" + git reset --hard "${PKG_VERSION}" || return 1 + + echo "Updating submodules..." + _update_submodules || { + echo "Submodule update failed." + return 1 + } + + popd > /dev/null + + # Get the SHA of the current HEAD + local GIT_SHA + while read -r line; do + if [[ $line == *HEAD ]]; then + GIT_SHA="${line%%[[:space:]]*}" + break + fi + done < <(git ls-remote "${PACKAGE}") + + if [[ -z "${GIT_SHA}" ]]; then + echo "Failed to retrieve GIT_SHA." + return 1 + fi + + if [[ -n "${PKG_GIT_SHA}" && "${PKG_GIT_SHA}" != "${GIT_SHA}" ]]; then + build_msg "CLR_WARNING" "WARNING" "Incorrect git hash in repository: got ${GIT_SHA}, wanted ${PKG_GIT_SHA}" >&2 + return 1 + fi + + echo "Repository setup completed successfully." + return 0 +} + + +_fetch_missing_submodule_commits() { + git submodule sync --recursive + for submodule in $(git config --file .gitmodules --get-regexp path | awk '{ print $2 }'); do + pushd "${submodule}" > /dev/null + + echo "Fetching all refs and tags for submodule: ${submodule}" + git fetch --all --tags --prune || return 1 + + if ! git rev-parse "${PKG_VERSION}" &> /dev/null; then + echo "Commit ${PKG_VERSION} not found in ${submodule}, attempting to fetch it explicitly." + git fetch origin "${PKG_VERSION}:${PKG_VERSION}" || return 1 + fi + + if ! git checkout "${PKG_VERSION}" ; then + echo "Failed to checkout commit ${PKG_VERSION} in ${submodule}, trying branch instead." + git checkout -B "${PKG_GIT_CLONE_BRANCH}" || return 1 + fi + + popd > /dev/null + done +} + + +main(){ + # Acquire lock on source dir + lock_source_dir "${1}" + + # Check if repo already exists and is valid + _repo_exists_and_valid && exit 0 + + # If not valid, proceed to get the repo + build_msg "CLR_GET" "GET" "${1} (git)" "indent" + + # Remove stale stamps + rm -f "${STAMP_URL}" "${STAMP_SHA}" + + # Clone or update the repository + _get_repo || exit 1 + + # Verify the git hash + GIT_SHA="" + while IFS=$'\t' read -r sha ref; do + if [[ "$ref" == "HEAD" ]]; then + GIT_SHA="$sha" + break + fi + done < <(git ls-remote "${PACKAGE}") + + # Check if GIT_SHA was successfully retrieved + if [[ -z "$GIT_SHA" ]]; then + echo "Failed to retrieve GIT_SHA." >&2 + exit 1 + fi + + # Verify that the retrieved SHA matches the expected one + if [[ -n "${PKG_GIT_SHA}" && "${PKG_GIT_SHA}" != "${GIT_SHA}" ]]; then + build_msg "CLR_WARNING" "WARNING" "Incorrect git hash in repository: got ${GIT_SHA}, wanted ${PKG_GIT_SHA}" >&2 + exit 1 + fi + + echo "Repository setup completed successfully." +} + + +main diff --git a/scripts/image b/scripts/image index 66fe6f5183..0ac47708a3 100755 --- a/scripts/image +++ b/scripts/image @@ -10,15 +10,6 @@ unset _CACHE_PACKAGE_LOCAL _CACHE_PACKAGE_GLOBAL _DEBUG_DEPENDS_LIST _DEBUG_PACK . config/multithread . config/show_config -# Validate UBOOT_SYSTEM if it is specified -if [ "${BOOTLOADER}" = "u-boot" -a -n "${DEVICE}" ]; then - if [ -z "${UBOOT_SYSTEM}" ]; then - ${SCRIPTS}/uboot_helper ${PROJECT} ${DEVICE} >/dev/null - else - ${SCRIPTS}/uboot_helper ${PROJECT} ${DEVICE} ${UBOOT_SYSTEM} dtb >/dev/null - fi -fi - ${SCRIPTS}/checkdeps # Setup both toolchain cmake configs to avoid potentially racy behaviour later. @@ -56,6 +47,7 @@ function do_mkimage() { SYSTEM_PART_START="${SYSTEM_PART_START}" \ STORAGE_SIZE="${STORAGE_SIZE:-32}" \ OVA_SIZE="${OVA_SIZE}" \ + SUBDEVICE="${SUBDEVICE}" \ ${SCRIPTS}/mkimage } @@ -87,19 +79,12 @@ if [ "${DISTRO_VERSION}" = "devel" ]; then esac fi +DISTRO_VERSION=$(date +%Y%m%d) + # Get origin url, fix git:// and git@github.com: urls if necessary ORIGIN_URL="$(git remote -v | awk '$1 == "origin" { print $2 }' | head -1 | sed -e 's#\.git$##' -e 's#^git:#https:#' -e 's#^git@github\.com:#https://github.com/#' -e 's#://.*@#://#')" -[ "${BUILDER_NAME,,}" = "official" ] && BUILDER_NAME= -if [ "${OFFICIAL}" = "yes" ]; then - DISTRO_BUILD="official" -else - if [ -n "${BUILDER_NAME}" ]; then - DISTRO_BUILD="${BUILDER_NAME}" - else - DISTRO_BUILD="community" - fi -fi +eval "$(base64 -d <<< aWYgWyAiJHtPRkZJQ0lBTH0iID0gInllcyIgXTsgdGhlbgogIGV4cG9ydCBPU19CVUlMRD0ib2ZmaWNpYWwiCmVsaWYgWyAiJHtOSUdIVExZfSIgPSAieWVzIiBdOyB0aGVuCiAgZXhwb3J0IE9TX0JVSUxEPSJuaWdodGx5IgplbHNlCiAgZXhwb3J0IE9TX0JVSUxEPSJjb21tdW5pdHkiCmZp)" if [ -n "${CUSTOM_VERSION}" ]; then DISTRO_VERSION="${CUSTOM_VERSION}" @@ -112,7 +97,7 @@ if [ -n "${CUSTOM_IMAGE_NAME}" ]; then IMAGE_NAME="${CUSTOM_IMAGE_NAME}" else if [ "${DEVEL_VERSION}" = "devel" ]; then - IMAGE_NAME="${DISTRONAME}-${DISTRO_ARCH}-${OS_VERSION}-${DISTRO_VERSION}" + IMAGE_NAME="${DISTRONAME}-${DISTRO_ARCH}-${OS_VERSION}" else IMAGE_NAME="${DISTRONAME}-${TARGET_VERSION}" fi @@ -166,34 +151,30 @@ echo "${TARGET_VERSION}" >${INSTALL}/etc/release # Create /etc/os-release cat <${INSTALL}/etc/os-release -NAME="${DISTRONAME}" -VERSION="${DISTRO_VERSION}" -ID="${DISTRONAME,,}" -VERSION_ID="${OS_VERSION}" -PRETTY_NAME="${DISTRONAME} (${DISTRO_BUILD}): ${DISTRO_VERSION}" -HOME_URL="${DISTRO_HOME_URL}" -BUG_REPORT_URL="${ORIGIN_URL}" +OS_NAME="${DISTRONAME}" +OS_VERSION="${OS_VERSION}" +OS_BUILD="${OS_BUILD}" +GIT_ORGANIZATION="${GIT_ORGANIZATION}" +GIT_REPO="${GIT_REPO}" +HOME_URL="${HOME_URL}" BUILD_ID="${GIT_HASH}" -DISTRO_ARCH="${DISTRO_ARCH}" -DISTRO_BUILD="${DISTRO_BUILD}" -DISTRO_PROJECT="${PROJECT}" +BUILD_BRANCH="$(git branch --show-current)" +BUILD_DATE="${BUILD_DATE}" +HW_DEVICE="${DEVICE}" +HW_ARCH="${ARCH}" EOF + +if [ -n "${HW_CPU}" ] +then + cat <>${INSTALL}/etc/os-release +HW_CPU="${HW_CPU}" +EOF +fi + [ -n "${DEVICE}" ] && echo "DISTRO_DEVICE=\"${DEVICE}\"" >>${INSTALL}/etc/os-release [ -n "${BUILDER_NAME}" ] && echo "BUILDER_NAME=\"${BUILDER_NAME}\"" >>${INSTALL}/etc/os-release [ -n "${BUILDER_VERSION}" ] && echo "BUILDER_VERSION=\"${BUILDER_VERSION}\"" >>${INSTALL}/etc/os-release -# Create /etc/issue -cat <${INSTALL}/etc/issue -${GREETING0} -${GREETING1} -${GREETING2} -${GREETING3} -${GREETING4} -${DISTRONAME} (${DISTRO_BUILD}): ${DISTRO_VERSION} (${DISTRO_ARCH}) -EOF - -ln -sf /etc/issue ${INSTALL}/etc/motd - # Copy PROJECT related files to filesystem if [ -d "${PROJECT_DIR}/${PROJECT}/filesystem" ]; then cp -PR --remove-destination ${PROJECT_DIR}/${PROJECT}/filesystem/* ${INSTALL} @@ -300,7 +281,6 @@ if [ "${1}" = "release" -o "${1}" = "mkimage" -o "${1}" = "noobs" ]; then fi cp ${ROOT}/README* ${RELEASE_DIR} - cp ${ROOT}/CHANGELOG* ${RELEASE_DIR} echo "${TARGET_VERSION}" >${RELEASE_DIR}/RELEASE if [ ! "${MEDIACENTER}" = "no" ]; then @@ -341,26 +321,9 @@ if [ "${1}" = "release" -o "${1}" = "mkimage" -o "${1}" = "noobs" ]; then UUID_SYSTEM="$(date '+%d%m')-$(date '+%M%S')" UUID_STORAGE="$(uuidgen)" - DEVICE_BOARDS= - if [ "${BOOTLOADER}" = "u-boot" -a -z "${UBOOT_SYSTEM}" -a -n "${DEVICE}" ]; then - DEVICE_BOARDS=$(${SCRIPTS}/uboot_helper "${PROJECT}" "${DEVICE}") - fi - - if [ -n "${DEVICE_BOARDS}" ]; then - for UBOOT_SYSTEM in ${DEVICE_BOARDS}; do - echo "Installing u-boot for board ${UBOOT_SYSTEM}..." - - # Re-install u-boot package - rm ${STAMPS_INSTALL}/u-boot/install_target - UBOOT_SYSTEM="${UBOOT_SYSTEM}" ${SCRIPTS}/install u-boot 2>&1 - - # Re-run bootloader/release - if find_file_path bootloader/release ${BOOTLOADER_DIR}/release; then - echo "Running ${FOUND_PATH}" - . ${FOUND_PATH} - fi - - do_mkimage "${IMAGE_NAME}-${UBOOT_SYSTEM}" + if [ -n "${SUBDEVICES}" ]; then + for SUBDEVICE in ${SUBDEVICES}; do + do_mkimage "${IMAGE_NAME}" done else do_mkimage @@ -505,3 +468,6 @@ fi if [ -n "$(ls -1 ${BUILD}/qa_checks/ 2>/dev/null)" ]; then log_qa_check "qa_issues" "QA issues present, please fix!\n$(find ${BUILD}/qa_checks/* -type f ! -name qa_issues)\n" fi + +rm -f ${TARGET_IMG}/*.kernel +rm -f ${TARGET_IMG}/*.system diff --git a/scripts/install b/scripts/install index 629653d2ff..7069dba659 100755 --- a/scripts/install +++ b/scripts/install @@ -79,7 +79,7 @@ if [ "${TARGET}" = "target" ]; then if [ -d ${PKG_TMP_DIR}/profile.d ]; then mkdir -p ${INSTALL}/etc/profile.d - cp ${PKG_TMP_DIR}/profile.d/*.conf ${INSTALL}/etc/profile.d + cp ${PKG_TMP_DIR}/profile.d/* ${INSTALL}/etc/profile.d fi if [ -d ${PKG_TMP_DIR}/tmpfiles.d ]; then @@ -87,6 +87,17 @@ if [ "${TARGET}" = "target" ]; then cp ${PKG_TMP_DIR}/tmpfiles.d/*.conf ${INSTALL}/usr/lib/tmpfiles.d fi + if [ -d ${PKG_TMP_DIR}/autostart ]; then + mkdir -p ${INSTALL}/usr/lib/autostart/common + cp ${PKG_TMP_DIR}/autostart/* ${INSTALL}/usr/lib/autostart/common + chmod 0755 ${INSTALL}/usr/lib/autostart/common/* + fi + + if [ -d ${PKG_TMP_DIR}/daemons ]; then + mkdir -p ${INSTALL}/usr/lib/autostart/daemons + cp ${PKG_TMP_DIR}/daemons/* ${INSTALL}/usr/lib/autostart/daemons + fi + if [ -d ${PKG_TMP_DIR}/system.d ]; then mkdir -p ${INSTALL}/usr/lib/systemd/system cp -Pr ${PKG_TMP_DIR}/system.d/*.* ${INSTALL}/usr/lib/systemd/system diff --git a/scripts/mkimage b/scripts/mkimage index 1823ed3667..3ae91d4300 100755 --- a/scripts/mkimage +++ b/scripts/mkimage @@ -12,6 +12,7 @@ # set variables IMG_TMP=$(mktemp -d -p ${TARGET_IMG}) SAVE_ERROR="${IMG_TMP}/save_error" +. projects/${PROJECT}/devices/${DEVICE}/options if [ -z "${SYSTEM_SIZE}" -o -z "${SYSTEM_PART_START}" ]; then echo "mkimage: SYSTEM_SIZE and SYSTEM_PART_START must be configured!" @@ -22,6 +23,9 @@ DISK_START_PADDING=$(((${SYSTEM_PART_START} + 2048 - 1) / 2048)) DISK_GPT_PADDING=1 DISK_SIZE=$((${DISK_START_PADDING} + ${SYSTEM_SIZE} + ${STORAGE_SIZE} + ${DISK_GPT_PADDING})) DISK_BASENAME="${TARGET_IMG}/${IMAGE_NAME}" +if [ -n "${SUBDEVICE}" ]; then + DISK_BASENAME="${DISK_BASENAME}-${SUBDEVICE}" +fi DISK="${DISK_BASENAME}.img" # functions @@ -129,7 +133,7 @@ alias mmd='mmd -i "${IMG_TMP}/part1.fat"' # create filesystem on part1 echo "image: creating filesystem on part1..." -if [ "${BOOTLOADER}" = "syslinux" -o "${BOOTLOADER}" = "bcm2835-bootloader" -o "${BOOTLOADER}" = "u-boot" ]; then +if [ "${BOOTLOADER}" = "syslinux" -o "${BOOTLOADER}" = "bcm2835-bootloader" -o "${BOOTLOADER}" = "u-boot" -o "${BOOTLOADER}" = "arm-efi" ]; then mformat -i "${IMG_TMP}/part1.fat" -v "${DISTRO_BOOTLABEL}" -N "${UUID_SYSTEM//-/}" :: >"${SAVE_ERROR}" 2>&1 || show_error fi sync @@ -238,33 +242,9 @@ EOF mcopy -s "${RELEASE_DIR}/3rdparty/bootloader/overlays" :: >"${SAVE_ERROR}" 2>&1 || show_error fi -elif [ "${BOOTLOADER}" = "u-boot" -a -n "${UBOOT_SYSTEM}" ]; then +elif [ "${BOOTLOADER}" = "u-boot" ]; then # create bootloader configuration - echo "image: creating bootloader configuration..." - - DTB="$(${SCRIPTS}/uboot_helper ${PROJECT} ${DEVICE} ${UBOOT_SYSTEM} dtb)" - if [ -n "${DTB}" ]; then - - if [ -f "${RELEASE_DIR}/3rdparty/bootloader/${DTB}" ]; then - mcopy "${RELEASE_DIR}/3rdparty/bootloader/${DTB}" :: >"${SAVE_ERROR}" 2>&1 || show_error - fi - - if [ -d "${RELEASE_DIR}/3rdparty/bootloader/overlays" ]; then - mcopy -s "${RELEASE_DIR}/3rdparty/bootloader/overlays" :: >"${SAVE_ERROR}" 2>&1 || show_error - fi - - mkdir -p "${IMG_TMP}/extlinux" - - cat <"${IMG_TMP}/extlinux/extlinux.conf" -LABEL ${DISTRO} - LINUX /${KERNEL_NAME} - FDT /${DTB} - APPEND boot=UUID=${UUID_SYSTEM} disk=UUID=${UUID_STORAGE} quiet ${EXTRA_CMDLINE} -EOF - - mcopy -s "${IMG_TMP}/extlinux" :: >"${SAVE_ERROR}" 2>&1 || show_error - fi - + echo "image: creating bootloader configuration... (u-boot)" if [ -f "${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/bootloader/mkimage" ]; then . "${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/bootloader/mkimage" elif [ -f "${PROJECT_DIR}/${PROJECT}/bootloader/mkimage" ]; then @@ -279,10 +259,24 @@ EOF mcopy "${RELEASE_DIR}/target/KERNEL.md5" "::/${KERNEL_NAME}.md5" >"${SAVE_ERROR}" 2>&1 || show_error mcopy "${RELEASE_DIR}/target/SYSTEM.md5" ::/SYSTEM.md5 >"${SAVE_ERROR}" 2>&1 || show_error -elif [ "${BOOTLOADER}" = "u-boot" ]; then - echo "to make an image using u-boot UBOOT_SYSTEM must be set" - cleanup - exit +elif [ "${BOOTLOADER}" = "arm-efi" ]; then + # create bootloader configuration + echo "image: creating bootloader configuration... (arm-efi)" + if [ -f "${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/bootloader/mkimage" ]; then + . "${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/bootloader/mkimage" + elif [ -f "${PROJECT_DIR}/${PROJECT}/bootloader/mkimage" ]; then + . "${PROJECT_DIR}/${PROJECT}/bootloader/mkimage" + else + echo "image: skipping arm-efi. no mkimage script found" + fi + + # copy files + echo "image: copying files to part1..." + mcopy "${TARGET_IMG}/${BUILD_NAME}.kernel" "::/${KERNEL_NAME}" + mcopy "${TARGET_IMG}/${BUILD_NAME}.system" ::/SYSTEM + mcopy "${RELEASE_DIR}/target/KERNEL.md5" "::/${KERNEL_NAME}.md5" + mcopy "${RELEASE_DIR}/target/SYSTEM.md5" ::/SYSTEM.md5 + fi # bootloader # run fsck diff --git a/scripts/unpack b/scripts/unpack index a211a80e31..bf6f1c8fad 100755 --- a/scripts/unpack +++ b/scripts/unpack @@ -32,15 +32,15 @@ if [ -n "${PKG_DEPENDS_UNPACK}" ]; then unset _unpack_recursive_cnt fi -STAMP="${PKG_BUILD}/.libreelec-unpack" +STAMP="${PKG_BUILD}/.rocknix-unpack" mkdir -p ${BUILD}/build # Perform a wildcard match on the package to ensure old versions are cleaned too PKG_DEEPHASH= for i in ${BUILD}/build/${PKG_NAME}-*; do - if [ -d ${i} -a -f "${i}/.libreelec-unpack" ]; then - . "${i}/.libreelec-unpack" + if [ -d ${i} -a -f "${i}/.rocknix-unpack" ]; then + . "${i}/.rocknix-unpack" if [ "${STAMP_PKG_NAME}" = "${PKG_NAME}" ]; then [ -z "${PKG_DEEPHASH}" ] && PKG_DEEPHASH=$(calculate_stamp) if [ ! "${PKG_DEEPHASH}" = "${STAMP_PKG_DEEPHASH}" ]; then @@ -109,7 +109,7 @@ if [ -d "${SOURCES}/${PKG_NAME}" -o -d "${PKG_DIR}/sources" ] || pkg_call_exists fi # Add a tag to the unpacked folder before transferring into the shared build folder - echo "INFO_PKG_NAME=\"${PKG_NAME}\"" >"${PKG_UNPACK_DIR}/.intermediate/.libreelec-package" + echo "INFO_PKG_NAME=\"${PKG_NAME}\"" >"${PKG_UNPACK_DIR}/.intermediate/.rocknix-package" # Restore original PKG_BUILD, and transfer the unpacked folder PKG_BUILD="${PKG_BUILD_ORIG}" @@ -193,7 +193,7 @@ if [ -d "${SOURCES}/${PKG_NAME}" -o -d "${PKG_DIR}/sources" ] || pkg_call_exists if grep -qE '^GIT binary patch$|^rename from|^rename to' ${i}; then git apply --directory="${PKG_BUILD}" -p1 --verbose --whitespace=nowarn --unsafe-paths <${i} >&${VERBOSE_OUT} else - patch -d "${PKG_BUILD}" -p1 <${i} >&${VERBOSE_OUT} + patch -d "${PKG_BUILD}" -p1 < <(sed -e "s#@TARGET_CPU@#${TARGET_CPU}#g" -e "s#@DEVICE@#${DEVICE}#g" "${i}") >&"${VERBOSE_OUT}" fi fi done @@ -216,7 +216,7 @@ pkg_call_finish if [ "${PKG_SECTION}" != "virtual" ]; then mkdir -p "${PKG_BUILD}" - echo "INFO_PKG_NAME=\"${PKG_NAME}\"" >"${PKG_BUILD}/.libreelec-package" + echo "INFO_PKG_NAME=\"${PKG_NAME}\"" >"${PKG_BUILD}/.rocknix-package" PKG_DEEPHASH=$(calculate_stamp) for i in PKG_NAME PKG_DEEPHASH; do