मेरा प्रोजेक्ट बिल्ड प्रक्रिया को प्रबंधित करने के लिए स्कॉन्स का उपयोग करता है। मैं एकाधिक कंपाइलर्स का समर्थन करना चाहता हूं, इसलिए मैंने AddOption
का उपयोग करने का निर्णय लिया ताकि उपयोगकर्ता निर्दिष्ट कर सकें कि कमांड लाइन पर किस कंपाइलर का उपयोग करना है (डिफ़ॉल्ट रूप से जो भी उनके वर्तमान कंपाइलर है)।यह निर्धारित करने के लिए कि किस कंपाइलर से अनुरोध किया गया था
AddOption('--compiler', dest = 'compiler', type = 'string', action = 'store', default = DefaultEnvironment()['CXX'], help = 'Name of the compiler to use.')
मैं (जैसे कि विशेष रूप से संकलक के लिए अधिकतम चेतावनी स्तर के रूप में चीजों सहित) विभिन्न compilers के लिए निर्मित संकलक सेटिंग्स के लिए सक्षम होना चाहता हूँ।
if is_compiler('g++'):
from build_scripts.gcc.std import cxx_std
from build_scripts.gcc.warnings import warnings, warnings_debug, warnings_optimized
from build_scripts.gcc.optimizations import optimizations, preprocessor_optimizations, linker_optimizations
elif is_compiler('clang++'):
from build_scripts.clang.std import cxx_std
from build_scripts.clang.warnings import warnings, warnings_debug, warnings_optimized
from build_scripts.clang.optimizations import optimizations, preprocessor_optimizations, linker_optimizations
हालांकि, मैं नहीं यकीन है कि तरह is_compiler()
समारोह देखो बनाने के लिए क्या कर रहा हूँ: यह क्या वर्तमान में मेरे एक समाधान का पहला प्रयास लग रहा है की तरह है। मेरा पहला विचार था कि उपयोगकर्ता क्या पास करता है उसके खिलाफ संकलक नाम (जैसे 'क्लैंग ++') की तुलना करना सीधे तुलना करना था। हालांकि, scons --compiler=~/data/llvm-3.1-obj/Release+Asserts/bin/clang++
का उपयोग करने का प्रयास करने पर यह तुरंत विफल हो गया।
तो मैंने सोचा कि मैं एक छोटे से बेहतर हो जाते हैं और संकलक स्ट्रिंग के अंत में इस समारोह
cxx = GetOption('compiler')
def is_compiler (compiler):
return cxx[-len(compiler):] == compiler
यह केवल लग रहा है का उपयोग करें, ताकि यह निर्देशिका ध्यान नहीं देता। दुर्भाग्यवश, 'clang ++' 'g ++' में समाप्त होता है, इसलिए मेरा कंपाइलर clang ++ के बजाय g ++ के रूप में देखा गया था।
मेरा अगला विचार पिछड़ा खोज करना था और पथ विभाजक ('\' या '/') की पहली घटना को देखना था, लेकिन तब मुझे एहसास हुआ कि यह उन लोगों के लिए काम नहीं करेगा जिनके पास एकाधिक कंपाइलर संस्करण हैं । 'G ++ - 4.7' के साथ संकलित कोई भी g ++ होने के रूप में पंजीकृत नहीं होगा।
तो, क्या यह निर्धारित करने का कोई आसान तरीका है कि किस कंपाइलर से अनुरोध किया गया था?
वर्तमान में, केवल सी ++ और क्लैंग ++ समर्थित हैं (और केवल उनके हाल ही में जारी संस्करण) उनके सी ++ 11 समर्थन के कारण, इसलिए एक समाधान जो केवल उन दोनों के लिए काम करता है, अब पर्याप्त होगा। हालांकि, मेरा अंतिम लक्ष्य कम से कम जी ++, क्लैंग ++, आईसीसी, और एमएसवीसी ++ (एक बार जब वे आवश्यक सी ++ 11 फीचर्स का समर्थन करते हैं) का समर्थन करना है, तो अधिक सामान्य समाधान पसंद किए जाते हैं।
मैं यहां दो मुद्दों को अलग कर दूंगा। समस्या # 1) * जो * कंपाइलर से अनुरोध किया गया है और # 2) * जहां * अनुरोधित कंपाइलर स्थित है (इसके लिए आप ज्यादातर समय समझदार डिफ़ॉल्ट का उपयोग कर सकते हैं और केवल उन्हें निर्दिष्ट करने दें यदि वे डिफ़ॉल्ट क्लैंग/जीसीसी/जो कुछ भी)। दो चीजों में आम बात नहीं है, आखिर में मैं आसानी से 'एमएसवीसी' कहलाता हूं जिसे मैं चाहता हूं (वास्तव में कभी कोशिश नहीं की, लेकिन क्यों नहीं?) – Voo
मैं सुझाव के साथ सहमत हूं @Voo ने आपको सुझाव दिया । इसे एक प्रश्न को कम करने के लिए संपादित करें, और उसके बाद एक नया प्रश्न बनाएं। आपके पास दो अच्छे प्रश्न हैं, यही कारण है कि मैंने आपके द्वारा बनाई गई (अब तक) को ऊपर उठाया है। – octopusgrabbus
@Voo अगर आप इसे उत्तर के रूप में लिखते हैं, तो मैं इसे स्वीकार करूंगा, क्योंकि यह उस महत्वपूर्ण अंतर्दृष्टि थी जिसका उपयोग मैंने समस्या को हल करने के लिए किया था। –