144 lines
4.9 KiB
Bash
144 lines
4.9 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
redbear_project_root() {
|
|
if [ -n "${PROJECT_ROOT:-}" ]; then
|
|
printf '%s\n' "${PROJECT_ROOT}"
|
|
return 0
|
|
fi
|
|
if [ -n "${COOKBOOK_ROOT:-}" ]; then
|
|
printf '%s\n' "${COOKBOOK_ROOT}"
|
|
return 0
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
redbear_choose_toolchain_root() {
|
|
if [ -n "${COOKBOOK_HOST_SYSROOT:-}" ] && [ -d "${COOKBOOK_HOST_SYSROOT}" ]; then
|
|
printf '%s\n' "${COOKBOOK_HOST_SYSROOT}"
|
|
return 0
|
|
fi
|
|
if [ -d "${HOME}/.redoxer/x86_64-unknown-redox/toolchain" ]; then
|
|
printf '%s\n' "${HOME}/.redoxer/x86_64-unknown-redox/toolchain"
|
|
return 0
|
|
fi
|
|
printf '%s\n' "$(redbear_project_root)/prefix/x86_64-unknown-redox/sysroot"
|
|
}
|
|
|
|
redbear_relibc_target_dir() {
|
|
printf '%s\n' "$(redbear_project_root)/recipes/core/relibc/target/x86_64-unknown-redox"
|
|
}
|
|
|
|
redbear_relibc_stage_include_dir() {
|
|
local relibc_target
|
|
relibc_target="$(redbear_relibc_target_dir)"
|
|
printf '%s\n' "${relibc_target}/stage/usr/include"
|
|
}
|
|
|
|
redbear_relibc_stage_lib_dir() {
|
|
local relibc_target
|
|
relibc_target="$(redbear_relibc_target_dir)"
|
|
printf '%s\n' "${relibc_target}/stage/usr/lib"
|
|
}
|
|
|
|
redbear_choose_relibc_stage_include() {
|
|
local relibc_target stage_include tmp_include
|
|
relibc_target="$(redbear_relibc_target_dir)"
|
|
stage_include="${relibc_target}/stage/usr/include"
|
|
tmp_include="${relibc_target}/stage.tmp/usr/include"
|
|
if [ -d "$stage_include" ]; then
|
|
printf '%s\n' "$stage_include"
|
|
elif [ -d "$tmp_include" ]; then
|
|
printf '%s\n' "$tmp_include"
|
|
fi
|
|
}
|
|
|
|
redbear_choose_relibc_stage_lib() {
|
|
local relibc_target stage_lib tmp_lib build_lib candidate
|
|
relibc_target="$(redbear_relibc_target_dir)"
|
|
stage_lib="${relibc_target}/stage/usr/lib"
|
|
tmp_lib="${relibc_target}/stage.tmp/usr/lib"
|
|
build_lib="${relibc_target}/build/target/x86_64-unknown-redox/release"
|
|
for candidate in "$stage_lib" "$tmp_lib" "$build_lib"; do
|
|
if [ -f "$candidate/libc.so" ] && readelf -Ws "$candidate/libc.so" | grep -q '_Z7strtoldPKcPPc'; then
|
|
printf '%s\n' "$candidate"
|
|
return 0
|
|
fi
|
|
done
|
|
for candidate in "$stage_lib" "$build_lib" "$tmp_lib"; do
|
|
if [ -d "$candidate" ]; then
|
|
printf '%s\n' "$candidate"
|
|
return 0
|
|
fi
|
|
done
|
|
}
|
|
|
|
redbear_copy_relibc_surface_into_sysroot() {
|
|
local destination_sysroot="$1"
|
|
local include_dir lib_dir
|
|
include_dir="$(redbear_choose_relibc_stage_include)"
|
|
lib_dir="$(redbear_choose_relibc_stage_lib)"
|
|
|
|
if [ -n "$include_dir" ] && [ -d "$include_dir" ]; then
|
|
mkdir -p "${destination_sysroot}/include"
|
|
cp -a "${include_dir}/." "${destination_sysroot}/include/"
|
|
fi
|
|
if [ -n "$lib_dir" ] && [ -d "$lib_dir" ]; then
|
|
mkdir -p "${destination_sysroot}/lib"
|
|
cp -a "${lib_dir}/." "${destination_sysroot}/lib/"
|
|
fi
|
|
}
|
|
|
|
redbear_relibc_surface_ready() {
|
|
local relibc_target relibc_stage_include relibc_stage_lib
|
|
relibc_target="$(redbear_relibc_target_dir)"
|
|
relibc_stage_include="${relibc_target}/stage/usr/include"
|
|
relibc_stage_lib="${relibc_target}/stage/usr/lib/libc.so"
|
|
|
|
[ -f "${relibc_stage_include}/sys/signalfd.h" ] || return 1
|
|
[ -f "${relibc_stage_include}/sys/timerfd.h" ] || return 1
|
|
[ -f "${relibc_stage_include}/sys/eventfd.h" ] || return 1
|
|
[ -f "${relibc_stage_include}/threads.h" ] || return 1
|
|
[ -f "${relibc_stage_lib}" ] || return 1
|
|
readelf -Ws "${relibc_stage_lib}" | grep -q '_Z7strtoldPKcPPc' || return 1
|
|
return 0
|
|
}
|
|
|
|
redbear_sync_relibc_surface_to_toolchain() {
|
|
local relibc_target relibc_stage_include relibc_stage_lib toolchain_sysroot
|
|
relibc_target="$(redbear_relibc_target_dir)"
|
|
relibc_stage_include="${relibc_target}/stage/usr/include"
|
|
relibc_stage_lib="${relibc_target}/stage/usr/lib"
|
|
toolchain_sysroot="$(redbear_choose_toolchain_root)"
|
|
|
|
mkdir -p \
|
|
"${toolchain_sysroot}/include" \
|
|
"${toolchain_sysroot}/x86_64-unknown-redox/include" \
|
|
"${toolchain_sysroot}/x86_64-unknown-redox/lib"
|
|
|
|
cp -a "${relibc_stage_include}/." "${toolchain_sysroot}/include/"
|
|
cp -a "${relibc_stage_include}/." "${toolchain_sysroot}/x86_64-unknown-redox/include/"
|
|
cp -a "${relibc_stage_lib}/." "${toolchain_sysroot}/x86_64-unknown-redox/lib/"
|
|
}
|
|
|
|
redbear_ensure_relibc_desktop_surface() {
|
|
local relibc_target
|
|
relibc_target="$(redbear_relibc_target_dir)"
|
|
|
|
if ! redbear_relibc_surface_ready; then
|
|
echo ">>> Refreshing relibc staged surface for full desktop target..."
|
|
rm -rf \
|
|
"${relibc_target}/build" \
|
|
"${relibc_target}/stage" \
|
|
"${relibc_target}/stage.tmp" \
|
|
"${relibc_target}/sysroot"
|
|
rm -f \
|
|
"${relibc_target}/auto_deps.toml" \
|
|
"${relibc_target}/stage.pkgar" \
|
|
"${relibc_target}/stage.toml"
|
|
REPO_OFFLINE=1 COOKBOOK_OFFLINE=true CI=1 ./target/release/repo cook relibc
|
|
echo ""
|
|
fi
|
|
|
|
redbear_sync_relibc_surface_to_toolchain
|
|
}
|