13

Cソースファイルのコンパイル方法を制御するためにいくつかのフラグを追加することにしました(つまり、use-clang、use-intelなど)。

      C-ソース:c_lib / tiger.c
      インクルード-ディレクトリ:c_lib
      インストール-含まれるもの:tiger.h

      ifフラグ(デバッグ)
          GHC-オプション:-debug -Wall -fno-warn-orphans
          CPP-オプション:-DDEBUG
          CC-オプション:-DDEBUG -g
      そうしないと
          GHC-オプション:-Wall -fno-warn-orphans

質問は次のとおりです。Cコンパイラを変更するには、記述ファイルのどのオプションを変更する必要がありますか?CC-Optionsしか見つかりませんでした。

4

3 に答える 3

9

簡単な方法はありませんが、可能です。

Distribution.Simpleを使用していると仮定すると、基本的にビルドステージにユーザーフックを追加する必要があります。

次のすべての変更をSetup.hsに表示する必要があります。

mainを変更して、次のようなビルドフックを使用します。

main :: IO ()
main = defaultMainWithHooks simpleUserHooks { buildHook = myBuildHook }

次に、ビルドフックが必要です。次のようになります。

myBuildHook pkg_descr local_bld_info user_hooks bld_flags =
    do
    let lib       = fromJust (library pkg_descr)
        lib_bi    = libBuildInfo lib
        custom_bi = customFieldsBI lib_bi
        cpp_name  = fromJust (lookup "x-cc-name" custom_bi)
        c_srcs    = cSources lib_bi
        cc_opts   = ccOptions lib_bi
        inc_dirs  = includeDirs lib_bi
        lib_dirs  = extraLibDirs lib_bi
        bld_dir   = buildDir local_bld_info
    -- Compile C/C++ sources
    putStrLn "invoking my compile phase"
    objs <- mapM (compileCxx cpp_name cc_opts inc_dirs bld_dir) c_srcs
    -- Remove C/C++ source code from the hooked build (don't change libs)
    let lib_bi'    = lib_bi { cSources = [] }
        lib'       = lib    { libBuildInfo = lib_bi' }
        pkg_descr' = pkg_descr { library = Just lib' }
    -- The following line invokes the standard build behaviour
    putStrLn "Invoke default build hook"
    bh <- buildHook simpleUserHooks pkg_descr' local_bld_info user_hooks bld_flags
    return bh

上記のコードは、おそらく少し解凍する必要があります。let句は基本的に、ビルドフックに渡された構造から必要なデータフィールドを解凍することに関するものです。foo.cabalでカスタムスタンザを作成できることに注意してください。次のようなスタンザをサポートするコードを提供しました。

x-cc-name: icc

コンパイラを指定する手段として。すべてのソースファイルを抽出したら、関数を使用してそれらをマッピングし、単一のファイルをコンパイルします(注:これは、複数のソースファイルを効率的にコンパイルして単一のオブジェクト出力を生成できるコンパイラなど、場合によっては最適ではありません。大規模な最適化からですが、今はそれを脇に置いておきます)。

最後に、C / C ++コードをコンパイルしたので、すべてをデフォルトのビルドフックに渡す前に、ビルド構造からコードを削除します。

申し訳ありませんが、これは定型の回答というよりも「HOWTO」のようなものですが、それはあなたが始めるのに役立つはずです。

コードはテストされていません。私はwxHaskellビルドシステムで行ってきたいくつかの作業からそれを適応させたので、アイデアがうまく機能することを知っています。Cabal APIは、実際にはかなりよく文書化されています。主に、これらの領域の一部で不安定になるという問題があります。

于 2010-05-31T00:13:04.393 に答える
1

.cabalファイルでこれを指定する方法は実際にはないようです。ここでリモートでさえ役立つと思われる現時点での唯一のものはです--with-<prog>=path

トラックでカバルに対してチケットを提出してみることをお勧めします。

于 2010-03-30T17:47:04.753 に答える
0

4.10.1。プログラムを1つ以上のフェーズに置き換える

-pgmc cmd
cmdCコンパイラとして         使用します。

これはで機能しghc --makeますが、CabalにこれをCファイルのコンパイルに適用させる方法がわかりません。

于 2010-03-27T18:26:43.000 に答える