如何检测GHC是否设置为默认生成32位或64位代码?

时间:2011-06-02 16:35:09

标签: haskell makefile 32bit-64bit ghc

我的makefile中有以下几位:

GLFW_FLAG := -m32 -O2 -Iglfw/include -Iglfw/lib -Iglfw/lib/cocoa $(CFLAGS)
...
$(BUILD_DIR)/%.o : %.c
    $(CC) -c $(GLFW_FLAG) $< -o $@
$(BUILD_DIR)/%.o : %.m
    $(CC) -c $(GLFW_FLAG) $< -o $@

-m32指示GCC生成32位代码。它存在,因为在某些配置中GHC设置为构建32位代码,但GCC的默认值有时为64位。我想概括一下,以便自动检测GHC是构建32位还是64位代码,然后将正确的标志传递给GCC。

问题:我如何向GHC询问它将构建哪种类型的代码(32位与64位)?

PS:我的cabal文件在构建期间调用此makefile以解决cabal中的变通方法限制。我希望我可以在我的cabal文件中将这些列为c源。

3 个答案:

答案 0 :(得分:6)

我看到的通常技巧是要求IntWord的字节或位大小,因为GHC会根据机器的字大小而变化,

Prelude> :m + Foreign
Prelude Foreign> sizeOf (undefined :: Int)
8
Prelude Foreign> bitSize (undefined :: Int)
64

或使用系统工具:

$ cat A.hs
main = print ()

$ ghc --make A.hs
[1 of 1] Compiling Main             ( A.hs, A.o )
Linking A ...

$ file A
A: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 
     dynamically linked (uses shared libs), for GNU/Linux 2.6.27, not stripped

答案 1 :(得分:2)

感谢Ed'ka,我现在知道正确的答案。

Makefile现在有这样的规则:

GCCFLAGS  := $(shell ghc --info | ghc -e "fmap read getContents >>= putStrLn . unwords . read . Data.Maybe.fromJust . lookup \"Gcc Linker flags\"")

它有点长,但它只是从ghc的输出中提取“Gcc Linker标志”。 注意:这是ghc --info而非ghc +RTS --info的输出。

这比其他建议的方式更好,因为它为我提供了 all 需要指定的标志,而不仅仅是-m标志。当没有标志时它也是空的。

谢谢大家!

答案 2 :(得分:1)

根据我的评论,应该可以编译测试程序并读取生成的二进制文件。

$ cabal install elf

代码只是

readElf testFile'sPath >>= \e -> if elfClass e == ELFCLASS64 then print 64 else print 32

或者在GHCi中我们看到:

> e <- readElf "/bin/ls"
> elfClass e
ELFCLASS64