daml/bazel_tools/haskell-optional-cabal-haddock.patch
Andreas Herrmann 91f5dd573f stack update (#3935)
* Remove manual stack update

* Update rules_haskell

* rules_haskell_worker_dependencies after bazel-haskell-deps

* Update rules_haskell Windows patch

* make cabal haddock optional

* Don't generate Haddocks on stack_snapshot

Fails with ghc-lib and takes more time to build.

Co-authored-by: Andreas Herrmann <andreash87@gmx.ch>
2020-01-06 10:24:15 +00:00

261 lines
10 KiB
Diff

From 0d20e37429257b97d2f5387a32f2062b90426a13 Mon Sep 17 00:00:00 2001
From: Andreas Herrmann <andreas.herrmann@tweag.io>
Date: Tue, 31 Dec 2019 15:10:50 +0100
Subject: [PATCH 1/3] Cabal optional haddock outputs
---
haskell/cabal.bzl | 69 ++++++++++++++++++----------
haskell/private/cabal_wrapper.py.tpl | 7 ++-
2 files changed, 49 insertions(+), 27 deletions(-)
diff --git a/haskell/cabal.bzl b/haskell/cabal.bzl
index 8663eb09..3b9c5691 100644
--- a/haskell/cabal.bzl
+++ b/haskell/cabal.bzl
@@ -97,7 +97,7 @@ def _cabal_tool_flag(tool):
def _binary_paths(binaries):
return [binary.dirname for binary in binaries.to_list()]
-def _prepare_cabal_inputs(hs, cc, posix, dep_info, cc_info, direct_cc_info, component, package_id, tool_inputs, tool_input_manifests, cabal, setup, srcs, compiler_flags, flags, cabal_wrapper, package_database):
+def _prepare_cabal_inputs(hs, cc, posix, dep_info, cc_info, direct_cc_info, component, package_id, tool_inputs, tool_input_manifests, cabal, setup, srcs, compiler_flags, flags, generate_haddock, cabal_wrapper, package_database):
"""Compute Cabal wrapper, arguments, inputs."""
with_profiling = is_profiling_enabled(hs)
@@ -121,7 +121,7 @@ def _prepare_cabal_inputs(hs, cc, posix, dep_info, cc_info, direct_cc_info, comp
direct_cc_info.compilation_context.system_includes,
])
direct_lib_dirs = [file.dirname for file in direct_libs.to_list()]
- args.add_all([component, package_id, setup, cabal.dirname, package_database.dirname])
+ args.add_all([component, package_id, generate_haddock, setup, cabal.dirname, package_database.dirname])
args.add("--flags=" + " ".join(flags))
args.add_all(compiler_flags, format_each = "--ghc-option=%s")
args.add("--")
@@ -198,14 +198,18 @@ def _haskell_cabal_library_impl(ctx):
"_install/{}_data".format(package_id),
sibling = cabal,
)
- haddock_file = hs.actions.declare_file(
- "_install/{}_haddock/{}.haddock".format(package_id, ctx.attr.name),
- sibling = cabal,
- )
- haddock_html_dir = hs.actions.declare_directory(
- "_install/{}_haddock_html".format(package_id),
- sibling = cabal,
- )
+ if ctx.attr.haddock:
+ haddock_file = hs.actions.declare_file(
+ "_install/{}_haddock/{}.haddock".format(package_id, ctx.attr.name),
+ sibling = cabal,
+ )
+ haddock_html_dir = hs.actions.declare_directory(
+ "_install/{}_haddock_html".format(package_id),
+ sibling = cabal,
+ )
+ else:
+ haddock_file = None
+ haddock_html_dir = None
static_library_filename = "_install/lib/libHS{}.a".format(package_id)
if with_profiling:
static_library_filename = "_install/lib/libHS{}_p.a".format(package_id)
@@ -243,23 +247,27 @@ def _haskell_cabal_library_impl(ctx):
srcs = ctx.files.srcs,
compiler_flags = user_compile_flags,
flags = ctx.attr.flags,
+ generate_haddock = ctx.attr.haddock,
cabal_wrapper = ctx.executable._cabal_wrapper,
package_database = package_database,
)
+ outputs = [
+ package_database,
+ interfaces_dir,
+ static_library,
+ data_dir,
+ ]
+ if ctx.attr.haddock:
+ outputs.extend([haddock_file, haddock_html_dir])
+ if dynamic_library != None:
+ outputs.append(dynamic_library)
ctx.actions.run(
executable = c.cabal_wrapper,
arguments = [c.args],
inputs = c.inputs,
input_manifests = c.input_manifests,
tools = [c.cabal_wrapper],
- outputs = [
- package_database,
- interfaces_dir,
- static_library,
- data_dir,
- haddock_file,
- haddock_html_dir,
- ] + ([dynamic_library] if dynamic_library != None else []),
+ outputs = outputs,
env = c.env,
mnemonic = "HaskellCabalLibrary",
progress_message = "HaskellCabalLibrary {}".format(hs.label),
@@ -291,12 +299,15 @@ def _haskell_cabal_library_impl(ctx):
compile_flags = [],
)
lib_info = HaskellLibraryInfo(package_id = package_id, version = None, exports = [])
- doc_info = generate_unified_haddock_info(
- this_package_id = package_id,
- this_package_html = haddock_html_dir,
- this_package_haddock = haddock_file,
- deps = ctx.attr.deps,
- )
+ if ctx.attr.haddock:
+ doc_info = generate_unified_haddock_info(
+ this_package_id = package_id,
+ this_package_html = haddock_html_dir,
+ this_package_haddock = haddock_file,
+ deps = ctx.attr.deps,
+ )
+ else:
+ doc_info = None
cc_toolchain = find_cpp_toolchain(ctx)
feature_configuration = cc_common.configure_features(
ctx = ctx,
@@ -324,7 +335,10 @@ def _haskell_cabal_library_impl(ctx):
cc_info,
],
)
- return [default_info, hs_info, cc_info, lib_info, doc_info]
+ result = [default_info, hs_info, cc_info, lib_info]
+ if ctx.attr.haddock:
+ result.append(doc_info)
+ return result
haskell_cabal_library = rule(
_haskell_cabal_library_impl,
@@ -336,6 +350,10 @@ haskell_cabal_library = rule(
doc = "Version of the Cabal package.",
mandatory = True,
),
+ "haddock": attr.bool(
+ default = True,
+ doc = "Whether to generate haddock documentation.",
+ ),
"srcs": attr.label_list(allow_files = True),
"deps": attr.label_list(),
"compiler_flags": attr.string_list(
@@ -451,6 +469,7 @@ def _haskell_cabal_binary_impl(ctx):
srcs = ctx.files.srcs,
compiler_flags = user_compile_flags,
flags = ctx.attr.flags,
+ generate_haddock = False,
cabal_wrapper = ctx.executable._cabal_wrapper,
package_database = package_database,
)
diff --git a/haskell/private/cabal_wrapper.py.tpl b/haskell/private/cabal_wrapper.py.tpl
index d7b0f618..d066f64a 100755
--- a/haskell/private/cabal_wrapper.py.tpl
+++ b/haskell/private/cabal_wrapper.py.tpl
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
-# cabal_wrapper.py <COMPONENT> <PKG_NAME> <SETUP_PATH> <PKG_DIR> <PACKAGE_DB_PATH> [EXTRA_ARGS...] -- [PATH_ARGS...]
+# cabal_wrapper.py <COMPONENT> <PKG_NAME> <HADDOCK> <SETUP_PATH> <PKG_DIR> <PACKAGE_DB_PATH> [EXTRA_ARGS...] -- [PATH_ARGS...]
#
# This wrapper calls Cabal's configure/build/install steps one big
# action so that we don't have to track all inputs explicitly between
@@ -8,6 +8,7 @@
#
# COMPONENT: Cabal component to build.
# PKG_NAME: Package ID of the resulting package.
+# HADDOCK: Whether to generate haddock documentation.
# SETUP_PATH: Path to Setup.hs
# PKG_DIR: Directory containing the Cabal file
# PACKAGE_DB_PATH: Output package DB path.
@@ -63,6 +64,7 @@ os.environ["PATH"] = canonicalize_path(os.getenv("PATH", ""))
component = sys.argv.pop(1)
name = sys.argv.pop(1)
+haddock = sys.argv.pop(1) == "true"
execroot = os.getcwd()
setup = os.path.join(execroot, sys.argv.pop(1))
srcdir = os.path.join(execroot, sys.argv.pop(1))
@@ -155,7 +157,8 @@ with tmpdir() as distdir:
[ "--package-db=" + package_database ], # This arg must come last.
)
run([runghc, setup, "build", "--verbose=0", "--builddir=" + distdir])
- run([runghc, setup, "haddock", "--verbose=0", "--builddir=" + distdir])
+ if haddock:
+ run([runghc, setup, "haddock", "--verbose=0", "--builddir=" + distdir])
run([runghc, setup, "install", "--verbose=0", "--builddir=" + distdir])
# Bazel builds are not sandboxed on Windows and can be non-sandboxed on
# other OSs. Operations like executing `configure` scripts can modify the
From 61c0d3307815d9022df95066f2f68238de9bf5bd Mon Sep 17 00:00:00 2001
From: Andreas Herrmann <andreas.herrmann@tweag.io>
Date: Tue, 31 Dec 2019 16:18:25 +0100
Subject: [PATCH 2/3] Add test-case for `haddock = False`
---
tests/haskell_cabal_library/BUILD.bazel | 1 +
tests/haskell_cabal_library/SecondLib.hs | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/tests/haskell_cabal_library/BUILD.bazel b/tests/haskell_cabal_library/BUILD.bazel
index 80ccb066..784a8d86 100644
--- a/tests/haskell_cabal_library/BUILD.bazel
+++ b/tests/haskell_cabal_library/BUILD.bazel
@@ -34,6 +34,7 @@ haskell_cabal_library(
"SecondLib.hs",
"second-lib.cabal",
],
+ haddock = False,
version = "0.1.0.0",
)
diff --git a/tests/haskell_cabal_library/SecondLib.hs b/tests/haskell_cabal_library/SecondLib.hs
index 44844bbf..2f2e6797 100644
--- a/tests/haskell_cabal_library/SecondLib.hs
+++ b/tests/haskell_cabal_library/SecondLib.hs
@@ -1,4 +1,4 @@
module SecondLib where
y :: Int
-y = 3
+y = 3 -- ^ Intentionally broken haddock comment to test @haddock = False@.
From 338815be67925a3fffe33375e133986eae80dc27 Mon Sep 17 00:00:00 2001
From: Andreas Herrmann <andreas.herrmann@tweag.io>
Date: Tue, 31 Dec 2019 16:23:46 +0100
Subject: [PATCH 3/3] stack_snapshot: Expose haddock attribute
---
haskell/cabal.bzl | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/haskell/cabal.bzl b/haskell/cabal.bzl
index 3b9c5691..280007eb 100644
--- a/haskell/cabal.bzl
+++ b/haskell/cabal.bzl
@@ -912,6 +912,7 @@ haskell_library(
haskell_cabal_library(
name = "{name}",
version = "{version}",
+ haddock = {haddock},
flags = {flags},
srcs = glob(["{dir}/**"]),
deps = {deps},
@@ -922,6 +923,7 @@ haskell_cabal_library(
""".format(
name = package.name,
version = package.version,
+ haddock = repr(repository_ctx.attr.haddock),
flags = package.flags,
dir = package.sdist,
deps = package.deps + [
@@ -951,6 +953,10 @@ _stack_snapshot = repository_rule(
"packages": attr.string_list(),
"vendored_packages": attr.label_keyed_string_dict(),
"flags": attr.string_list_dict(),
+ "haddock": attr.bool(
+ default = True,
+ doc = "Whether to generate haddock documentation",
+ ),
"extra_deps": attr.label_keyed_string_dict(),
"tools": attr.label_list(),
"stack": attr.label(),