2012-10-16 13 views
5

पर निर्भरता जोड़ें मेरे पास कई सबप्रोजेक्ट्स के साथ एक सीएमके प्रोजेक्ट है। उनमें से प्रत्येक एक फ़ंक्शन का उपयोग कर सकता है जो मैं कुछ निश्चित जानकारी (add_custom_command को कॉल करके) के साथ एक छोटी पाठ फ़ाइल उत्पन्न करने के लिए प्रदान करता हूं। अंतिम चरण में मैं उन सभी फ़ाइलों को एक बड़ी टेक्स्ट फ़ाइल में जोड़ना चाहता हूं।सीएमके: add_custom_command गतिशील रूप से

मैंने एक कस्टम कमांड बनाया है जो बनाई गई फ़ाइलों (सभी एक ही स्थान पर) की खोज करता है और उन्हें विलय करता है।

समस्या यह है कि मैं यह अंतिम चरण उपप्रोजेक्ट में किए जा रहे सभी छोटे चरणों पर निर्भर करता हूं, जबकि मुझे वास्तव में नहीं पता कि कितनी फाइलें प्रदान की जाएंगी।

मेरे अंतिम आदेश लगता है:

add_custom_command(OUTPUT combination.txt 
        COMMAND create combination.txt from all files from /path/) 

और मेरे create-छोटे पाठ फ़ाइल के लिए प्रत्येक-subproject आदेश की तरह दिखता है:

add_custom_command(OUTPUT /path/${sub_project_name}.txt 
        COMMAND create /path/${sub_project_name}.txt) 

और जब मैं उन छोटे फ़ाइलों को बनाने के मैं "combination.txt" बनाने के लिए की तरह कुछ करना चाहते हैं /path/${sub_project_name}.txt पर निर्भर

तो काश मैं कर सकता:

add_dependency(combination.txt /path/${sub_project_name}.txt) 

हालांकि यह केवल लक्ष्य के लिए काम करता है।

मैं भी OBJECT_DEPENDS साथ set_source_files_properties उपयोग करने के लिए कोशिश की है, लेकिन यह (शायद अपनी इरादा add_target के सीपीपी फाइलों के साथ प्रयोग की जाने वाली?)

पिछले रास्ता मिल यह काम करने के लिए मैं देख रहा हूँ है काम नहीं करता है लगता है एक कैश चर जो उन सभी छोटे फ़ाइलों रास्तों जमा है और फिर इस तरह इसका इस्तेमाल उपयोग करने के लिए:

add_custom_command(OUTPUT combination.txt 
        COMMAND create combination.txt from all files from /path/ 
        DEPENDS ${all_small_files_list}) 

लेकिन यह अंत में मैं क्या करना चाहते है।

उत्तर

4

add_custom_command का उपयोग करने के बजाय आप सही निर्भरता-परिभाषा के साथ add_custom_target का उपयोग कर सकते हैं (ताकि यह हर बार बनाया न जाए)।

add_custom_target(project 
        COMMAND touch project.txt) 

add_custom_target(project2 
        COMMAND touch project2.txt) 

add_custom_target(combination 
        COMMAND cat project.txt project2.txt > combination.txt) 

add_dependencies(combination project2) 
add_dependencies(combination project) 

add_executable(t t.c) 
add_dependencies(t combination.txt) 

फिर: सुनिश्चित करें कि आप इतना है कि एक परियोजना लक्ष्य है और इस तरह संयोजन-लक्ष्य की तारीख से बाहर हो जाता है एक असली निर्भरता श्रृंखला बनाने के लिए add_custom_target की DEPENDS तर्क का उपयोग कर रहे हैं।

अद्यतन: मैं बहुत समय से पहले था। असल में सेमेक (कम से कम 2.8.9) निर्भरता के लिए निम्नानुसार काम करता है: add_dependencies पर कॉल के साथ आप एक कस्टम कमांड IOW ए (जेनरेटेड) फ़ाइल के OUTPUT पर निर्भरता नहीं जोड़ सकते हैं। add_dependencies के साथ आप केवल target जोड़ सकते हैं जैसा कि add_custom_target द्वारा बनाया गया है। हालांकि में आप DEPENDS-डायरेक्टिव का उपयोग करके add_custom_command के आउटपुट पर निर्भर कर सकते हैं। जैसा कि कहा गया यह यह काम करता है:

add_custom_command(OUTPUT project.txt 
        COMMAND uptime >> project.txt MAIN_DEPENDENCY t2.c) 
add_custom_target(project DEPENDS project.txt) 

add_custom_target(combination 
        COMMAND cat project.txt project2.txt > combination.txt) 
add_dependencies(combination project) 

इस रूप में यह कोई MAIN_DEPENDENCY या DEPENDS है संयोजन लक्ष्य हमेशा पुनर्जीवित किया है, लेकिन add_dependencies के उपयोग की अनुमति दी है कर देगा।

+0

यह काम करेगा, लेकिन बिल्कुल अपेक्षित नहीं: हर बार जब मैं कॉल करता हूं, तो सभी लक्ष्य (संयोजन, प्रोजेक्ट और प्रोजेक्ट 2) पुनर्निर्माण किए जाएंगे - इसलिए फाइलें फिर से चालू हो जाएंगी। यह उतना अच्छा नहीं है जितना हो सकता है;) मेरे लिए अपेक्षित व्यवहार किसी भी फाइल को पुन: उत्पन्न नहीं करना है जब तक कि यह आवश्यक न हो। सीएमके के दस्तावेज़ों के अनुसार - add_custom_target हर बार बनाया जा रहा है। मेरी इच्छा है कि मेरे पास add_custom_command के रूप में काम करने का समाधान हो - जो केवल तभी बनता है जब कोई निर्भरता बदल जाती है। –

+0

प्रोजेक्ट.txt जेनरेट करने के लिए आप निर्भरता के रूप में क्या उपयोग करते हैं? मैं _think_ cmake-doc क्या कहना चाहता है, कि एक कस्टम_ लक्ष्य हमेशा जांचता है कि इसे पुनर्निर्मित करना है या नहीं - कम से कम ऐसा लगता है कि यह मेरे लिए ऐसा काम करता है। –

+0

ठीक है, हम इसे कैसे करते हैं, इसके बारे में कुछ उचित पढ़ने के बाद, मुझे यह स्वीकार करना होगा कि मैं बहुत समय से पहले था। उत्तर का मेरा अद्यतन देखें। –

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