4

シェイクと併用のおすすめの使い方が知りたいghc --make。私のプロジェクトでは、シェイク ルールを使用して C ソース コードを*.oファイル (私は と呼びますcobjects) にコンパイルし、これらのオブジェクトは を呼び出すことによって、私の haskell プログラムに一緒にリンクされghc --makeます。このコマンドの実行中ghcに、haskell ファイルを再構築する必要がある時期を自動的に判断します。

以下の例は、2 つのツールを統合するように正しく記述されていません。ファイルが変更された場合.hs、shake スクリプトを再実行しても は再起動されませんghc --make。シェイクが再構築を知らない理由は理解できますが、推奨される修正方法はわかりません。

main = shake shakeOptions $ do
  want [main_exe]

  main_exe *> \out -> do
    need cobjects
    cmd "ghc --make" hs_compileFlags cobjects "main.hs"

  cobjects **> ...
4

2 に答える 2

2

一般的な原則として、ルールがファイルを使用するコマンドを実行する場合、ルールはファイルに依存する必要があります。あなたの場合、あなたはneedすべてのものghc --makeを要求する必要があり、それを理解する最も簡単な方法はghc -M(を生成するMakefile)です:

main = shake shakeOptions $ do
  want [main_exe]

  main_exe *> \out -> do
    need cobjects
    cmd "ghc -M" hs_compileFlags "main.hs"
    cmd "ghc --make" hs_compileFlags cobjects "main.hs"
    needMakefileDependencies "Makefile"

  cobjects **> ...

needMakefileDependencies関数は にありますDevelopment.Shake.UtilneedMakefileDependencies 唯一の微妙な点は、コマンドの実行後に呼び出すことです。そうしないと、オブジェクト ファイルがまだ作成されていないためです (自分.hsでファイルのみをフィルタリングすることで解決MakefileできparseMakefileます)。

于 2014-02-18T14:03:09.310 に答える
0

推奨される方法は、「偽の」ルールを使用しwant、そのルールを上部に追加することです。これは、この役立つチュートリアルから見つかりました。

http://blog.jle.im/entry/shake-task-automation-and-scripting-in-haskell

このアイデアを私の例に適応させる最初の試み:

main = shake shakeOptions $ do
  want [main_exe, "compile and link hs"]

  main_exe *> \out -> do
    need cobjects

  cobjects **> ...

  "compile and link hs" ~> do
    cmd "ghc --make" hs_compileFlags cobjects "main.hs"

この(~>)関数は、文字列"compile and link hs"がルールの名前であり、ファイルの名前ではないことを指定します。

main_exeこれは常に私が望むように新しいルールを実行しようとしますが、残念ながら、私が望むものではないルールの前にルールを実行しようとします。

新しいルールの需要をルール内に移動すると、main_exeこの新しい問題が修正されるようです。

main = shake shakeOptions $ do
  want [main_exe]

  main_exe *> \out -> do
    need cobjects
    need ["compile and link hs"]

  cobjects **> ...

  "compile and link hs" ~> do
    cmd "ghc --make" hs_compileFlags cobjects "main.hs"

これは機能しますが、コードの最初の部分で 2 つのルールを実行する順序を Shake がどのように決定するかがわかりません。

于 2014-02-14T16:30:37.603 に答える