2010-03-27 1 views
11

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

 
     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-Options.

ответ

1

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

Предлагаю вам попробовать подачу билета с Cabal на trac.

+1

Правда. Существует [вопросы # 1325 о github] (https://github.com/haskell/cabal/issues/1325) :) – ony

0

4.10.1. Replacing the program for one or more phases

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

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

+0

Пробовал - ничего не изменилось. Указание «-fvia-C» дает ожидаемые ошибки во время компиляции файлов Haskell, поэтому эти параметры не фильтруются. Похоже, что Cabal использует собственную последовательность для создания «.c» -файлов. – ony

7

Существует нет простого способа, но это возможно.

Предполагая, что вы используете Distribution.Simple, вам в основном нужно добавить пользовательский крючок на этап сборки.

Все последующие изменения должны появиться в Setup.hs:

Изменение основной использовать сборки крюк, что-то вроде:

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 

Возможно, код, вероятно, нуждается в распаковке. Предоставленные предложения в основном касаются распаковки необходимых полей данных из структур, переданных на крючок сборки. Обратите внимание, что вы можете создавать пользовательские строфы в своем foo.cabal. Я представил код для поддержки строфы что-то вроде:

x-cc-name: icc 

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

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

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

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