haskell-jp / beginners #21 at 2022-07-20 01:14:21 +0900

今 sdl2 のライブラリを stack でインストールしようとしているのですが、
 sdl2> configure
 sdl2> Configuring sdl2-2.5.3.0...
 sdl2> Cabal-simple_Z6RU0evB_3.4.1.0_ghc-9.0.2.exe: The pkg-config package 'sdl2'
 sdl2> version >=2.0.6 is required but it could not be found.

こんな具合に止まってしまいます。
どうしたものでしょうか。
初めて見かけるエラーメッセージなので読んでの推測ですが、sdl2パッケージはC言語で書かれたSDLのbindingなので、お使いのOSのパッケージマネージャーを利用して事前にSDLをインストールする必要があると思われます。
例えばUbuntuやDebianであれば
sudo apt install libsdl2-2.0 libsdl2-dev

でインストールできるようです。
参考: https://wiki.libsdl.org/Installation
Windows なんですよね...
調べてみます。
Windowsの場合、stack.yamlの extra-include-dirsextra-lib-dirs に、それぞれヘッダーファイルへのパスとdllファイルへのパスを設定することになるでしょう。
https://docs.haskellstack.org/en/stable/yaml_configuration/#extra-include-dirsextra-lib-dirs
おおおお
ありがたい!
早速試してみます!
pkg-config が情報を探しにいってるっぽいので stack.yaml でうまくいくんだろうか?(確信はない
sdl2.cabal に↓の記述が
    pkgconfig-depends:
      sdl2 >= 2.0.6

MSYS2 内じゃないとビルドできないかも?
MSYS2 で、ビルド.....
なるほど、であればstackがインストールしたMSYS2を使うようにして
stack exec -- pacman -S mingw-w64-x86_64-SDL2

ならいかがでしょうか?
https://packages.msys2.org/search?t=binpkg&q=sdl2 で探してみてもどれがそれなのかイマイチ確信が持てませんでしたが
> stack exec -- pacman -S mingw-w64-x86_64-SDL2
resolving dependencies...
looking for conflicting packages...

Packages (9) mingw-w64-x86_64-gcc-libs-10.3.0-2  mingw-w64-x86_64-gmp-6.2.1-2
             mingw-w64-x86_64-libiconv-1.16-2
             mingw-w64-x86_64-libwinpthread-git-9.0.0.6215.788f57701-1  mingw-w64-x86_64-mpc-1.2.1-1
             mingw-w64-x86_64-mpfr-4.1.0-3  mingw-w64-x86_64-vulkan-headers-1.2.179-1
             mingw-w64-x86_64-vulkan-loader-1.2.179-2  mingw-w64-x86_64-SDL2-2.0.14-2

Total Download Size:    2.16 MiB
Total Installed Size:  26.43 MiB

:: Proceed with installation? [Y/n] y
:: Retrieving packages...
 mingw-w64-x86_64-mpfr-4.1.0...   357.1 KiB   235 KiB/s 00:02 [################################] 100%
 mingw-w64-x86_64-mpc-1.2.1-...    72.7 KiB  35.5 MiB/s 00:00 [################################] 100%
 mingw-w64-x86_64-libiconv-1...   744.5 KiB  1076 KiB/s 00:01 [################################] 100%
 mingw-w64-x86_64-SDL2-2.0.1...  1038.0 KiB   956 KiB/s 00:01 [################################] 100%
(9/9) checking keys in keyring                                [################################] 100%
(9/9) checking package integrity                              [################################] 100%
error: mingw-w64-x86_64-mpfr: signature from "David Macek <[email protected]>" is unknown trust
:: File /var/cache/pacman/pkg/mingw-w64-x86_64-mpfr-4.1.0-3-any.pkg.tar.zst is corrupted (invalid or corrupted package (PGP signature)).
Do you want to delete it? [Y/n] y
error: mingw-w64-x86_64-mpc: signature from "David Macek <[email protected]>" is unknown trust
:: File /var/cache/pacman/pkg/mingw-w64-x86_64-mpc-1.2.1-1-any.pkg.tar.zst is corrupted (invalid or corrupted package (PGP signature)).
Do you want to delete it? [Y/n] y
error: mingw-w64-x86_64-libiconv: signature from "David Macek <[email protected]>" is unknown trust
:: File /var/cache/pacman/pkg/mingw-w64-x86_64-libiconv-1.16-2-any.pkg.tar.zst is corrupted (invalid or corrupted package (PGP signature)).
Do you want to delete it? [Y/n] y
error: mingw-w64-x86_64-SDL2: signature from "David Macek <[email protected]>" is unknown trust
:: File /var/cache/pacman/pkg/mingw-w64-x86_64-SDL2-2.0.14-2-any.pkg.tar.zst is corrupted (invalid or corrupted package (PGP signature)).
Do you want to delete it? [Y/n] y
error: failed to commit transaction (invalid or corrupted package (PGP signature))
Errors occurred, no packages were upgraded.

なんだかエラーが出て破損してるみたいです...
なんとか頑張ってみます。
手元でも同じになりましたね……:thinking_face:
なるほど...
ヘッダーファイルなどを直接指定しないと難しそうであれば、cabalファイルを書き換えて https://stackoverflow.com/questions/4959802/how-to-specify-dependency-on-external-c-library-in-cabal を参考にWindowsの場合はextra-lib-dirsなどが使えるようにする、という手も考えられますね。
そのままだと使えないのですか?
ざっとcabalファイルを読んだ限り現状だとpkgconfigを必ず使うようになってしまっているようなので、恐らくcabalファイルを書き換えないとダメではないかと思います。
https://github.com/haskell-game/sdl2/blob/master/sdl2.cabal
なるほど
pacman -S mingw64/mingw-w64-x86_64-SDL2 でエラーになる問題はこれでした
https://www.msys2.org/news/#2020-06-29-new-packagers
で、`pacman -S mingw64/mingw-w64-x86_64-SDL2` は成功したけど The program 'pkg-config' version >=0.9.0 is required but it could not be found. は変わらずですねえ
pkg-config 自体がインストールされてなかった
pacman -S mingw64/mingw-w64-x86_64-pkg-config
:tada:
すみません、病院に行っていました。
どういう感じですかね?
pacman -S mingw64/mingw-w64-x86_64-SDL2

これはエラー出ませんでした。
pkg-config もインストールされてますね。
お、その状態であれば Haskell の sdl2 のビルド成功しませんかね?
変わらず成功しませんね...
Windows PowerShell で stack install sdl2
しましたが、以前と変わらないエラーが出ました。
stack exec -- pacman -S mingw64/mingw-w64-x86_64-SDL2 pkg-config ならどうでしょうか!
Executable named pacman not found on path

だそうです...
昨日までは stack exec ちゃんと動いてたんですよね...
:confused: うーん、二重に変なことが起きてますね。普通はGHCをstackでインストールした場合は、同時にstackが管理するディレクトリーにMSYS2をインストールするので、 stack exec pacman したらまずそこにあるpacmanを見に行くはずなんですがそれがなくて、その上別途MSYS2をインストールしていてそのpacmanは使えていた、と言うことでしょうから、仮にstackがインストールした方のpacmanが消えていたとしても別途インストールした方のものが呼ばれると思うのですが...
改めて普通に pacman を実行するとどうなりますか?
MSYS2 の上では動いてますね
ああー、そういうことか。MSYS2のツールがグローバルな PATH では参照されてない、と。だからそっちに pkg-config などをいれてもうまく行かなかったわけですね。デフォルトであればstackがインストールする MSYS2 は C:\Users\<Windowsのユーザー名>\AppData\Local\Programs\stack\x86_64-windows にインストールされるはずですが、どうなっていますか?インストール済みであれば「msys2-」で始まるファイルやディレクトリーがいくつかあるはずです。
色々入れ直したら動きました!
error: mingw-w64-x86_64-mpfr: signature from "David Macek <[email protected]>" is unknown trust

こんなこと言われました
https://www.msys2.org/news/#2020-06-29-new-packagers と同じ問題かと思います。直すには、このページに書かれている pacman コマンドを stack exec -- pacman で読み替えれば解決できると思います。
あと msys2- で始まるファイルなどを複数見つけられました