代码之家  ›  专栏  ›  技术社区  ›  ony

cabal包中C编译器的选择

  •  13
  • ony  · 技术社区  · 14 年前

          C-Sources:    c_lib/tiger.c
          Include-Dirs: c_lib
          Install-Includes: tiger.h
    
          if flag(debug)
              GHC-Options: -debug -Wall -fno-warn-orphans
              CPP-Options: -DDEBUG
              CC-Options: -DDEBUG -g
          else
              GHC-Options: -Wall -fno-warn-orphans

    问题是:为了更改C编译器,需要修改描述文件中的哪些选项?我只找到了抄送选项。

    3 回复  |  直到 14 年前
        1
  •  1
  •   SamB som-snytt    14 年前

    在.cabal文件中似乎真的没有任何方法来指定这一点;我们目前唯一能在这里发挥作用的似乎是 --with-<prog>=path

    我建议你试着在火车上开一张反对阴谋集团的罚单 trac .

        2
  •  9
  •   Rufflewind    10 年前

    没有直截了当的办法,但这是可能的。

    将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
    

    作为指定编译器的方法。提取了所有源文件后,您可以使用一个函数来编译单个文件(注意:在某些情况下,这是次优的,例如那些编译器可以高效地编译多个源文件以生成单个对象输出,并从大规模优化中获益,但我们暂时不谈这一点)。

    很抱歉,这只是一个“如何”而不是一个固定的答案,但它应该可以帮助你开始。

    我应该提到的是,该代码未经测试。我在wxHaskell构建系统上做了一些工作,所以我知道这个想法很管用。阴谋集团的API实际上是相当好的文件-它主要是由于在这些地区周围的一些不稳定。

        3
  •  0
  •   Community Keith    4 年前

    4.10.1. Replacing the program for one or more phases

    -pgmc cmd
    使用 cmd 作为C编译器。

    ghc --make