2011-06-02 5 views
6

मैं अपने makefile में निम्नलिखित बिट्स है:मैं कैसे पता लगा सकता हूं कि जीएचसी डिफ़ॉल्ट रूप से 32 बिट या 64 बिट कोड उत्पन्न करने के लिए सेट है या नहीं?

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

-m32 जीसीसी 32 बिट कोड उत्पन्न करने के लिए निर्देश देता है। ऐसा इसलिए है क्योंकि कुछ कॉन्फ़िगरेशन पर जीएचसी 32 बिट कोड बनाने के लिए सेट है लेकिन जीसीसी का डिफॉल्ट कभी-कभी 64 बिट होता है। मैं इसे सामान्य बनाना चाहता हूं ताकि यह स्वतः पता लगा सके कि जीएचसी 32 बिट या 64 बिट कोड बना रहा है और फिर सही झंडा जीसीसी को पास कर देता है।

प्रश्न: मैं जीएचसी से किस प्रकार का कोड (32 बिट बनाम 64 बिट) का निर्माण करूंगा?

पीएस: मेरी कैबल फ़ाइल इस मेकफ़ाइल को कैबल में वर्कअराउंड सीमाओं के निर्माण के दौरान कॉल करती है। मेरी इच्छा है कि मैं इन्हें केवल अपनी कैबल फ़ाइल में सी-स्रोतों के रूप में सूचीबद्ध कर सकता हूं।

+1

मैं इसका उपयोग जीएचसी से शब्द आकार प्राप्त करने के लिए कर सकता हूं, लेकिन मुझे नहीं पता कि यह उपयोग करने का सही मूल्य है: WORDSIZE: = $ (खोल ghc + RTS --info | ghc -e "do c <- getContents; चलो {r = read c :: [(स्ट्रिंग, स्ट्रिंग)]; wsize = Data.Maybe.from बस (लुकअप \ "शब्द का आकार \" आर)}; putStrLn wsize ") –

+0

क्या एक परीक्षण प्रोग्राम संकलित करना उचित है और एल्फ पुस्तकालय (हैकेज पर) के साथ परिणाम पढ़ें? –

+0

आप 'ghc -e' प्रिंट (maxbound :: Int) 'के परिणाम का उपयोग करने में सक्षम हो सकते हैं, जो कि 32 बिट या 64 बिट जीएचसी के आधार पर अलग होना चाहिए ... – hvr

उत्तर

2

Ed'ka के लिए धन्यवाद मैं अब सही जवाब पता है।

Makefile अब इस तरह एक नियम है:

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

यह थोड़ा लंबा है, लेकिन सभी यह होता है GHC के उत्पादन से "जीसीसी लिंकर झंडे" निकालने है। नोट: यह ghc --info का आउटपुट है और ghc +RTS --info नहीं है।

यह अन्य तरीके सुझाए गए की तुलना में बेहतर रूप में यह मेरे सभी झंडे निर्दिष्ट करने की और न सिर्फ -m झंडा जरूरत है कि देता है। जब कोई झंडे की आवश्यकता नहीं होती है तो यह खाली भी होता है।

सभी को धन्यवाद!

+0

ऐसा लगता है कि आपको 'getContents >> = putStrLn जैसे कुछ चाहिए। डेटा। Maybe.from बस। लुकअप "सी कंपाइलर लिंक झंडे"। read' –

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 
5

सामान्य चाल मैं देख रहा हूँ बाइट या एक Int के टुकड़े में आकार के लिए पूछना है या Word, चूंकि यह मशीन के शब्द आकार के आधार पर जीएचसी में भिन्न होता है,

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 
संबंधित मुद्दे