xcode - कैसे xcconfig चर में मूल्यों को जोड़ने के लिए?




(6)

मैं Xcode .xcconfig फ़ाइलों का उपयोग कर रहा हूँ। मैं प्रीप्रोसेसर परिभाषाओं में कुछ मूल्यों को जोड़ने की कोशिश कर रहा हूं, लेकिन मैं इसे काम नहीं कर सकता।

मैंने निम्नलिखित (साथ ही इसके कई रूपांतरों) की कोशिश की, लेकिन अब तक कोई भाग्य नहीं:

GCC_PREPROCESSOR_DEFINITIONS = '$(GCC_PREPROCESSOR_DEFINITIONS) NEW_VALUE'

NEW_VALUE प्रतीक को पूर्वप्रोसेसर परिभाषाओं में कभी नहीं जोड़ा जाता है।

क्या किसी को xcconfig फ़ाइलों में चर के लिए नए मूल्यों को जोड़ने में सफलता मिली?


Xcode बिल्ड सिस्टम गाइड के अनुसार:

जब एक कॉन्फ़िगरेशन यूनिट में किसी विशेष बिल्ड सेटिंग के लिए एक से अधिक परिभाषा होती है, तो Xcode यूनिट में अंतिम परिभाषा का उपयोग करता है। ध्यान रखें कि कॉन्फ़िगरेशन फ़ाइलों में वे शामिल की गई कॉन्फ़िगरेशन फ़ाइलों में बनाई गई सेटिंग परिभाषा बनाने के लिए पहुंच नहीं है। अर्थात्, आप शामिल कॉन्फ़िगरेशन फ़ाइल में बनाई गई परिभाषा को संशोधित नहीं कर सकते हैं; आप केवल इसे बदल सकते हैं।

इसलिए, मेरा यह मतलब है कि किसी दिए गए वैरिएबल में मूल्यों को जोड़ना संभव नहीं है।


आप प्लेसहोल्डर $ (विरासत में मिली) का उपयोग करना चाहते हैं, जो निचले स्तरों से विरासत में मिले मूल्य का प्रतिनिधित्व करता है

GCC_PREPROCESSOR_DEFINITIONS = "$(inherited) NEW_VALUE"

एक जवाब के साथ एक और सवाल है जो इस विशेष समस्या के साथ मदद कर सकता है। यह एक ऐसी तकनीक का वर्णन करता है जिसमें प्रत्येक परत परिभाषाओं का एक सबसेट है, फिर उन सभी को पत्ती-स्तर xccffig पर एक साथ लाएं।


जैसा कि अन्य जवाबों में कहा गया है, Xcode 10 से पहले, xcconfig फाइलें केवल एक दूसरे के मूल्यों का वारिस और विस्तार नहीं कर सकती थीं। परंतु,

Xcode 10 के बाद से, xcconfig अब एक के रूप में काम करता है जो उनसे उम्मीद कर सकता है: $(inherited) वास्तव में चर के पहले परिभाषित मूल्य तक विस्तृत है।

जब एक .xcconfig फ़ाइल में एक ही बिल्ड सेटिंग के कई असाइनमेंट होते हैं, तो बाद में $(inherited) या $(<setting_name>) का उपयोग करने वाले असाइनमेंट .xcconfig में पहले के असाइनमेंट से इनहेरिट करेंगे। विरासत निर्माण प्रणाली ने .xcconfig में परिभाषित किसी भी अन्य को छोड़ने के लिए $(inherited) या $(<setting_name>) हर उपयोग का कारण बना। यह पता लगाने के लिए कि क्या आपका .xcconfig इस सुधार से प्रभावित है, रनिंग defaults write com.apple.dt.XCBuild EnableCompatibilityWarningsForXCBuildTransition -bool YES टर्मिनल में Xcode के कारण इस स्थिति के बारे में चेतावनी उत्पन्न करेगा।

(Xcode 10 बीटा 1 रिलीज़ नोट)

इसलिए उदाहरण के लिए, दो सरल .xcconfig फाइलें दी गई हैं:

//  Generic.xcconfig
OTHER_SWIFT_FLAGS = $(inherited) -DMY_GENERIC_FLAG

// Debug.xcconfig
#include "Generic.xcconfig"
OTHER_SWIFT_FLAGS = $(inherited) -DMY_DEBUG_FLAG

मान लें कि आपकी परियोजना अपने डीबग कॉन्फ़िगरेशन के लिए Debug.xcconfig का उपयोग करती है, तो आपको -DMY_GENERIC_FLAG -DMY_DEBUG_FLAG लिए अपेक्षित मान -DMY_GENERIC_FLAG -DMY_DEBUG_FLAG OTHER_SWIFT_FLAGS

(Xcode 9 और पहले के रिलीज में सिर्फ -DMY_DEBUG_FLAG बजाय)

