diff --git a/.gitignore b/.gitignore index 920b172..d46fb21 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,8 @@ cmake-build-release/ .idea/ node_modules/ *.dSYM -.vs/ \ No newline at end of file +.vs/ +.direnv/ +.envrc +/build/ +/result/ diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..cd2b62f --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1749285348, + "narHash": "sha256-frdhQvPbmDYaScPFiCnfdh3B/Vh81Uuoo0w5TkWmmjU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3e3afe5174c561dee0df6f2c2b2236990146329f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..6e4c9e3 --- /dev/null +++ b/flake.nix @@ -0,0 +1,167 @@ +{ + description = "Clay (short for C Layout) is a high performance 2D UI layout library."; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + }; + + outputs = { + self, + nixpkgs, + }: let + inherit (nixpkgs) lib; + + systems = lib.systems.flakeExposed; + forAllSystems = lib.genAttrs systems; + nixpkgsFor = forAllSystems (system: nixpkgs.legacyPackages.${system}); + + date = let + # YYYYMMDD + date' = lib.substring 0 8 self.lastModifiedDate; + year = lib.substring 0 4 date'; + month = lib.substring 4 2 date'; + day = lib.substring 6 2 date'; + in + if (self ? lastModifiedDate) + then lib.concatStringsSep "-" [year month day] + else "unknown"; + + mkClayPackage = { + system, + version, + src, + suffix, + }: + nixpkgsFor.${system}.stdenv.mkDerivation { + pname = "clay"; + version = "${version}${suffix}"; + inherit src; + + dontBuild = true; + + postInstall = '' + mkdir -p $out/include + mkdir -p $out/lib/pkgconfig + + cp clay.h $out/include + + cat <$out/lib/pkgconfig/clay.pc + prefix=$out + includedir=$out/include + Name: Clay + Description: Clay (short for C Layout) is a high performance 2D UI layout library. + Version: ${version} + Cflags: -I$out/include + EOF + ''; + + passthru.tests.pkg-config = nixpkgs.lib.testing.testMetaPkgConfig self.packages.${system}.${version}; + + meta = with lib; { + description = "Clay (short for C Layout) is a high performance 2D UI layout library."; + homepage = "https://github.com/nicbarker/clay"; + license = licenses.zlib; + maintainers = with maintainers; [nicbarker]; + pkgConfigModules = ["clay"]; + platforms = platforms.all; + }; + }; + in { + checks = forAllSystems ( + system: let + pkgs = nixpkgsFor.${system}; + in { + formatting = + pkgs.runCommand "format-flake" { + nativeBuildInputs = with pkgs; [ + alejandra + deadnix + statix + ]; + } '' + cd ${self} + + echo "Checking nix formatting" + alejandra --check . + + echo "Checking dead code" + deadnix --fail . + + echo "Checking statix" + statix check . + + touch $out + ''; + } + ); + + devShells = forAllSystems ( + system: let + pkgs = nixpkgsFor.${system}; + in { + default = pkgs.mkShell { + # For testing renderers and examples, aswell as tests + packages = with pkgs; [ + cmake # this is needed for building examples and tests + clang-tools # for clangd and clang-tidy (optional) + pkg-config + alejandra # for formatting nix + + lld # for wasm + ]; + + buildInputs = with pkgs; [ + SDL2 + SDL2_image + SDL2_ttf + + sdl3 + sdl3-ttf + sdl3-image + + cairo + raylib + sokol + + # dependencies for examples and tests + xorg.libXrandr + xorg.libXinerama + xorg.libXcursor + xorg.libXi + ]; + }; + } + ); + + formatter = forAllSystems (system: nixpkgsFor.${system}.alejandra); + + packages = forAllSystems (system: let + pkgs = nixpkgsFor.${system}; + inherit (pkgs) fetchFromGitHub; + in { + stable = mkClayPackage { + inherit system; + version = "0.14"; + # To update this use nurl https://github.com/nicbarker/clay {tag} + src = fetchFromGitHub { + owner = "nicbarker"; + repo = "clay"; + rev = "v0.14"; # This will need to be updated when a new version is released + hash = "sha256-6h1aQXqwzPc4oPuid3RfV7W0WzQFUiddjW7OtkKM0P8="; # This too likely + }; + suffix = ""; + }; + + unstable = mkClayPackage { + inherit system; + version = "0.14"; + src = ./.; + suffix = "-master-${date}"; + }; + + # I have no idea how to expose both unstable and stable at the same time + # so I'm going to just expose the unstable version for now + default = self.packages.${system}.unstable; + }); + }; +}