मैं किसी भी फ़ाइल को cmake `फ़ाइल (GLOB…)` पैटर्न से कैसे निकालूँ?


86

मेरी CMakeLists.txtइस पंक्ति में है:

file(GLOB lib_srcs Half/half.cpp Iex/*.cpp IlmThread/*.cpp Imath/*.cpp IlmImf/*.cpp)

और IlmImfफ़ोल्डर में शामिल है b44ExpLogTable.cpp, जिसे मुझे बिल्ड से बाहर करने की आवश्यकता है।

कैसे प्राप्त करें?

जवाबों:


100

आप listसूची में हेरफेर करने के लिए फ़ंक्शन का उपयोग कर सकते हैं , उदाहरण के लिए:

list(REMOVE_ITEM <list> <value> [<value> ...])

आपके मामले में, शायद कुछ इस तरह काम करेगा:

list(REMOVE_ITEM lib_srcs "IlmImf/b44ExpLogTable.cpp")

1
lib_srcs के बजाय lib_src और IlmImf के बजाय IlmThread, यह ट्रिक किया! अनेक अनेक धन्यवाद !
बर्क

20
नोट: सूची के आइटम को हटाते समय, सुनिश्चित करें कि आप जिस मूल्य की खोज कर रहे हैं, ठीक उसी तरह से करें जैसा कि सूची में है। मुझे $ {CMAKE_SOURCE_DIR} /src/file_to_remove.cpp $ {CMAKE_CURRENT_SOURCE_DIR} /../ file_rem_remove.cpp के साथ मिलाने में कुछ परेशानी हो रही थी। यह एक ही स्थान को इंगित करता है, लेकिन यह एक ही स्ट्रिंग नहीं है। संदेश ("$ {VARIABLE_NAME}") आपको उन सामग्रियों को डीबग करने में मदद कर सकता है।
hbobenicio

यदि आपके द्वारा उपयोग CONFIGURE_DEPENDSकी गई और बिल्ड द्वारा निर्मित फ़ाइल को बाहर करने की आवश्यकता है तो यह मदद नहीं करता है । fileकॉल के बाद सूची पर एक फ़िल्टर अभी भी एक पुनर्निर्माण को ट्रिगर करता है, जो मेरे मामले में, मैं बचने की कोशिश कर रहा हूं।
simon.watts

यह बहुत बेहतर है का उपयोग करेंlist(FILTER
19 hukeping

2
उपरोक्त समाधान 3.10.2 संस्करण के साथ मेरे लिए काम नहीं करता है, लेकिन नीचे दिया गया समाधान list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>) मेरे लिए अच्छा काम करता है।
एमएच यिप

42

फिल्टर एक और विकल्प है जो कुछ मामलों में अधिक सुविधाजनक हो सकता है:

list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>)

यह फ़ाइल आवश्यक फ़ाइल नाम के साथ समाप्त होने वाली प्रत्येक वस्तु को बाहर करती है:

list(FILTER lib_srcs EXCLUDE REGEX ".*b44ExpLogTable.cpp$")

यहाँ cmge के लिए Regex विशिष्टता है:

The following characters have special meaning in regular expressions:

^         Matches at beginning of input
$         Matches at end of input
.         Matches any single character
[ ]       Matches any character(s) inside the brackets
[^ ]      Matches any character(s) not inside the brackets
 -        Inside brackets, specifies an inclusive range between
          characters on either side e.g. [a-f] is [abcdef]
          To match a literal - using brackets, make it the first
          or the last character e.g. [+*/-] matches basic
          mathematical operators.
*         Matches preceding pattern zero or more times
+         Matches preceding pattern one or more times
?         Matches preceding pattern zero or once only
|         Matches a pattern on either side of the |
()        Saves a matched subexpression, which can be referenced
          in the REGEX REPLACE operation. Additionally it is saved
          by all regular expression-related commands, including
          e.g. if( MATCHES ), in the variables CMAKE_MATCH_(0..9).

निरपेक्ष / सापेक्ष
पथों के

1
बहुत बेहतरlist(REMOVE_ITEM
Ceztko

1
ध्यान दें कि list(FILTER ...)cmake v3.6 में पेश किया गया था: stackoverflow.com/a/42167646/3476780
yano

यह निश्चित रूप से एक बेहतर जवाब है, हालांकि यदि आप इसे पूरी निर्देशिका को बाहर करने के लिए उपयोग करने का प्रयास कर रहे हैं या यदि आपका regex गड़बड़ है, तो आप जितना चाहें उससे अधिक बाहर कर सकते हैं। उदाहरण के लिए, .*test/.*यदि आपकी परियोजना एक निर्देशिका ट्री के अंदर है, जहां मूल माता-पिता में से एक को कुछ कहा जाता है, तो हर चीज को बाहर करने की कोशिश हो सकती है mytest
एंथनीडी 973

1

इसे इस्तेमाल करे : CMakeLists.txt

install(DIRECTORY   ${CMAKE_SOURCE_DIR}/ 
            DESTINATION ${CMAKE_INSTALL_PREFIX}
            COMPONENT   copy-files
            PATTERN     ".git*"   EXCLUDE
            PATTERN     "*.in"    EXCLUDE
            PATTERN     "*/build" EXCLUDE)

add_custom_target(copy-files
            COMMAND ${CMAKE_COMMAND} -D COMPONENT=copy-files
            -P cmake_install.cmake)
$cmake <src_path> -DCMAKE_INSTALL_PREFIX=<install_path>
$cmake --build . --target copy-files
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.