[Git][ghc/ghc][wip/hadddock-libraries] haddock: Build haddock-api and haddock-library using hadrian

Zubin (@wz1000) gitlab at gitlab.haskell.org
Wed Aug 7 09:06:39 UTC 2024



Zubin pushed to branch wip/hadddock-libraries at Glasgow Haskell Compiler / GHC


Commits:
668d1cb6 by Zubin Duggal at 2024-08-07T14:36:29+05:30
haddock: Build haddock-api and haddock-library using hadrian

We build these two packages as regular boot library dependencies rather
than using the `in-ghc-tree` flag to include the source files into the haddock
executable.

The `in-ghc-tree` flag is moved into haddock-api to ensure that haddock built
from hackage can still find the location of the GHC bindist using `ghc-paths`.

Addresses #24834

This causes a metric decrease under non-release flavours because under these
flavours libraries are compiled with optimisation but executables are not.

Since we move the bulk of the code from the haddock executable to the
haddock-api library, we see a metric decrease on the validate flavours.

Metric Decrease:
    haddock.Cabal
    haddock.base
    haddock.compiler

- - - - -


9 changed files:

- docs/users_guide/9.12.1-notes.rst
- hadrian/src/Hadrian/Haskell/Cabal/Parse.hs
- hadrian/src/Packages.hs
- hadrian/src/Settings/Default.hs
- hadrian/src/Settings/Packages.hs
- hadrian/src/Settings/Warnings.hs
- utils/haddock/haddock-api/haddock-api.cabal
- utils/haddock/haddock-api/src/Haddock/Version.hs
- utils/haddock/haddock.cabal


Changes:

=====================================
docs/users_guide/9.12.1-notes.rst
=====================================
@@ -138,38 +138,40 @@ for further change information.
 
 .. ghc-package-list::
 
