summaryrefslogtreecommitdiff
path: root/ulisp.nix
blob: 6fc6e33909d32a721fe783c2ad8017cddc2fa069 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
{ pkgs, teensy-core, ... }:

let
  # hacky usage of arduino-cli to preprocess ulisp "ino" source into compilable C++ code
  preprocessed-ulisp-arm = pkgs.stdenv.mkDerivation rec {
    name = "preprocessed-ulisp-arm.cpp";

    src = pkgs.fetchFromGitHub {
      owner = "technoblogy";
      repo = "ulisp-arm";
      rev = "a25fff3ef1072bdc2733d8064fcf0738579ab7ed";
      sha256 = "p6H9To9vccHrP46Cv5m+cAFDVPXDCORUWcqOz18c3kg=";
    };

    outputHashMode = "flat";
    outputHashAlgo = "sha256";
    outputHash = "mutVLBFSpTXgUzu594zZ3akR/Z7e9n5SytU6WoQ6rKA=";

    buildInputs = with pkgs; [
      cacert
      arduino-cli
    ];

    buildPhase = ''
      export HOME=/tmp/arduino
      arduino-cli core install arduino:samd
      mv ulisp-arm.ino source.ino
      arduino-cli compile --fqbn arduino:samd:arduino_zero_native --preprocess > ulisp-arm.cpp
      echo 'extern "C" int main(void) { setup(); while(true) { loop(); } }' >> ulisp-arm.cpp
    '';

    installPhase = ''
      cp ulisp-arm.cpp $out
    '';
  };

in pkgs.stdenv.mkDerivation rec {
  name = "teensy-ulisp";

  buildInputs = with pkgs; [
    gcc-arm-embedded
    teensy-core
  ];

  phases = [ "buildPhase" "installPhase" ];

  buildPhase = ''
    cp ${./test/Makefile} Makefile
    cp ${preprocessed-ulisp-arm} ulisp-arm.cpp

    export CC=arm-none-eabi-gcc
    export CXX=arm-none-eabi-g++
    export OBJCOPY=arm-none-eabi-objcopy
    export SIZE=arm-none-eabi-size

    export TEENSY_PATH=${teensy-core}

    make
  '';

  installPhase = ''
    mkdir $out
    cp *.hex $out/
  '';
}