2013-09-03 4 views
6

मेरे पास एक मौजूदा सेमेक फ़ाइल है जो एक .so लाइब्रेरी उत्पन्न करती है। मैं इसे संशोधित करना चाहता हूं ताकि वह .so की एक प्रति बनाये और कुछ और नाम दे। यह मैं क्या है मोटे तौर पर है:सेमीकेक कस्टम कमांड को कॉपी और नाम बदलने के लिए

CMAKE_MINIMUM_REQUIRED(VERSION 2.8.7) 
PROJECT(test1) 

SET(TEST_SOURCES f1.c) 
ADD_LIBRARY(test SHARED ${TEST_SOURCES}) 
ADD_CUSTOM_COMMAND(
    OUTPUT custom1 
    COMMAND cp libtest.so custom1 
    DEPENDS libtest.so) 

मुझे पता है वहाँ लाइब्रेरी नाम हार्डकोड की तुलना में बेहतर तरीके हैं, मैं तो बस इस समय मैं कोशिश करते हैं और यह पता लगाने की यह बिल्कुल काम करने के लिए कैसे कर रहा हूँ। मुझे क्या याद आ रही है जो मेरी प्रतिलिपि/नाम बदलने के लिए कस्टम कमांड का कारण बन जाएगी? नोट: यह एक इंस्टॉल-टाइम चीज़ नहीं है। धन्यवाद

उत्तर

6
add_custom_target(CopyAndRename 
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/test.so ${CMAKE_BINARY_DIR}/SomeThingElse.so 
) 

add_custom_target CopyAndRename नामक एक नया लक्ष्य परिचय देता है। आप के साथ इसे चला सकते हैं:

make CopyAndRename 
11

मैं 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 चलाएं।

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