3

MakefileをShakefileに変換している最中ですが、PHONY makeターゲット(、など)を処理する方法がわかりませcleaninstall。私は次のようなことを試しました:

main = shake shakeOptions $ do
  want ["install"]
  "install" *> \_ -> do
    need ["mytarget"]
    system' "ln" ["-s", "mytarget", "linkname"]

シンボリックリンクの作成は成功しますが、「エラー、ルール「インストール」はファイルのビルドに失敗しました:インストール」というエラーが報告されます。

それで、「欲しい」アクションがない場合、実行したいデフォルトのターゲットが偽のターゲットであることをどのように宣言しますか?

4

2 に答える 2

5

Shake-0.10.1 以降では、phony関数を使用して次のように記述できます。

main = shake shakeOptions $ do
  want ["install"]
  phony "install" $ do
    need ["mytarget"]
    system' "ln" ["-s", "mytarget", "linkname"]

これはまさにあなたが望んでいることであり、偽のファイルを作成する必要はありません。さらに、ユーザーがコマンドラインから選択できるようにするのshakeArgsではなく、使用したい場合や、クリーンなどの別のターゲットを選択したい場合があります。shakeinstall

于 2013-03-18T08:53:23.407 に答える
1

Shake-0.9 以下では、偽のターゲットは Shake の弱点と言えます。実行することはできますが、必要以上に冗長で手動です。以下にいくつかのオプションを示します。

インストール規則にファイルを生成させる

非常に簡単な解決策として、ルールwriteFile' "install" ""の最後に追加するだけです。installこれによりダミー ファイルが生成されますが、変更のたびに再実行されmytargetます。要求されるたびに実行したい場合install(偽の make のように) を追加するだけalwaysRerunです。冗長なファイルを無視できる場合、これが最も簡単な解決策ですが、一流の偽のサポートが提供されます。

使用するaction

あなたは書ける:

main = shake shakeOptions $ do
  action $ do
    need ["mytarget"]
    system' "ln" ["-s", "mytarget", "linkname"]

これは、すべてのビルドで実行されるアクションを宣言します。実際には、コマンドライン上にある場合にのみこれを実行したいinstallので、次のようにすることができます:

main = do
  args <- getArgs
  shake shakeOptions $ do
    when ("install" `elem` args) $ action $ do
      ... install code ...

使用するshakeArguments

シェイクの新しいバージョンではshakeArgsWith、関数を使用して次のように記述できます。

main = shakeArgsWith shakeOptions [] $ \_ targets ->
  if "clean" `elem` targets then do
    removeFiles "_make" "//*"
    return Nothing
  else return $ Just $ do
    when ("install" `elem` targets) $ do
       ... install code ...
    ... other rules ...
    want $ delete "install" targets

これにより、ターゲットの処理方法を完全に制御できるため、偽のターゲットよりもはるかに強力なことを行うことができますが、より多くの作業が必要になります。

于 2013-03-16T19:03:34.830 に答える