2015-12-15 7 views
8

में तर्कों को ओवरराइड करना अगर मैं उसी आदेश पंक्ति में -O2 -O3 क्लैंग देता हूं, तो -O3-O2 ओवरराइड करने जा रहा है? क्या बाद का तर्क हमेशा ओवरराइड करता है?
एक बिल्ड स्क्रिप्ट जो मैं डिफ़ॉल्ट रूप से नहीं बदल सकताजोड़ता है और मैं केवल इसके बाद चीजें जोड़ सकता हूं। क्या यह एक स्वीकार्य बात है?क्लैंग कमांड लाइन

उत्तर

6

क्लैंग ड्राइवर का संचालन मैनुअल पेज Driver Design & Internals § Driver stages में वर्णित है। ध्यान दें कि आप प्रत्येक चरण के परिणाम को डंप करने के लिए -### विकल्प का उपयोग कैसे कर सकते हैं। यह ऐसा कुछ नहीं है जिसे आप अपने बोर्कन बिल्ड सिस्टम के साथ व्यायाम कर सकते हैं क्योंकि विकल्प पहले सूचीबद्ध होना चाहिए। लेकिन आप सत्यापित कर सकते है कि चालक वास्तव में आप क्या आशा है कि यह करता है:

clang -### foo.cpp -O2 -O3 # dumps yayayada "-O3" yadamore 
clang -### foo.cpp -O3 -O2 # dumps yayayada "-O2" yadamore 

कहाँ "बेकार" वमन है कि मैं लोप के बाद से वहाँ इसके बारे में बहुत ज्यादा। तो, वास्तव में, अंतिम-O विकल्प जो आप निर्दिष्ट करते हैं वह प्रभावी है। किसी भी कंपाइलर ड्राइवर के लिए अपेक्षित व्यवहार कौन सा है।

4

clang प्रक्रिया विकल्प बाएं से दाएं। इस प्रकार, अंतिम -O विकल्प "जीतता है"। यह एक कारण है जो आप पूछते हैं: इसलिए किसी और द्वारा निर्धारित डिफ़ॉल्ट ओवरराइड करने की संभावना है (उदाहरण के लिए कुछ बिल्ड सिस्टम, सॉफ्टवेयर डेवलपर्स, ...) हां, यह पूरी तरह से स्वीकार्य है, और आप बहुत अच्छी कंपनी में हैं । LLVM स्रोत कोड

परम संदर्भ होगा (विकल्प से निपटने फ़ाइल lib/Support/CommandLine.cpp में cl::ParseCommandLineOptions() द्वारा किया जाता है।)

बॉक्स के बाहर सोच रही थी: भले ही आप परिवर्तन निर्माण स्क्रिप्ट नहीं, तो आप प्रभावित कर सकते हैं कर सकते हैं यह वही करना जो आप चाहते हैं। उदाहरण के लिए, ऑप्टिमाइज़ेशन विकल्प एक वैरिएबल का हिस्सा हो सकता है जिसे किसी विकल्प या पर्यावरण से लिया जाता है। उदाहरण के लिए, अगर निर्माण एक Makefile का उपयोग करता है, चर CFLAGS या COPTS कहा जा सकता है और

make CFLAGS=-O3 

साथ सेट किया जा निर्माण एक खोल स्क्रिप्ट, हो सकता है

CFLAGS="-O3" ./configure 

की तरह कुछ काम करेगा का उपयोग करता है। निर्माण को देखे बिना कोई बताना नहीं है।