#!/bin/bash

. arch-arm-cross-config.sh

arm_arch=$1
shift
new_root=$(realpath "$1")
shift

if [[ $arm_arch != arm ]] && [[ $arm_arch != aarch64 ]]; then
    echo "Invalid arm arch: $arm_arch." >& /dev/null
    exit 1
fi

"${EXEC_DIR}/prepare-qemu-${arm_arch}"
new_execdir="${new_root}/${EXEC_DIR}/"

copy_program() {
    local orig="$1"
    local new_dir="$2"
    local ldd_out
    ldd_out=$(ldd "${orig}") || return 1
    local ld_found=0
    while read line; do
        [[ $line =~ ^[[:blank:]]*(/[^[:blank:]]+) ]] && {
            # Already found a dynamic linker
            ((ld_found)) && return 1
            cp "${BASH_REMATCH[1]}" "${new_dir}"
            basename "${BASH_REMATCH[1]}"
            continue
        }
        [[ $line =~ ^[[:blank:]]*([^[:blank:]]+)[[:blank:]]*=\>[[:blank:]]*(/[^[:blank:]]+)[[:blank:]]* ]] && {
            cp "${BASH_REMATCH[2]}" "${new_dir}/${BASH_REMATCH[1]}"
            continue
        }
    done <<EOF
${ldd_out}
EOF
}

mkdir -p "${new_root}/${EXEC_DIR}/"
cp "${EXEC_DIR}/arch-qemu-${arm_arch}" "${new_execdir}"
cp "/usr/bin/qemu-${arm_arch}" "${new_execdir}"

for fs in dev sys proc; do
    umount "${new_root}/${fs}/" 2> /dev/null
    mkdir -p "${new_root}/${fs}/"
    mount --bind /"${fs}" "${new_root}/${fs}/"
done

if ld_linux=$(copy_program /usr/bin/qemu-${arm_arch} \
                           "${new_execdir}" 2> /dev/null); then
    exec "${SCRIPTS_DIR}/write-cmd" "${new_execdir}/qemu_cmd_${arm_arch}" \
         "${EXEC_DIR}/${ld_linux}" --library-path "${EXEC_DIR}" \
         "${EXEC_DIR}/qemu-${arm_arch}"
else
    exec "${SCRIPTS_DIR}/write-cmd" "${new_execdir}/qemu_cmd_${arm_arch}" \
         "${EXEC_DIR}/qemu-${arm_arch}"
fi
