From e575e08cacd3461feae843d368fa205c85304b2c Mon Sep 17 00:00:00 2001
From: Someone Serge <else@someonex.net>
Date: Tue, 25 Jun 2024 17:09:58 +0000
Subject: evanix-py: init

---
 flake.nix          | 140 +++++++++++++++++++++++++++++++----------------------
 meson.build        |   9 ++++
 meson_options.txt  |   1 +
 pyproject.toml     |  10 ++++
 python-package.nix |  41 ++++++++++++++++
 src/evanix-py.c    |  14 ++++++
 6 files changed, 157 insertions(+), 58 deletions(-)
 create mode 100644 meson_options.txt
 create mode 100644 pyproject.toml
 create mode 100644 python-package.nix
 create mode 100644 src/evanix-py.c

diff --git a/flake.nix b/flake.nix
index 90992f3..ad6638d 100644
--- a/flake.nix
+++ b/flake.nix
@@ -3,75 +3,99 @@
 
   inputs.nixpkgs.url = "github:NixOs/nixpkgs/nixos-unstable";
 
-  outputs = { self, nixpkgs }: let
-    lib = nixpkgs.lib;
+  outputs =
+    { self, nixpkgs }:
+    let
+      lib = nixpkgs.lib;
 
-    forSystem = f: system: f {
-      inherit system;
-      pkgs = import nixpkgs { inherit system; };
-    };
+      forSystem =
+        f: system:
+        f {
+          inherit system;
+          pkgs = import nixpkgs { inherit system; };
+        };
 
-    supportedSystems = lib.platforms.unix;
-    forAllSystems = f: lib.genAttrs supportedSystems (forSystem f);
-  in {
-    devShells = forAllSystems ({ system, pkgs }: {
-      default = pkgs.mkShell {
-        name = "dev";
+      supportedSystems = lib.platforms.unix;
+      forAllSystems = f: lib.genAttrs supportedSystems (forSystem f);
+    in
+    {
+      devShells = forAllSystems (
+        { system, pkgs }:
+        {
+          default = pkgs.mkShell {
+            name = "dev";
 
-        buildInputs = with pkgs; [
-          jq
-          cjson
-          nix-eval-jobs
+            buildInputs = with pkgs; [
+              jq
+              cjson
+              nix-eval-jobs
 
-          pkg-config
-          meson
-          ninja
+              pkg-config
+              meson
+              ninja
 
-          gdb
-          ccls
-          valgrind
-          clang-tools # clang-format
-        ];
+              gdb
+              ccls
+              valgrind
+              clang-tools # clang-format
+            ];
 
-	shellHook = ''
-          export PS1="\033[0;34m[󱄅 ]\033[0m $PS1"
-        '';
-      };
-    });
+            shellHook = ''
+              export PS1="\033[0;34m[󱄅 ]\033[0m $PS1"
+            '';
+          };
+        }
+      );
 
-    packages = forAllSystems ({ system, pkgs }: {
-      evanix = pkgs.stdenv.mkDerivation (finalAttrs: {
-        name = "evanix";
+      packages = forAllSystems (
+        { system, pkgs }:
+        {
+          default = self.packages.${system}.evanix;
+          evanix = pkgs.stdenv.mkDerivation (finalAttrs: {
+            name = "evanix";
 
-        src = ./.;
-        nativeBuildInputs = with pkgs; [
-          meson
-          ninja
-          pkg-config
-          makeWrapper
-        ];
-        buildInputs = with pkgs; [
-          cjson
-          nix-eval-jobs
-        ];
+            src = ./.;
+            nativeBuildInputs = with pkgs; [
+              meson
+              ninja
+              pkg-config
+              makeWrapper
+            ];
+            buildInputs = with pkgs; [
+              cjson
+              nix-eval-jobs
+            ];
 
-        postInstall = ''
-          wrapProgram $out/bin/evanix \
-              --prefix PATH : ${lib.makeBinPath [ pkgs.nix-eval-jobs ]}
-        '';
+            postInstall = ''
+              wrapProgram $out/bin/evanix \
+                  --prefix PATH : ${lib.makeBinPath [ pkgs.nix-eval-jobs ]}
+            '';
 
-        meta = {
-          homepage = "https://git.sinanmohd.com/evanix";
+            meta = {
+              homepage = "https://git.sinanmohd.com/evanix";
 
-          license = lib.licenses.gpl3;
-          platforms = supportedSystems;
-          mainProgram = "evanix";
+              license = lib.licenses.gpl3;
+              platforms = supportedSystems;
+              mainProgram = "evanix";
 
-          maintainers = with lib.maintainers; [ sinanmohd ];
-        };
-      });
+              maintainers = with lib.maintainers; [ sinanmohd ];
+            };
+          });
 
-      default = self.packages.${system}.evanix;
-    });
-  };
+          evanix-py = pkgs.python3Packages.callPackage ./python-package.nix { };
+          pythonWithEvanix =
+            let
+              wrapper = pkgs.python3.withPackages (ps: [ (ps.callPackage ./python-package.nix { }) ]);
+            in
+            wrapper.overrideAttrs (oldAttrs: {
+              makeWrapperArgs = oldAttrs.makeWrapperArgs or [ ] ++ [
+                "--prefix"
+                "PATH"
+                ":"
+                "${lib.makeBinPath [ pkgs.nix-eval-jobs ]}"
+              ];
+            });
+        }
+      );
+    };
 }
