Haskell堆栈构建包括makefile

时间:2015-11-25 13:29:35

标签: haskell cabal ffi haskell-stack

我正在开发一个通过step1: ghc ${SRCDIR}/Internal/InlineC.hs -isrc/ step2: cc -c ${SRCDIR}/Internal/InlineC.c -o ${LIBDIR}/InlineC_c.o -I${PETSC_DIR_ARCH}/include -I${PETSC_DIR}/include step3: ghci ${SRCDIR}/Test.hs ${SRCDIR}/Internal/InlineC.hs ${LIBDIR}/InlineC_c.o ${LIBDIR}/Internal.o -isrc/ -L${PETSC_DIR_ARCH}/lib -lpetsc -lmpich 使用一些C绑定的库。截至目前,构建过程涉及一个makefile,如下所示,因为我们首先需要从inline-c宏生成C存根,将它们编译成目标代码并动态链接它们,在本例中为GHCi。

stack build

问题

有没有办法在public static bool StartServices() { try { bool startedWithSuccess = false; foreach (var servico in GetInstances()) { using (servico) { if (servico.Status != ServiceControllerStatus.Running && servico.Status != ServiceControllerStatus.StartPending) { servico.Start(); startedWithSuccess = TimeoutHelper.RetryUntilSuccessOrTimeout(() => { servico.Refresh(); return servico.Status != ServiceControllerStatus.Running ? false : true; }, TIMEOUT_IN_MILLISECONS); } else { startedWithSuccess = true; } } } return startedWithSuccess; } catch (Exception) { throw new SqlServerStartServiceException(); } } public static ServiceController[] GetInstances() { ServiceController[] services = ServiceController.GetServices().Where(x => x.ServiceName.Contains("SQL")).ToArray(); var lista = services.Where(x => x.DisplayName.Contains("Agent") || x.DisplayName.Contains("Browser") || x.DisplayName.Contains("VSS") || x.DisplayName.Contains("Active")).ToArray(); return services.Except(lista).ToArray(); } 食谱中打包上面的构建序列?

提前谢谢

1 个答案:

答案 0 :(得分:0)

是的,有。仔细阅读堆栈指南并遵循正确的.cabal文件语法。

更确切地说,当处于类似情况(HaskellC - > C - > Haskell)时,请确保.cabal文件具有:

  • 通过在include-dirs节中指定extra-lib-dirsextra-librarieslibrary字段来绑定范围内的库。

  • c-sources字段,指向与包含inline-c内容的Haskell文件的相同名称的文件(即所有[C.exp| |]用于包装C函数的quasiquoters)但具有.c扩展名。 这将触发警告,因为C文件在构建开始时尚不存在,但它也会调用gcc,它将处理由inline-c生成的C输出。