{ description = "PlatformIO Development Environment with VSCodium"; inputs = { }; outputs = { self, nixpkgs }: let system = "x86_64-linux"; pkgs = import { inherit system; }; platformioVsix = pkgs.fetchurl { url = "https://marketplace.visualstudio.com/_apis/public/gallery/publishers/platformio/vsextensions/platformio-ide/3.3.4/vspackage?targetPlatform=linux-x64"; sha256 = "sha256-Ri5TZDxSsW1cW33Rh+l/5Fxl23MNzFEjcFGLDx/xzT8="; }; patchedExtension = pkgs.stdenv.mkDerivation { name = "platformio-ide-patched"; src = platformioVsix; buildInputs = [ pkgs.jq pkgs.unzip pkgs.gzip ]; unpackCmd = '' gzip -d < $src > temp.zip unzip temp.zip rm temp.zip ''; buildPhase = '' jq '.extensionDependencies = [] | .["platformio-ide.useBuiltinPIOCore"].default = false | .["platformio-ide.useBuiltinPython"].default = false | .["platformio-ide.forceSystemPIOCore"].default = true | .["platformio-ide.forceSystemPython"].default = true' \ package.json > package.json.new mv package.json.new package.json ''; installPhase = '' cd .. mkdir -p $out ${pkgs.zip}/bin/zip -r $out/platformio-ide.vsix . ''; }; platformioWrapper = pkgs.writeScriptBin "platformio" '' #!/bin/sh VENV_DIR="''${PLATFORMIO_VENV_DIR:-$HOME/.platformio/penv}" . "$VENV_DIR/bin/activate" exec ${pkgs.platformio}/bin/platformio "$@" ''; configureVSCodeSettings = '' USER_CONFIG_DIR="''${XDG_CONFIG_HOME:-$HOME/.config}/VSCodium/User" mkdir -p "$USER_CONFIG_DIR" SETTINGS_FILE="$USER_CONFIG_DIR/settings.json" if [ ! -f "$SETTINGS_FILE" ]; then echo '{}' > "$SETTINGS_FILE" fi ${pkgs.jq}/bin/jq '. + { "platformio-ide.useBuiltinPIOCore": true, "platformio-ide.useBuiltinPython": false, "platformio-ide.forceSystemPIOCore": false, "platformio-ide.forceSystemPython": true, "platformio-ide.customPATH": "$PATH" }' "$SETTINGS_FILE" > "$SETTINGS_FILE.tmp" if [ $? -eq 0 ]; then mv "$SETTINGS_FILE.tmp" "$SETTINGS_FILE" else rm -f "$SETTINGS_FILE.tmp" fi ''; fhsEnv = pkgs.buildFHSEnv { name = "platformio-env"; targetPkgs = pkgs: with pkgs; [ platformio platformioWrapper python312 git vscodium gcc gdb gnumake udev zlib ncurses stdenv.cc.cc.lib glibc libusb1 openssl tio chromium ]; profile = '' export PYTHONPATH=${pkgs.platformio}/lib/python3.12/site-packages:$PYTHONPATH export PLATFORMIO_CORE_DIR="''${PLATFORMIO_CORE_DIR:-$HOME/.platformio}" export PATH=${platformioWrapper}/bin:$PATH export PATH=${pkgs.python312}/bin:$PATH ''; runScript = pkgs.writeScript "platformio-shell" '' export XDG_DATA_HOME="''${XDG_DATA_HOME:-$HOME/.local/share}" export PATH=${pkgs.python312}/bin:${platformioWrapper}/bin:$PATH export PYTHONPATH=${pkgs.platformio}/lib/python3.12/site-packages:$PYTHONPATH ${configureVSCodeSettings} VSCODE_PORTABLE="''${VSCODE_PORTABLE:-$HOME/.vscode-portable}" EXTENSION_DIR="''${VSCODE_PORTABLE}/extensions" mkdir -p "$EXTENSION_DIR" ${pkgs.vscodium}/bin/codium --install-extension ${patchedExtension}/platformio-ide.vsix mkdir -p $HOME/.local/bin ln -sf ${platformioWrapper}/bin/platformio $HOME/.local/bin/pio echo "PlatformIO environment ready. PlatformIO Core: $(platformio --version)" echo "Run 'codium .' to open VSCodium in current directory" if [ -f $HOME/.platformio/penv/bin/activate ]; then source $HOME/.platformio/penv/bin/activate fi PS1="Codium-PIO> " exec bash --norc ''; }; # Create a dedicated VSCodium launcher package that accepts arguments codiumLauncher = pkgs.writeScriptBin "launch-codium" '' #!/usr/bin/env bash export XDG_DATA_HOME="''${XDG_DATA_HOME:-$HOME/.local/share}" export PATH=${pkgs.python312}/bin:${platformioWrapper}/bin:$PATH export PYTHONPATH=${pkgs.platformio}/lib/python3.12/site-packages:$PYTHONPATH ${configureVSCodeSettings} VSCODE_PORTABLE="''${VSCODE_PORTABLE:-$HOME/.vscode-portable}" EXTENSION_DIR="''${VSCODE_PORTABLE}/extensions" mkdir -p "$EXTENSION_DIR" ${pkgs.vscodium}/bin/codium --install-extension ${patchedExtension}/platformio-ide.vsix mkdir -p $HOME/.local/bin ln -sf ${platformioWrapper}/bin/platformio $HOME/.local/bin/pio # Initialize PlatformIO environment if needed if [ ! -f $HOME/.platformio/penv/bin/activate ] && [ -x "$(command -v python3)" ]; then echo "Initializing PlatformIO environment..." python3 -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py)" fi if [ -f $HOME/.platformio/penv/bin/activate ]; then source $HOME/.platformio/penv/bin/activate fi # If no arguments are provided, open the current directory if [ $# -eq 0 ]; then exec ${pkgs.vscodium}/bin/codium . else # Otherwise, pass all arguments to VSCodium exec ${pkgs.vscodium}/bin/codium "$@" fi ''; # Create an FHS environment specifically for launching VSCodium codiumFhsEnv = pkgs.buildFHSEnv { name = "codium-launcher"; targetPkgs = pkgs: with pkgs; [ platformio platformioWrapper python312 git vscodium gcc gdb gnumake udev zlib ncurses stdenv.cc.cc.lib glibc libusb1 openssl codiumLauncher tio ]; profile = '' export PYTHONPATH=${pkgs.platformio}/lib/python3.12/site-packages:$PYTHONPATH export PLATFORMIO_CORE_DIR="''${PLATFORMIO_CORE_DIR:-$HOME/.platformio}" export PATH=${platformioWrapper}/bin:$PATH export PATH=${pkgs.python312}/bin:$PATH ''; # Pass all arguments received to the launch-codium script runScript = pkgs.writeScript "codium-launch-wrapper" '' exec ${codiumLauncher}/bin/launch-codium "$@" ''; }; in { devShells.${system} = { default = fhsEnv.env; codium = codiumFhsEnv.env; }; packages.${system} = { default = fhsEnv; platformioExtension = patchedExtension; codium = codiumFhsEnv; }; }; }