मैंने हाल ही में एक लंबे समय से चले गए डेवलपर के अस्पष्ट और गलत निर्माण निर्देशों के बाद एक सी ++ प्रोजेक्ट के लिए बहुत समय बिताया है जिस पर मैं काम कर रहा हूं। इसलिए, मैं एक नई बिल्ड सिस्टम लिख रहा हूं और मैं इसे करने का सबसे अच्छा तरीका ढूंढ रहा हूं। मैंने परियोजना लक्ष्यों से पहले निर्भरता एकत्र करने और निर्माण करने के लिए सीएमके में ExternalProject_Add कमांड का उपयोग करने पर समझौता किया है, लेकिन मुझे एक उत्कृष्ट लेख git सबमॉड्यूल के उपयोग का सुझाव देता है, जो ऐसा लगता है कि यह बहुत समान करता है, यदि समान नहीं है। तो मेरा प्रश्न: git submodules और ExternalProject_Add?

2
CiaranWelsh 2 मार्च 2020, 20:51
git submodules git उपयोगिता द्वारा प्रदान किया गया है, ExternalProject_Add सीएमके द्वारा प्रदान किया गया है। वे "समान चीज़" कैसे हो सकते हैं? क्या आप CMake प्रोजेक्ट में बाहरी निर्भरता को संभालने के लिए इन कार्यात्मकताओं की तुलना करना चाहते हैं? मुझे यकीन नहीं है कि प्रोप। और विपक्ष। अनुरोध स्टैक ओवरफ़्लो पर विषय पर है और इसका ठीक से उत्तर दिया जा सकता है। BTW, ExternalProject_Add के बजाय यह FetchContent कार्यक्षमता है जो git submodules द्वारा प्रदान की गई कार्यक्षमता के समान है। यह मुख्य रूप से प्रोजेक्ट के डेवलपर पर निर्भर करता है कि वह FetchContent या git submodules में से किसी एक को चुनें।
 – 
Tsyvarev
2 मार्च 2020, 22:49
"वही बात", मेरा मतलब कार्यक्षमता के संदर्भ में है। मेरा मतलब यह नहीं था कि वे सटीक हैं। ऐसा लगता है कि वे दोनों तीसरे पक्ष के पुस्तकालयों को बिना किसी जल्दबाजी के स्थापित करने में सक्षम बनाते हैं। मैं जानना चाहता हूं कि 'सामान्य' (बेहतर शब्द की कमी के लिए) सी ++ डेवलपर इन दो समान विशेषताओं के बारे में क्या जानता है। शायद आपका अधिकार, यह स्टैक ओवरफ़्लो के लिए ऑफ-विषय होने पर बोर्डिंग कर रहा है, लेकिन मुझे अभी भी इसका उत्तर देना बहुत उपयोगी लगेगा।
 – 
CiaranWelsh
3 मार्च 2020, 20:22

1 उत्तर

सबसे बढ़िया उत्तर

आप git सबमॉड्यूल के बिना ExternalProject_Add का उपयोग कर सकते हैं:

if (SPECIAL_CASE)
  include (ExternalProject)
  ExternalProject_Add (
    project1
    PREFIX project1
    GIT_REPOSITORY "https://github.com/project.git"
    GIT_TAG "v1"
  )
endif ()

project को CURRENT_BINARY_DIR में क्लोन किया जाएगा, मुख्य प्रोजेक्ट निर्माण से पहले स्थानीय सिस्टम में बनाया और स्थापित किया जाएगा। आपका मुख्य प्रोजेक्ट वैश्विक दायरे से #include <project/header.h> का उपयोग करेगा। यह समाधान केवल लोकप्रिय परियोजनाओं के लिए उपयुक्त है, जो लक्ष्य ऑपरेटिंग सिस्टम के भाग के लिए निर्भरता के रूप में उपलब्ध हैं। आप गारंटी दे सकते हैं कि आपके लक्षित सिस्टम को निर्भरता का आवश्यक संस्करण प्राप्त होगा।

उदाहरण के लिए, openssl को देखें, आपके स्थानीय सिस्टम में यह लाइब्रेरी 100% स्थापित है। आपकी लक्षित ऑपरेटिंग सिस्टम सूची में मूल Win32 (बिना MinGW या CygWin) शामिल हैं। Win32 के लिए openssl की सभी उपलब्ध रिलीज़ बहुत पुरानी हैं, आप Win32 के लिए openssl इंस्टॉलर का आवश्यक संस्करण नहीं ढूंढ पाएंगे। तो आप बिना सबमॉड्यूल के #include <openssl/ssl.h> के साथ if (WIN32) ExternalProject_Add का उपयोग कर सकते हैं। आपके प्रोजेक्ट में openssl सबमॉड्यूल जोड़ने का कोई मतलब नहीं है।

कृपया निम्न उदाहरण की समीक्षा करें।

यदि बाहरी project लोकप्रिय नहीं है, लोकप्रिय पैकेज प्रबंधकों में उपलब्ध नहीं है (जैसे rpm, deb, ebuilds, आदि) तो सबमॉड्यूल का उपयोग करना बेहतर है।

0
puchu 20 अप्रैल 2021, 20:26