🥬

rules_haskell v0.16 でビルドする

2023/03/31に公開

https://github.com/tweag/rules_haskell/releases/tag/v0.16

GHC は 9.2.5 に対応しているので、それでビルドします(現在対応する Stackage resolver は lts-20.11)。

エラーの対応

macOS でやってます。

Cabal

ERROR: /sandbox/external/stackage/BUILD.bazel:3833:22: HaskellCabalLibrary @stackage//:unliftio-core failed: (Exit 1): cabal_wrapper failed: error executing command bazel-out/host/bin/external/rules_haskell/haskell/cabal_wrapper bazel-out/darwin-fastbuild/bin/external/stackage/unliftio-core_cabal_wrapper_args.json

Use --sandbox_debug to see verbose messages from the sandbox

../../../bazel-out/darwin-fastbuild/bin/external/stackage/unliftio-core-0.2.1.0/unliftio-core-0.2.1.0/build/autogen/Paths_unliftio_core.hs:48:17: error:
    Variable not in scope: splitFileName :: FilePath -> (a, b0)
   |
48 |   let (dir,_) = splitFileName exePath
   |                 ^^^^^^^^^^^^^

../../../bazel-out/darwin-fastbuild/bin/external/stackage/unliftio-core-0.2.1.0/unliftio-core-0.2.1.0/build/autogen/Paths_unliftio_core.hs:49:16: error:
    Variable not in scope: minusFileName :: t0 -> String -> String
   |
49 |   return ((dir `minusFileName` "bin") `joinFileName` dirRel)
   |                ^^^^^^^^^^^^^^^
Traceback (most recent call last):
  File "/sandbox/darwin-sandbox/277/execroot/mdium/bazel-out/host/bin/external/rules_haskell/haskell/runghc.runfiles/rules_haskell/haskell/runghc.py", line 9, in <module>
    subprocess.run([r.Rlocation("rules_haskell_ghc_darwin_amd64/bin/runghc")] + sys.argv[1:], check=True)
  File "/usr/local/Cellar/python@3.9/3.9.10/Frameworks/Python.framework/Versions/3.9/lib/python3.9/subprocess.py", line 528, in run
    raise CalledProcessError(retcode, process.args,

前にも起きてたやつです。直したんですけど、なんやかんやあって戻っちゃったみたいです。これの原因自体は、Cabal が 3.6 から splitFileName 関数と minusFileName 関数を生成しなくなったためです。で、これどうすればいいかというと:

https://github.com/tweag/rules_haskell/issues/1832#issuecomment-1363738039

2つの関数を生成するようにパッチを当てた Cabal を Tweag が用意してあるので、それを使うように stack snapshot を書き換えて、全ての依存パッケージがこの Cabal を使うように "hoge": ["@stackage//:Cabal"]setup_deps へ追記します。

全ての依存パッケージは stack ls dependencies とかで列挙できます。

digest package

ERROR: /sandbox/external/stackage/BUILD.bazel:1282:22: HaskellCabalLibrary @stackage//:digest failed: (Exit 1): cabal_wrapper failed: error executing command bazel-out/host/bin/external/rules_haskell/haskell/cabal_wrapper bazel-out/darwin-fastbuild/bin/external/stackage/digest_cabal_wrapper_args.json

Use --sandbox_debug to see verbose messages from the sandbox
clang: warning: argument unused during compilation: '-no-pie' [-Wunused-command-line-argument]
Setup.hs: The program 'pkg-config' version >=0.9.0 is required but it could
not be found.

Traceback (most recent call last):
  File "/sandbox/darwin-sandbox/318/execroot/mdium/bazel-out/host/bin/external/rules_haskell/haskell/runghc.runfiles/rules_haskell/haskell/runghc.py", line 9, in <module>
    subprocess.run([r.Rlocation("rules_haskell_ghc_darwin_amd64/bin/runghc")] + sys.argv[1:], check=True)
  File "/usr/local/Cellar/python@3.9/3.9.10/Frameworks/Python.framework/Versions/3.9/lib/python3.9/subprocess.py", line 528, in run
    raise CalledProcessError(retcode, process.args,

エラーメッセージは「The program 'pkg-config' version >=0.9.0 is required but it could not be found.」の部分です。色々調べた結果、digest パッケージ側の問題でした:

https://github.com/TeofilC/digest/pull/11

Bazel の場合、pkgconfig-depends が機能しないっぽいので、フラグで指定したいという PR です。lts-20.11 の場合は digest-0.0.1.5 で、これがリリースされたのが 0.0.1.6 なのでバージョンを上げて、次のようにしてフラグを指定します:

     },
+    flags = {
+        "digest": ["-pkg-config"],
+    },
     local_snapshot = "//:stack-snapshot.yaml",
 )

ちなみに、Cabal のフラグ機能は頭に - を付けると False に、+ を付けると True になるみたいです

おしまい

Discussion