make_mission_planner.sh 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. mkdir -p ~/mp_build/dist
  2. cd ~/mp_build
  3. cat <<'EOF' > Dockerfile
  4. FROM ubuntu:22.04
  5. ENV DEBIAN_FRONTEND=noninteractive
  6. # Install the graphics dependencies and mono-complete
  7. RUN apt-get update && apt-get install -y \
  8. mono-complete unzip curl wget fuse libfuse2 libgdiplus \
  9. libx11-6 libfontconfig1 libfreetype6 libexif12 libgif7 \
  10. libjpeg-turbo8 libpng16-16 libtiff5 libcairo2 libxrender1 libxext6 \
  11. && rm -rf /var/lib/apt/lists/*
  12. WORKDIR /build
  13. # 1. Fetch Mission Planner
  14. RUN wget https://firmware.ardupilot.org/Tools/MissionPlanner/MissionPlanner-latest.zip -O mp.zip
  15. RUN mkdir -p MP.AppDir/usr/lib/missionplanner && unzip -q mp.zip -d MP.AppDir/usr/lib/missionplanner
  16. # 2. Extract Mono Binaries, Libraries, and Config Map
  17. RUN mkdir -p MP.AppDir/usr/bin MP.AppDir/usr/lib MP.AppDir/usr/etc
  18. RUN cp /usr/bin/mono MP.AppDir/usr/bin/
  19. RUN cp -r /usr/lib/mono MP.AppDir/usr/lib/
  20. RUN cp -r /etc/mono MP.AppDir/usr/etc/
  21. # 3. Surgical Dependency Bundling (Graphics)
  22. RUN GDI_PATH=$(find /usr/lib /lib -name "libgdiplus.so.0" | head -n 1) && \
  23. cp -L $GDI_PATH MP.AppDir/usr/lib/ && \
  24. ldd $GDI_PATH | grep "=> /" | awk '{print $3}' | grep -vE 'libc\.so|libm\.so|libdl\.so|libpthread\.so|librt\.so|libresolv\.so|libgcc_s\.so|libstdc\+\+\.so|ld-linux' | xargs -I '{}' cp -L '{}' MP.AppDir/usr/lib/ || true
  25. # 4. Pull in the native Mono shims AND the missing POSIX helper
  26. RUN find /usr/lib /lib -name "libmono-native.so*" -exec cp -L {} MP.AppDir/usr/lib/ \;
  27. RUN find /usr/lib /lib -name "libMonoPosixHelper.so*" -exec cp -L {} MP.AppDir/usr/lib/ \;
  28. # 5. Force Mono to map the Windows DLL request directly to our bundled Linux library
  29. RUN printf '<configuration>\n <dllmap dll="gdiplus.dll" target="libgdiplus.so.0"/>\n <dllmap dll="gdiplus" target="libgdiplus.so.0"/>\n</configuration>\n' > MP.AppDir/usr/lib/missionplanner/MissionPlanner.exe.config
  30. # 6. Create the AppRun
  31. RUN printf '#!/bin/bash\n\
  32. HERE="$(dirname "$(readlink -f "${0}")")"\n\
  33. export PATH="$HERE/usr/bin:$PATH"\n\
  34. export MONO_PATH="$HERE/usr/lib/missionplanner"\n\
  35. export LD_LIBRARY_PATH="$HERE/usr/lib:$LD_LIBRARY_PATH"\n\
  36. export MONO_CFG_DIR="$HERE/usr/etc"\n\
  37. export MONO_MWF_SCALING_POLICY=none\n\
  38. \n\
  39. exec "$HERE/usr/bin/mono" "$HERE/usr/lib/missionplanner/MissionPlanner.exe" "$@"\n' > MP.AppDir/AppRun
  40. RUN chmod +x MP.AppDir/AppRun
  41. # 7. Desktop Metadata
  42. RUN printf '[Desktop Entry]\nType=Application\nName=Mission Planner\nExec=AppRun\nIcon=missionplanner\nCategories=Engineering;\n' > MP.AppDir/missionplanner.desktop
  43. RUN touch MP.AppDir/missionplanner.png
  44. # 8. Package
  45. RUN wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O appimagetool && chmod +x appimagetool
  46. CMD ["/bin/bash", "-c", "./appimagetool --appimage-extract-and-run MP.AppDir MissionPlanner.AppImage && cp MissionPlanner.AppImage /dist/"]
  47. EOF
  48. docker build -t mp-map-builder .
  49. docker run --rm --privileged -v "$(pwd)/dist:/dist" mp-map-builder