haskell - 使用 Haskell 堆栈构建时使用 Clang 而不是 gcc 编译 C 源文件?

标签 haskell cabal haskell-stack

目前,如果我构建一个也包含 c 源文件的 haskell 项目,堆栈会使用 gcc 编译 c 源文件。但是,我想用 Clang 来编译这些 C 源文件。是否可以更改 package.yaml 或 stack.yaml 来实现此目的?

最佳答案

看起来像是在 stack.yaml 文件中指定类似以下内容:

with-gcc: /usr/bin/clang-15

并且 - 如果您收到有关 .addrsig 操作码的错误 - 可能会向您的 .cabal 文件添加 cflags:

library ...
  ...
  cc-options: -fno-addrsig
  ...

可能就足够了。至少,我能够使用 clang-15 获得以下玩具示例。

我使用以下文件创建了一个 Stack 项目:

# stack.yaml
resolver: lts-21.0
packages:
- .
with-gcc: /usr/bin/clang-15
# clangtest.cabal
cabal-version: 1.12
name:           clangtest
version:        0.1.0.0
build-type:     Simple

executable clangtest-exe
  main-is: Main.hs
  c-sources: test.c
  cc-options: -fno-addrsig
  build-depends: base >=4.7 && <5
  default-language: Haskell2010
/* test.h */
char* world(int key);
/* test.c */
#include "test.h"

char* world(int key)
{
        switch(key) {
        case 1: return "world";
        case 2: return "Bob";
        default: return "<unknown>";
        }
}
-- Main.hs
module Main (main) where

import Foreign.C

foreign import ccall "world" world :: Int -> CString

main :: IO ()
main = do
  thing <- peekCString (world 1)
  putStrLn $ "Hello, " ++ thing

然后,我运行了堆栈构建:

$ stack build
Building all executables for `clangtest' once. After a successful build of all of them, only specified executables will be rebuilt.
clangtest> configure (exe)
Configuring clangtest-0.1.0.0...
clangtest> build (exe)
Preprocessing executable 'clangtest-exe' for clangtest-0.1.0.0..
Building executable 'clangtest-exe' for clangtest-0.1.0.0..
[1 of 1] Compiling Main
[2 of 2] Linking .stack-work/dist/x86_64-linux/Cabal-3.8.1.0/build/clangtest-exe/clangtest-exe
clangtest> copy/register
Installing executable clangtest-exe in /u/buhr/src/overflow/clangtest/.stack-work/install/x86_64-linux/af84b282df7268d5dbef65c10bee4a1a2517fa1d96db69f048f962dabf7b870f/9.4.5/bin

我验证了 C 文件实际上是用 clang 编译的:

$ strings .stack-work/dist/x86_64-linux/Cabal-3.8.1.0/build/clangtest-exe/clangtest-exe-tmp/test.o | egrep clang
Debian clang version 15.0.6

并且我验证了该程序确实运行了:

buhr@delores:~/src/overflow/clangtest$ stack exec clangtest-exe
Hello, world

关于haskell - 使用 Haskell 堆栈构建时使用 Clang 而不是 gcc 编译 C 源文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76552414/

相关文章:

haskell - 删除 Stack/Cabal 软件包并安装旧版本

haskell - 具有多个图书馆部分的 cabal

Haskell-Stack:构建期间出现访问冲突错误

cabal-install - 堆栈给出 'dyld: malformed mach-o'

haskell - 标准 Haskell 函数::(a -> Maybe b) -> [a] -> Maybe b

haskell - 是否可以重组嵌套元组?

通过 cabal repl 调试/单步进入包模块

haskell - tasty-discover with stack run 0 测试

haskell - 如何将重叠编译指示应用于派生实例

haskell - McCarthy 91 函数的工作原理