2016-02-11 13 views
5

से कमांड स्थापित करें बहिष्कृत करें मैं एक परियोजना के लिए सीएमके का उपयोग कर रहा हूं और अपने परीक्षण मामलों के लिए googletest का उपयोग कर रहा हूं। इंटरनेट के चारों ओर देखकर, Googletest स्रोत को अपने भंडार के सबफ़ोल्डर में कॉपी करने और इसे "add_subdirectory (googletest)" के साथ शामिल करने के लिए सामान्य प्रथा प्रतीत होती है। मैंने वह किया।सीपीएसी: उपनिर्देशिका (googletest निर्देशिका)

अब मैं अपने प्रोजेक्ट के लिए डेबियन पैकेज जेनरेट करने के लिए सीपीएक का उपयोग कर रहा हूं। दुर्भाग्य से, सीपीएक्स द्वारा उत्पन्न संकुल मेरे प्रोजेक्ट के साथ Googletest इंस्टॉल करें। यह निश्चित रूप से नहीं है जो मैं चाहता हूं।

googletest निर्देशिका में देखकर, मुझे कुछ इंस्टाल सेमेक कमांड मिलते हैं, इसलिए यह स्पष्ट है, ऐसा क्यों होता है। सवाल अब है - मैं इससे कैसे बच सकता हूं? मुझे googletest से CMakeLists.txt फ़ाइलों को संशोधित करना पसंद नहीं है, क्योंकि मुझे अपडेट पर अपने संशोधनों को फिर से लागू करना याद रखना होगा। क्या सीपीएक्स में इन इंस्टॉलेशन को अक्षम करने का कोई और तरीका है?

उत्तर

6

आप अपने प्रोजेक्ट की रिहाई में परीक्षण (जो आप CPack साथ प्रदान करना चाहते हैं) की जरूरत नहीं है, तो सशर्त googletest उपनिर्देशिका में शामिल हैं, और गलत पर सशर्त सेट जब पैकेजिंग:

... 
if(NOT DISABLE_TESTS) 
    add_subdirectory(googletest) 
endif() 

साथ पैकेजिंग
cmake -DDISABLE_TESTS=ON <source-dir> 
cpack 

वैकल्पिक रूप से, अगर आप परीक्षण चाहते हैं, लेकिन परीक्षण के बुनियादी ढांचे को स्थापित नहीं करना चाहते हैं, तो आप install आदेश ही नाम के साथ मैक्रो या समारोह को परिभाषित करने के माध्यम से अक्षम कर सकते हैं:

# Replace install() to do-nothing macro. 
macro(install) 
endmacro() 
# Include subproject (or any other CMake code) with "disabled" install(). 
add_subdirectory(googletest) 
# Restore original install() behavior. 
macro(install) 
    _install(${ARGN}) 
endmacro() 

इस दृष्टिकोण को CMake mailing में भी सुझाव दिया गया है।

# overwrite install() command with a dummy macro that is a nop 
macro (install) 
endmacro() 

# configure build system for external libraries 
add_subdirectory(external) 

# replace install macro by one which simply invokes the CMake 
install() function with the given arguments 
macro (install) 
    _install(${ARGV}) 
endmacro(install) 

नोट ${ARGV} और ${ARGN} वही हैं, लेकिन डॉक्स वर्तमान में ${ARGN} उपयोग करने का सुझाव:

+0

दूसरी बात मेरे स्वयं के इंस्टॉलेशन कमांड को अक्षम करने लगती है, हालांकि उन्हें एक अलग (उप-निर्देशिका) में परिभाषित नहीं किया गया है। किस स्कोप के लिए इंस्टॉल फ़ंक्शन ओवरराइट किया गया है? क्या मैं इसे वर्तमान निर्देशिका (उपनिर्देशिका सहित) के लिए केवल ओवरराइट कर सकता हूं? – Heinzi

+0

'क्या मैं इसे वर्तमान निर्देशिका (उपनिर्देशिका समेत) के लिए ओवरराइट कर सकता हूं?' - वास्तव में फ़ंक्शन की परिभाषा को काम करना चाहिए। मैं बाद में इसका परीक्षण करूंगा। – Tsyvarev

+0

खैर, वास्तव में कार्य परिभाषा का वैश्विक दायरा है।मैंने उत्तर पोस्ट में 'इंस्टॉल()' व्यवहार को बहाल करने के लिए कोड जोड़ा है। – Tsyvarev

3

तो वहाँ मैक्रो विकल्प @Tsyvarev उल्लेख किया है कि मूल रूप से here सुझाव दिया गया था। यह भी तथ्य है कि मैक्रो ओवरराइटिंग _ को मूल मैक्रो नाम पर प्रीपेड नहीं किया गया है, लेकिन यह अभी भी व्यवहार है। कोड here देखें।

हालांकि, मुझे उपर्युक्त कोड ठीक से काम करने के लिए कभी नहीं मिला। यह वास्तव में अजीब चीजें करता है और अक्सर install() दो बार कॉल करता है।

एक वैकल्पिक - भी undocumented - EXCLUDE_FROM_ALL उपयोग करने के लिए है:

add_subdirectory(external EXCLUDE_FROM_ALL) 

कुछ टिप्पणी मैंने पाया के अनुसार कहीं यह है कि उप निर्देशिका के लिए install() अक्षम करता है। मुझे लगता है कि यह वास्तव में क्या करता है EXCLUDE_FROM_ALL डिफ़ॉल्ट रूप से सभी install() कमांड के लिए सेट करता है जो शायद आप जो चाहते हैं वह भी करता है। हालांकि मैंने वास्तव में इसका परीक्षण नहीं किया है, हालांकि एक शॉट के लायक है।

+1

EXCLUDE_FROM_ALL cmake 3.7 के साथ ठीक काम करता है – Dmitry

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