我的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源。
答案 0 :(得分:6)
我看到的通常技巧是要求Int
或Word
的字节或位大小,因为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