From e061d32b3b9352253125e5a5e6bf33c9f7f30987 Mon Sep 17 00:00:00 2001 From: david Date: Sat, 6 Apr 2024 14:59:28 -0400 Subject: [PATCH] Update C Flake, Meson wrap fetch, cleaner deps --- flakes/c/flake.nix | 124 ++++++++++++++++++------------------- flakes/c/mesonWrapFetch.py | 22 +++++++ 2 files changed, 84 insertions(+), 62 deletions(-) create mode 100644 flakes/c/mesonWrapFetch.py diff --git a/flakes/c/flake.nix b/flakes/c/flake.nix index f99899e..755d158 100644 --- a/flakes/c/flake.nix +++ b/flakes/c/flake.nix @@ -1,90 +1,90 @@ { - description = "Syzygui - Cross Platform Vulkan Based GUI Framework"; + description = "C Project Flake"; inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let version = "0.0.1"; - name = "PACKAGE"; + name = "cproj"; pkgs = import nixpkgs { inherit system; }; - deps = (with pkgs; [ - ]); + pkgs-windows = pkgs.pkgsCross.mingwW64; + + # For Linux Specific Dependencies + linux' = pkgs.lib.optional pkgs.stdenv.isLinux; + # For MacOS Specific Dependencies + darwin' = pkgs.lib.optional pkgs.stdenv.isDarwin; + + nativeBuildInputs = with pkgs; [ + meson + ninja + pkg-config + ]; + + bDeps = p: with p; [ + ] ++ (linux' [ + ]) ++ (darwin' ([ + ] ++ (with darwin.apple_sdk.frameworks; [ + ]))); - propDeps = (with pkgs; [ + pbDeps = p: with p; [ + ]; - ]) ++ (pkgs.lib.optionals pkgs.stdenv.isDarwin (with pkgs; [ - ])); - - project = pkgs.stdenv.mkDerivation { + sharedEnv = let + mesonWrapCache = let + mesonPy = pkgs.python3.withPackages (p: [p.meson]); + in import (pkgs.runCommand "meson-wrap-${name}-${version}" {} '' + ${mesonPy}/bin/${mesonPy.executable} ${./mesonWrapFetch.py} ${./.} > $out + '') { inherit pkgs; }; + in { pname = name; inherit version; - src = ./.; - - nativeBuildInputs = with pkgs; [ - meson - ninja - pkg-config - ]; - - buildInputs = deps ++ (with pkgs; [ - ]); - - propagatedBuildInputs = propDeps ++ (with pkgs; [ - ]); - }; - - # Pseudo Dev for Not Rebuilding During Development - project-dev = pkgs.stdenv.mkDerivation { - name = "${name}-dev"; - src = ./include; - installPhase = '' - mkdir -p $out/include - cp -r * $out/include + src = self; + + inherit nativeBuildInputs; + + preConfigure = '' + mkdir subprojects/packagecache + ${builtins.concatStringsSep ";" (builtins.attrValues (builtins.mapAttrs (n: v: "cp ${v} subprojects/packagecache/${n}") mesonWrapCache))} ''; }; - project-examples = pkgs.stdenv.mkDerivation { - pname = "${name}-examples"; - inherit version; - src = ./examples; - - nativeBuildInputs = with pkgs; [ - meson - ninja - pkg-config - ]; + cproj = pkgs.stdenv.mkDerivation (sharedEnv // { + buildInputs = bDeps pkgs; + propagatedBuildInputs = pbDeps pkgs; + }); - buildInputs = deps ++ (with pkgs; [ - "${name}" - ]); + cproj-exe = pkgs-windows.stdenv.mkDerivation ( sharedEnv // { + buildInputs = bDeps pkgs-windows; + propagatedBuildInputs = pbDeps pkgs-windows; + }); + in { + packages = { + default = cproj; + inherit cproj cproj-exe; + + Cproj = mkImage "latest"; + Cproj-Test = mkImage "dev"; }; - in { - packages = { - default = project; - examples = if (builtins.pathExists ./examples) then project-examples else pkgs.writeText "No Examples" '' - No "examples" in root directory, make an examples dir for examples. - ''; - }; - apps = rec { - default = flake-utils.lib.mkApp { drv = self.packages.${system}.default; }; - }; + apps = rec { + default = flake-utils.lib.mkApp { drv = self.packages.${system}.default; }; + }; - devShells.default = pkgs.mkShell { - C_INCLUDE_PATH = "./include"; - packages = deps ++ propDeps ++ (with pkgs; [ - project-dev - + devShells = { + default = pkgs.mkShell { + inputsFrom = [ cproj ]; + packages = (with pkgs; [ clang-tools - meson ]); }; - } - ); + inherit cproj; + }; + }); } diff --git a/flakes/c/mesonWrapFetch.py b/flakes/c/mesonWrapFetch.py new file mode 100644 index 0000000..40cf571 --- /dev/null +++ b/flakes/c/mesonWrapFetch.py @@ -0,0 +1,22 @@ +from glob import glob +from mesonbuild.wrap.wrap import PackageDefinition +import sys + +print("{ pkgs, ... }: {") + +for wrap in glob(f"{sys.argv[1]}/subprojects/*.wrap"): + wrap = PackageDefinition(wrap) + + if wrap.wrap_section == "wrap-file": + print(f""" "{wrap.values['source_filename']}" = pkgs.fetchurl {{ + url = "{wrap.values['source_url']}"; + sha256 = "{wrap.values['source_hash']}"; + }};""") + + if 'patch_url' in wrap.values: + print(f""" "{wrap.values['patch_filename']}" = pkgs.fetchurl {{ + url = "{wrap.values['patch_url']}"; + sha256 = "{wrap.values['patch_hash']}"; + }};""") + +print("}")