on iko/ghcjs-patch-master help sign in
Merge branch 'external-static-8.10.4'

Add external static plugins patch to Plutus GHC

commitd82e4c0e249e99259c083863e26a35509283f250 authorShea Levy <shea@shealevy.com> dateTue 3 May 2022, 13:38 (4 years ago) parent0a847d9bfeea3e
18 files changed+386−19
builder/comp-builder.nix+1 builder/ghc-for-component-wrapper.nix+60−15 builder/haddock-builder.nix+1 builder/shell-for.nix+1 ci.nix+2−2 modules/package.nix+17 overlays/bootstrap.nix+1−1 overlays/patches/ghc/external-static-8.10.4.patch+219 test/default.nix+1 test/external-static-plugin/cabal.project+1 test/external-static-plugin/default.nix+27 test/external-static-plugin/plugin/CHANGELOG.md+5 test/external-static-plugin/plugin/plugin.cabal+12 test/external-static-plugin/plugin/src/Plugin.hs+16 test/external-static-plugin/prog/CHANGELOG.md+5 test/external-static-plugin/prog/app/Main.hs+4 test/external-static-plugin/prog/prog.cabal+12 test/haskell-language-server/stack.nix+1−1
builder/comp-builder.nix+1
@@ -236,6 +236,7 @@ let
236236 shellWrappers = ghcForComponent {
237237 componentName = fullName;
238238 inherit configFiles enableDWARF;
239+ inherit (component) plugins;
239240 };
240241
241242 # In order to let shell hooks make package-specific things like Hoogle databases
builder/ghc-for-component-wrapper.nix+60−15
@@ -13,6 +13,7 @@
1313, configFiles # The component's "config" derivation
1414, postInstall ? ""
1515, enableDWARF
16+, plugins
1617}:
1718
1819let
@@ -37,31 +38,70 @@ in runCommand "${componentName}-${ghc.name}-env" {
3738 ''
3839 . ${makeWrapper}/nix-support/setup-hook
3940
40− # Start with a ghc...
41+ ''
42+ # Start with a ghc and remove all of the package directories
43+ + ''
4144 mkdir -p $out/bin
4245 ${lndir}/bin/lndir -silent ${ghc} $out
43− # ... remove all of the package directories
4446 rm -rf ${libDir}/*/
45− # ... but retain the lib/ghc/bin directory. This contains `unlit' and friends.
47+ ''
48+ # ... but retain the lib/ghc/bin directory. This contains `unlit' and friends.
49+ + ''
4650 ln -s ${ghc}/lib/${ghcCommand}-${ghc.version}/bin ${libDir}
47− # ... and the ghcjs shim's if they are available ...
51+ ''
52+ # ... and the ghcjs shim's if they are available ...
53+ + ''
4854 if [ -d ${ghc}/lib/${ghcCommand}-${ghc.version}/shims ]; then
4955 ln -s ${ghc}/lib/${ghcCommand}-${ghc.version}/shims ${libDir}
5056 fi
51− # ... and node modules ...
57+ ''
58+ # ... and node modules ...
59+ + ''
5260 if [ -d ${ghc}/lib/${ghcCommand}-${ghc.version}/ghcjs-node ]; then
5361 ln -s ${ghc}/lib/${ghcCommand}-${ghc.version}/ghcjs-node ${libDir}
5462 fi
55− # Replace the package database with the one from target package config.
63+ ''
64+ # Replace the package database with the one from target package config.
65+ + ''
5666 ln -s ${configFiles}/${packageCfgDir} $out/${packageCfgDir}
5767
58− # now the tricky bit. For GHCJS (to make plugins work), we need a special
59− # file called ghc_libdir. That points to the build ghc's lib.
60− echo "${ghc.buildGHC or ghc}/lib/${(ghc.buildGHC or ghc).name}" > "${libDir}/ghc_libdir"
68+ ''
69+ # Set the GHC_PLUGINS environment variable according to the plugins for the component.
70+ # GHC will automatically load the relevant symbols from the given libraries and
71+ # initialize them with the given arguments.
72+ #
73+ # GHC_PLUGINS is a `read`able [(FilePath,String,String,[String])], where the
74+ # first component is a path to the shared library, the second is the package ID,
75+ # the third is the module name, and the fourth is the plugin arguments.
76+ + ''
77+ GHC_PLUGINS="["
78+ LIST_PREFIX=""
79+ ${builtins.concatStringsSep "\n" (map (plugin: ''
80+ id=$(${ghc}/bin/ghc-pkg --package-db ${plugin.library}/package.conf.d field ${plugin.library.package.identifier.name} id --simple-output)
81+ lib_dir=$(${ghc}/bin/ghc-pkg --package-db ${plugin.library}/package.conf.d field ${plugin.library.package.identifier.name} dynamic-library-dirs --simple-output)
82+ lib_base=$(${ghc}/bin/ghc-pkg --package-db ${plugin.library}/package.conf.d field ${plugin.library.package.identifier.name} hs-libraries --simple-output)
83+ lib="$(echo ''${lib_dir}/lib''${lib_base}*)"
84+ GHC_PLUGINS="''${GHC_PLUGINS}''${LIST_PREFIX}(\"''${lib}\",\"''${id}\",\"${plugin.moduleName}\",["
85+ LIST_PREFIX=""
86+ ${builtins.concatStringsSep "\n" (map (arg: ''
87+ GHC_PLUGINS="''${GHC_PLUGINS}''${LIST_PREFIX}\"${arg}\""
88+ LIST_PREFIX=","
89+ '') plugin.args)}
90+ GHC_PLUGINS="''${GHC_PLUGINS}])"
91+ LIST_PREFIX=","
92+ '') plugins)}
93+ GHC_PLUGINS="''${GHC_PLUGINS}]"
6194
62− # Wrap compiler executables with correct env variables.
63− # The NIX_ variables are used by the patched Paths_ghc module.
95+ ''
96+ # now the tricky bit. For GHCJS (to make plugins work), we need a special
97+ # file called ghc_libdir. That points to the build ghc's lib.
98+ + ''
99+ echo "${ghc.buildGHC or ghc}/lib/${(ghc.buildGHC or ghc).name}" > "${libDir}/ghc_libdir"
64100
101+ ''
102+ # Wrap compiler executables with correct env variables.
103+ # The NIX_ variables are used by the patched Paths_ghc module.
104+ + ''
65105 for prg in ${ghcCommand} ${ghcCommand}i ${ghcCommand}-${ghc.version} ${ghcCommand}i-${ghc.version}; do
66106 if [[ -x "${ghc}/bin/$prg" ]]; then
67107 rm -f $out/bin/$prg
@@ -70,6 +110,7 @@ in runCommand "${componentName}-${ghc.name}-env" {
70110 --set "NIX_${ghcCommandCaps}" "$out/bin/${ghcCommand}" \
71111 --set "NIX_${ghcCommandCaps}PKG" "$out/bin/${ghcCommand}-pkg" \
72112 --set "NIX_${ghcCommandCaps}_DOCDIR" "${docDir}" \
113+ --set "GHC_PLUGINS" "$GHC_PLUGINS" \
73114 --set "NIX_${ghcCommandCaps}_LIBDIR" "${libDir}"
74115 fi
75116 done
@@ -82,11 +123,14 @@ in runCommand "${componentName}-${ghc.name}-env" {
82123 --set "NIX_${ghcCommandCaps}" "$out/bin/${ghcCommand}" \
83124 --set "NIX_${ghcCommandCaps}PKG" "$out/bin/${ghcCommand}-pkg" \
84125 --set "NIX_${ghcCommandCaps}_DOCDIR" "${docDir}" \
126+ --set "GHC_PLUGINS" "$GHC_PLUGINS" \
85127 --set "NIX_${ghcCommandCaps}_LIBDIR" "${libDir}"
86128 fi
87129 done
88130
89− # Wrap haddock, if the base GHC provides it.
131+ ''
132+ # Wrap haddock, if the base GHC provides it.
133+ + ''
90134 if [[ -x "${haddock}/bin/haddock" ]]; then
91135 rm -f $out/bin/haddock
92136 makeWrapper ${haddock}/bin/haddock $out/bin/haddock \
@@ -94,9 +138,10 @@ in runCommand "${componentName}-${ghc.name}-env" {
94138 --set "NIX_${ghcCommandCaps}_LIBDIR" "${libDir}"
95139 fi
96140
97− # Point ghc-pkg to the package database of the component using the
98− # --global-package-db flag.
99−
141+ ''
142+ # Point ghc-pkg to the package database of the component using the
143+ # --global-package-db flag.
144+ + ''
100145 for prg in ${ghcCommand}-pkg ${ghcCommand}-pkg-${ghc.version}; do
101146 if [[ -x "${ghc}/bin/$prg" ]]; then
102147 rm -f $out/bin/$prg
builder/haddock-builder.nix+1
@@ -56,6 +56,7 @@ let
5656 componentName = fullName;
5757 configFiles = docsConfigFiles;
5858 inherit (componentDrv) enableDWARF;
59+ inherit (component) plugins;
5960 };
6061
6162 drv = stdenv.mkDerivation (commonAttrs // {
builder/shell-for.nix+1
@@ -113,6 +113,7 @@ let
113113 ln -s ${hoogleIndex}/bin/hoogle $out/bin
114114 '';
115115 inherit enableDWARF;
116+ plugins = [];
116117 };
117118
118119 hoogleIndex = let
ci.nix+2−2
@@ -41,7 +41,7 @@
4141 ghc902 = true;
4242 ghc921 = false;
4343 ghc922 = true;
44− ghc810420210212 = false;
44+ ghc810420210212 = true;
4545 });
4646 systems = nixpkgsName: nixpkgs: compiler-nix-name: nixpkgs.lib.genAttrs (
4747 nixpkgs.lib.filter (v:
@@ -63,7 +63,7 @@
6363 || (system == "x86_64-darwin" && __elem compiler-nix-name ["ghc8107"]))) {
6464 inherit (lib.systems.examples) ghcjs;
6565 } // lib.optionalAttrs (system == "x86_64-linux" &&
66− nixpkgsName == "unstable" && (__elem compiler-nix-name ["ghc8107"])) {
66+ nixpkgsName == "unstable" && (__elem compiler-nix-name ["ghc810420210212" "ghc8107"])) {
6767 # Windows cross compilation is currently broken on macOS
6868 inherit (lib.systems.examples) mingwW64;
6969 } // lib.optionalAttrs (system == "x86_64-linux" && nixpkgsName == "unstable" && compiler-nix-name == "ghc8107") {
modules/package.nix+17
@@ -31,6 +31,23 @@ let
3131 type = bool;
3232 default = true;
3333 };
34+ plugins = mkOption {
35+ type = listOf (submodule {
36+ options = {
37+ library = mkOption {
38+ type = unspecified;
39+ };
40+ moduleName = mkOption {
41+ type = str;
42+ };
43+ args = mkOption {
44+ type = listOf str;
45+ default = [];
46+ };
47+ };
48+ });
49+ default = [];
50+ };
3451 depends = mkOption {
3552 type = listOfFilteringNulls unspecified;
3653 default = [];
overlays/bootstrap.nix+1−1
@@ -644,7 +644,7 @@ in {
644644 sha256 = "03li4k10hxgyxcdyyz2092wx09spr1599hi0sxbh4m889qdqgbsj";
645645 };
646646 ghc-patches = ghc-patches "8.10.4"
647− ++ [ ./patches/ghc/core-field.patch ];
647+ ++ [ ./patches/ghc/core-field.patch ./patches/ghc/external-static-8.10.4.patch ];
648648
649649 # Avoid clashes with normal ghc8104
650650 ghc-version = "8.10.4.20210212";
overlays/patches/ghc/external-static-8.10.4.patchnew file+219
@@ -0,0 +1,219 @@
1+commit 43b4a6c9a6af630ae701b4c8e8f58e45b7d571bb
2+Author: Shea Levy <shea@shealevy.com>
3+Date: Sun Apr 24 23:10:11 2022 -0400
4+
5+ Backport !7377: external static plugins
6+
7+ https://gitlab.haskell.org/ghc/ghc/-/merge_requests/7377
8+
9+diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs
10+index 2ea0b3d5e9..587fef29ff 100644
11+--- a/compiler/main/DynFlags.hs
12++++ b/compiler/main/DynFlags.hs
13+@@ -282,7 +282,7 @@ import Settings
14+ import ToolSettings
15+
16+ import Foreign.C ( CInt(..) )
17+-import System.IO.Unsafe ( unsafeDupablePerformIO )
18++import System.IO.Unsafe ( unsafeDupablePerformIO, unsafePerformIO )
19+ import {-# SOURCE #-} ErrUtils ( Severity(..), MsgDoc, mkLocMessageAnn
20+ , getCaretDiagnostic )
21+ import Json
22+@@ -2011,7 +2011,7 @@ defaultDynFlags mySettings llvmConfig =
23+ pluginModNameOpts = [],
24+ frontendPluginOpts = [],
25+ cachedPlugins = [],
26+- staticPlugins = [],
27++ staticPlugins = unsafePerformIO initStaticPlugins,
28+ hooks = emptyHooks,
29+
30+ outputFile = Nothing,
31+diff --git a/compiler/main/Plugins.hs b/compiler/main/Plugins.hs
32+index 25e69c15e5..5028b617bb 100644
33+--- a/compiler/main/Plugins.hs
34++++ b/compiler/main/Plugins.hs
35+@@ -1,4 +1,8 @@
36+ {-# LANGUAGE RankNTypes #-}
37++{-# LANGUAGE LambdaCase #-}
38++{-# LANGUAGE BlockArguments #-}
39++{-# LANGUAGE UnboxedTuples #-}
40++{-# LANGUAGE MagicHash #-}
41+ {-# LANGUAGE CPP #-}
42+
43+ -- | Definitions for writing /plugins/ for GHC. Plugins can hook into
44+@@ -45,6 +49,7 @@ module Plugins (
45+ , LoadedPlugin(..), lpModuleName
46+ , StaticPlugin(..)
47+ , mapPlugins, withPlugins, withPlugins_
48++ , initStaticPlugins
49+ ) where
50+
51+ import GhcPrelude
52+@@ -61,13 +66,22 @@ import DriverPhases
53+ import Module ( ModuleName, Module(moduleName))
54+ import Fingerprint
55+ import Data.List (sort)
56+-import Outputable (Outputable(..), text, (<+>))
57++import Outputable
58++import Panic
59+
60+ --Qualified import so we can define a Semigroup instance
61+ -- but it doesn't clash with Outputable.<>
62+ import qualified Data.Semigroup
63+
64+ import Control.Monad
65++import Text.Read (readMaybe)
66++
67++import qualified System.Environment as Env
68++#if defined(HAVE_INTERNAL_INTERPRETER)
69++import GHCi.ObjLink
70++import GHC.Exts (addrToAny#, Ptr(..))
71++import Encoding
72++#endif
73+
74+ -- | Command line options gathered from the -PModule.Name:stuff syntax
75+ -- are given to you as this type
76+@@ -262,3 +276,126 @@ data FrontendPlugin = FrontendPlugin {
77+ }
78+ defaultFrontendPlugin :: FrontendPlugin
79+ defaultFrontendPlugin = FrontendPlugin { frontend = \_ _ -> return () }
80++
81++
82++-- Note [External Static Plugins]
83++-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
84++-- GHC supports two kinds of "static" plugins:
85++-- 1. internal: setup with GHC-API
86++-- 2. external: setup as explained below and loaded from shared libraries
87++--
88++-- External static plugins can be configured with the GHC_PLUGINS global
89++-- environment variable. Its syntax corresponds to the Read instance of
90++-- [(FilePath,String,String,[String])]
91++-- that is a list of (library path, unit-id, module name, plugin arguments)
92++--
93++-- Example:
94++-- GHC_PLUGINS='[(".../myplugin.so","my-plugin-unit","ZiPlugin.Plugin",["Arg1","Arg3"])]'
95++--
96++-- Building the plugin library:
97++-- 1. link with the libraries used to build the compiler you target. If you
98++-- target a cross-compiler (stage2), you can't directly use it to build the
99++-- plugin library. Use the stage1 compiler instead.
100++--
101++-- 2. if you use cabal to build the library, its unit-id will be set by cabal
102++-- and will contain a hash (e.g. "my-plugin-unit-1345656546ABCDEF"). To force
103++-- the unit id, use GHC's `-this-unit-id` command line flag:
104++-- e.g. -this-unit-id my-plugin-unit
105++-- You can set this in the .cabal file of your library with the following
106++-- stanza: `ghc-options: -this-unit-id my-plugin-unit`
107++--
108++-- 3. To make your plugin easier to distribute, you may want to link it
109++-- statically with all its dependencies. You would need to use `-shared`
110++-- without `-dynamic` when building your library.
111++--
112++-- However, all the static dependencies have to be built with `-fPIC` and it's
113++-- not done by default. See
114++-- https://www.hobson.space/posts/haskell-foreign-library/ for a way to modify
115++-- the compiler to do it.
116++--
117++-- In any case, don't link your plugin library statically with the RTS (e.g.
118++-- use `-fno-link-rts`) as there are some global variables in the RTS that must
119++-- be shared between the plugin and the compiler.
120++--
121++-- With external static plugins we don't check the type of the `plugin` closure
122++-- we look up. If it's not a valid `Plugin` value, it will probably crash badly.
123++--
124++-- TODO:
125++-- * support configuration via command-line flags
126++-- * support search paths for the plugin library
127++
128++
129++initStaticPlugins :: IO [StaticPlugin]
130++initStaticPlugins = do
131++ -- detect static plugins in environment variables
132++ Env.lookupEnv "GHC_PLUGINS" >>= \case
133++ Nothing -> return []
134++ Just str -> case parseExternalStaticPlugins str of
135++ Nothing -> panic "Couldn't parse `GHC_PLUGINS` environment variable"
136++ Just [] -> return []
137++ Just ps -> initExternalStaticPlugins ps
138++
139++-- | Parse external static plugin description string
140++--
141++-- E.g. '[(".../myplugin.so","my-plugin-unit","ZiPlugin.Plugin",["Arg1","Arg3"])]'
142++parseExternalStaticPlugins :: String -> Maybe [ExternalStaticPlugin]
143++parseExternalStaticPlugins s = fmap (fmap to) (readMaybe s)
144++ where
145++ to :: (FilePath,String,String,[String]) -> ExternalStaticPlugin
146++ to (path,unit_id,mod_name,args) = ExternalStaticPlugin
147++ { esp_lib = path
148++ , esp_unit_id = unit_id
149++ , esp_module = mod_name
150++ , esp_args = args
151++ }
152++
153++
154++data ExternalStaticPlugin = ExternalStaticPlugin
155++ { esp_lib :: !FilePath
156++ , esp_unit_id :: !String
157++ , esp_module :: !String
158++ , esp_args :: ![String]
159++ }
160++
161++initExternalStaticPlugins :: [ExternalStaticPlugin] -> IO [StaticPlugin]
162++initExternalStaticPlugins _ps = do
163++#if !defined(HAVE_INTERNAL_INTERPRETER)
164++ panic "initExternalStaticPlugins: can't load external static plugins with GHC built without internal interpreter"
165++#elif !defined(CAN_LOAD_DLL)
166++ panic "initExternalStaticPlugins: loading shared libraries isn't supported by this compiler"
167++#else
168++ initObjLinker RetainCAFs
169++ forM _ps \(ExternalStaticPlugin path unit mod_name opts) -> do
170++ let ztmp = zEncodeString mod_name ++ "_plugin_closure"
171++ symbol
172++ | null unit = ztmp
173++ | otherwise = zEncodeString unit ++ "_" ++ ztmp
174++ plugin <- loadPluginLib path symbol
175++ pure $ StaticPlugin (PluginWithArgs plugin opts)
176++
177++
178++loadPluginLib :: FilePath -> String -> IO Plugin
179++loadPluginLib path symbol_name = do
180++ -- load library
181++ loadDLL path >>= \case
182++ Just errmsg -> pprPanic "loadPluginLib"
183++ (vcat [ text "Can't load plugin library"
184++ , text " Library path: " <> text path
185++ , text " Error : " <> text errmsg
186++ ])
187++ Nothing -> do
188++ -- resolve objects
189++ resolveObjs >>= \case
190++ True -> return ()
191++ False -> pprPanic "loadPluginLib" (text "Unable to resolve objects")
192++
193++ -- lookup symbol
194++ lookupSymbol symbol_name >>= \case
195++ Nothing -> pprPanic "loadPluginLib"
196++ (vcat [ text "Symbol not found"
197++ , text " Library path: " <> text path
198++ , text " Symbol : " <> text symbol_name
199++ ])
200++ Just (Ptr addr) -> case addrToAny# addr of
201++ (# a #) -> pure a
202++#endif
203+diff --git a/compiler/main/Plugins.hs-boot b/compiler/main/Plugins.hs-boot
204+index c90c6ebaf7..1a26ad4e71 100644
205+--- a/compiler/main/Plugins.hs-boot
206++++ b/compiler/main/Plugins.hs-boot
207+@@ -2,9 +2,11 @@
208+ -- exposed without importing all of its implementation.
209+ module Plugins where
210+
211+-import GhcPrelude ()
212++import GhcPrelude (IO)
213+
214+ data Plugin
215+
216+ data LoadedPlugin
217+ data StaticPlugin
218++
219++initStaticPlugins :: IO [StaticPlugin]
test/default.nix+1
@@ -203,6 +203,7 @@ let
203203 githash = haskell-nix.callPackage ./githash { inherit compiler-nix-name; testSrc = testSrcWithGitDir; };
204204 c-ffi = callTest ./c-ffi { inherit util compiler-nix-name; };
205205 th-dlls = callTest ./th-dlls { inherit util compiler-nix-name; };
206+ external-static-plugin = callTest ./external-static-plugin { inherit compiler-nix-name; };
206207
207208 unit = unitTests;
208209 };
test/external-static-plugin/cabal.projectnew file+1
@@ -0,0 +1 @@
1+packages: ./**/*.cabal
test/external-static-plugin/default.nixnew file+27
@@ -0,0 +1,27 @@
1+{ cabalProject', testSrc, compiler-nix-name, recurseIntoAttrs, haskellLib }: let
2+ project = cabalProject' {
3+ src = testSrc "external-static-plugin";
4+ inherit compiler-nix-name;
5+ modules = [ {
6+ packages.prog.components.exes.prog.plugins = [ {
7+ inherit (project.hsPkgs.plugin.components) library;
8+ moduleName = "Plugin";
9+ args = [ "f1" "f2" ];
10+ } ];
11+ packages.prog.postInstall = ''
12+ test -f f1
13+ test -f f2
14+ '';
15+ } ];
16+ };
17+in recurseIntoAttrs {
18+ ifdInputs = {
19+ inherit (project) plan-nix;
20+ };
21+
22+ meta.disabled = !(builtins.elem compiler-nix-name [
23+ "ghc810420210212"
24+ ]) || haskellLib.isCrossHost;
25+
26+ build = project.hsPkgs.prog.components.exes.prog;
27+}
test/external-static-plugin/plugin/CHANGELOG.mdnew file+5
@@ -0,0 +1,5 @@
1+# Revision history for plugin
2+
3+## 0.1.0.0 -- YYYY-mm-dd
4+
5+* First version. Released on an unsuspecting world.
test/external-static-plugin/plugin/plugin.cabalnew file+12
@@ -0,0 +1,12 @@
1+cabal-version: 2.4
2+name: plugin
3+version: 0.1.0.0
4+author: Shea Levy
5+maintainer: shea@shealevy.com
6+extra-source-files: CHANGELOG.md
7+
8+library
9+ exposed-modules: Plugin
10+ build-depends: base, ghc
11+ hs-source-dirs: src
12+ default-language: Haskell2010
test/external-static-plugin/plugin/src/Plugin.hsnew file+16
@@ -0,0 +1,16 @@
1+module Plugin (plugin) where
2+
3+import GhcPlugins
4+import MonadUtils
5+import System.IO
6+import Control.Monad
7+
8+plugin :: Plugin
9+plugin = defaultPlugin
10+ { installCoreToDos = install
11+ }
12+
13+install :: CorePlugin
14+install files passes = do
15+ liftIO . forM files $ flip writeFile ""
16+ pure passes
test/external-static-plugin/prog/CHANGELOG.mdnew file+5
@@ -0,0 +1,5 @@
1+# Revision history for prog
2+
3+## 0.1.0.0 -- YYYY-mm-dd
4+
5+* First version. Released on an unsuspecting world.
test/external-static-plugin/prog/app/Main.hsnew file+4
@@ -0,0 +1,4 @@
1+module Main where
2+
3+main :: IO ()
4+main = putStrLn "Hello, Haskell!"
test/external-static-plugin/prog/prog.cabalnew file+12
@@ -0,0 +1,12 @@
1+cabal-version: 2.4
2+name: prog
3+version: 0.1.0.0
4+author: Shea Levy
5+maintainer: shea@shealevy.com
6+extra-source-files: CHANGELOG.md
7+
8+executable prog
9+ main-is: Main.hs
10+ build-depends: base
11+ hs-source-dirs: app
12+ default-language: Haskell2010
test/haskell-language-server/stack.nix+1−1
@@ -22,5 +22,5 @@ in recurseIntoAttrs {
2222 build = project.hsPkgs.haskell-language-server.components.exes.haskell-language-server;
2323
2424 # Haskell Language Server does not build for GHC 9 or 8.10.7 yet
25− meta.disabled = __elem compiler-nix-name ["ghc922" "ghc921" "ghc901" "ghc902" "ghc8107"];
25+ meta.disabled = __elem compiler-nix-name ["ghc922" "ghc921" "ghc901" "ghc902" "ghc8107" "ghc810420210212" ];
2626}