Я решил добавить некоторые флаги для управления способом, которым исходный файл 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.
На самом деле, похоже, нет никакого способа указать это в файле .cabal; единственное, что у нас сейчас есть, что было бы хоть сколько-нибудь полезно здесь, это - with-
.
Я предлагаю вам попробовать подать иск против Кабала в треке .
4.10.1. Замена программы для одной или нескольких фаз
-pgmc cmd
Используйтеcmd
в качестве компилятора C.
Это работает для ghc --make
, но я не уверен, как заставить Кабал применить это к компиляции файла C.
Прямого пути нет, но он возможен.
Предполагая, что вы используете 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 Кабала на самом деле довольно хорошо документирован - он в основном страдает от некоторой нестабильности в некоторых из этих областей.