すべてを再ビルドせずに、2 つの異なる構成を使用して 1 セットのソース ファイルをビルドするにはどうすればよいですか?
現在のセットアップでは、build_rel.cfg からすべてのオプションをロードし、すべてをディレクトリ build_rel/ にコンパイルするオプション --config=rel を追加します。
data Flags = FlagCfg String
deriving (Show, Eq)
flags = [Option ['c'] ["config"]
(ReqArg (\x -> Right $ FlagCfg x) "CFG")
"Specify which configuration to use for the build"]
main :: IO ()
main = shakeArgsWith shakeOptions { shakeChange=ChangeModtimeAndDigest }
flags $
\flags targets -> return $ Just $do
let buildDir = "build" ++
foldr (\a def -> case (a, def) of
(FlagCfg cfg, "") -> '_':cfg
otherwise -> def)
"" flags
-- Settings are read from a config file.
usingConfigFile $ buildDir ++ ".cfg"
...
次に実行すると
build --config=rel
build --config=dev
私は2つのビルドで終わります
build_rel/
build_dev/
ただし、構成を切り替えるたびに、すべてを再構築することになります。これは、すべてのオラクルが「変更」されたためだと思います。変更が異なる構成を使用するビルド間で干渉しないように、すべてのオラクルを 2 つの異なるビルド ディレクトリに固有にしたいと考えています。
データベースの保存場所を指定する -m オプションがあることは知っていますが、常に同期する必要がある 2 つのオプションを指定する必要はありません。
build --config=rel -m build_rel
--config オプションが解析された後にオプション shakeFiles を更新する方法はありますか?
別のアイデアは、ビルド構成を含めるためにすべての Oracle をパラメーター化することでしたが、usingConfigFile が Oracle を使用していることに気付き、それも再実装する必要がありました。不格好なようです。
すべてを再構築せずに複数のターゲットを構築する他の方法はありますか? それはとても些細なことのように思えますが、それでも私には理解できません。