मैं add_custom_command
का उपयोग कर के अपने मूल विचार के साथ चिपके रहते हैं चाहते हैं। हालांकि, मैं आपको add_custom_command(OUTPUT ...)
के बजाय add_custom_command(TARGET ...)
फ़ॉर्म का उपयोग करने की सलाह दूंगा।
OUTPUT
संस्करण को उसी CMakeLists.txt में एक अलग सीएमके लक्ष्य में स्रोत फ़ाइल के रूप में उपयोग की जाने वाली आउटपुट फ़ाइल के लिए डिज़ाइन किया गया है। कस्टम लक्ष्य कमांड लागू होता है जब यह लक्ष्य बनाया जाता है (दाएं शुरुआत में), क्योंकि लक्ष्य को उस बिंदु पर मौजूद फ़ाइल की आवश्यकता होती है।
आपके मामले में, कोई लक्ष्य आपकी फ़ाइल पर निर्भर नहीं करता है - यह बिल्ड प्रक्रिया का एक उत्पाद है।
यदि आप add_custom_command(TARGET ...)
का उपयोग करते हैं, तो यह गारंटी देता है कि प्रत्येक बार लक्ष्य पुनर्निर्मित किया जाता है। add_custom_target
का उपयोग करने के लिए आपको यह याद रखना याद रखना चाहिए कि यदि मूल लक्ष्य (test
इस मामले में) अद्यतन किया गया है। यह आपकी लक्ष्यों की सूची में भी अनिवार्य रूप से जोड़ता है - शायद एक छोटी परियोजना के लिए कोई मुद्दा नहीं है, लेकिन यह बड़ी परियोजनाओं के लिए हो सकता है।
SET(COPY_TO_PATH custom1)
ADD_CUSTOM_COMMAND(TARGET test POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
$<TARGET_FILE:test>
${COPY_TO_PATH}
COMMENT "Copying 'test' library to '${COPY_TO_PATH}'")
यह test
की की एक के बाद निर्माण घटना के रूप में आदेश जोड़ता है:
यहाँ कैसे मैं आदेश की स्थापना करेंगे। जैसा कि आपने सही ढंग से पहचाना है, हार्ड कोडिंग लाइब्रेरी नाम बहुत अच्छा नहीं है; इसलिए सीएमके इसे संभालने के लिए "जेनरेटर एक्सप्रेशन" प्रदान करता है। जनरेटर अभिव्यक्ति $<TARGET_FILE:test>
प्लेटफ़ॉर्म या कंपाइलर के बावजूद, test
द्वारा बनाई गई लाइब्रेरी के पूर्ण पथ को हल करता है। ध्यान दें कि जेनरेटर एक्सप्रेशन का उपयोग केवल COMMAND
तर्क में किया जा सकता है; उदाहरण के लिए आप उन्हें COMMENT
भाग में उपयोग नहीं कर सके।
वास्तविक आदेश अपने -E
command line option के साथ सीएमके स्वयं (${CMAKE_COMMAND}
) का आह्वान कर रहा है। यह प्रति प्राप्त करने के लिए एक क्रॉस-प्लेटफार्म तरीका प्रदान करता है, क्योंकि cp
विंडोज कमांड नहीं है। सभी -E
विकल्पों को देखने के लिए, cmake -E help
चलाएं।