You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
3.1 KiB
70 lines
3.1 KiB
#!/bin/bash |
|
set -uo pipefail |
|
|
|
# Проверяем базовую компиляцию, затем Opus отдельно и через существующую CMake-сборку. |
|
probe_cc="${UTUN_PROBE_CC:-/ucrt64/bin/cc.exe}" |
|
printf '[INFO] MSYSTEM=%s\n[INFO] PATH=%s\n[INFO] Compiler=%s\n' "${MSYSTEM:-unset}" "$PATH" "$probe_cc" |
|
if [ ! -x "$probe_cc" ]; then |
|
printf '[ERROR] Compiler is missing or not executable: %s\n' "$probe_cc" |
|
exit 1 |
|
fi |
|
|
|
probe_dir=$(mktemp -d "${TMPDIR:-/tmp}/utun-cc-probe.XXXXXX") || { |
|
printf '[ERROR] Cannot create the temporary probe directory.\n' |
|
exit 1 |
|
} |
|
trap 'rm -rf -- "$probe_dir" || printf "[WARN] Cannot remove probe directory: %s\n" "$probe_dir"' EXIT |
|
printf '[INFO] Temporary directory: %s\n' "$probe_dir" |
|
|
|
# Каждый этап сохраняет собственный код завершения, включая молчаливые сбои. |
|
probe_step() { |
|
local step="$1" result |
|
shift |
|
printf '\n[INFO] %s\n[INFO] Command:' "$step" |
|
printf ' %q' "$@" |
|
printf '\n' |
|
"$@" |
|
result=$? |
|
printf '[INFO] %s exit code: %d\n' "$step" "$result" |
|
if [ "$result" -ne 0 ]; then |
|
printf '[ERROR] Failed stage: %s\n' "$step" |
|
fi |
|
return "$result" |
|
} |
|
|
|
printf '#include <stdio.h>\nint main(void) { puts("utun compiler probe OK"); return 0; }\n' > "$probe_dir/probe.c" || { |
|
printf '[ERROR] Cannot write the probe source: %s/probe.c\n' "$probe_dir" |
|
exit 1 |
|
} |
|
probe_step 'Compiler version' "$probe_cc" --version || exit $? |
|
probe_step 'Compile' "$probe_cc" -v -std=c99 -c "$probe_dir/probe.c" -o "$probe_dir/probe.o" || exit $? |
|
probe_step 'Link' "$probe_cc" -v "$probe_dir/probe.o" -o "$probe_dir/probe.exe" || exit $? |
|
probe_step 'Run' "$probe_dir/probe.exe" || exit $? |
|
printf '\n[SUCCESS] Compile, link and run completed.\n' |
|
|
|
probe_root=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd) || { |
|
printf '[ERROR] Cannot locate the repository directory.\n' |
|
exit 1 |
|
} |
|
probe_opus="$probe_root/lib/libopus" |
|
probe_includes=() |
|
for probe_include in '' include celt silk silk/float silk/fixed src; do |
|
probe_includes+=("-I$probe_opus/$probe_include") |
|
done |
|
probe_step 'Compile Opus laplace.c' "$probe_cc" -v -DOPUS_BUILD -DUSE_ALLOCA -DVAR_ARRAYS "${probe_includes[@]}" \ |
|
-O3 -DNDEBUG -std=gnu99 -MD -MF "$probe_dir/laplace.d" -c "$probe_opus/celt/laplace.c" -o "$probe_dir/laplace.o" || exit $? |
|
|
|
probe_build="$probe_root/tools/chatgui/build" |
|
if [ ! -f "$probe_build/CMakeCache.txt" ]; then |
|
printf '[ERROR] Existing ChatGUI build cache not found: %s/CMakeCache.txt\n' "$probe_build" |
|
exit 1 |
|
fi |
|
if ! command -v cmake >/dev/null 2>&1; then |
|
printf '[ERROR] cmake is not available in PATH.\n' |
|
exit 1 |
|
fi |
|
probe_step 'CMake cache settings' sed -n -E \ |
|
'/^CMAKE_(C_COMPILER|C_COMPILER_LAUNCHER|C_FLAGS(_(DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO))?|MAKE_PROGRAM|GENERATOR|BUILD_TYPE):/p' \ |
|
"$probe_build/CMakeCache.txt" || exit $? |
|
probe_step 'Build Opus with CMake' cmake --build "$probe_build" --target opus_internal --parallel 1 --verbose || exit $? |
|
printf '\n[SUCCESS] Standalone Opus compilation and CMake Opus build completed.\n'
|
|
|