2015-06-05 5 views
7

इसलिए मैंने एक मेटाप्रोजेक्ट सेट किया है, जिसका अर्थ है कि मेरे पास एक निर्देशिका (मूल निर्देशिका) है जिसमें एकाधिक उपनिर्देशिकाएं हैं, जिनमें से प्रत्येक एक सेमेक प्रोजेक्ट है (एक वैध cmakelists के साथ)। रूट निर्देशिका में cmakelists cmake add_subdirectory कमांड का उपयोग कर सबप्रोजेक्ट आयात करता है।सेमेक सबप्रोजेक्ट्स में नाम संघर्ष से कैसे बचें?

प्रत्येक सबप्रोजेक्ट अपने स्वयं के लक्ष्य (पुस्तकालयों और निष्पादन योग्य) के साथ-साथ लक्ष्य "चेक" को परिभाषित करता है जो उस परियोजना के लिए परीक्षण सूट निष्पादित करता है और "दस्तावेज़" जो डॉक्सिजन चलाता है।

मेरी समस्या यह है कि सीएमके समझ में नहीं आता है कि चेक और दस्तावेज़ लक्ष्य प्रत्येक प्रोजेक्ट के लिए स्थानीय हैं, और इसलिए नाम संघर्ष के बारे में शिकायत करते हैं।

तो मेरा सवाल यह है कि क्या सेमेक को यह समझने का कोई तरीका है कि ये लक्ष्य प्रत्येक परियोजना के लिए स्थानीय हैं?

उत्तर

1

सीएमके डुप्लिकेट लक्ष्य नामों की अनुमति नहीं देता है। तर्क docs for policy CMP0002 में प्रदान की जाती है:

  • अनोखा नाम स्पष्ट रूप से दोनों CMake कोड में और मेकअप उपकरण कमांड लाइन पर संदर्भित किया जा सकता है।
  • लक्ष्य के लिए सार्थक परियोजना नाम तैयार करने के लिए एक्सकोड और वीएस आईडीई जनरेटर द्वारा तार्किक नामों का उपयोग किया जाता है।

आपका CMP0002OLD (cmake_policy(SET CMP0002 OLD) के माध्यम से किया) के लिए जो कम से कम CMake त्रुटि से छुटकारा पाने के हैं सेट कर सकते हैं, लेकिन मुझे लगता है कि के खिलाफ की सलाह देते हैं - यह निश्चित रूप से MSVC/Xcode के लिए काम नहीं करेगा।

एकमात्र विकल्प जिसे मैं हाथ-कोडिंग अद्वितीय नामों से कम देख सकता हूं, एक सीएमकेक फ़ंक्शन लिखना होगा जो प्रति "चेक" लक्ष्य का एक अद्वितीय नाम उत्पन्न करता है - उदाहरण के लिए यह उस लक्ष्य का नाम जोड़ सकता है जिसे चेक किया जा रहा है, check_my_lib_one, check_my_exe_one, आदि

यह समारोह भी सभी पंजीकृत check_<Target> की कई घटनाओं के इकट्ठा करने और उन्हें एक ही लक्ष्य check कहा जाता है जो प्रत्येक अधीनस्थ check_<Target> आह्वान करेंगे में जोड़ने के लिए इस्तेमाल किया जा सकता है, तो make check चल जैसे नामों उपज उन सब को चलाता है ।

+0

ठीक है, मैं "एक नामस्थान प्रति परियोजना" की तरह कुछ ढूंढ रहा था, लेकिन यह सेमेक में मौजूद प्रतीत नहीं होता है, इसलिए मैं आपके समाधान का उपयोग करूंगा, धन्यवाद! तकनीकी रूप से –

+0

@ सार-स्काई, आप अपने द्वारा नामस्थान सम्मेलन का उपयोग कर सकते हैं। उदाहरण के लिए प्रोजेक्ट नाम से सभी परियोजनाओं के लक्ष्य को उपसर्ग करना। – ibizaman

+0

@ibizaman यह है कि मैं उपसर्ग जोड़ने को स्वचालित करने के लिए एक मैक्रो का उपयोग कर समाप्त हो गया। –

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