2013-01-23 14 views
9

मैं प्रत्येक संकलन के बाद निर्माण निर्देशिका में कॉन्फ़िगरेशन फ़ाइलों की प्रतिलिपि बनाने के लिए निम्न आदेश का उपयोग कर रहा हूं।सीएमके: फ़ाइलों को कॉपी करने के लिए लक्ष्य कैसे रखें

# Gather list of all .xml and .conf files in "/config" 
file(GLOB ConfigFiles ${CMAKE_SOURCE_DIR}/config/*.xml 
         ${CMAKE_SOURCE_DIR}/config/*.conf) 

foreach(ConfigFile ${ConfigFiles}) 
    add_custom_command(TARGET MyTarget PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E 
         copy ${ConfigFile} $<TARGET_FILE_DIR:MyTarget>) 
endforeach() 

यह क्रिया हर बार जब मैं प्रोजेक्ट संकलित करता हूं तो यह क्रिया ट्रिगर होती है। क्या किसी भी संकलन की आवश्यकता के बिना फ़ाइलों की प्रतिलिपि बनाने के लिए CMakeLists.txt में कोई लक्ष्य बनाना संभव है? कुछ "कॉपी कॉपी" की तरह।

उत्तर

24

आप copy नामक एक नए कस्टम लक्ष्य जोड़ सकते हैं और है कि अपने कस्टम का लक्ष्य आदेश बनाने के लिए सक्षम होना चाहिए:

file(GLOB ConfigFiles ${CMAKE_SOURCE_DIR}/config/*.xml 
         ${CMAKE_SOURCE_DIR}/config/*.conf) 

add_custom_target(copy) 
foreach(ConfigFile ${ConfigFiles}) 
    add_custom_command(TARGET copy PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E 
         copy ${ConfigFile} $<TARGET_FILE_DIR:MyTarget>) 
endforeach() 

अब कस्टम आदेशों केवल यदि आप copy निर्माण पर अमल होगा।

आप MyTarget की निर्भरता इतनी है कि आप या तो बस फ़ाइलों की प्रतिलिपि या यदि आप MyTarget निर्माण उन्हें कॉपी किया हो सकता है के रूप में इस copy लक्ष्य रखना चाहते हैं, तो आप चक्रीय निर्भरता को तोड़ने के लिए की आवश्यकता होगी। (MyTargetcopy पर निर्भर करता है, लेकिन copy प्रतिलिपि निर्देशिका के स्थान प्राप्त करने के लिए MyTarget पर निर्भर करता है)।

ऐसा करने के लिए, आप एक लक्ष्य के उत्पादन निर्देशिका होने का पुराने तरीके का सहारा कर सकते हैं:

add_custom_target(copy) 
get_target_property(MyTargetLocation MyTarget LOCATION) 
get_filename_component(MyTargetDir ${MyTargetLocation} PATH) 
foreach(ConfigFile ${ConfigFiles}) 
    add_custom_command(TARGET copy PRE_BUILD 
        COMMAND ${CMAKE_COMMAND} -E 
         copy ${ConfigFile} ${MyTargetDir}) 
endforeach() 
add_dependencies(MyTarget copy) 
+0

धन्यवाद। क्या मुझे दो अलग-अलग 'add_custom_command' कमांड की आवश्यकता है? मुख्य निष्पादन योग्य लक्ष्य और प्रतिलिपि लक्ष्य के लिए एक? क्योंकि अभी कस्टम कमान कुछ ऐसा है: 'add_custom_command (TARGET $ {PRODUCT} PRE_BUILD'। मैं मुख्य लक्ष्य बनाते समय या जब मैं "प्रतिलिपि बना देता हूं" फ़ाइलों को प्रतिलिपि बनाना चाहता हूं। – Meysam

+0

@Meysam उस मामले में '$ {PRODUCT}' को 'प्रतिलिपि 'पर निर्भर करने के लिए' add_dependencies ($ {PRODUCT} प्रतिलिपि 'का उपयोग करें। – Angew

+0

@Meysam - अपडेट किया गया उत्तर – Fraser

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