about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@tvl.su>2024-08-28T14·59+0300
committerclbot <clbot@tvl.fyi>2024-09-02T12·58+0000
commit18578c3458187bad901ce559131922e856162fb5 (patch)
tree905118fd92ddc4020ce0e95274694d26c200523e
parent3abc104584b1fbc92199a7d54caddbe8065b637e (diff)
feat(tools/eaglemode): add plugin builder for eagle mode r/8637
Adds a buildPlugin function which can build Eagle Mode plugins that can
ultimately be linked into Eagle Mode using the existing etcDir function.

Change-Id: I338171779d3547faecbfb708fbaa78cd1cfd59ac
Reviewed-on: https://cl.tvl.fyi/c/depot/+/12387
Autosubmit: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
Reviewed-by: emery <emery@dmz.rs>
Reviewed-by: azahi <azat@bahawi.net>
-rw-r--r--tools/eaglemode/default.nix53
-rw-r--r--tools/eaglemode/plugins/example.nix17
2 files changed, 69 insertions, 1 deletions
diff --git a/tools/eaglemode/default.nix b/tools/eaglemode/default.nix
index 0b0c0caa8ba8..30983f5d5018 100644
--- a/tools/eaglemode/default.nix
+++ b/tools/eaglemode/default.nix
@@ -68,6 +68,52 @@ rec {
     ${pkgs.imagemagick}/bin/convert ${path} $out
   '';
 
+  buildPlugin = lib.makeOverridable (
+    { name
+    , src
+    , version
+    , eaglemode ? pkgs.eaglemode
+    , target ? name
+    , extraNativeBuildInputs ? [ ]
+    , extraBuildInputs ? [ ]
+    }:
+    pkgs.stdenv.mkDerivation {
+      pname = "eaglemode-plugin-${name}";
+      inherit src version;
+      # inherit (eaglemode.drvAttrs) dontPatchELF;
+
+      nativeBuildInputs = eaglemode.drvAttrs.nativeBuildInputs ++ extraNativeBuildInputs;
+      buildInputs = eaglemode.drvAttrs.buildInputs ++ extraBuildInputs ++ [ eaglemode ];
+
+      buildPhase = ''
+        runHook preBuild
+
+        # merge eaglemode & plugin folders
+        cp -r ${pkgs.srcOnly eaglemode} merged-src && chmod -R u+rw merged-src
+        cp -r $src/* merged-src && chmod -R u+rw merged-src
+        cd merged-src
+
+        export NIX_LDFLAGS="$NIX_LDFLAGS -lXxf86vm -lXext -lXinerama"
+        perl make.pl build projects=${target} continue=no
+
+        runHook postBuild
+      '';
+
+      installPhase = ''
+        runHook preInstall
+
+        mkdir -p $out/lib
+        cp -r lib/lib${target}.so $out/lib
+
+        if [ -d "$src/etc" ]; then
+          cp -r $src/etc/* $out
+        fi
+
+        runHook postInstall
+      '';
+    }
+  );
+
   # etcDir creates a directory layout suitable for use in the EM_USER_CONFIG_DIR
   # environment variable.
   #
@@ -88,8 +134,13 @@ rec {
   # withConfig creates an Eagle Mode wrapper that runs it with the given
   # configuration.
   withConfig = { eaglemode ? pkgs.eaglemode, config }: pkgs.writeShellScriptBin "eaglemode" ''
-    set -ue
     ${configWrapper}/bin/wrapper --em-config "${config}"
+
+    if [ -d "${config}/lib" ]; then
+      export LD_LIBRARY_PATH="${config}/lib:$LD_LIBRARY_PATH"
+      exec ${eaglemode}/bin/eaglemode "$@"
+    fi
+
     exec ${eaglemode}/bin/eaglemode "$@"
   '';
 }
diff --git a/tools/eaglemode/plugins/example.nix b/tools/eaglemode/plugins/example.nix
new file mode 100644
index 000000000000..b361971cc57e
--- /dev/null
+++ b/tools/eaglemode/plugins/example.nix
@@ -0,0 +1,17 @@
+{ depot, pkgs, ... }:
+
+let
+  em = depot.tools.eaglemode;
+  emSrc = with pkgs; srcOnly eaglemode;
+in
+em.buildPlugin {
+  name = "example";
+  version = "canon";
+
+  src = pkgs.runCommand "em-plugin-example-src" { } ''
+    set -ux
+    cp -r ${emSrc}/doc/examples/CppApiExamples/PluginExample $out
+  '';
+
+  target = "PlEx";
+}