diff --git a/meson.build b/meson.build
index 38f78d7..e5290f8 100644
--- a/meson.build
+++ b/meson.build
@@ -21,4 +21,13 @@ add_project_arguments(
 cjson_dep = dependency('libcjson')
 evanix_inc = include_directories('include')
 
+if get_option('build-python')
+  py = import('python').find_installation()
+  py.extension_module(
+    'evanix',
+    'src/evanix-py.c',
+    install: true,
+  )
+endif
+
 subdir('src')
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 0000000..e8baf64
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1 @@
+option('build-python', type: 'boolean', value: 'false')
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..b5a3375
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,10 @@
+[build-system]
+build-backend = 'mesonpy'
+requires = [ 'meson-python' ]
+
+[project]
+name = 'evanix'
+version = '0.0.1'
+
+[tool.meson-python.args]
+setup = [ '-Dbuild-python=true' ]
diff --git a/python-package.nix b/python-package.nix
new file mode 100644
index 0000000..a422052
--- /dev/null
+++ b/python-package.nix
@@ -0,0 +1,41 @@
+{
+  lib,
+  buildPythonPackage,
+  meson-python,
+  ninja,
+  pkg-config,
+  makeWrapper,
+  cjson,
+}:
+
+buildPythonPackage {
+  pname = "evanix";
+  version = "0.0.1";
+  pyproject = true;
+
+  src =
+    let
+      fs = lib.fileset;
+    in
+    fs.toSource {
+      root = ./.;
+      fileset = fs.unions [
+        ./src
+        ./include
+        ./meson.build
+        ./meson_options.txt
+        ./pyproject.toml
+      ];
+    };
+
+  build-system = [ meson-python ];
+  nativeBuildInputs = [
+    ninja
+    pkg-config
+    makeWrapper
+  ];
+  buildInputs = [
+    cjson
+    # nix-eval-jobs
+  ];
+}
diff --git a/src/evanix-py.c b/src/evanix-py.c
new file mode 100644
index 0000000..c010e27
--- /dev/null
+++ b/src/evanix-py.c
@@ -0,0 +1,14 @@
+#include <Python.h>
+
+static PyMethodDef methods[] = {
+	{NULL, NULL, 0, NULL},
+};
+
+static struct PyModuleDef module = {
+	PyModuleDef_HEAD_INIT, "evanix", NULL, -1, methods,
+};
+
+PyMODINIT_FUNC PyInit_evanix(void)
+{
+	return PyModule_Create(&module);
+}
-- 
cgit v1.2.3