From bd270b05ff92b15c15d5dfebd52576d0e15d0b04 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andreas=20K=C3=A4llberg?=
Date: Sun, 29 Nov 2020 14:51:55 +0100
Subject: [PATCH 01/41] Remove the `Either Int` from value2term
This prevents HUGE space leak and makes compiling a PGF a LOT faster
For example, an application grammar moved from taking over 50GB
of ram and taking 5 minutes (most of which is spent on garbage colelction)
to taking 1.2 seconds and using 42mb of memory
The price we pay is that the "variable #n is out of scope" error is now
lazy and will happen when we try to evaluate the term instead of
happening when the function returns and allowing the caller to chose how
to handle the error.
I don't think this should matter in practice, since it's very rare;
at least Inari has never encountered it.
---
src/compiler/GF/Compile/Compute/Concrete.hs | 66 +++++++++++----------
1 file changed, 34 insertions(+), 32 deletions(-)
diff --git a/src/compiler/GF/Compile/Compute/Concrete.hs b/src/compiler/GF/Compile/Compute/Concrete.hs
index 4b54c8c84..a346de882 100644
--- a/src/compiler/GF/Compile/Compute/Concrete.hs
+++ b/src/compiler/GF/Compile/Compute/Concrete.hs
@@ -493,57 +493,59 @@ vtrace loc arg res = trace (render (hang (pv arg) 4 ("->"<+>pv res))) res
pf (_,v) = ppV v
pa (_,v) = ppV v
ppV v = case value2term' True loc [] v of
- Left i -> "variable #" <> pp i <+> "is out of scope"
- Right t -> ppTerm Unqualified 10 t
+ -- Left i -> "variable #" <> pp i <+> "is out of scope"
+ t -> ppTerm Unqualified 10 t
-- | Convert a value back to a term
value2term :: GLocation -> [Ident] -> Value -> Either Int Term
-value2term = value2term' False
+value2term loc xs v0 = Right $ value2term' False loc xs v0
+
+value2term' :: Bool -> p -> [Ident] -> Value -> Term
value2term' stop loc xs v0 =
case v0 of
- VApp pre vs -> liftM (foldl App (Q (cPredef,predefName pre))) (mapM v2t vs)
- VCApp f vs -> liftM (foldl App (QC f)) (mapM v2t vs)
- VGen j vs -> liftM2 (foldl App) (var j) (mapM v2t vs)
- VMeta j env vs -> liftM (foldl App (Meta j)) (mapM v2t vs)
- VProd bt v x f -> liftM2 (Prod bt x) (v2t v) (v2t' x f)
- VAbs bt x f -> liftM (Abs bt x) (v2t' x f)
- VInt n -> return (EInt n)
- VFloat f -> return (EFloat f)
- VString s -> return (if null s then Empty else K s)
- VSort s -> return (Sort s)
- VImplArg v -> liftM ImplArg (v2t v)
- VTblType p res -> liftM2 Table (v2t p) (v2t res)
- VRecType rs -> liftM RecType (mapM (\(l,v) -> fmap ((,) l) (v2t v)) rs)
- VRec as -> liftM R (mapM (\(l,v) -> v2t v >>= \t -> return (l,(Nothing,t))) as)
- VV t _ vs -> liftM (V t) (mapM v2t vs)
- VT wild v cs -> v2t v >>= \t -> liftM (T ((if wild then TWild else TTyped) t)) (mapM nfcase cs)
- VFV vs -> liftM FV (mapM v2t vs)
- VC v1 v2 -> liftM2 C (v2t v1) (v2t v2)
- VS v1 v2 -> liftM2 S (v2t v1) (v2t v2)
- VP v l -> v2t v >>= \t -> return (P t l)
- VPatt p -> return (EPatt p)
- VPattType v -> v2t v >>= return . EPattType
- VAlts v vvs -> liftM2 Alts (v2t v) (mapM (\(x,y) -> liftM2 (,) (v2t x) (v2t y)) vvs)
- VStrs vs -> liftM Strs (mapM v2t vs)
+ VApp pre vs -> applyMany (Q (cPredef,predefName pre)) vs
+ VCApp f vs -> applyMany (QC f) vs
+ VGen j vs -> applyMany (var j) vs
+ VMeta j env vs -> applyMany (Meta j) vs
+ VProd bt v x f -> Prod bt x (v2t v) (v2t' x f)
+ VAbs bt x f -> Abs bt x (v2t' x f)
+ VInt n -> EInt n
+ VFloat f -> EFloat f
+ VString s -> if null s then Empty else K s
+ VSort s -> Sort s
+ VImplArg v -> ImplArg (v2t v)
+ VTblType p res -> Table (v2t p) (v2t res)
+ VRecType rs -> RecType [(l, v2t v) | (l,v) <- rs]
+ VRec as -> R [(l, (Nothing, v2t v)) | (l,v) <- as]
+ VV t _ vs -> V t (map v2t vs)
+ VT wild v cs -> T ((if wild then TWild else TTyped) (v2t v)) (map nfcase cs)
+ VFV vs -> FV (map v2t vs)
+ VC v1 v2 -> C (v2t v1) (v2t v2)
+ VS v1 v2 -> S (v2t v1) (v2t v2)
+ VP v l -> P (v2t v) l
+ VPatt p -> EPatt p
+ VPattType v -> EPattType $ v2t v
+ VAlts v vvs -> Alts (v2t v) [(v2t x, v2t y) | (x,y) <- vvs]
+ VStrs vs -> Strs (map v2t vs)
-- VGlue v1 v2 -> Glue (v2t v1) (v2t v2)
-- VExtR v1 v2 -> ExtR (v2t v1) (v2t v2)
- VError err -> return (Error err)
-
+ VError err -> Error err
where
+ applyMany f vs = foldl App f (map v2t vs)
v2t = v2txs xs
v2txs = value2term' stop loc
v2t' x f = v2txs (x:xs) (bind f (gen xs))
var j
- | j
Date: Sun, 29 Nov 2020 15:03:08 +0100
Subject: [PATCH 02/41] Remove last traces of the Either in value2term
---
src/compiler/GF/Compile/Compute/Concrete.hs | 21 ++++++++++---------
.../GF/Compile/TypeCheck/ConcreteNew.hs | 10 ++++-----
2 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/src/compiler/GF/Compile/Compute/Concrete.hs b/src/compiler/GF/Compile/Compute/Concrete.hs
index a346de882..dd2180937 100644
--- a/src/compiler/GF/Compile/Compute/Concrete.hs
+++ b/src/compiler/GF/Compile/Compute/Concrete.hs
@@ -30,11 +30,12 @@ import Debug.Trace(trace)
normalForm :: GlobalEnv -> L Ident -> Term -> Term
normalForm (GE gr rv opts _) loc = err (bugloc loc) id . nfx (GE gr rv opts loc)
+nfx :: GlobalEnv -> Term -> Err Term
nfx env@(GE _ _ _ loc) t = do
v <- eval env [] t
case value2term loc [] v of
- Left i -> fail ("variable #"++show i++" is out of scope")
- Right t -> return t
+ -- Left i -> fail ("variable #"++show i++" is out of scope")
+ t -> return t
eval :: GlobalEnv -> Env -> Term -> Err Value
eval (GE gr rvs opts loc) env t = ($ (map snd env)) # value cenv t
@@ -289,8 +290,8 @@ glue env (v1,v2) = glu v1 v2
then VC v1 (VC (VApp BIND []) v2)
else let loc = gloc env
vt v = case value2term loc (local env) v of
- Left i -> Error ('#':show i)
- Right t -> t
+ -- Left i -> Error ('#':show i)
+ t -> t
originalMsg = render $ ppL loc (hang "unsupported token gluing" 4
(Glue (vt v1) (vt v2)))
term = render $ pp $ Glue (vt v1) (vt v2)
@@ -356,8 +357,8 @@ select env vv =
match loc cs v =
case value2term loc [] v of
- Left i -> bad ("variable #"++show i++" is out of scope")
- Right t -> err bad return (matchPattern cs t)
+ -- Left i -> bad ("variable #"++show i++" is out of scope")
+ t -> err bad return (matchPattern cs t)
where
bad = fail . ("In pattern matching: "++)
@@ -384,8 +385,8 @@ valueTable env i cs =
convertv cs' vty =
case value2term (gloc env) [] vty of
- Left i -> fail ("variable #"++show i++" is out of scope")
- Right pty -> convert' cs' =<< paramValues'' env pty
+ -- Left i -> fail ("variable #"++show i++" is out of scope")
+ pty -> convert' cs' =<< paramValues'' env pty
convert cs' ty = convert' cs' =<< paramValues' env ty
@@ -497,8 +498,8 @@ vtrace loc arg res = trace (render (hang (pv arg) 4 ("->"<+>pv res))) res
t -> ppTerm Unqualified 10 t
-- | Convert a value back to a term
-value2term :: GLocation -> [Ident] -> Value -> Either Int Term
-value2term loc xs v0 = Right $ value2term' False loc xs v0
+value2term :: GLocation -> [Ident] -> Value -> Term
+value2term = value2term' False
value2term' :: Bool -> p -> [Ident] -> Value -> Term
value2term' stop loc xs v0 =
diff --git a/src/compiler/GF/Compile/TypeCheck/ConcreteNew.hs b/src/compiler/GF/Compile/TypeCheck/ConcreteNew.hs
index d85af5361..628f7ea4c 100644
--- a/src/compiler/GF/Compile/TypeCheck/ConcreteNew.hs
+++ b/src/compiler/GF/Compile/TypeCheck/ConcreteNew.hs
@@ -568,9 +568,9 @@ unifyVar ge scope i env vs ty2 = do -- Check whether i is bound
Bound ty1 -> do v <- liftErr (eval ge env ty1)
unify ge scope (vapply (geLoc ge) v vs) ty2
Unbound scope' _ -> case value2term (geLoc ge) (scopeVars scope') ty2 of
- Left i -> let (v,_) = reverse scope !! i
- in tcError ("Variable" <+> pp v <+> "has escaped")
- Right ty2' -> do ms2 <- getMetaVars (geLoc ge) [(scope,ty2)]
+ -- Left i -> let (v,_) = reverse scope !! i
+ -- in tcError ("Variable" <+> pp v <+> "has escaped")
+ ty2' -> do ms2 <- getMetaVars (geLoc ge) [(scope,ty2)]
if i `elem` ms2
then tcError ("Occurs check for" <+> ppMeta i <+> "in:" $$
nest 2 (ppTerm Unqualified 0 ty2'))
@@ -766,8 +766,8 @@ zonkTerm t = composOp zonkTerm t
tc_value2term loc xs v =
case value2term loc xs v of
- Left i -> tcError ("Variable #" <+> pp i <+> "has escaped")
- Right t -> return t
+ -- Left i -> tcError ("Variable #" <+> pp i <+> "has escaped")
+ t -> return t
From c2ffa6763bb36956f9b353c2d2cd6711ab0796f5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andreas=20K=C3=A4llberg?=
Date: Sun, 29 Nov 2020 21:36:11 +0100
Subject: [PATCH 03/41] Github actions: Fix build for stack
---
.github/workflows/build-all-versions.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/build-all-versions.yml b/.github/workflows/build-all-versions.yml
index fca637189..f4ba6a2f1 100644
--- a/.github/workflows/build-all-versions.yml
+++ b/.github/workflows/build-all-versions.yml
@@ -14,7 +14,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
- cabal: ["3.2"]
+ cabal: ["latest"]
ghc:
- "8.6.5"
- "8.8.3"
@@ -65,7 +65,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- stack: ["2.3.3"]
+ stack: ["latest"]
ghc: ["7.10.3","8.0.2", "8.2.2", "8.4.4", "8.6.5", "8.8.4"]
# ghc: ["8.8.3"]
From 7faf8c9dad5a88c38f7fa3633f8a1b286ac570c3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andreas=20K=C3=A4llberg?=
Date: Mon, 12 Jul 2021 16:38:29 +0800
Subject: [PATCH 04/41] Clean up redundant case expressions
---
src/compiler/GF/Compile/Compute/Concrete.hs | 21 +++++++++----------
.../GF/Compile/TypeCheck/ConcreteNew.hs | 4 ++--
2 files changed, 12 insertions(+), 13 deletions(-)
diff --git a/src/compiler/GF/Compile/Compute/Concrete.hs b/src/compiler/GF/Compile/Compute/Concrete.hs
index dd2180937..47e2f5cde 100644
--- a/src/compiler/GF/Compile/Compute/Concrete.hs
+++ b/src/compiler/GF/Compile/Compute/Concrete.hs
@@ -33,9 +33,9 @@ normalForm (GE gr rv opts _) loc = err (bugloc loc) id . nfx (GE gr rv opts loc)
nfx :: GlobalEnv -> Term -> Err Term
nfx env@(GE _ _ _ loc) t = do
v <- eval env [] t
- case value2term loc [] v of
+ return (value2term loc [] v)
+ -- Old value2term error message:
-- Left i -> fail ("variable #"++show i++" is out of scope")
- t -> return t
eval :: GlobalEnv -> Env -> Term -> Err Value
eval (GE gr rvs opts loc) env t = ($ (map snd env)) # value cenv t
@@ -289,9 +289,9 @@ glue env (v1,v2) = glu v1 v2
(v1,v2) -> if flag optPlusAsBind (opts env)
then VC v1 (VC (VApp BIND []) v2)
else let loc = gloc env
- vt v = case value2term loc (local env) v of
+ vt v = value2term loc (local env) v
+ -- Old value2term error message:
-- Left i -> Error ('#':show i)
- t -> t
originalMsg = render $ ppL loc (hang "unsupported token gluing" 4
(Glue (vt v1) (vt v2)))
term = render $ pp $ Glue (vt v1) (vt v2)
@@ -356,9 +356,9 @@ select env vv =
(v1,v2) -> ok2 VS v1 v2
match loc cs v =
- case value2term loc [] v of
+ err bad return (matchPattern cs (value2term loc [] v))
+ -- Old value2term error message:
-- Left i -> bad ("variable #"++show i++" is out of scope")
- t -> err bad return (matchPattern cs t)
where
bad = fail . ("In pattern matching: "++)
@@ -384,9 +384,8 @@ valueTable env i cs =
wild = case i of TWild _ -> True; _ -> False
convertv cs' vty =
- case value2term (gloc env) [] vty of
- -- Left i -> fail ("variable #"++show i++" is out of scope")
- pty -> convert' cs' =<< paramValues'' env pty
+ convert' cs' =<< paramValues'' env (value2term (gloc env) [] vty)
+ -- Old value2term error message: Left i -> fail ("variable #"++show i++" is out of scope")
convert cs' ty = convert' cs' =<< paramValues' env ty
@@ -493,9 +492,9 @@ vtrace loc arg res = trace (render (hang (pv arg) 4 ("->"<+>pv res))) res
pf (_,VString n) = pp n
pf (_,v) = ppV v
pa (_,v) = ppV v
- ppV v = case value2term' True loc [] v of
+ ppV v = ppTerm Unqualified 10 (value2term' True loc [] v)
+ -- Old value2term error message:
-- Left i -> "variable #" <> pp i <+> "is out of scope"
- t -> ppTerm Unqualified 10 t
-- | Convert a value back to a term
value2term :: GLocation -> [Ident] -> Value -> Term
diff --git a/src/compiler/GF/Compile/TypeCheck/ConcreteNew.hs b/src/compiler/GF/Compile/TypeCheck/ConcreteNew.hs
index 628f7ea4c..ed3a20ce0 100644
--- a/src/compiler/GF/Compile/TypeCheck/ConcreteNew.hs
+++ b/src/compiler/GF/Compile/TypeCheck/ConcreteNew.hs
@@ -765,9 +765,9 @@ zonkTerm (Meta i) = do
zonkTerm t = composOp zonkTerm t
tc_value2term loc xs v =
- case value2term loc xs v of
+ return $ value2term loc xs v
+ -- Old value2term error message:
-- Left i -> tcError ("Variable #" <+> pp i <+> "has escaped")
- t -> return t
From 80d16fcf946f7ff26640f93301bc1259f0b8f89a Mon Sep 17 00:00:00 2001
From: Inari Listenmaa
Date: Wed, 14 Jul 2021 15:03:59 +0800
Subject: [PATCH 05/41] Update instructions about C runtime
---
doc/gf-developers.t2t | 105 ++++++++++++++++++++++++++++++++++--------
1 file changed, 86 insertions(+), 19 deletions(-)
diff --git a/doc/gf-developers.t2t b/doc/gf-developers.t2t
index ed336b9a7..5b13986a2 100644
--- a/doc/gf-developers.t2t
+++ b/doc/gf-developers.t2t
@@ -361,35 +361,102 @@ bash setup.sh install
```
This will install
the C header files and libraries need to write C programs that use PGF grammars.
-Some example C programs are included in the ``utils`` subdirectory, e.g.
-``pgf-translate.c``.
+% Some example C programs are included in the ``utils`` subdirectory, e.g. ``pgf-translate.c``.
-When the C run-time system is installed, you can install GF with C run-time
-support by doing
+Depending on what you want to do with the C runtime, you can follow one or more of the following steps.
+
+=== 1. Use the C runtime from another programming language ===
+
+% **If you just want to use the C runtime from Python, Java, or Haskell, you don't need to change your GF installation.**
+
+==== What ====
+
+**This is the most common use case for the C runtime:** compile
+your GF grammars into PGF with the standard GF executable,
+and manipulate the PGFs from another programming language,
+using the bindings to the C runtime.
+
+==== How ====
+
+The Python, Java and Haskell bindings are found in the
+``src/runtime/{python,java,haskell-bind}`` directories,
+respecively. Compile them by following the instructions
+in the ``INSTALL`` or ``README`` files in those directories.
+
+The Python library can also be installed from PyPI using ``pip install pgf``.
+(If you are on Mac and get an error about ``clang`` version, you can try
+some of [these solutions https://stackoverflow.com/questions/63972113/big-sur-clang-invalid-version-error-due-to-macosx-deployment-target]—but be careful before removing any existing installations.)
+
+
+=== 2. Use GF shell with C runtime support ===
+
+==== What ====
+If you want to use the GF shell with C runtime functionalities, then you need to (re)compile GF with special flags.
+
+The GF shell can be started with ``gf -cshell`` or ``gf -crun`` to use
+the C run-time system instead of the Haskell run-time system.
+Only limited functionality is available when running the shell in these
+modes (use the ``help`` command in the shell for details).
+
+(Re)compiling your GF with these flags will also give you
+Haskell bindings to the C runtime, as a library called ``PGF2``,
+but if you want Python or Java bindings, you need to do step 1.
+
+% ``PGF2``: a module to import in Haskell programs, providing a binding to the C run-time system.
+
+==== How ====
+
+If you use cabal, run the following command:
```
-cabal install -fserver -fc-runtime
+cabal install -fc-runtime
```
-from the top directory. This give you three new things:
-- ``PGF2``: a module to import in Haskell programs, providing a binding to
- the C run-time system.
+from the top directory.
-- The GF shell can be started with ``gf -cshell`` or ``gf -crun`` to use
- the C run-time system instead of the Haskell run-time system.
- Only limited functionality is available when running the shell in these
- modes (use the ``help`` command in the shell for details).
+If you use stack, uncomment the following lines in the ``stack.yaml`` file:
-- ``gf -server`` mode is extended with new requests to call the C run-time
- system, e.g. ``c-parse``, ``c-linearize`` and ``c-translate``.
+```
+flags:
+ gf:
+ c-runtime: true
+extra-lib-dirs:
+ - /usr/local/lib
+```
+
+and then run ``stack install``, also from the top directory.
-=== Python and Java bindings ===
+=== 3. Use GF server mode with C runtime ===
+
+==== What ====
+
+With this feature, ``gf -server`` mode is extended with new requests to call the C run-time
+system, e.g. ``c-parse``, ``c-linearize`` and ``c-translate``.
+
+==== How ====
+
+If you use cabal, run the following command:
+
+```
+cabal install -fc-runtime -fserver
+```
+from the top directory.
+
+If you use stack, add the following lines in the
+If you use stack, uncomment the following lines in the ``stack.yaml`` file:
+
+```
+flags:
+ gf:
+ c-runtime: true
+ server: true
+extra-lib-dirs:
+ - /usr/local/lib
+```
+
+and then run ``stack install``, also from the top directory.
-The C run-time system can also be used from Python and Java. Python and Java
-bindings are found in the ``src/runtime/python`` and ``src/runtime/java``
-directories, respecively. Compile them by following the instructions in
-the ``INSTALL`` files in those directories.
The Python library can also be installed from PyPI using `pip install pgf`.
From f345f615f417ff92f56b2b2fe412513d25109ec0 Mon Sep 17 00:00:00 2001
From: Inari Listenmaa
Date: Wed, 14 Jul 2021 15:16:23 +0800
Subject: [PATCH 06/41] Update information about test suite
Co-Authored-By: 1Regina <46968488+1Regina@users.noreply.github.com>
---
doc/gf-developers.t2t | 72 +++++++++++++++++++++++++++++--------------
1 file changed, 49 insertions(+), 23 deletions(-)
diff --git a/doc/gf-developers.t2t b/doc/gf-developers.t2t
index 5b13986a2..d7cd44083 100644
--- a/doc/gf-developers.t2t
+++ b/doc/gf-developers.t2t
@@ -458,7 +458,6 @@ extra-lib-dirs:
and then run ``stack install``, also from the top directory.
-The Python library can also be installed from PyPI using `pip install pgf`.
== Compilation of RGL ==
@@ -552,36 +551,63 @@ the GF ``.rpm`` package.
When building ``.rpm`` packages for GF 3.4, we also had to build ``.rpm``s for
``fst`` and ``httpd-shed``.
-== Running the testsuite ==
+== Running the test suite ==
-**NOTE:** The test suite has not been maintained recently, so expect many
-tests to fail.
-%% // TH 2012-08-06
+The GF test suite is run with one of the following commands from the top directory:
-GF has testsuite. It is run with the following command:
```
-$ cabal test
+ $ cabal test
```
+
+or
+
+```
+ $ stack test
+```
+
The testsuite architecture for GF is very simple but still very flexible.
GF by itself is an interpreter and could execute commands in batch mode.
This is everything that we need to organize a testsuite. The root of the
-testsuite is the testsuite/ directory. It contains subdirectories which
-themself contain GF batch files (with extension .gfs). The above command
-searches the subdirectories of the testsuite/ directory for files with extension
-.gfs and when it finds one it is executed with the GF interpreter.
-The output of the script is stored in file with extension .out and is compared
-with the content of the corresponding file with extension .gold, if there is one.
-If the contents are identical the command reports that the test was passed successfully.
-Otherwise the test had failed.
+testsuite is the ``testsuite/`` directory. It contains subdirectories
+which themselves contain GF batch files (with extension ``.gfs``).
+The above command searches the subdirectories of the ``testsuite/`` directory
+for files with extension ``.gfs`` and when it finds one, it is executed with
+the GF interpreter. The output of the script is stored in file with extension ``.out``
+and is compared with the content of the corresponding file with extension ``.gold``, if there is one.
-Every time when you make some changes to GF that have to be tested, instead of
-writing the commands by hand in the GF shell, add them to one .gfs file in the testsuite
-and run the test. In this way you can use the same test later and we will be sure
-that we will not incidentaly break your code later.
+Every time when you make some changes to GF that have to be tested,
+instead of writing the commands by hand in the GF shell, add them to one ``.gfs``
+file in the testsuite subdirectory where its ``.gf`` file resides and run the test.
+In this way you can use the same test later and we will be sure that we will not
+accidentally break your code later.
+
+**Test Outcome - Passed:** If the contents of the files with the ``.out`` extension
+are identical to their correspondingly-named files with the extension ``.gold``,
+the command will report that the tests passed successfully, e.g.
-If you don't want to run the whole testsuite you can write the path to the subdirectory
-in which you are interested. For example:
```
-$ cabal test testsuite/compiler
+ Running 1 test suites...
+ Test suite gf-tests: RUNNING...
+ Test suite gf-tests: PASS
+ 1 of 1 test suites (1 of 1 test cases) passed.
```
-will run only the testsuite for the compiler.
+
+**Test Outcome - Failed:** If there is a contents mismatch between the files
+with the ``.out`` extension and their corresponding files with the extension ``.gold``,
+the test diagnostics will show a fail and the areas that failed. e.g.
+
+```
+ testsuite/compiler/compute/Records.gfs: OK
+ testsuite/compiler/compute/Variants.gfs: FAIL
+ testsuite/compiler/params/params.gfs: OK
+ Test suite gf-tests: FAIL
+ 0 of 1 test suites (0 of 1 test cases) passed.
+```
+
+The fail results overview is available in gf-tests.html which shows 4 columns:
+
++ //Results// - only areas that fail will appear. (Note: There are 3 failures in the gf-tests.html which are labelled as (expected). These failures should be ignored.)
++ //Input// - which is the test written in the .gfs file
++ //Gold// - the expected output from running the test set out in the .gfs file. This column refers to the contents from the .gold extension files.
++ //Output// - This column refers to the contents from the .out extension files which are generated as test output.
+After fixing the areas which fail, rerun the test command. Repeat the entire process of fix-and-test until the test suite passes before submitting a pull request to include your changes.
From 6f2a4bcd2c7efa3bc878a8309bc11cc09101fbf5 Mon Sep 17 00:00:00 2001
From: Meowyam
Date: Wed, 14 Jul 2021 15:34:56 +0800
Subject: [PATCH 07/41] update doc for linux installation
---
doc/gf-developers.t2t | 52 ++++++++++++++++++-------------------------
1 file changed, 22 insertions(+), 30 deletions(-)
diff --git a/doc/gf-developers.t2t b/doc/gf-developers.t2t
index d7cd44083..b4a21a25e 100644
--- a/doc/gf-developers.t2t
+++ b/doc/gf-developers.t2t
@@ -15,52 +15,28 @@ you are a GF user who just wants to download and install GF
== Setting up your system for building GF ==
To build GF from source you need to install some tools on your
-system: the //Haskell Platform//, //Git// and the //Haskeline library//.
+system: the Haskell Tool Stack, //Git// and the //Haskeline library//.
**On Linux** the best option is to install the tools via the standard
software distribution channels, i.e. by using the //Software Center//
in Ubuntu or the corresponding tool in other popular Linux distributions.
-Or, from a Terminal window, the following command should be enough:
-- On Ubuntu: ``sudo apt-get install haskell-platform git libghc6-haskeline-dev``
-- On Fedora: ``sudo dnf install haskell-platform git ghc-haskeline-devel``
+If the Haskell Tool Stack is already installed, enter the following command in a Terminal:
+- On Ubuntu: ``sudo apt-get install git libghc6-haskeline-dev``
+- On Fedora: ``sudo dnf install git ghc-haskeline-devel``
**On Mac OS and Windows**, the tools can be downloaded from their respective
web sites, as described below.
-=== The Haskell Platform ===
-
-GF is written in Haskell, so first of all you need
-the //Haskell Platform//, e.g. version 8.0.2 or 7.10.3. Downloads
-and installation instructions are available from here:
-
- http://hackage.haskell.org/platform/
-
-Once you have installed the Haskell Platform, open a terminal
-(Command Prompt on Windows) and try to execute the following command:
-```
-$ ghc --version
-```
-This command should show you which version of GHC you have. If the installation
-of the Haskell Platform was successful you should see a message like:
-
-```
-The Glorious Glasgow Haskell Compilation System, version 8.0.2
-```
-
-Other required tools included in the Haskell Platform are
-[Cabal http://www.haskell.org/cabal/],
-[Alex http://www.haskell.org/alex/]
-and
-[Happy http://www.haskell.org/happy/].
-
=== Git ===
To get the GF source code, you also need //Git//.
//Git// is a distributed version control system, see
https://git-scm.com/downloads for more information.
+If you've entered the command above, it incudes git installation.
+
=== The haskeline library ===
GF uses //haskeline// to enable command line editing in the GF shell.
@@ -149,6 +125,17 @@ It is also possible for anyone else to contribute by
- and finally sending a pull request.
+== Compilation from source with Stack ==
+
+Assuming you have the Haskell Tool Stack, Git, and Haskeline installed, entering
+
+```
+$ stack install
+```
+
+into a Terminal will install GF and all necessary libraries, including Alex and Happy.
+
+
== Compilation from source with Cabal ==
@@ -424,6 +411,11 @@ extra-lib-dirs:
- /usr/local/lib
```
+First you will need to install the following libraries if not already installed:
+
+```
+apt-get install
+
and then run ``stack install``, also from the top directory.
From 06e0a986d13f3aa744a4b344586cf22cc337a5ff Mon Sep 17 00:00:00 2001
From: Inari Listenmaa
Date: Wed, 14 Jul 2021 16:12:11 +0800
Subject: [PATCH 08/41] Changes in Git instructions
---
doc/gf-developers.t2t | 93 ++++++++++++++++++-------------------------
1 file changed, 38 insertions(+), 55 deletions(-)
diff --git a/doc/gf-developers.t2t b/doc/gf-developers.t2t
index b4a21a25e..9e758cd48 100644
--- a/doc/gf-developers.t2t
+++ b/doc/gf-developers.t2t
@@ -26,6 +26,7 @@ If the Haskell Tool Stack is already installed, enter the following command in a
- On Ubuntu: ``sudo apt-get install git libghc6-haskeline-dev``
- On Fedora: ``sudo dnf install git ghc-haskeline-devel``
+
**On Mac OS and Windows**, the tools can be downloaded from their respective
web sites, as described below.
@@ -50,79 +51,60 @@ required by //haskeline// are installed. Here is one way to do this:
== Getting the source ==
-Once you have all tools in place you can get the GF source code. If you
-just want to compile and use GF then it is enough to have read-only
-access. It is also possible to make changes in the source code but if you
-want these changes to be applied back to the main source repository you will
-have to send the changes to us. If you plan to work continuously on
-GF then you should consider getting read-write access.
+Once you have all tools in place you can get the GF source code from
+[GitHub https://github.com/GrammaticalFramework/gf-core].
-=== Read-only access ===
+=== Read-only access: clone the main repository ===
-==== Getting a fresh copy for read-only access ====
-
-Anyone can get the latest development version of GF by running:
+If you only want to compile and use GF, you can just clone the repository as follows:
```
-$ git clone https://github.com/GrammaticalFramework/gf-core.git
-$ git clone https://github.com/GrammaticalFramework/gf-rgl.git
+ $ git clone https://github.com/GrammaticalFramework/gf-core.git
```
-This will create directories ``gf-core`` and ``gf-rgl`` in the current directory.
-
-
-==== Updating your copy ====
-
-To get all new patches from each repo:
-```
-$ git pull
-```
-This can be done anywhere in your local repository.
-
-
-==== Recording local changes ====[record]
-
-Since every copy is a repository, you can have local version control
-of your changes.
-
-If you have added files, you first need to tell your local repository to
-keep them under revision control:
+To get new updates, run the following anywhere in your local copy of the repository:
```
-$ git add file1 file2 ...
+ $ git pull
```
-To record changes, use:
+=== Contribute your changes: create a fork ===
+
+If you want the possibility to contribute your changes, you should
+[create your own fork https://docs.github.com/en/get-started/quickstart/fork-a-repo]
+of the repository, and then clone that.
```
-$ git commit file1 file2 ...
+ $ git clone https://github.com//gf-core.git
```
-This creates a patch against the previous version and stores it in your
-local repository. You can record any number of changes before
-pushing them to the main repo. In fact, you don't have to push them at
-all if you want to keep the changes only in your local repo.
-
-Instead of enumerating all modified files on the command line,
-you can use the flag ``-a`` to automatically record //all// modified
-files. You still need to use ``git add`` to add new files.
-
-
-=== Read-write access ===
-
-If you are a member of the GF project on GitHub, you can push your
-changes directly to the GF git repository on GitHub.
+**Updating your copy —**
+Once you have cloned your fork, you need to set up the main GrammaticalFramework repository as a remote:
```
-$ git push
+ $ git remote add upstream https://github.com/GrammaticalFramework/gf-core.git
```
-It is also possible for anyone else to contribute by
+Then you can get the latest updates by running the following:
-- creating a fork of the GF repository on GitHub,
-- working with local clone of the fork (obtained with ``git clone``),
-- pushing changes to the fork,
-- and finally sending a pull request.
+```
+ $ git pull upstream master
+```
+
+**Recording local changes —**
+If you are new to Git, we recommend to read a tutorial on how to [record and push your changes https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository] to your fork.
+
+
+**Pull request —**
+TODO
+
+
+%It is also possible for anyone else to contribute by
+
+%- creating a fork of the GF repository on GitHub,
+%- working with local clone of the fork (obtained with ``git clone``),
+%- pushing changes to the fork,
+%- and finally sending a pull request.
== Compilation from source with Stack ==
@@ -414,7 +396,8 @@ extra-lib-dirs:
First you will need to install the following libraries if not already installed:
```
-apt-get install
+apt-get install
+```
and then run ``stack install``, also from the top directory.
From a1594e6a6950665a691529a15da7f440335f6e00 Mon Sep 17 00:00:00 2001
From: Inari Listenmaa
Date: Wed, 14 Jul 2021 16:44:44 +0800
Subject: [PATCH 09/41] updated doc with instructions for C runtime for ubuntu
and fedora
---
doc/gf-developers.t2t | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/doc/gf-developers.t2t b/doc/gf-developers.t2t
index 9e758cd48..c62cc5e04 100644
--- a/doc/gf-developers.t2t
+++ b/doc/gf-developers.t2t
@@ -394,13 +394,15 @@ extra-lib-dirs:
```
First you will need to install the following libraries if not already installed:
+autoconf, automake, libtool, make
+
+On Ubuntu ``apt-get install autotools-dev``
+On Fedora ``dnf install autoconf automake libtool``
-```
-apt-get install
-```
and then run ``stack install``, also from the top directory.
+If you get an error ``error while loading shared libraries`` when trying to run gf with C runtime, remember to declare your LD_LIBRARY_PATH. Add ``export LD_LIBRARY_PATH="/usr/local/lib"`` to either your .bashrc or .profile. You should now be able to start GF with C runtime.
=== 3. Use GF server mode with C runtime ===
From 9e209bbabac32823a4818eb0479543028568f6ef Mon Sep 17 00:00:00 2001
From: Inari Listenmaa
Date: Wed, 14 Jul 2021 16:45:36 +0800
Subject: [PATCH 10/41] Changes in Git instructions
---
doc/gf-developers.t2t | 17 ++++++-----------
1 file changed, 6 insertions(+), 11 deletions(-)
diff --git a/doc/gf-developers.t2t b/doc/gf-developers.t2t
index c62cc5e04..28ab6b6fa 100644
--- a/doc/gf-developers.t2t
+++ b/doc/gf-developers.t2t
@@ -96,16 +96,9 @@ If you are new to Git, we recommend to read a tutorial on how to [record and pus
**Pull request —**
-TODO
-
-
-%It is also possible for anyone else to contribute by
-
-%- creating a fork of the GF repository on GitHub,
-%- working with local clone of the fork (obtained with ``git clone``),
-%- pushing changes to the fork,
-%- and finally sending a pull request.
-
+When you want to contribute your changes to the main gf-core repository,
+[create a pull request https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request]
+from your fork.
== Compilation from source with Stack ==
@@ -399,7 +392,9 @@ autoconf, automake, libtool, make
On Ubuntu ``apt-get install autotools-dev``
On Fedora ``dnf install autoconf automake libtool``
-
+```
+apt-get install
+```
and then run ``stack install``, also from the top directory.
If you get an error ``error while loading shared libraries`` when trying to run gf with C runtime, remember to declare your LD_LIBRARY_PATH. Add ``export LD_LIBRARY_PATH="/usr/local/lib"`` to either your .bashrc or .profile. You should now be able to start GF with C runtime.
From 743f5e55d486633ec7b148ea9a30ba7e59892e6d Mon Sep 17 00:00:00 2001
From: Meowyam
Date: Wed, 14 Jul 2021 16:28:14 +0800
Subject: [PATCH 11/41] add missing install.sh file for c runtime
---
src/runtime/c/install.sh | 3 +++
1 file changed, 3 insertions(+)
create mode 100755 src/runtime/c/install.sh
diff --git a/src/runtime/c/install.sh b/src/runtime/c/install.sh
new file mode 100755
index 000000000..78483719d
--- /dev/null
+++ b/src/runtime/c/install.sh
@@ -0,0 +1,3 @@
+bash setup.sh configure
+bash setup.sh build
+bash setup.sh install
From fffe3161d4db12333663c845aca8b214b9f1c3ec Mon Sep 17 00:00:00 2001
From: Meowyam
Date: Wed, 14 Jul 2021 16:34:52 +0800
Subject: [PATCH 12/41] updated docs to reflect binaries generated via github
actions
fix merge conflicts
resolve merge conflict
---
doc/gf-developers.t2t | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/doc/gf-developers.t2t b/doc/gf-developers.t2t
index 28ab6b6fa..fafc3f4c4 100644
--- a/doc/gf-developers.t2t
+++ b/doc/gf-developers.t2t
@@ -392,9 +392,6 @@ autoconf, automake, libtool, make
On Ubuntu ``apt-get install autotools-dev``
On Fedora ``dnf install autoconf automake libtool``
-```
-apt-get install
-```
and then run ``stack install``, also from the top directory.
If you get an error ``error while loading shared libraries`` when trying to run gf with C runtime, remember to declare your LD_LIBRARY_PATH. Add ``export LD_LIBRARY_PATH="/usr/local/lib"`` to either your .bashrc or .profile. You should now be able to start GF with C runtime.
@@ -456,6 +453,10 @@ If you do not have Haskell installed, you can use the simple build script ``Setu
== Creating binary distribution packages ==
+The binaries are generated with Github Actions. More details can be viewed here:
+
+https://github.com/GrammaticalFramework/gf-core/actions/workflows/build-binary-packages.yml
+
=== Creating .deb packages for Ubuntu ===
This was tested on Ubuntu 14.04 for the release of GF 3.6, and the
From a09d9bd0062e43ff45961c80ebd26d919af107ac Mon Sep 17 00:00:00 2001
From: 1Regina <46968488+1Regina@users.noreply.github.com>
Date: Wed, 14 Jul 2021 16:44:08 +0800
Subject: [PATCH 13/41] install and upgrade stack
---
doc/gf-developers.t2t | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/doc/gf-developers.t2t b/doc/gf-developers.t2t
index fafc3f4c4..840fa3762 100644
--- a/doc/gf-developers.t2t
+++ b/doc/gf-developers.t2t
@@ -30,6 +30,21 @@ If the Haskell Tool Stack is already installed, enter the following command in a
**On Mac OS and Windows**, the tools can be downloaded from their respective
web sites, as described below.
+=== Stack ===
+The primary installation method is via ``stack``. To install [stack https://docs.haskellstack.org/en/stable/README/]
+- **On Mac and other Unix**, do either
+```
+curl -sSL https://get.haskellstack.org/ | sh
+```
+**OR**
+```
+wget -qO- https://get.haskellstack.org/ | sh
+```
+- **On Windows and other operating systems** :check out the install and [upgrade guide https://docs.haskellstack.org/en/stable/install_and_upgrade]
+
+If you already have stack installed, upgrade it to the latest version by running: ``stack upgrade``
+
+
=== Git ===
To get the GF source code, you also need //Git//.
From 6d12754e4f38b1107f0a820611fa0bc0eba979c4 Mon Sep 17 00:00:00 2001
From: Inari Listenmaa
Date: Thu, 15 Jul 2021 08:21:29 +0800
Subject: [PATCH 14/41] Split the Cabal instructions to another page
and link from main instructions
---
doc/gf-developers-old-cabal.t2t | 201 ++++++++++++++++++++++++++++++++
doc/gf-developers.t2t | 120 +------------------
2 files changed, 202 insertions(+), 119 deletions(-)
create mode 100644 doc/gf-developers-old-cabal.t2t
diff --git a/doc/gf-developers-old-cabal.t2t b/doc/gf-developers-old-cabal.t2t
new file mode 100644
index 000000000..0f583bec8
--- /dev/null
+++ b/doc/gf-developers-old-cabal.t2t
@@ -0,0 +1,201 @@
+GF Developer's Guide: Old installation instructions with Cabal
+
+
+This page contains the old installation instructions from the [Developer's Guide ../doc/gf-developers.html].
+We recommend Stack as a primary installation method, because it's easier for a Haskell beginner, and we want to keep the main instructions short.
+But if you are an experienced Haskeller and want to keep using Cabal, here are the old instructions using ``cabal install``.
+
+Note that some of these instructions may be outdated. Other parts may still be useful.
+
+== Compilation from source with Cabal ==
+
+The build system of GF is based on //Cabal//, which is part of the
+Haskell Platform, so no extra steps are needed to install it. In the simplest
+case, all you need to do to compile and install GF, after downloading the
+source code as described above, is
+
+```
+$ cabal install
+```
+
+This will automatically download any additional Haskell libraries needed to
+build GF. If this is the first time you use Cabal, you might need to run
+``cabal update`` first, to update the list of available libraries.
+
+If you want more control, the process can also be split up into the usual
+//configure//, //build// and //install// steps.
+
+=== Configure ===
+
+During the configuration phase Cabal will check that you have all
+necessary tools and libraries needed for GF. The configuration is
+started by the command:
+
+```
+$ cabal configure
+```
+
+If you don't see any error message from the above command then you
+have everything that is needed for GF. You can also add the option
+``-v`` to see more details about the configuration.
+
+You can use ``cabal configure --help`` to get a list of configuration options.
+
+=== Build ===
+
+The build phase does two things. First it builds the GF compiler from
+the Haskell source code and after that it builds the GF Resource Grammar
+Library using the already build compiler. The simplest command is:
+
+```
+$ cabal build
+```
+
+Again you can add the option ``-v`` if you want to see more details.
+
+==== Parallel builds ====
+
+If you have Cabal>=1.20 you can enable parallel compilation by using
+
+```
+$ cabal build -j
+```
+
+or by putting a line
+```
+jobs: $ncpus
+```
+in your ``.cabal/config`` file. Cabal
+will pass this option to GHC when building the GF compiler, if you
+have GHC>=7.8.
+
+Cabal also passes ``-j`` to GF to enable parallel compilation of the
+Resource Grammar Library. This is done unconditionally to avoid
+causing problems for developers with Cabal<1.20. You can disable this
+by editing the last few lines in ``WebSetup.hs``.
+
+=== Install ===
+
+After you have compiled GF you need to install the executable and libraries
+to make the system usable.
+
+```
+$ cabal copy
+$ cabal register
+```
+
+This command installs the GF compiler for a single user, in the standard
+place used by Cabal.
+On Linux and Mac this could be ``$HOME/.cabal/bin``.
+On Mac it could also be ``$HOME/Library/Haskell/bin``.
+On Windows this is ``C:\Program Files\Haskell\bin``.
+
+The compiled GF Resource Grammar Library will be installed
+under the same prefix, e.g. in
+``$HOME/.cabal/share/gf-3.3.3/lib`` on Linux and
+in ``C:\Program Files\Haskell\gf-3.3.3\lib`` on Windows.
+
+If you want to install in some other place then use the ``--prefix``
+option during the configuration phase.
+
+=== Clean ===
+
+Sometimes you want to clean up the compilation and start again from clean
+sources. Use the clean command for this purpose:
+
+```
+$ cabal clean
+```
+
+
+%=== SDist ===
+%
+%You can use the command:
+%
+%% This does *NOT* include everything that is needed // TH 2012-08-06
+%```
+%$ cabal sdist
+%```
+%
+%to prepare archive with all source codes needed to compile GF.
+
+=== Known problems with Cabal ===
+
+Some versions of Cabal (at least version 1.16) seem to have a bug that can
+cause the following error:
+
+```
+Configuring gf-3.x...
+setup: Distribution/Simple/PackageIndex.hs:124:8-13: Assertion failed
+```
+
+The exact cause of this problem is unclear, but it seems to happen
+during the configure phase if the same version of GF is already installed,
+so a workaround is to remove the existing installation with
+
+```
+ghc-pkg unregister gf
+```
+
+You can check with ``ghc-pkg list gf`` that it is gone.
+
+== Compilation with make ==
+
+If you feel more comfortable with Makefiles then there is a thin Makefile
+wrapper arround Cabal for you. If you just type:
+```
+$ make
+```
+the configuration phase will be run automatically if needed and after that
+the sources will be compiled.
+
+%% cabal build rgl-none does not work with recent versions of Cabal
+%If you don't want to compile the resource library
+%every time then you can use:
+%```
+%$ make gf
+%```
+
+For installation use:
+```
+$ make install
+```
+For cleaning:
+```
+$ make clean
+```
+%and to build source distribution archive run:
+%```
+%$ make sdist
+%```
+
+
+== Partial builds of RGL ==
+
+**NOTE**: The following doesn't work with recent versions of ``cabal``. //(This comment was left in 2015, so make your own conclusions.)//
+%% // TH 2015-06-22
+
+%Sometimes you just want to work on the GF compiler and don't want to
+%recompile the resource library after each change. In this case use
+%this extended command:
+
+%```
+%$ cabal build rgl-none
+%```
+
+The resource grammar library can be compiled in two modes: with present
+tense only and with all tenses. By default it is compiled with all
+tenses. If you want to use the library with only present tense you can
+compile it in this special mode with the command:
+
+```
+$ cabal build present
+```
+
+You could also control which languages you want to be recompiled by
+adding the option ``langs=list``. For example the following command
+will compile only the English and the Swedish language:
+
+```
+$ cabal build langs=Eng,Swe
+```
diff --git a/doc/gf-developers.t2t b/doc/gf-developers.t2t
index 840fa3762..ffaf06699 100644
--- a/doc/gf-developers.t2t
+++ b/doc/gf-developers.t2t
@@ -138,125 +138,7 @@ source code as described above, is
$ cabal install
```
-This will automatically download any additional Haskell libraries needed to
-build GF. If this is the first time you use Cabal, you might need to run
-``cabal update`` first, to update the list of available libraries.
-
-If you want more control, the process can also be split up into the usual
-//configure//, //build// and //install// steps.
-
-=== Configure ===
-
-During the configuration phase Cabal will check that you have all
-necessary tools and libraries needed for GF. The configuration is
-started by the command:
-
-```
-$ cabal configure
-```
-
-If you don't see any error message from the above command then you
-have everything that is needed for GF. You can also add the option
-``-v`` to see more details about the configuration.
-
-You can use ``cabal configure --help`` to get a list of configuration options.
-
-=== Build ===
-
-The build phase does two things. First it builds the GF compiler from
-the Haskell source code and after that it builds the GF Resource Grammar
-Library using the already build compiler. The simplest command is:
-
-```
-$ cabal build
-```
-
-Again you can add the option ``-v`` if you want to see more details.
-
-==== Parallel builds ====
-
-If you have Cabal>=1.20 you can enable parallel compilation by using
-
-```
-$ cabal build -j
-```
-
-or by putting a line
-```
-jobs: $ncpus
-```
-in your ``.cabal/config`` file. Cabal
-will pass this option to GHC when building the GF compiler, if you
-have GHC>=7.8.
-
-Cabal also passes ``-j`` to GF to enable parallel compilation of the
-Resource Grammar Library. This is done unconditionally to avoid
-causing problems for developers with Cabal<1.20. You can disable this
-by editing the last few lines in ``WebSetup.hs``.
-
-
-==== Partial builds ====
-
-**NOTE**: The following doesn't work with recent versions of ``cabal``.
-%% // TH 2015-06-22
-
-Sometimes you just want to work on the GF compiler and don't want to
-recompile the resource library after each change. In this case use
-this extended command:
-
-```
-$ cabal build rgl-none
-```
-
-The resource library could also be compiled in two modes: with present
-tense only and with all tenses. By default it is compiled with all
-tenses. If you want to use the library with only present tense you can
-compile it in this special mode with the command:
-
-```
-$ cabal build present
-```
-
-You could also control which languages you want to be recompiled by
-adding the option ``langs=list``. For example the following command
-will compile only the English and the Swedish language:
-
-```
-$ cabal build langs=Eng,Swe
-```
-
-=== Install ===
-
-After you have compiled GF you need to install the executable and libraries
-to make the system usable.
-
-```
-$ cabal copy
-$ cabal register
-```
-
-This command installs the GF compiler for a single user, in the standard
-place used by Cabal.
-On Linux and Mac this could be ``$HOME/.cabal/bin``.
-On Mac it could also be ``$HOME/Library/Haskell/bin``.
-On Windows this is ``C:\Program Files\Haskell\bin``.
-
-The compiled GF Resource Grammar Library will be installed
-under the same prefix, e.g. in
-``$HOME/.cabal/share/gf-3.3.3/lib`` on Linux and
-in ``C:\Program Files\Haskell\gf-3.3.3\lib`` on Windows.
-
-If you want to install in some other place then use the ``--prefix``
-option during the configuration phase.
-
-=== Clean ===
-
-Sometimes you want to clean up the compilation and start again from clean
-sources. Use the clean command for this purpose:
-
-```
-$ cabal clean
-```
+//The old (partially outdated) instructions for Cabal are moved to a [separate page ../doc/gf-developers-old-cabal.html]. If you run into trouble with ``cabal install``, you may want to take a look.//
%=== SDist ===
From 45bc5595c03059ff2c83d9079f5e17d92267c5c9 Mon Sep 17 00:00:00 2001
From: Inari Listenmaa
Date: Thu, 15 Jul 2021 09:54:15 +0800
Subject: [PATCH 15/41] Update C runtime install instructions
---
src/runtime/c/INSTALL | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/runtime/c/INSTALL b/src/runtime/c/INSTALL
index 6bbaefdce..c45c18fa9 100644
--- a/src/runtime/c/INSTALL
+++ b/src/runtime/c/INSTALL
@@ -14,6 +14,9 @@ For Linux users
You will need the packages: autoconf, automake, libtool, make
+- On Ubuntu: $ apt-get install autotools-dev
+- On Fedora: $ dnf install autoconf automake libtool
+
The compilation steps are:
$ autoreconf -i
@@ -28,7 +31,7 @@ For Mac OSX users
The following is what I did to make it work on MacOSX 10.8:
- Install XCode and XCode command line tools
-- Install Homebrew: http://mxcl.github.com/homebrew/
+- Install Homebrew: https://brew.sh
$ brew install automake autoconf libtool
$ glibtoolize
@@ -49,7 +52,7 @@ For Windows users
After the installation, don't forget to fix the fstab file. See here:
http://www.mingw.org/wiki/Getting_Started
-- From the MSYS shell (c:/MinGW/msys/1.0/msys.bat) go to the directory
+- From the MSYS shell (c:/MinGW/msys/1.0/msys.bat) go to the directory
which contains the INSTALL file and do:
$ autoreconf -i
From aa530233fb3fd7a7f0a9dd23e000f56b34e34658 Mon Sep 17 00:00:00 2001
From: Inari Listenmaa
Date: Thu, 15 Jul 2021 10:27:57 +0800
Subject: [PATCH 16/41] Remove instructions to create binaries
Those are in github actions
---
doc/gf-developers.t2t | 66 -------------------------------------------
1 file changed, 66 deletions(-)
diff --git a/doc/gf-developers.t2t b/doc/gf-developers.t2t
index ffaf06699..8c91ccc96 100644
--- a/doc/gf-developers.t2t
+++ b/doc/gf-developers.t2t
@@ -354,72 +354,6 @@ The binaries are generated with Github Actions. More details can be viewed here:
https://github.com/GrammaticalFramework/gf-core/actions/workflows/build-binary-packages.yml
-=== Creating .deb packages for Ubuntu ===
-
-This was tested on Ubuntu 14.04 for the release of GF 3.6, and the
-resulting ``.deb`` packages appears to work on Ubuntu 12.04, 13.10 and 14.04.
-For the release of GF 3.7, we generated ``.deb`` packages on Ubuntu 15.04 and
-tested them on Ubuntu 12.04 and 14.04.
-
-Under Ubuntu, Haskell executables are statically linked against other Haskell
-libraries, so the .deb packages are fairly self-contained.
-
-==== Preparations ====
-
-```
-sudo apt-get install dpkg-dev debhelper
-```
-
-==== Creating the package ====
-
-Make sure the ``debian/changelog`` starts with an entry that describes the
-version you are building. Then run
-
-```
-make deb
-```
-
-If get error messages about missing dependencies
-(e.g. ``autoconf``, ``automake``, ``libtool-bin``, ``python-dev``,
-``java-sdk``, ``txt2tags``)
-use ``apt-get intall`` to install them, then try again.
-
-
-=== Creating OS X Installer packages ===
-
-Run
-
-```
-make pkg
-```
-
-=== Creating binary tar distributions ===
-
-Run
-
-```
-make bintar
-```
-
-=== Creating .rpm packages for Fedora ===
-
-This is possible, but the procedure has not been automated.
-It involves using the cabal-rpm tool,
-
-```
-sudo dnf install cabal-rpm
-```
-
-and following the Fedora guide
-[How to create an RPM package http://fedoraproject.org/wiki/How_to_create_an_RPM_package].
-
-Under Fedora, Haskell executables are dynamically linked against other Haskell
-libraries, so ``.rpm`` packages for all Haskell libraries that GF depends on
-are required. Most of them are already available in the Fedora distribution,
-but a few of them might have to be built and distributed along with
-the GF ``.rpm`` package.
-When building ``.rpm`` packages for GF 3.4, we also had to build ``.rpm``s for
-``fst`` and ``httpd-shed``.
== Running the test suite ==
From 13f845d127430a6a306f11c46026c97e9232ef00 Mon Sep 17 00:00:00 2001
From: Inari Listenmaa
Date: Thu, 15 Jul 2021 10:39:54 +0800
Subject: [PATCH 17/41] Update C runtime instructions
---
doc/gf-developers.t2t | 125 +++++++++++++++---------------------------
1 file changed, 43 insertions(+), 82 deletions(-)
diff --git a/doc/gf-developers.t2t b/doc/gf-developers.t2t
index 8c91ccc96..2c8aded0d 100644
--- a/doc/gf-developers.t2t
+++ b/doc/gf-developers.t2t
@@ -162,94 +162,63 @@ Configuring gf-3.x...
setup: Distribution/Simple/PackageIndex.hs:124:8-13: Assertion failed
```
-The exact cause of this problem is unclear, but it seems to happen
-during the configure phase if the same version of GF is already installed,
-so a workaround is to remove the existing installation with
+== Compiling GF with C runtime system support ==
-```
-ghc-pkg unregister gf
-```
-
-You can check with ``ghc-pkg list gf`` that it is gone.
-
-== Compilation with make ==
-
-If you feel more comfortable with Makefiles then there is a thin Makefile
-wrapper arround Cabal for you. If you just type:
-```
-$ make
-```
-the configuration phase will be run automatically if needed and after that
-the sources will be compiled.
-
-%% cabal build rgl-none does not work with recent versions of Cabal
-%If you don't want to compile the resource library
-%every time then you can use:
-%```
-%$ make gf
-%```
-
-For installation use:
-```
-$ make install
-```
-For cleaning:
-```
-$ make clean
-```
-%and to build source distribution archive run:
-%```
-%$ make sdist
-%```
-
-== Compiling GF with C run-time system support ==
-
-The C run-time system is a separate implementation of the PGF run-time services.
+The C runtime system is a separate implementation of the PGF runtime services.
It makes it possible to work with very large, ambiguous grammars, using
-probabilistic models to obtain probable parses. The C run-time system might
-also be easier to use than the Haskell run-time system on certain platforms,
+probabilistic models to obtain probable parses. The C runtime system might
+also be easier to use than the Haskell runtime system on certain platforms,
e.g. Android and iOS.
-To install the C run-time system, go to the ``src/runtime/c`` directory
-%and follow the instructions in the ``INSTALL`` file.
-and use the ``install.sh`` script:
-```
-bash setup.sh configure
-bash setup.sh build
-bash setup.sh install
-```
-This will install
-the C header files and libraries need to write C programs that use PGF grammars.
-% Some example C programs are included in the ``utils`` subdirectory, e.g. ``pgf-translate.c``.
+To install the C runtime system, go to the ``src/runtime/c`` directory.
+
+- **On Linux and Mac OS —**
+ You should have autoconf, automake, libtool and make.
+ If you are missing some of them, follow the
+ instructions in the [INSTALL https://github.com/GrammaticalFramework/gf-core/blob/master/src/runtime/c/INSTALL] file.
+
+ Once you have the required libraries, the easiest way to install the C runtime is to use the ``install.sh`` script. Just type
+
+ ``$ bash install.sh``
+
+ This will install the C header files and libraries need to write C programs
+ that use PGF grammars.
+
+% If this doesn't work for you, follow the manual instructions in the [INSTALL https://github.com/GrammaticalFramework/gf-core/blob/master/src/runtime/c/INSTALL] file under your operating system.
+
+- **On other operating systems —** Follow the instructions in the
+[INSTALL https://github.com/GrammaticalFramework/gf-core/blob/master/src/runtime/c/INSTALL] file under your operating system.
+
+
Depending on what you want to do with the C runtime, you can follow one or more of the following steps.
-=== 1. Use the C runtime from another programming language ===
+=== Use the C runtime from another programming language ===[bindings]
% **If you just want to use the C runtime from Python, Java, or Haskell, you don't need to change your GF installation.**
-==== What ====
-
-**This is the most common use case for the C runtime:** compile
+- **What —**
+This is the most common use case for the C runtime: compile
your GF grammars into PGF with the standard GF executable,
and manipulate the PGFs from another programming language,
using the bindings to the C runtime.
-==== How ====
+- **How —**
The Python, Java and Haskell bindings are found in the
``src/runtime/{python,java,haskell-bind}`` directories,
respecively. Compile them by following the instructions
in the ``INSTALL`` or ``README`` files in those directories.
The Python library can also be installed from PyPI using ``pip install pgf``.
-(If you are on Mac and get an error about ``clang`` version, you can try
-some of [these solutions https://stackoverflow.com/questions/63972113/big-sur-clang-invalid-version-error-due-to-macosx-deployment-target]—but be careful before removing any existing installations.)
-=== 2. Use GF shell with C runtime support ===
+//If you are on Mac and get an error about ``clang`` version, you can try some of [these solutions https://stackoverflow.com/questions/63972113/big-sur-clang-invalid-version-error-due-to-macosx-deployment-target]—but be careful before removing any existing installations.//
-==== What ====
+
+=== Use GF shell with C runtime support ===
+
+- **What —**
If you want to use the GF shell with C runtime functionalities, then you need to (re)compile GF with special flags.
The GF shell can be started with ``gf -cshell`` or ``gf -crun`` to use
@@ -259,19 +228,18 @@ modes (use the ``help`` command in the shell for details).
(Re)compiling your GF with these flags will also give you
Haskell bindings to the C runtime, as a library called ``PGF2``,
-but if you want Python or Java bindings, you need to do step 1.
+but if you want Python or Java bindings, you need to do [the previous step #bindings].
% ``PGF2``: a module to import in Haskell programs, providing a binding to the C run-time system.
-==== How ====
-
+- **How —**
If you use cabal, run the following command:
```
cabal install -fc-runtime
```
-from the top directory.
+from the top directory (``gf-core``).
If you use stack, uncomment the following lines in the ``stack.yaml`` file:
@@ -282,26 +250,20 @@ flags:
extra-lib-dirs:
- /usr/local/lib
```
+and then run ``stack install`` from the top directory (``gf-core``).
-First you will need to install the following libraries if not already installed:
-autoconf, automake, libtool, make
-On Ubuntu ``apt-get install autotools-dev``
-On Fedora ``dnf install autoconf automake libtool``
+//If you get an "``error while loading shared libraries``" when trying to run GF with C runtime, remember to declare your ``LD_LIBRARY_PATH``.//
+//Add ``export LD_LIBRARY_PATH="/usr/local/lib"`` to either your ``.bashrc`` or ``.profile``. You should now be able to start GF with C runtime.//
-and then run ``stack install``, also from the top directory.
-If you get an error ``error while loading shared libraries`` when trying to run gf with C runtime, remember to declare your LD_LIBRARY_PATH. Add ``export LD_LIBRARY_PATH="/usr/local/lib"`` to either your .bashrc or .profile. You should now be able to start GF with C runtime.
-
-=== 3. Use GF server mode with C runtime ===
-
-==== What ====
+=== Use GF server mode with C runtime ===
+- **What —**
With this feature, ``gf -server`` mode is extended with new requests to call the C run-time
system, e.g. ``c-parse``, ``c-linearize`` and ``c-translate``.
-==== How ====
-
+- **How —**
If you use cabal, run the following command:
```
@@ -309,8 +271,7 @@ cabal install -fc-runtime -fserver
```
from the top directory.
-If you use stack, add the following lines in the
-If you use stack, uncomment the following lines in the ``stack.yaml`` file:
+If you use stack, add the following lines in the ``stack.yaml`` file:
```
flags:
From a677f0373c2b02c009028a9e9dd8341a80b499e0 Mon Sep 17 00:00:00 2001
From: Inari Listenmaa
Date: Thu, 15 Jul 2021 10:40:26 +0800
Subject: [PATCH 18/41] General restructuring, various minor changes
---
doc/gf-developers.t2t | 172 ++++++++++++++++++++++--------------------
1 file changed, 89 insertions(+), 83 deletions(-)
diff --git a/doc/gf-developers.t2t b/doc/gf-developers.t2t
index 2c8aded0d..c20afda52 100644
--- a/doc/gf-developers.t2t
+++ b/doc/gf-developers.t2t
@@ -1,6 +1,6 @@
GF Developers Guide
-2018-07-26
+2021-07-15
%!options(html): --toc
@@ -15,66 +15,81 @@ you are a GF user who just wants to download and install GF
== Setting up your system for building GF ==
To build GF from source you need to install some tools on your
-system: the Haskell Tool Stack, //Git// and the //Haskeline library//.
+system: the Haskell build tool //Stack//, the version control software //Git// and the //Haskeline// library.
-**On Linux** the best option is to install the tools via the standard
-software distribution channels, i.e. by using the //Software Center//
-in Ubuntu or the corresponding tool in other popular Linux distributions.
+%**On Linux** the best option is to install the tools via the standard
+%software distribution channels, i.e. by using the //Software Center//
+%in Ubuntu or the corresponding tool in other popular Linux distributions.
-If the Haskell Tool Stack is already installed, enter the following command in a Terminal:
-
-- On Ubuntu: ``sudo apt-get install git libghc6-haskeline-dev``
-- On Fedora: ``sudo dnf install git ghc-haskeline-devel``
-
-
-**On Mac OS and Windows**, the tools can be downloaded from their respective
-web sites, as described below.
+%**On Mac OS and Windows**, the tools can be downloaded from their respective
+%web sites, as described below.
=== Stack ===
-The primary installation method is via ``stack``. To install [stack https://docs.haskellstack.org/en/stable/README/]
-- **On Mac and other Unix**, do either
-```
-curl -sSL https://get.haskellstack.org/ | sh
-```
-**OR**
-```
-wget -qO- https://get.haskellstack.org/ | sh
-```
-- **On Windows and other operating systems** :check out the install and [upgrade guide https://docs.haskellstack.org/en/stable/install_and_upgrade]
+The primary installation method is via //Stack//.
+(You can also use Cabal, but we recommend Stack to those who are new to Haskell.)
-If you already have stack installed, upgrade it to the latest version by running: ``stack upgrade``
+To install Stack:
+
+- **On Linux and Mac OS**, do either
+
+ ``$ curl -sSL https://get.haskellstack.org/ | sh``
+
+ or
+
+ ``$ wget -qO- https://get.haskellstack.org/ | sh``
+
+
+- **On other operating systems**, see the [installation guide https://docs.haskellstack.org/en/stable/install_and_upgrade].
+
+
+%If you already have Stack installed, upgrade it to the latest version by running: ``stack upgrade``
=== Git ===
-To get the GF source code, you also need //Git//.
-//Git// is a distributed version control system, see
-https://git-scm.com/downloads for more information.
+To get the GF source code, you also need //Git//, a distributed version control system.
-If you've entered the command above, it incudes git installation.
+- **On Linux**, the best option is to install the tools via the standard
+software distribution channels:
-=== The haskeline library ===
+ - On Ubuntu: ``sudo apt-get install git-all``
+ - On Fedora: ``sudo dnf install git-all``
+
+
+- **On other operating systems**, see
+https://git-scm.com/book/en/v2/Getting-Started-Installing-Git for installation.
+
+
+
+=== Haskeline ===
GF uses //haskeline// to enable command line editing in the GF shell.
-This should work automatically on Mac OS and Windows, but on Linux one
-extra step is needed to make sure the C libraries (terminfo)
-required by //haskeline// are installed. Here is one way to do this:
-- On Ubuntu: ``sudo apt-get install libghc-haskeline-dev``
-- On Fedora: ``sudo dnf install ghc-haskeline-devel``
+- **On Mac OS and Windows**, this should work automatically.
+
+- **On Linux**, an extra step is needed to make sure the C libraries (terminfo)
+required by //haskeline// are installed:
+
+ - On Ubuntu: ``sudo apt-get install libghc-haskeline-dev``
+ - On Fedora: ``sudo dnf install ghc-haskeline-devel``
-== Getting the source ==
+== Getting the source ==[getting-source]
Once you have all tools in place you can get the GF source code from
-[GitHub https://github.com/GrammaticalFramework/gf-core].
+[GitHub https://github.com/GrammaticalFramework/]:
+
+- https://github.com/GrammaticalFramework/gf-core for the GF compiler
+- https://github.com/GrammaticalFramework/gf-rgl for the Resource Grammar Library
+
=== Read-only access: clone the main repository ===
-If you only want to compile and use GF, you can just clone the repository as follows:
+If you only want to compile and use GF, you can just clone the repositories as follows:
```
$ git clone https://github.com/GrammaticalFramework/gf-core.git
+ $ git clone https://github.com/GrammaticalFramework/gf-rgl.git
```
To get new updates, run the following anywhere in your local copy of the repository:
@@ -83,18 +98,22 @@ To get new updates, run the following anywhere in your local copy of the reposit
$ git pull
```
-=== Contribute your changes: create a fork ===
+=== Contribute your changes: fork the main repository ===
-If you want the possibility to contribute your changes, you should
-[create your own fork https://docs.github.com/en/get-started/quickstart/fork-a-repo]
-of the repository, and then clone that.
+If you want the possibility to contribute your changes,
+you should create your own fork, do your changes there,
+and then send a pull request to the main repository.
+
++ **Creating and cloning a fork —**
+See GitHub documentation for instructions how to [create your own fork https://docs.github.com/en/get-started/quickstart/fork-a-repo]
+of the repository. Once you've done it, clone the fork to your local computer.
```
$ git clone https://github.com//gf-core.git
```
-**Updating your copy —**
-Once you have cloned your fork, you need to set up the main GrammaticalFramework repository as a remote:
++ **Updating your copy —**
+Once you have cloned your fork, you need to set up the main repository as a remote:
```
$ git remote add upstream https://github.com/GrammaticalFramework/gf-core.git
@@ -106,61 +125,44 @@ Then you can get the latest updates by running the following:
$ git pull upstream master
```
-**Recording local changes —**
-If you are new to Git, we recommend to read a tutorial on how to [record and push your changes https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository] to your fork.
++ **Recording local changes —**
+See Git tutorial on how to [record and push your changes https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository] to your fork.
-
-**Pull request —**
++ **Pull request —**
When you want to contribute your changes to the main gf-core repository,
[create a pull request https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request]
from your fork.
-== Compilation from source with Stack ==
-Assuming you have the Haskell Tool Stack, Git, and Haskeline installed, entering
+
+If you want to contribute to the RGL as well, do the same process for the RGL repository.
+
+
+== Compilation from source ==
+
+By now you should have installed Stack and Haskeline, and cloned the Git repository on your own computer, in a directory called ``gf-core``.
+
+=== Primary recommendation: use Stack ===
+
+Open a terminal, go to the top directory (``gf-core``), and type the following command.
```
$ stack install
```
-into a Terminal will install GF and all necessary libraries, including Alex and Happy.
+It will install GF and all necessary tools and libraries to do that.
+=== Alternative: use Cabal ===
+You can also install GF using Cabal, if you prefer Cabal to Stack. In that case, you may need to install some prerequisites yourself.
-== Compilation from source with Cabal ==
-
-The build system of GF is based on //Cabal//, which is part of the
-Haskell Platform, so no extra steps are needed to install it. In the simplest
-case, all you need to do to compile and install GF, after downloading the
-source code as described above, is
+The actual installation process is similar to Stack: open a terminal, go to the top directory (``gf-core``), and type the following command.
```
$ cabal install
```
-//The old (partially outdated) instructions for Cabal are moved to a [separate page ../doc/gf-developers-old-cabal.html]. If you run into trouble with ``cabal install``, you may want to take a look.//
-
-
-%=== SDist ===
-%
-%You can use the command:
-%
-%% This does *NOT* include everything that is needed // TH 2012-08-06
-%```
-%$ cabal sdist
-%```
-%
-%to prepare archive with all source codes needed to compile GF.
-
-=== Known problems with Cabal ===
-
-Some versions of Cabal (at least version 1.16) seem to have a bug that can
-cause the following error:
-
-```
-Configuring gf-3.x...
-setup: Distribution/Simple/PackageIndex.hs:124:8-13: Assertion failed
-```
+//The old (potentially outdated) instructions for Cabal are moved to a [separate page ../doc/gf-developers-old-cabal.html]. If you run into trouble with ``cabal install``, you may want to take a look.//
== Compiling GF with C runtime system support ==
@@ -290,6 +292,10 @@ and then run ``stack install``, also from the top directory.
As of 2018-07-26, the RGL is distributed separately from the GF compiler and runtimes.
+To get the source, follow the previous instructions on [how to clone a repository with Git #getting-source].
+
+After cloning the RGL, you should have a directory named ``gf-rgl`` on your computer.
+
=== Simple ===
To install the RGL, you can use the following commands from within the ``gf-rgl`` repository:
```
@@ -371,8 +377,8 @@ the test diagnostics will show a fail and the areas that failed. e.g.
The fail results overview is available in gf-tests.html which shows 4 columns:
-+ //Results// - only areas that fail will appear. (Note: There are 3 failures in the gf-tests.html which are labelled as (expected). These failures should be ignored.)
-+ //Input// - which is the test written in the .gfs file
-+ //Gold// - the expected output from running the test set out in the .gfs file. This column refers to the contents from the .gold extension files.
-+ //Output// - This column refers to the contents from the .out extension files which are generated as test output.
++ __Results__ - only areas that fail will appear. (Note: There are 3 failures in the gf-tests.html which are labelled as (expected). These failures should be ignored.)
++ __Input__ - which is the test written in the .gfs file
++ __Gold__ - the expected output from running the test set out in the .gfs file. This column refers to the contents from the .gold extension files.
++ __Output__ - This column refers to the contents from the .out extension files which are generated as test output.
After fixing the areas which fail, rerun the test command. Repeat the entire process of fix-and-test until the test suite passes before submitting a pull request to include your changes.
From dfa5b9276d4c5b67b30323f7c3224237fbdaeced Mon Sep 17 00:00:00 2001
From: Inari Listenmaa
Date: Thu, 22 Jul 2021 01:08:00 +0200
Subject: [PATCH 19/41] #gf IRC channel has moved to Libera
---
index.html | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/index.html b/index.html
index c8a990fd6..0fa2c2a70 100644
--- a/index.html
+++ b/index.html
@@ -214,8 +214,8 @@ least one, it may help you to get a first idea of what GF is.
- We run the IRC channel #gf on the Freenode network, where you are welcome to look for help with small questions or just start a general discussion.
- You can open a web chat
+ We run the IRC channel #gf on the Libera network, where you are welcome to look for help with small questions or just start a general discussion.
+ You can open a web chat (type #gf on the field for Channel)
or browse the channel logs.