From c6461bda14d96eb16c2c7ba9c20cc4c919d1b3d91e7215247ef57f8a7a4088b7 Mon Sep 17 00:00:00 2001 From: Daniel Ziltener Date: Mon, 16 Sep 2024 10:09:13 +0200 Subject: [PATCH] In the beginning there was darkness --- .envrc | 1 + flake.lock | 43 +++++++++++++++++ flake.nix | 50 ++++++++++++++++++++ nix/default.nix | 123 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 217 insertions(+) create mode 100644 .envrc create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 nix/default.nix diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..9102f25 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake . --impure --show-trace diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..0f4cfab --- /dev/null +++ b/flake.lock @@ -0,0 +1,43 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1726062873, + "narHash": "sha256-IiA3jfbR7K/B5+9byVi9BZGWTD4VSbWe8VLpp9B/iYk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f807e8940284ad7925ebd0a0993d2a1791acb2f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs", + "systems": "systems" + } + }, + "systems": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..c9a1e99 --- /dev/null +++ b/flake.nix @@ -0,0 +1,50 @@ +{ + description = "A flake to use a development version of Chicken."; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + systems.url = "github:nix-systems/default-linux"; + }; + + outputs = inputs @ { + self, + nixpkgs, + systems, + ... + }: let + inherit (nixpkgs) lib; + eachSystem = lib.genAttrs (import systems); + pkgsFor = eachSystem (system: + import nixpkgs { + localSystem.system = system; + overlays = with self.overlays; [chicken]; + }); + mkDate = longDate: (lib.concatStringsSep "-" [ + (builtins.substring 0 4 longDate) + (builtins.substring 4 2 longDate) + (builtins.substring 6 2 longDate) + ]); + version = "6.0.0"; + in { + overlays = { + default = self.overlays.chicken; + + chicken = final: prev: { + chicken = final.callPackage ./nix/default.nix { + stdenv = final.gcc13Stdenv; + version = version + "+date=" + (mkDate (self.lastModifiedDate or "19700101")) + "_" + (self.shortRev or "dirty"); + }; + }; + }; + + devShells = eachSystem (system: { + default = let + pkgs = import nixpkgs { + overlays = [ self.overlays.chicken ]; + }; + in pkgs.mkShell { + packages = [ pkgs.chicken ]; + }; + }); + }; +} diff --git a/nix/default.nix b/nix/default.nix new file mode 100644 index 0000000..d7838a5 --- /dev/null +++ b/nix/default.nix @@ -0,0 +1,123 @@ +{ + pkgs, + lib, + stdenv, + fetchgit, + fetchurl, + makeWrapper, + darwin, + version ? "git", + testers +}: +let + platform = with stdenv; + if isDarwin then "macosx" + else if isCygwin then "cygwin" + else if (isFreeBSD || isOpenBSD) then "bsd" + else if isSunOS then "solaris" + else "linux"; # Should be a sane default +in +stdenv.mkDerivation (finalAttrs: { + pname = "chicken"; + inherit version; + + binaryVersion = 12; + + srcs = [ + (fetchgit { + url = "https://code.call-cc.org/git/chicken-core.git"; + rev = "dbffda19e57c3be092e5a9174f1829632f5fa5a7"; + sha256 = "sha256-zWjf9JS4H1buBlkmUhIv+odCQzXaOPtI7VfIaQUhe6Q="; + }) + (fetchurl { + url = "https://code.call-cc.org/dev-snapshots/2024/07/01/chicken-6.0.0-bootstrap.tar.gz"; + sha256 = "sha256-qkcyWzsaN9+HbMBolmv7zeaPrtbaCTGa9HoF2g/3//o="; + }) + ]; + + unpackPhase = '' + cp -r `echo $srcs | awk '{print $1}'`/* . + cp -r `echo $srcs | awk '{print $1}'`/.* . + chmod -R 777 . + mkdir -p boot/snapshot + cd boot + tar xzf `echo $srcs | awk '{print $2}'` + cd .. + echo ${version} > buildid + + cd boot/chicken-6.0.0 + case "${platform}" in + bsd) + mkcmd=gmake;; + *) + mkcmd=make;; + esac + $mkcmd PREFIX="$(pwd)"/../snapshot + $mkcmd PREFIX="$(pwd)"/../snapshot install + cd ../.. + ./configure --chicken "$(pwd)"/boot/snapshot/bin/chicken + $mkcmd boot-chicken + ''; + + # Disable two broken tests: "static link" and "linking tests" + postPatch = '' + sed -i tests/runtests.sh -e "/static link/,+4 { s/^/# / }" + sed -i tests/runtests.sh -e "/linking tests/,+11 { s/^/# / }" + ''; + + # -fno-strict-overflow is not a supported argument in clang + hardeningDisable = lib.optionals stdenv.cc.isClang [ "strictoverflow" ]; + + makeFlags = [ + "PLATFORM=${platform}" + "PREFIX=$(out)" + "C_COMPILER=$(CC)" + "CXX_COMPILER=$(CXX)" + ] ++ (lib.optionals stdenv.isDarwin [ + "XCODE_TOOL_PATH=${darwin.binutils.bintools}/bin" + "LINKER_OPTIONS=-headerpad_max_install_names" + "POSTINSTALL_PROGRAM=install_name_tool" + ]) ++ (lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + "HOSTSYSTEM=${stdenv.hostPlatform.config}" + "TARGET_C_COMPILER=${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc" + "TARGET_CXX_COMPILER=${stdenv.cc}/bin/${stdenv.cc.targetPrefix}c++" + ]); + + nativeBuildInputs = [ + makeWrapper + pkgs.hostname + ] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [ + darwin.autoSignDarwinBinariesHook + ]; + + configurePhase = '' + ./configure --chicken ./chicken-boot --prefix $PREFIX --platform=$PLATFORM + ''; + + doCheck = !stdenv.isDarwin; + postCheck = '' + ./csi -R chicken.pathname -R chicken.platform \ + -p "(assert (equal? \"${toString finalAttrs.binaryVersion}\" (pathname-file (car (repository-path)))))" + ''; + + passthru.tests.version = testers.testVersion { + package = finalAttrs.finalPackage; + command = "csi -version"; + }; + + meta = { + homepage = "https://call-cc.org/"; + license = lib.licenses.bsd3; + maintainers = with lib.maintainers; [ corngood nagy konst-aa ]; + platforms = lib.platforms.unix; + description = "Portable compiler for the Scheme programming language"; + longDescription = '' + CHICKEN is a compiler for the Scheme programming language. + CHICKEN produces portable and efficient C, supports almost all + of the R5RS Scheme language standard, and includes many + enhancements and extensions. CHICKEN runs on Linux, macOS, + Windows, and many Unix flavours. + ''; + }; + +})