summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore6
-rw-r--r--flake.lock43
-rw-r--r--flake.nix50
-rw-r--r--nix/expose-all.patch12
-rw-r--r--nix/revert-new-cabal-madness.patch193
5 files changed, 304 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index b698d53ab..93d660fcc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -73,3 +73,9 @@ doc/icfp-2012.html
download/*.html
gf-book/index.html
src/www/gf-web-api.html
+.devenv
+.direnv
+result
+.vscode
+.envrc
+.pre-commit-config.yaml \ No newline at end of file
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 000000000..232e59372
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,43 @@
+{
+ "nodes": {
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1704290814,
+ "narHash": "sha256-LWvKHp7kGxk/GEtlrGYV68qIvPHkU9iToomNFGagixU=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "70bdadeb94ffc8806c0570eb5c2695ad29f0e421",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixos-23.05",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "nixpkgs": "nixpkgs",
+ "systems": "systems"
+ }
+ },
+ "systems": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 000000000..ccacc15b0
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,50 @@
+{
+ inputs = {
+ nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.05";
+ systems.url = "github:nix-systems/default";
+ };
+
+ nixConfig = {
+ # extra-trusted-public-keys =
+ # "devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw=";
+ # extra-substituters = "https://devenv.cachix.org";
+ };
+
+ outputs = { self, nixpkgs, systems, ... }@inputs:
+ let forEachSystem = nixpkgs.lib.genAttrs (import systems);
+ in {
+ packages = forEachSystem (system:
+ let
+ pkgs = nixpkgs.legacyPackages.${system};
+ haskellPackages = pkgs.haskell.packages.ghc925.override {
+ overrides = self: _super: {
+ cgi = pkgs.haskell.lib.unmarkBroken (pkgs.haskell.lib.dontCheck
+ (self.callHackage "cgi" "3001.5.0.1" { }));
+ };
+ };
+
+ in {
+ gf = pkgs.haskell.lib.overrideCabal
+ (haskellPackages.callCabal2nixWithOptions "gf" self "--flag=-server"
+ { }) (_old: {
+ # Fix utf8 encoding problems
+ patches = [
+ # Already applied in master
+ # (
+ # pkgs.fetchpatch {
+ # url = "https://github.com/anka-213/gf-core/commit/6f1ca05fddbcbc860898ddf10a557b513dfafc18.patch";
+ # sha256 = "17vn3hncxm1dwbgpfmrl6gk6wljz3r28j191lpv5zx741pmzgbnm";
+ # }
+ # )
+ ./nix/expose-all.patch
+ ./nix/revert-new-cabal-madness.patch
+ ];
+ jailbreak = true;
+ # executableSystemDepends = [
+ # (pkgs.ncurses.override { enableStatic = true; })
+ # ];
+ # executableHaskellDepends = [ ];
+ });
+ });
+ };
+}
diff --git a/nix/expose-all.patch b/nix/expose-all.patch
new file mode 100644
index 000000000..bca529157
--- /dev/null
+++ b/nix/expose-all.patch
@@ -0,0 +1,12 @@
+diff --git a/gf.cabal b/gf.cabal
+index 0076e7638..8d3fe4b49 100644
+--- a/gf.cabal
++++ b/gf.cabal
+@@ -168,7 +168,6 @@ Library
+ GF.Text.Lexing
+ GF.Grammar.Canonical
+
+- other-modules:
+ GF.Main
+ GF.Compiler
+ GF.Interactive \ No newline at end of file
diff --git a/nix/revert-new-cabal-madness.patch b/nix/revert-new-cabal-madness.patch
new file mode 100644
index 000000000..1a1a40db9
--- /dev/null
+++ b/nix/revert-new-cabal-madness.patch
@@ -0,0 +1,193 @@
+commit 45e5473fcd5707af93646d9a116867a4d4e3e9c9
+Author: Andreas Källberg <anka.213@gmail.com>
+Date: Mon Oct 10 14:57:12 2022 +0200
+
+ Revert "workaround for the Nix madness"
+
+ This reverts commit 1294269cd60f3db7b056135104615625baeb528c.
+
+ There are easier workarounds, like using
+
+ cabal v1-build
+
+ etc. instead of just `cabal build`
+
+ These changes also broke a whole bunch of other stuff
+
+diff --git a/README.md b/README.md
+index ba35795a4..79e6ab68f 100644
+--- a/README.md
++++ b/README.md
+@@ -38,21 +38,6 @@ or:
+ ```
+ stack install
+ ```
+-Note that if you are unlucky to have Cabal 3.0 or later, then it uses
+-the so-called Nix style commands. Using those for GF development is
+-a pain. Every time when you change something in the source code, Cabal
+-will generate a new folder for GF to look for the GF libraries and
+-the GF cloud. Either reinstall everything with every change in the
+-compiler, or be sane and stop using cabal-install. Instead you can do:
+-```
+-runghc Setup.hs configure
+-runghc Setup.hs build
+-sudo runghc Setup.hs install
+-```
+-The script will install the GF dependencies globally. The only solution
+-to the Nix madness that I found is radical:
+-
+- "No person, no problem" (Нет человека – нет проблемы).
+
+ For more information, including links to precompiled binaries, see the [download page](https://www.grammaticalframework.org/download/index.html).
+
+diff --git a/Setup.hs b/Setup.hs
+index 58dc3e0c6..f8309cc00 100644
+--- a/Setup.hs
++++ b/Setup.hs
+@@ -4,68 +4,42 @@ import Distribution.Simple.LocalBuildInfo(LocalBuildInfo(..),absoluteInstallDirs
+ import Distribution.Simple.Setup(BuildFlags(..),Flag(..),InstallFlags(..),CopyDest(..),CopyFlags(..),SDistFlags(..))
+ import Distribution.PackageDescription(PackageDescription(..),emptyHookedBuildInfo)
+ import Distribution.Simple.BuildPaths(exeExtension)
+-import System.Directory
+ import System.FilePath((</>),(<.>))
+-import System.Process
+-import Control.Monad(forM_,unless)
+-import Control.Exception(bracket_)
+-import Data.Char(isSpace)
+
+ import WebSetup
+
++-- | Notice about RGL not built anymore
++noRGLmsg :: IO ()
++noRGLmsg = putStrLn "Notice: the RGL is not built as part of GF anymore. See https://github.com/GrammaticalFramework/gf-rgl"
++
+ main :: IO ()
+ main = defaultMainWithHooks simpleUserHooks
+- { preConf = gfPreConf
+- , preBuild = gfPreBuild
++ { preBuild = gfPreBuild
+ , postBuild = gfPostBuild
+ , preInst = gfPreInst
+ , postInst = gfPostInst
+ , postCopy = gfPostCopy
+ }
+ where
+- gfPreConf args flags = do
+- pkgs <- fmap (map (dropWhile isSpace) . tail . lines)
+- (readProcess "ghc-pkg" ["list"] "")
+- forM_ dependencies $ \pkg -> do
+- let name = takeWhile (/='/') (drop 36 pkg)
+- unless (name `elem` pkgs) $ do
+- let fname = name <.> ".tar.gz"
+- callProcess "wget" [pkg,"-O",fname]
+- callProcess "tar" ["-xzf",fname]
+- removeFile fname
+- bracket_ (setCurrentDirectory name) (setCurrentDirectory ".." >> removeDirectoryRecursive name) $ do
+- exists <- doesFileExist "Setup.hs"
+- unless exists $ do
+- writeFile "Setup.hs" (unlines [
+- "import Distribution.Simple",
+- "main = defaultMain"
+- ])
+- let to_descr = reverse .
+- (++) (reverse ".cabal") .
+- drop 1 .
+- dropWhile (/='-') .
+- reverse
+- callProcess "wget" [to_descr pkg, "-O", to_descr name]
+- callProcess "runghc" ["Setup.hs","configure"]
+- callProcess "runghc" ["Setup.hs","build"]
+- callProcess "sudo" ["runghc","Setup.hs","install"]
+-
+- preConf simpleUserHooks args flags
+-
+- gfPreBuild args = gfPre args . buildDistPref
+- gfPreInst args = gfPre args . installDistPref
++ gfPreBuild args = gfPre args . buildDistPref
++ gfPreInst args = gfPre args . installDistPref
+
+ gfPre args distFlag = do
+ return emptyHookedBuildInfo
+
+ gfPostBuild args flags pkg lbi = do
++ -- noRGLmsg
+ let gf = default_gf lbi
+ buildWeb gf flags (pkg,lbi)
+
+ gfPostInst args flags pkg lbi = do
++ -- noRGLmsg
++ saveInstallPath args flags (pkg,lbi)
+ installWeb (pkg,lbi)
+
+ gfPostCopy args flags pkg lbi = do
++ -- noRGLmsg
++ saveCopyPath args flags (pkg,lbi)
+ copyWeb flags (pkg,lbi)
+
+ -- `cabal sdist` will not make a proper dist archive, for that see `make sdist`
+@@ -73,16 +47,27 @@ main = defaultMainWithHooks simpleUserHooks
+ gfSDist pkg lbi hooks flags = do
+ return ()
+
+-dependencies = [
+- "https://hackage.haskell.org/package/utf8-string-1.0.2/utf8-string-1.0.2.tar.gz",
+- "https://hackage.haskell.org/package/json-0.10/json-0.10.tar.gz",
+- "https://hackage.haskell.org/package/network-bsd-2.8.1.0/network-bsd-2.8.1.0.tar.gz",
+- "https://hackage.haskell.org/package/httpd-shed-0.4.1.1/httpd-shed-0.4.1.1.tar.gz",
+- "https://hackage.haskell.org/package/exceptions-0.10.5/exceptions-0.10.5.tar.gz",
+- "https://hackage.haskell.org/package/stringsearch-0.3.6.6/stringsearch-0.3.6.6.tar.gz",
+- "https://hackage.haskell.org/package/multipart-0.2.1/multipart-0.2.1.tar.gz",
+- "https://hackage.haskell.org/package/cgi-3001.5.0.0/cgi-3001.5.0.0.tar.gz"
+- ]
++saveInstallPath :: [String] -> InstallFlags -> (PackageDescription, LocalBuildInfo) -> IO ()
++saveInstallPath args flags bi = do
++ let
++ dest = NoCopyDest
++ dir = datadir (uncurry absoluteInstallDirs bi dest)
++ writeFile dataDirFile dir
++
++saveCopyPath :: [String] -> CopyFlags -> (PackageDescription, LocalBuildInfo) -> IO ()
++saveCopyPath args flags bi = do
++ let
++ dest = case copyDest flags of
++ NoFlag -> NoCopyDest
++ Flag d -> d
++ dir = datadir (uncurry absoluteInstallDirs bi dest)
++ writeFile dataDirFile dir
++
++-- | Name of file where installation's data directory is recording
++-- This is a last-resort way in which the seprate RGL build script
++-- can determine where to put the compiled RGL files
++dataDirFile :: String
++dataDirFile = "DATA_DIR"
+
+ -- | Get path to locally-built gf
+ default_gf :: LocalBuildInfo -> FilePath
+diff --git a/gf.cabal b/gf.cabal
+index a055b86be..d00a5b935 100644
+--- a/gf.cabal
++++ b/gf.cabal
+@@ -2,7 +2,7 @@ name: gf
+ version: 3.11.0-git
+
+ cabal-version: 1.22
+-build-type: Simple
++build-type: Custom
+ license: OtherLicense
+ license-file: LICENSE
+ category: Natural Language Processing, Compiler
+@@ -44,6 +44,14 @@ data-files:
+ www/translator/*.css
+ www/translator/*.js
+
++custom-setup
++ setup-depends:
++ base >= 4.9.1 && < 4.16,
++ Cabal >= 1.22.0.0,
++ directory >= 1.3.0 && < 1.4,
++ filepath >= 1.4.1 && < 1.5,
++ process >= 1.0.1.1 && < 1.7
++
+ source-repository head
+ type: git
+ location: https://github.com/GrammaticalFramework/gf-core.git \ No newline at end of file