-    libraries/array/array.cabal:             Dependency of ``ghc`` library
-    libraries/base/base.cabal:               Core library
-    libraries/binary/binary.cabal:           Dependency of ``ghc`` library
-    libraries/bytestring/bytestring.cabal:   Dependency of ``ghc`` library
-    libraries/Cabal/Cabal/Cabal.cabal:       Dependency of ``ghc-pkg`` utility
-    libraries/Cabal/Cabal-syntax/Cabal-syntax.cabal:  Dependency of ``ghc-pkg`` utility
-    libraries/containers/containers/containers.cabal: Dependency of ``ghc`` library
-    libraries/deepseq/deepseq.cabal:         Dependency of ``ghc`` library
-    libraries/directory/directory.cabal:     Dependency of ``ghc`` library
-    libraries/exceptions/exceptions.cabal:   Dependency of ``ghc`` and ``haskeline`` library
-    libraries/filepath/filepath.cabal:       Dependency of ``ghc`` library
-    compiler/ghc.cabal:                      The compiler itself
-    libraries/ghci/ghci.cabal:               The REPL interface
-    libraries/ghc-boot/ghc-boot.cabal:       Internal compiler library
-    libraries/ghc-boot-th/ghc-boot-th.cabal: Internal compiler library
-    libraries/ghc-compact/ghc-compact.cabal: Core library
-    libraries/ghc-heap/ghc-heap.cabal:       GHC heap-walking library
-    libraries/ghc-prim/ghc-prim.cabal:       Core library
-    libraries/haskeline/haskeline.cabal:     Dependency of ``ghci`` executable
-    libraries/hpc/hpc.cabal:                 Dependency of ``hpc`` executable
-    libraries/integer-gmp/integer-gmp.cabal: Core library
-    libraries/mtl/mtl.cabal:                 Dependency of ``Cabal`` library
-    libraries/parsec/parsec.cabal:           Dependency of ``Cabal`` library
-    libraries/pretty/pretty.cabal:           Dependency of ``ghc`` library
-    libraries/process/process.cabal:         Dependency of ``ghc`` library
-    libraries/stm/stm.cabal:                 Dependency of ``haskeline`` library
-    libraries/template-haskell/template-haskell.cabal: Core library
-    libraries/terminfo/terminfo.cabal:       Dependency of ``haskeline`` library
-    libraries/text/text.cabal:               Dependency of ``Cabal`` library
-    libraries/time/time.cabal:               Dependency of ``ghc`` library
-    libraries/transformers/transformers.cabal: Dependency of ``ghc`` library
-    libraries/unix/unix.cabal:               Dependency of ``ghc`` library
-    libraries/Win32/Win32.cabal:             Dependency of ``ghc`` library
-    libraries/xhtml/xhtml.cabal:             Dependency of ``haddock`` executable
-    libraries/os-string/os-string.cabal:     Dependency of ``filepath`` library
+    libraries/array/array.cabal:                         Dependency of ``ghc`` library
+    libraries/base/base.cabal:                           Core library
+    libraries/binary/binary.cabal:                       Dependency of ``ghc`` library
+    libraries/bytestring/bytestring.cabal:               Dependency of ``ghc`` library
+    libraries/Cabal/Cabal/Cabal.cabal:                   Dependency of ``ghc-pkg`` utility
+    libraries/Cabal/Cabal-syntax/Cabal-syntax.cabal:     Dependency of ``ghc-pkg`` utility
+    libraries/containers/containers/containers.cabal:    Dependency of ``ghc`` library
+    libraries/deepseq/deepseq.cabal:                     Dependency of ``ghc`` library
+    libraries/directory/directory.cabal:                 Dependency of ``ghc`` library
+    libraries/exceptions/exceptions.cabal:               Dependency of ``ghc`` and ``haskeline`` library
+    libraries/filepath/filepath.cabal:                   Dependency of ``ghc`` library
+    compiler/ghc.cabal:                                  The compiler itself
+    libraries/ghci/ghci.cabal:                           The REPL interface
+    libraries/ghc-boot/ghc-boot.cabal:                   Internal compiler library
+    libraries/ghc-boot-th/ghc-boot-th.cabal:             Internal compiler library
+    libraries/ghc-compact/ghc-compact.cabal:             Core library
+    libraries/ghc-heap/ghc-heap.cabal:                   GHC heap-walking library
+    libraries/ghc-prim/ghc-prim.cabal:                   Core library
+    utils/haddock/haddock-api/haddock-api.cabal:         Dependency of ``haddock`` executable
+    utils/haddock/haddock-library/haddock-library.cabal: Dependency of ``haddock`` executable
+    libraries/haskeline/haskeline.cabal:                 Dependency of ``ghci`` executable
+    libraries/hpc/hpc.cabal:                             Dependency of ``hpc`` executable
+    libraries/integer-gmp/integer-gmp.cabal:             Core library
+    libraries/mtl/mtl.cabal:                             Dependency of ``Cabal`` library
+    libraries/parsec/parsec.cabal:                       Dependency of ``Cabal`` library
+    libraries/pretty/pretty.cabal:                       Dependency of ``ghc`` library
+    libraries/process/process.cabal:                     Dependency of ``ghc`` library
+    libraries/stm/stm.cabal:                             Dependency of ``haskeline`` library
+    libraries/template-haskell/template-haskell.cabal:   Core library
+    libraries/terminfo/terminfo.cabal:                   Dependency of ``haskeline`` library
+    libraries/text/text.cabal:                           Dependency of ``Cabal`` library
+    libraries/time/time.cabal:                           Dependency of ``ghc`` library
+    libraries/transformers/transformers.cabal:           Dependency of ``ghc`` library
+    libraries/unix/unix.cabal:                           Dependency of ``ghc`` library
+    libraries/Win32/Win32.cabal:                         Dependency of ``ghc`` library
+    libraries/xhtml/xhtml.cabal:                         Dependency of ``haddock`` executable
+    libraries/os-string/os-string.cabal:                 Dependency of ``filepath`` library


