2

すべてを再ビルドせずに、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 を使用していることに気付き、それも再実装する必要がありました。不格好なようです。

すべてを再構築せずに複数のターゲットを構築する他の方法はありますか? それはとても些細なことのように思えますが、それでも私には理解できません。

4

1 に答える 1