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 +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