=====================================
hadrian/src/Hadrian/Haskell/Cabal/Parse.hs
=====================================
@@ -80,8 +80,10 @@ import Packages
 -- "Hadrian.Oracles.TextFile.readPackageData" oracle.
 parsePackageData :: Package -> Action PackageData
 parsePackageData pkg = do
-    gpd <- traced "cabal-read" $
+    gpd' <- traced "cabal-read" $
         C.readGenericPackageDescription C.verbose Nothing (C.makeSymbolicPath (pkgCabalFile pkg))
+    -- We need to make the data dir relative to the package path so that cabal can actually find it
+    let gpd = gpd' { C.packageDescription = (C.packageDescription gpd') { C.dataDir = C.makeSymbolicPath (pkgPath pkg) C.</> C.makeRelativePathEx (C.interpretSymbolicPathCWD (C.dataDir (C.packageDescription gpd'))) } }
     let pd      = C.packageDescription gpd
         pkgId   = C.package pd
         name    = C.unPackageName (C.pkgName pkgId)


=====================================
hadrian/src/Packages.hs
=====================================
@@ -6,7 +6,7 @@ module Packages (
     compareSizes, compiler, containers, deepseq, deriveConstants, directory, dumpDecls,
     exceptions, filepath, genapply, genprimopcode, ghc, ghcBignum, ghcBoot, ghcBootTh, ghcBootThNext, ghcPlatform,
     ghcCompact, ghcConfig, ghcExperimental, ghcHeap, ghcInternal, ghci, ghciWrapper, ghcPkg, ghcPrim,
-    ghcToolchain, ghcToolchainBin, haddock, haskeline,
+    ghcToolchain, ghcToolchainBin, haddockApi, haddockLibrary, haddock, haskeline,
     hsc2hs, hp2ps, hpc, hpcBin, integerGmp, integerSimple, iserv, iservProxy,
     libffi, mtl, osString, parsec, pretty, primitive, process, remoteIserv, rts,
     runGhc, semaphoreCompat, stm, templateHaskell, terminfo, text, time, timeout,
@@ -37,7 +37,7 @@ ghcPackages =
     , compareSizes, compiler, containers, deepseq, deriveConstants, directory, dumpDecls
     , exceptions, filepath, genapply, genprimopcode, ghc, ghcBignum, ghcBoot, ghcBootTh, ghcBootThNext, ghcPlatform
     , ghcCompact, ghcConfig, ghcExperimental, ghcHeap, ghcInternal, ghci, ghciWrapper, ghcPkg, ghcPrim
-    , ghcToolchain, ghcToolchainBin, haddock, haskeline, hsc2hs
+    , ghcToolchain, ghcToolchainBin, haddockApi, haddockLibrary, haddock, haskeline, hsc2hs
     , hp2ps, hpc, hpcBin, integerGmp, integerSimple, iserv, libffi, mtl, osString
     , parsec, pretty, process, rts, runGhc, stm, semaphoreCompat, templateHaskell
     , terminfo, text, time, transformers, unlit, unix, win32, xhtml
@@ -54,7 +54,7 @@ array, base, binary, bytestring, cabalSyntax, cabal, checkPpr, checkExact, count
   compareSizes, compiler, containers, deepseq, deriveConstants, directory, dumpDecls,
   exceptions, filepath, genapply, genprimopcode, ghc, ghcBignum, ghcBoot, ghcBootTh, ghcBootThNext, ghcPlatform,
   ghcCompact, ghcConfig, ghcExperimental, ghcHeap, ghci, ghcInternal, ghciWrapper, ghcPkg, ghcPrim,
-  ghcToolchain, ghcToolchainBin, haddock, haskeline, hsc2hs,
+  ghcToolchain, ghcToolchainBin, haddockLibrary, haddockApi, haddock, haskeline, hsc2hs,
   hp2ps, hpc, hpcBin, integerGmp, integerSimple, iserv, iservProxy, remoteIserv, libffi, mtl,
   osString, parsec, pretty, primitive, process, rts, runGhc, semaphoreCompat, stm, templateHaskell,
   terminfo, text, time, transformers, unlit, unix, win32, xhtml,
@@ -99,6 +99,8 @@ ghcPkg              = util "ghc-pkg"
 ghcPrim             = lib  "ghc-prim"
 ghcToolchain        = lib  "ghc-toolchain"     `setPath` "utils/ghc-toolchain"
 ghcToolchainBin     = prg  "ghc-toolchain-bin" `setPath` "utils/ghc-toolchain/exe" -- workaround for #23690
+haddockLibrary      = lib "haddock-library" `setPath` "utils/haddock/haddock-library"
+haddockApi          = lib "haddock-api" `setPath` "utils/haddock/haddock-api"
 haddock             = util "haddock"
 haskeline           = lib  "haskeline"
 hsc2hs              = util "hsc2hs"


=====================================
hadrian/src/Settings/Default.hs
=====================================
@@ -93,6 +93,8 @@ stage0Packages = do
              , ghcPlatform
              , ghcToolchain
              , ghci
+             , haddockApi
+             , haddockLibrary
              , haddock
              , hp2ps
              , hpc


=====================================
hadrian/src/Settings/Packages.hs
=====================================
@@ -183,7 +183,7 @@ packageArgs = do
           [ builder (Ghc LinkHs) ? arg "-optl-Wl,--export-dynamic" ]
 
         -------------------------------- haddock -------------------------------
-        , package haddock ?
+        , package haddockApi ?
           builder (Cabal Flags) ? arg "in-ghc-tree"
 
         ---------------------------- ghc-boot-th-next --------------------------


=====================================
hadrian/src/Settings/Warnings.hs
=====================================
@@ -52,9 +52,10 @@ ghcWarningsArgs = do
                                       , "-Wincomplete-record-updates"
                                       ]
         , package ghcPrim      ? pure [ "-Wno-trustworthy-safe" ]
-        , package haddock      ? pure [ "-Wno-unused-imports"
-                                      , "-Wno-deprecations"
-                                      , "-Wno-x-partial" ]
+        , package haddockLibrary ? pure [ "-Wno-unused-imports" ]
+        , package haddockApi     ? pure [ "-Wno-unused-imports"
+                                        , "-Wno-deprecations"
+                                        , "-Wno-x-partial" ]
         , package haskeline    ? pure [ "-Wno-deprecations"
                                       , "-Wno-x-partial"
                                       , "-Wno-unused-imports"


=====================================
utils/haddock/haddock-api/haddock-api.cabal
=====================================
@@ -63,14 +63,23 @@ common ghc-options
     -fdicts-strict -Wunused-packages -funbox-strict-fields
     -Wnoncanonical-monad-instances -Wmissing-home-modules
 
+flag in-ghc-tree
+  description: Are we in a GHC tree?
+  default: False
+  manual: True
+
 library
   import: extensions
   import: ghc-options
 
+  if flag(in-ghc-tree)
+    cpp-options: -DIN_GHC_TREE
+  else
+    build-depends: ghc-paths       ^>= 0.1.0.12
+
   -- this package typically supports only single major versions
   build-depends: base             >= 4.16 && < 4.21
                , ghc             ^>= 9.11
-               , ghc-paths       ^>= 0.1.0.12
                , haddock-library ^>= 1.11
                , xhtml           ^>= 3000.2.2
                , parsec          ^>= 3.1.13.0


=====================================
utils/haddock/haddock-api/src/Haddock/Version.hs
=====================================
@@ -20,11 +20,7 @@ module Haddock.Version
 
 import Data.Version (showVersion)
 
-#ifdef IN_GHC_TREE
-import Paths_haddock ( version )
-#else
 import Paths_haddock_api ( version )
-#endif
 
 projectName :: String
 projectName = "Haddock"


=====================================
utils/haddock/haddock.cabal
=====================================
@@ -54,11 +54,6 @@ extra-source-files:
   hoogle-test/src/**/*.hs
   hoogle-test/ref/**/*.txt
 
-flag in-ghc-tree
-  description: Are we in a GHC tree?
-  default: False
-  manual: True
-
 flag threaded
   description: Build haddock with the threaded RTS
   default: True
@@ -96,86 +91,10 @@ executable haddock
 
   -- haddock typically only supports a single GHC major version
   build-depends:
-    base >= 4.13.0.0 && <4.21
-
-  if flag(in-ghc-tree)
-    hs-source-dirs: haddock-api/src,  haddock-library/src
-    cpp-options: -DIN_GHC_TREE
-    build-depends:
-      filepath,
-      directory,
-      containers,
-      deepseq,
-      exceptions,
-      array,
-      xhtml >= 3000.2 && < 3000.3,
-      ghc-boot,
-      ghc == 9.11.*,
-      bytestring,
-      parsec,
-      text,
-      transformers,
-      mtl
-
-    other-modules:
-      Documentation.Haddock.Parser
-      Documentation.Haddock.Parser.Monad
-      Documentation.Haddock.Parser.Identifier
-      Documentation.Haddock.Types
-      Documentation.Haddock.Doc
-      Documentation.Haddock.Parser.Util
-      Documentation.Haddock.Markup
-
-      Documentation.Haddock
-      Haddock
-      Haddock.Interface
-      Haddock.Interface.Json
-      Haddock.Interface.Rename
-      Haddock.Interface.Create
-      Haddock.Interface.AttachInstances
-      Haddock.Interface.LexParseRn
-      Haddock.Interface.ParseModuleHeader
-      Haddock.Interface.RenameType
-      Haddock.Parser
-      Haddock.Utils
-      Haddock.Utils.Json
-      Haddock.Utils.Json.Parser
-      Haddock.Utils.Json.Types
-      Haddock.Backends.Xhtml
-      Haddock.Backends.Xhtml.Decl
-      Haddock.Backends.Xhtml.DocMarkup
-      Haddock.Backends.Xhtml.Layout
-      Haddock.Backends.Xhtml.Meta
-      Haddock.Backends.Xhtml.Names
-      Haddock.Backends.Xhtml.Themes
-      Haddock.Backends.Xhtml.Types
-      Haddock.Backends.Xhtml.Utils
-      Haddock.Backends.LaTeX
-      Haddock.Backends.HaddockDB
-      Haddock.Backends.Hoogle
-      Haddock.Backends.Hyperlinker
-      Haddock.Backends.Hyperlinker.Parser
-      Haddock.Backends.Hyperlinker.Renderer
-      Haddock.Backends.Hyperlinker.Types
-      Haddock.Backends.Hyperlinker.Utils
-      Haddock.ModuleTree
-      Haddock.Types
-      Haddock.Doc
-      Haddock.Version
-      Haddock.InterfaceFile
-      Haddock.Options
-      Haddock.GhcUtils
-      Haddock.Convert
-
-      Paths_haddock
-
-    autogen-modules:
-      Paths_haddock
-
-  else
+    base >= 4.13.0.0 && <4.21,
     -- in order for haddock's advertised version number to have proper meaning,
     -- we pin down to a single haddock-api version.
-    build-depends:  haddock-api == 2.30.0
+    haddock-api == 2.30.0
 
 test-suite html-test
   import: extensions



View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/668d1cb6c6f909d1e4f6cb45d21a791b9ff43886

-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/668d1cb6c6f909d1e4f6cb45d21a791b9ff43886
You're receiving this email because of your account on gitlab.haskell.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20240807/3ab85ca4/attachment-0001.html>


More information about the ghc-commits mailing list