नया व्यवहार बहुत सीधा है: $(inherited) बस पहले से परिभाषित चर के मान से प्रतिस्थापित किया जाता है, यदि कोई हो।

इसलिए पिछले उदाहरण में, यदि हम #include स्टेटमेंट का विस्तार करते हैं, तो हमें निम्नलिखित xcconfig फ़ाइल मिलेगी:

// Merged xcconfig files after resolving #include
OTHER_SWIFT_FLAGS = -DMY_GENERIC_FLAG
OTHER_SWIFT_FLAGS = $(inherited) -DMY_DEBUG_FLAG
  • पहली पंक्ति में OTHER_SWIFT_FLAGS मान है -DMY_GENERIC_FLAG ( $(inherited) कुछ भी नहीं है, क्योंकि यह OTHER_SWIFT_FLAGS 1 की पहली परिभाषा है)।
  • दूसरी पंक्ति में OTHER_SWIFT_FLAGS ओवरराइट किया गया है, और उसका मान अब -DMY_GENERIC_FLAG -DMY_DEBUG_FLAG (इसका पिछला मान + नया जोड़ा गया ध्वज) है।

अधिक जटिल xcconfig सेटअप पर, चीजें इस तरह दिख सकती हैं:

//  First.xcconfig
OTHER_SWIFT_FLAGS = $(inherited) -DMY_FIRST_FLAG

// Second.xcconfig
OTHER_SWIFT_FLAGS = $(inherited) -DMY_SECOND_FLAG

// Last.xcconfig
#include "Generic.xcconfig"
OTHER_SWIFT_FLAGS = $(inherited) -DMY_LAST_FLAG

// Merge.xcconfig
#include "First.xcconfig"
#include "Second.xcconfig"
OTHER_SWIFT_FLAGS = $(inherited) -DMY_INTERMEDIATE_FLAG
#include "Last.xcconfig"

हम मानेंगे कि इस बार हम अपने कॉन्फ़िगरेशन में Merge.xcconfig का उपयोग कर रहे हैं।

OTHER_SWIFT_FLAGS लिए हल किया गया मान फिर -DMY_FIRST_FLAG -DMY_SECOND_FLAG -DMY_INTERMEDIATE_FLAG -DMY_LAST_FLAG

यह पहली बार में आश्चर्यजनक हो सकता है, लेकिन यह वास्तव में समझ में आता है: एक बार #include हल हो जाने के बाद, हम इस xccff के साथ समाप्त होते हैं:

OTHER_SWIFT_FLAGS = $(inherited) -DMY_FIRST_FLAG
OTHER_SWIFT_FLAGS = $(inherited) -DMY_SECOND_FLAG
OTHER_SWIFT_FLAGS = $(inherited) -DMY_INTERMEDIATE_FLAG
OTHER_SWIFT_FLAGS = $(inherited) -DMY_LAST_FLAG

अंतिम हल किया गया मान तब अंतिम पंक्ति पर परिभाषित किया जाता है, जो -DMY_LAST_FLAG और साथ ही इसे पिछली पंक्ति से विरासत में प्राप्त मूल्य -DMY_INTERMEDIATE_FLAG आदि।

ध्यान दें कि स्वाभाविक रूप से, यदि आप परिभाषाओं में $(inherited) भूल जाते हैं, तो आप विरासत श्रृंखला को तोड़ देंगे और केवल नीचे की परिभाषाओं से मान प्राप्त करेंगे, बिना $(inherited) परिभाषा के $(inherited) परिभाषा।

1 परियोजना स्तर पर परिभाषित पिछले मानों को प्राप्त करने के लिए एक xcconfig फ़ाइल की अपेक्षा कर सकता है, लेकिन ऐसा प्रतीत नहीं होता है

Xcode 10 बीटा 1 के रूप में, ऐसा लगता है कि बिल्ड सेटिंग्स संपादक ठीक से xcconfig फ़ाइलों में परिभाषित चर के लिए सही मूल्य को हल नहीं करता है, और मानों को प्रदर्शित करता है जैसे कि पुराने पूर्व-Xcode 10 व्यवहार के साथ हल किया गया है। मैंने इस बारे में rdar: // 40873121 दायर किया ( https://openradar.appspot.com/radar?id=4925869923500032 )।


यह काम:

xcodebuild GCC_PREPROCESSOR_DEFINITIONS='$(value) NEW_VALUE'

यह मेरे लिए Xcode 2.4.1 में काम करता है:

GCC_PREPROCESSOR_DEFINITIONS = "$(GCC_PREPROCESSOR_DEFINITIONS) NEW_VALUE"

आपको कभी-कभी एक कॉन्फ़िगर फ़ाइल को संपादित करने और लक्ष्य के निर्माण की जानकारी में दिखाई देने वाले परिवर्तन के बीच कुछ सेकंड की अनुमति होती है।







xcconfig