目前,如果我构建一个也包含 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/