2017-08-26 7 views
7

हम सीएमपी 0054 नीति उल्लंघनों के परीक्षण के दौरान त्रुटियों को पकड़ रहे हैं। एक उदाहरण Build 367 पर ऑनलाइन पाया जा सकता है।चर का उपयोग कैसे करें और सीएमपी 0054 नीति उल्लंघन से बचें?

cmake : CMake Warning (dev) at CMakeLists.txt:364 (if): 
At line:8 char:5 
+  cmake -G "Visual Studio 15 2017" -DCMAKE_BUILD_TYPE=$env:configur ... 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (CMake Warning (...s.txt:364 (if)::String) [], RemoteException 
    + FullyQualifiedErrorId : NativeCommandError 

    Policy CMP0054 is not set: Only interpret if() arguments as variables or 
    keywords when unquoted. Run "cmake --help-policy CMP0054" for policy 
    details. Use the cmake_policy command to set the policy and suppress this 
    warning. 
    Quoted variables like "MSVC" will no longer be dereferenced when the policy 
    is set to NEW. Since the policy is not set the OLD behavior will be used. 
This warning is for project developers. Use -Wno-dev to suppress it. 

यह एक अगर बयान इसलिए की तरह बनाने की वजह से है:

if ("${CRYPTOPP_AMD64}" STREQUAL "1" OR "${CRYPTOPP_I386}" STREQUAL "1") 
    ... 
endif() 

बयान What's the CMake syntax to set and use variables? साथ संगत कर रहे ऊपर, और यह केवल बात यह है कि लग रहा था "बस काम" करने के लिए हर जगह, की परवाह किए बिना था चाहे चर सेट किया गया था, खाली था, 0 मान था, 1 मान था या कुछ अन्य मूल्य था।

हमने वैरिएबल से उद्धरण हटा दिए ताकि भगवान को शापित नीति को पूरा किया जा सके और सभी नरक टूट गए। अब हम भाग्यशाली हैं कि बिना किसी त्रुटि के सीएमके कॉन्फ़िगरेशन प्राप्त करें। हमने कोशिश की:

if (${CRYPTOPP_AMD64} STREQUAL "1" OR ${CRYPTOPP_I386} STREQUAL "1") 
    ... 
endif() 

और:

if (${CRYPTOPP_AMD64} STREQUAL 1 OR ${CRYPTOPP_I386} STREQUAL 1) 
    ... 
endif() 

और:

if (${CRYPTOPP_AMD64} EQUAL 1 OR ${CRYPTOPP_I386} EQUAL 1) 
    ... 
endif() 

वे ज्यादातर नेतृत्व एक "CMake त्रुटि को CMakeLists.txt पर ... अगर दिए गए तर्कों के ... "। उदाहरण के लिए, यहाँ सोलारिस 11 पर परीक्षण किया गया:

CMake Error at CMakeLists.txt:507 (if): 
    if given arguments: 

    "EQUAL" "1" "AND" "NOT" "DISABLE_SSSE3" 

    Unknown arguments specified 

हम उपयोगकर्ता मशीनों को नियंत्रित नहीं करते हैं, तो एक नीति को बदलने और आदेशों चल cmake_policy की तरह हमारे लिए सवाल से बाहर है। हम उपयोगकर्ताओं को कुछ विशेष करने की उम्मीद नहीं करते हैं। उपयोगकर्ताओं को केवल निर्देशिका में सीडी बनाने की उम्मीद है, और फिर cmake चलाएं। बस।

सिंटैक्स के लिए हमें क्या सिंटैक्स का उपयोग करना चाहिए जो हर जगह काम करता है जो सीएमके में नवीनतम परिवर्तन देता है?

जब हम हर जगह कहते हैं, तो हमारा मतलब है कि सेमेक 2.8 से वर्तमान तक, और एक चर जो सेट, खाली, 0 मान, 1 मान या अप्रत्याशित मूल्य सहित किसी भी राज्य में हो सकता है।


संपादित: अब हम Windows मशीनों पर गैर उद्धृत चर के लिए बग रिपोर्ट को पकड़ने रहे हैं। फिर भी Windows CMake failure when compiler path has a space पर एक और डरावनी सीएमके बग।

सीएमके पुस्तकालय में दो साल से रहा है। यह हमारे बग रिपोर्टर में 18% बग बनाता है। यह उपयोगकर्ताओं के लिए असमान संख्या में समस्याओं का कारण बनता है।

+1

@ usr1234567 - सहायता फ़ाइल से: * "पॉलिसी का 'ओल्ड' व्यवहार 'परिभाषा द्वारा बहिष्कृत' है और इसे सीएमके के भविष्य के संस्करण में हटाया जा सकता है।" * उपयोगकर्ताओं को एक नीति को सेट करने के लिए कह रहे हैं हटा दिया निश्चित रूप से सवाल से बाहर है। – jww

+2

यदि आप यह जांचना चाहते हैं कि 'CRYPTOPP_AMD64' चर का मान" 1 "है, तो 'if (CRYPTOPP_AMD64 STREQUAL" 1 ") का उपयोग करें। पॉलिसी का तात्पर्य यही है। यदि परिवर्तनीय 'CRYPTOPP_AMD64' ** का मान अन्य चर ** को संदर्भित करता है, तो कृपया विस्तृत करें कि प्रश्न पोस्ट में विस्तृत करें। – Tsyvarev

+0

धन्यवाद @Tsyvarev - 'CRYPTOPP_AMD64' अव्यवस्थित, सेट, खाली, 0 मान, 1 मान या" त्रुटि "जैसे अप्रत्याशित मान हो सकता है। तो मैं स्पष्ट हूं ... हमें अब '$ {CRYPTOPP_AMD64}' और दोस्तों का उपयोग नहीं करना चाहिए। अब हमें डॉलर के संकेत और ब्रेसिज़ के बिना 'CRYPTOPP_AMD64' का उपयोग करना चाहिए। क्या वो सही है? – jww

उत्तर

0

दो समाधान हैं:

  1. बस सेट नीति CMP0054NEW को

    cmake_policy(SET CMP0054 NEW) 
    

    कि CMake संस्करण बंद कर देंगे> = 3.1 फिर से चर नाम के रूप में उद्धरण में चर व्याख्या करने के लिए प्रयास करने के लिए (देखें चर्चा here, कोई भी वास्तव में OLD व्यवहार चाहता था)।

    संकेत है कि "एक नीति के OLD व्यवहार परिभाषा से हटा दिया गया है और CMake के भविष्य के संस्करण में हटाया जा सकता है" बस CMake डेवलपर्स भविष्य में कभी अभी भी OLD का समर्थन आवश्यक विरासत कोड निकाल देंगे इसका मतलब है कि व्यवहार।

  2. बदलें - @Tsyvarev टिप्पणी की रूप - बस चर नाम करने के लिए सभी if बयान डॉलर चिह्न के बिना और धनुकोष्ठक

    if (CRYPTOPP_AMD64 STREQUAL "1" OR CRYPTOPP_I386 STREQUAL "1") 
        ... 
    endif()   
    

    कि भी CMake के पुराने संस्करणों के लिए काम करेगा।

यह उद्धरण चिह्नों के बिना ${ } चर de-संदर्भित सिंटैक्स का उपयोग करने के लिए एक विकल्प नहीं है, क्योंकि यह एक खाली स्ट्रिंग (उन if() वाक्यविन्यास त्रुटियों के लिए अग्रणी) में खत्म हो सकता है।

नोट: एक वर्कअराउंड CMake modules itself उनके परिवर्तनीय चेक के लिए "x" उपसर्ग का उपयोग कर रहे हैं। लेकिन मुझे लगता है कि एक छोटे से अजीब लग रहा है:

if ("x${CRYPTOPP_AMD64}" STREQUAL "x1" OR "x${CRYPTOPP_I386}" STREQUAL "x1") 
    ... 
endif() 

नोट: आप केवल CMP0054 चेतावनी अगर आपके चर के संदर्भ वास्तव में फिर से मूल्यांकित किया गया था मिल (इसलिए यह एक संकेत अपने CMake कोड उन स्थानों में काम नहीं करेगा है)।

संबंधित मुद्दे