Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

static binary を作るためのフラグ追加 #29

Closed
wants to merge 8 commits into from

Conversation

waddlaw
Copy link
Contributor

@waddlaw waddlaw commented Oct 28, 2018

#33 静的にリンクされたバイナリを作るためのフラグを追加。

コードは stack からコピペしてきました。
https://github.com/commercialhaskell/stack/blob/master/package.yaml#L281

$ stack build
...
$ ldd $(stack exec which mmlh)
        linux-vdso.so.1 (0x00007ffe903fc000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6a169a4000)
        libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f6a1677a000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f6a16572000)
        libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f6a1636f000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6a1616b000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f6a15f4c000)
        libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f6a15ccb000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6a158da000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f6a16d42000)

$ stack install --flag makeMistakesToLearnHaskell:static
$ ldd $(stack exec which mmlh)
        動的実行ファイルではありません

@igrep
Copy link
Member

igrep commented Oct 28, 2018

うーん、ありがたいんですが、これを持ってしてもWindows版やMac版がサポートされない点や、assetsを含めなくちゃいけない点など、ちょっとやることが多いので、後回しにしたいです。
(🤔 WindowsはWSLを使えばいけるのかな。。。)

@waddlaw
Copy link
Contributor Author

waddlaw commented Oct 28, 2018

Windows は考えてなかったですね・・・。

assetsを含めなくちゃいけない点

これはスクリプトをちょっと書けば良いかなと思ってます。(たぶん)

@waddlaw
Copy link
Contributor Author

waddlaw commented Oct 28, 2018

変更点

  • isDocker フラグを Env に追加 (Docker 環境下ではイメージサイズを減らすために stack 経由の runhaskell ではなく、直接 runhaskell を呼びたいため。フラグはとりあえず、環境変数 MMLH_DOCKER_MODE が設定されていれば True になります)
  • assets が相対パスで見つかれば、それを利用するように修正。(見つからない場合は既存の動作)
  • stack image container コマンドで Docker ファイルを作成するように設定変更
  • ベースイメージに phadej/ghc:8.4.2-ubuntu を使うだけだと日本語の文字コード関連?でエラーになるので、haskell-works/stack-build の内容を追加して、ちょっとカスタマイズしました。

実際に発生したエラーメッセージ。

<stdout>: commitAndReleaseBuffer: invalid argument (invalid character)

Copy link
Member

@igrep igrep left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

遅くまでやっていただいて申し訳ないですが、ちょっと少なくともDockerによるインストールはそれはそれでハードルが上がるので受け入れがたいです。
実行方法が複雑になる点については確か改善策があった(名前を忘れてしまった...)かと思いますが、
#33 (comment) の点については今一度検討いただきたいです。

resolveInterpreterInDocker =
Dir.findExecutable "runhaskell" >>= \case
Nothing -> error "Not found runhaskell program"
Just p -> return [executableName, "--", optionAlwaysColor]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これは必要ですか?
現状でもstackを必須としているわけではなく、stackが見つからなかったら自動で PATH から runhaskellを探すようになっているはずですが...
☝️ の37 - 39行目がそうです。

あと、当プロジェクトの方針上、LambdaCaseの使用は避けていただきたく。
https://github.com/haskell-jp/makeMistakesToLearnHaskell#%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

現状でもstackを必須としているわけではなく、stackが見つからなかったら自動で PATH から runhaskellを探すようになっているはずですが...

なんでだろう。実行するとコマンドが反応しなくなったので、あとでもう一度確認してみます。

あと、当プロジェクトの方針上、LambdaCaseの使用は避けていただきたく。

すみません、見落としてました。

@@ -206,6 +207,7 @@ hasNoMainFirst src =
-- TODO: refactor with resultForUser
runHaskellExercise :: Diagnosis -> Text -> Env -> FilePath -> IO Result
runHaskellExercise diag right e prgFile = do
print "runHaskellExercise:"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

デバッグコードが残った?

shell> docker run --rm -it -v $(pwd)/ans:/app/ans mmlh-entrypoint.sh bash

# または
shell> docker run --rm -it -v $(pwd)/ans:/app/ans mmlh-entrypoint.sh -- mmlh verify ans/A.hs
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

entrypointの名前が食い違っていませんか?
あと、やっぱりちょっととっつきにくくなるな。。。と。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mmlh-entrypoint.sh というイメージ名です。

@waddlaw
Copy link
Contributor Author

waddlaw commented Oct 29, 2018

遅くまでやっていただいて申し訳ないですが、ちょっと少なくともDockerによるインストールはそれはそれでハードルが上がるので受け入れがたいです。

わかりました。インストール方法の代替案として、環境を汚したく無い人や Docker 使いたい人をターゲットに考えていたので大丈夫です。

とりあえず、あまり必要では無さそうなので一旦PR閉じることにします。(現状、必須な機能ではないため)
別の優先度高いやつをやることにしますね。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants