pcbjam/docker/entrypoint.sh
Viktor Vaczi ffaadd258b fix(docker): make container emsdk authoritative for exec, stop host emsdk leak
The wxWidgets autoconf build inside Docker failed with `emmake: command not
found` on a clean build, while the KiCad CMake build survived (CMake caches the
absolute compiler path). Two compounding causes:

1. `docker compose exec` bypasses the ENTRYPOINT, so it never sourced
   emsdk_env.sh and EMSDK was unset. env.sh then fell back to the local
   tools/emsdk.

2. The entrypoint's rsync from the host bind mount excluded only build-wasm and
   output, so the host's macOS-arm64 tools/emsdk got copied over the container's
   Linux emsdk. The macOS Mach-O python can't exec on Linux, so
   `emsdk construct_env` failed ("Exec format error") and emcc/emmake never
   landed on PATH.

Fixes:
- Set `ENV EMSDK=/emsdk` in the image so every process (including
  `docker compose exec`) resolves env.sh's EMSDK branch to the container's own
  emsdk and never falls back to tools/emsdk.
- Exclude `tools/emsdk` from the entrypoint rsync so the host emsdk can no
  longer leak into the container.

Validated with a clean wxWidgets build (`build-wxuniversal-wasm.sh --clean`):
reconfigures and compiles all 42 wx libs against /emsdk with no missing-tool
errors.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-25 19:41:55 +02:00

25 lines
786 B
Shell
Executable file

#!/bin/bash
set -e
# Source Emscripten environment
source /emsdk/emsdk_env.sh 2>/dev/null
# Sync source from host to workspace volume
# This fixes macOS Docker timestamp issues with bind mounts
# (autoconf sanity checks fail when timestamps appear inconsistent)
# Touch transferred files to set container timestamps for correct make detection
if [[ -d /workspace-host ]]; then
echo "Syncing source code to container volume..."
rsync -ai --delete \
--exclude='build-wasm' \
--exclude='output' \
--exclude='tools/emsdk' \
/workspace-host/ /workspace/ | \
grep "^>f" | \
sed "s/^[^ ]* //" | \
while read f; do touch "/workspace/$f" 2>/dev/null; done
echo "Sync complete."
fi
# Execute command or start shell
exec "$@"