From 7c455249b905ae0f67552b1d98ec0598c3745ed6 Mon Sep 17 00:00:00 2001 From: Ian-Woo Kim Date: Wed, 25 May 2022 18:40:30 -0700 Subject: [PATCH 1/5] add useClang. --- flake.nix | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/flake.nix b/flake.nix index 522ffc1..1074afb 100644 --- a/flake.nix +++ b/flake.nix @@ -138,7 +138,7 @@ overlays = fullOverlays; devShells = let - mkPkgs = ghcVer: + mkPkgs = { ghcVer, useClang }: let overlayGHC = final: prev: { haskellPackages = prev.haskell.packages.${ghcVer}; @@ -150,8 +150,8 @@ config.allowBroken = true; }; - mkDevShell = ghcVer: - let pkgs = mkPkgs ghcVer; + mkDevShell = { ghcVer, useClang ? false }: + let pkgs = mkPkgs { inherit ghcVer useClang; }; in pkgs.haskellPackages.shellFor { packages = ps: builtins.map (name: ps.${name}) categorifierCPackageNames; @@ -167,9 +167,9 @@ withHoogle = false; }; - mkUserShell = ghcVer: + mkUserShell = { ghcVer, useClang ? false }: let - pkgs = mkPkgs ghcVer; + pkgs = mkPkgs { inherit ghcVer useClang; }; hsenv = pkgs.haskellPackages.ghcWithPackages (ps: builtins.map (name: ps.${name}) categorifierCPackageNames); in pkgs.mkShell { @@ -181,16 +181,16 @@ [ pkgs.haskell-language-server ]; }; - in { + in rec { # nix develop .#ghc8107 # (or .#ghc901 .#ghc921) # This is used for building categorifier-c - "default" = mkDevShell "ghc901"; - "ghc8107" = mkDevShell "ghc8107"; - "ghc901" = mkDevShell "ghc901"; - "ghc921" = mkDevShell "ghc921"; + "default" = ghc901; + "ghc8107" = mkDevShell { ghcVer = "ghc8107"; }; + "ghc901" = mkDevShell { ghcVer = "ghc901"; }; + "ghc921" = mkDevShell { ghcVer = "ghc921"; }; # The shell with all batteries included! - "user-shell" = mkUserShell "ghc901"; + "user-shell" = mkUserShell { ghcVer = "ghc901"; }; }; }); } From 4eda9c6c84fb092bae0336c491678c4ec224694e Mon Sep 17 00:00:00 2001 From: Ian-Woo Kim Date: Wed, 25 May 2022 18:40:58 -0700 Subject: [PATCH 2/5] provide use-shell-clang --- flake.nix | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index 1074afb..dc83572 100644 --- a/flake.nix +++ b/flake.nix @@ -141,7 +141,11 @@ mkPkgs = { ghcVer, useClang }: let overlayGHC = final: prev: { - haskellPackages = prev.haskell.packages.${ghcVer}; + haskellPackages = let ps = prev.haskell.packages.${ghcVer}; + in if useClang then + ps.override { stdenv = prev.clangStdenv; } + else + ps; }; in import nixpkgs { overlays = [ overlayGHC (concat.overlay.${system}) ] @@ -191,6 +195,11 @@ "ghc921" = mkDevShell { ghcVer = "ghc921"; }; # The shell with all batteries included! "user-shell" = mkUserShell { ghcVer = "ghc901"; }; + # Experimental user-shell using clangStdenv for everything + "user-shell-clang" = mkUserShell { + ghcVer = "ghc901"; + useClang = true; + }; }; }); } From 712613d62b5e57a21a950b8f1f1098be8a8811b7 Mon Sep 17 00:00:00 2001 From: Ian-Woo Kim Date: Thu, 2 Jun 2022 11:56:00 -0700 Subject: [PATCH 3/5] mkShell.override { stdenv = clangStdenv; }; --- flake.nix | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/flake.nix b/flake.nix index dc83572..d1903d7 100644 --- a/flake.nix +++ b/flake.nix @@ -176,10 +176,12 @@ pkgs = mkPkgs { inherit ghcVer useClang; }; hsenv = pkgs.haskellPackages.ghcWithPackages (ps: builtins.map (name: ps.${name}) categorifierCPackageNames); - in pkgs.mkShell { - buildInputs = - # use nixpkgs default tools - [ hsenv pkgs.haskellPackages.ghc8107.cabal-install ] ++ + mkShell_ = if useClang then + pkgs.mkShell.override { stdenv = pkgs.clangStdenv; } + else + pkgs.mkShell; + in mkShell_ { + buildInputs = [ hsenv pkgs.haskellPackages.cabal-install ] ++ # haskell-language-server on GHC 9.2.1 is broken yet. pkgs.lib.optional (ghcVer != "ghc921") [ pkgs.haskell-language-server ]; From 4559a4bc4da74a466179595b9358db2858da1ed4 Mon Sep 17 00:00:00 2001 From: Ian-Woo Kim Date: Wed, 25 May 2022 10:55:04 -0700 Subject: [PATCH 4/5] trigger recompilation of the whole GHC --- flake.nix | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index d1903d7..5537439 100644 --- a/flake.nix +++ b/flake.nix @@ -143,7 +143,13 @@ overlayGHC = final: prev: { haskellPackages = let ps = prev.haskell.packages.${ghcVer}; in if useClang then - ps.override { stdenv = prev.clangStdenv; } + ps.override { + ghc = + final.buildPackages.haskell.compiler.${ghcVer}.override { + useLLVM = true; + }; + stdenv = prev.clangStdenv; + } else ps; }; From c438ab5191892c418c1c9bfcc4c5a2d642be5dc4 Mon Sep 17 00:00:00 2001 From: Ian-Woo Kim Date: Wed, 25 May 2022 18:25:48 -0700 Subject: [PATCH 5/5] correct stdenv replacement for ghc build. --- flake.nix | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/flake.nix b/flake.nix index 5537439..48eaea4 100644 --- a/flake.nix +++ b/flake.nix @@ -143,12 +143,31 @@ overlayGHC = final: prev: { haskellPackages = let ps = prev.haskell.packages.${ghcVer}; in if useClang then - ps.override { + let + newLlvmPackages = if ghcVer == "ghc901" then + prev.llvmPackages_9 + else + prev.llvmPackages_12; + newStdenv = newLlvmPackages.stdenv; + in ps.override { ghc = - final.buildPackages.haskell.compiler.${ghcVer}.override { + prev.buildPackages.haskell.compiler.${ghcVer}.override { useLLVM = true; + llvmPackages = newLlvmPackages; + targetPackages = prev.targetPackages.extend + (self: super: { stdenv = newStdenv; }); + pkgsHostTarget = prev.pkgsHostTarget.extend + (self: super: { + targetPackages = super.targetPackages.extend + (sself: super: { stdenv = newStdenv; }); + }); + pkgsBuildTarget = prev.pkgsBuildTarget.extend + (self: super: { + targetPackages = super.targetPackages.extend + (sself: super: { stdenv = newStdenv; }); + }); }; - stdenv = prev.clangStdenv; + stdenv = newStdenv; } else ps; @@ -180,10 +199,20 @@ mkUserShell = { ghcVer, useClang ? false }: let pkgs = mkPkgs { inherit ghcVer useClang; }; + newStdenv = if useClang then + let + newLlvmPackages = if ghcVer == "ghc901" then + pkgs.llvmPackages_9 + else + pkgs.llvmPackages_12; + in newLlvmPackages.stdenv + else + pkgs.stdenv; + hsenv = pkgs.haskellPackages.ghcWithPackages (ps: builtins.map (name: ps.${name}) categorifierCPackageNames); mkShell_ = if useClang then - pkgs.mkShell.override { stdenv = pkgs.clangStdenv; } + pkgs.mkShell.override { stdenv = newStdenv; } else pkgs.mkShell; in mkShell_ {