#
# Marlin Firmware
# PlatformIO Configuration File
#

#################################
#                               #
#      Native / Simulation      #
#                               #
#################################

#
# No supported Arduino libraries, base Marlin only
#
[env:linux_native]
platform        = native
framework       =
build_flags     = -D__PLAT_LINUX__ -std=gnu++17 -ggdb -g -lrt -lpthread -D__MARLIN_FIRMWARE__ -Wno-expansion-to-defined
src_build_flags = -Wall -IMarlin/src/HAL/LINUX/include
build_unflags   = -Wall
lib_ldf_mode    = off
lib_deps        =
src_filter      = ${common.default_src_filter} +<src/HAL/LINUX>

#
# Native Simulation
# Builds with a small subset of available features
# Required system libraries: SDL2, SDL2-net, OpenGL, GLM
#
# Tested with Linux (Mint 20) : gcc [9.3.0, 10.2.0]: libsdl2-dev[2.0.10], libsdl2-net-dev[2.0.1], libglm-dev[0.9.9.7, 0.9.9.8]
#
# Debugging with gdb in vscode is as easy as adding the launch task as usual, but platformio
# will randomly remove your task when it recreates its tasks from a template. Add your gdb
# launch task to '~/.platformio/penv/lib/python{PYTHON_VERSION}/site-packages/platformio/ide/tpls/vscode/.vscode'
# to avoid this until platformio updates.
#
[simulator_common]
platform          = native
framework         =
build_flags       = ${common.build_flags} -std=gnu++17 -D__PLAT_NATIVE_SIM__ -DU8G_HAL_LINKS -I/usr/include/SDL2 -IMarlin -IMarlin/src/HAL/NATIVE_SIM/include -IMarlin/src/HAL/NATIVE_SIM/u8g
src_build_flags   = -Wall -Wno-expansion-to-defined -Wcast-align
release_flags     = -g0 -O3 -flto
debug_build_flags = -fstack-protector-strong -g -g3 -ggdb
lib_compat_mode   = off
src_filter        = ${common.default_src_filter} +<src/HAL/NATIVE_SIM>

lib_deps          = ${common.lib_deps}
  MarlinSimUI=https://github.com/p3p/MarlinSimUI/archive/master.zip
  Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/marlin_sim_native.zip
  LiquidCrystal=https://github.com/p3p/LiquidCrystal/archive/master.zip
extra_scripts = ${common.extra_scripts}
  pre:buildroot/share/PlatformIO/scripts/simulator.py


[simulator_linux]
extends     = simulator_common
build_flags = ${simulator_common.build_flags} -ldl -lpthread -lSDL2 -lSDL2_net -lGL

[env:simulator_linux_debug]
platform   = ${simulator_linux.platform}
extends    = simulator_linux
build_type = debug

[env:simulator_linux_release]
platform    = ${simulator_linux.platform}
extends     = simulator_linux
build_type  = release
build_flags = ${simulator_linux.build_flags} ${simulator_linux.release_flags}

#
# Simulator for macOS (MacPorts)
#
#  sudo port install gcc10 gdb glm libsdl2 libsdl2_net freetype
#  sudo port install ld64 @3_3 +ld64_xcode
#
#  cd /opt/local/bin
#  sudo rm -f gcc g++ cc
#  sudo ln -s gcc-mp-10 gcc ; sudo ln -s g++-mp-10 g++ ; sudo ln -s g++ cc
# This step may be obsolete:
#  sudo port uninstall ld64 ld64-latest
#
# cd -
#
# Use 'sudo port install mesa' to get a <GL/gl.h> if no Xcode is installed.
# If Xcode is installed be sure to run `xcode-select --install` first.
#
# For VSCode debugging paste the block below near the top of launch.json.
# NOTE: The PlatformIO VSCode extension will remove it when regenerating launch.json.
#
# { "name": "Debug Sim",
#   "type": "cppdbg",
#   "request": "launch",
#   "program": "${workspaceFolder}/.pio/build/simulator_macos/MarlinSimulator",
#   "miDebuggerPath": "/opt/local/bin/ggdb",
#   "MIMode": "gdb",
#   "cwd": "${workspaceFolder}/.pio/build/simulator_macos" },
#
[simulator_macos]
build_unflags     = -lGL
custom_verbose    = 0
build_flags       =
  -I/opt/local/include
  -I/opt/local/include/freetype2
  -I/opt/local/include/SDL2/
  -L/opt/local/lib
  -Wl,-framework,OpenGl
  -Wl,-framework,CoreFoundation
  -lSDL2

[env:simulator_macos_debug]
platform        = ${env:simulator_linux_release.platform}
extends         = env:simulator_linux_debug
build_flags     = ${env:simulator_linux_debug.build_flags} ${simulator_macos.build_flags} -ggdb -Og -D_THREAD_SAFE
build_unflags   = ${simulator_macos.build_unflags}

[env:simulator_macos_release]
platform        = ${env:simulator_linux_release.platform}
extends         = env:simulator_linux_release
build_flags     = ${env:simulator_linux_release.build_flags} ${simulator_macos.build_flags}
build_unflags   = ${simulator_macos.build_unflags}

#
# Simulator for Windows 10
#
#  MSYS2 mingw-w64-x86_64 with these packages:
#  pacman -S --needed base-devel mingw-w64-x86_64-toolchain mingw64/mingw-w64-x86_64-glm mingw64/mingw-w64-x86_64-SDL2 mingw64/mingw-w64-x86_64-SDL2_net mingw-w64-x86_64-dlfcn
#
[env:simulator_windows]
platform    = ${simulator_common.platform}
extends     = simulator_common
src_build_flags = ${simulator_common.src_build_flags} -fpermissive
build_flags = ${simulator_common.build_flags} ${simulator_common.debug_build_flags} -IC:\\msys64\\mingw64\\include\\SDL2 -fno-stack-protector -Wl,-subsystem,windows -ldl -lmingw32 -lSDL2main -lSDL2 -lSDL2_net -lopengl32 -lssp
build_type = debug