Выбор компилятора C в пакете интриги

Я решил добавить некоторые флаги для управления способом, которым исходный файл C компилируется (т.е. что-то как лязг использования, Intel использования и т.д.).

      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

Вопрос: какие опции в descritpion файле должны быть изменены для изменения компилятора C? Я сделал найденный только Опции CC.

13
задан ony 27 March 2010 в 22:57
поделиться

3 ответа

На самом деле, похоже, нет никакого способа указать это в файле .cabal; единственное, что у нас сейчас есть, что было бы хоть сколько-нибудь полезно здесь, это - with- = path .

Я предлагаю вам попробовать подать иск против Кабала в треке .

1
ответ дан 2 December 2019 в 01:20
поделиться

4.10.1. Замена программы для одной или нескольких фаз

-pgmc cmd
Используйте cmd в качестве компилятора C.

Это работает для ghc --make , но я не уверен, как заставить Кабал применить это к компиляции файла C.

0
ответ дан 2 December 2019 в 01:20
поделиться

Прямого пути нет, но он возможен.

Предполагая, что вы используете 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

Как средство указать ваш компилятор. Извлекая все исходные файлы, вы сопоставляете их с помощью функции для компиляции одного файла (NB: в некоторых случаях это неоптимально, например, те компиляторы, которые могут эффективно компилировать несколько исходных файлов для создания единого объекта вывода и выгоды от крупномасштабных оптимизаций, но мы пока оставим это в стороне).

Наконец, поскольку мы скомпилировали код C / C ++, удалите его из структур сборки, прежде чем передавать все обработчику сборки по умолчанию.

Извините, что это больше похоже на «HOWTO», чем на шаблонный ответ, но он должен помочь вам начать работу.

Следует отметить, что код не тестировался. Я адаптировал его из некоторых работ, которые я делал над системой сборки wxHaskell, поэтому я знаю, что идея работает нормально.API Кабала на самом деле довольно хорошо документирован - он в основном страдает от некоторой нестабильности в некоторых из этих областей.

9
ответ дан 2 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: