Существует нет простого способа, но это возможно.
Предполагая, что вы используете 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 на самом деле довольно хорошо документирован - он страдает в основном от некоторой нестабильности в некоторых из этих областей.
Правда. Существует [вопросы # 1325 о github] (https://github.com/haskell/cabal/issues/1325) :) – ony