2011-12-08 14 views
13

सीएमके में मेरे पास एक फ़ोल्डर है जिसमें पूर्वनिर्धारित गेटटेक्स्ट कैटलॉग हैं, जो निर्माण समय पर मैं एक फ़ोल्डर में कॉपी करता हूं और फिर उन्हें संशोधित करता हूं। लेकिन समस्या यह है कि हर बार जब मैं लक्ष्य चलाता हूं तो यह पूर्वनिर्धारित फ़ाइल को स्थानीय प्रतिलिपि पर कॉपी करेगा (जिसे शायद संशोधित किया गया है)। क्या प्रतिलिपि बनाने का कोई तरीका है यदि फ़ाइल किसी राज्य से अलग है या नहीं, अन्यथा इसे अकेला छोड़ दें?मूल फ़ाइल बदलकर

मैं यह भी सोच रहा था कि ऐसा करने का एक तरीका उन्हें सीएमके पीढ़ी के समय में कॉपी करना होगा, लेकिन मुझे ऐसा करने से थोड़ा थका लगता है क्योंकि लोग फ़ोल्डरों को हटा सकते हैं और चीजों को पेंच कर सकते हैं। साथ ही मुझे नहीं पता कि निर्माण समय पर केवल पीढ़ी के समय में आदेश कैसे करें।

उत्तर

5

ठीक है, मैं इसे थोड़ी देर पहले ठीक करने में कामयाब रहा लेकिन इस जवाब के बारे में भूल गया। क्षमा करें उन सभी लोगों ने जो इस पर छोड़ दिया है और जवाब नहीं मिला!

# ----- Copy and merge across the po files that come with the source. 

message("Copying and updating stock translations...") 

file(GLOB poFiles "${stockDir}/*.po") 

foreach(file ${poFiles}) 
    # Get the language name, like en_US or zh_CN from the name of the po file, so 
    # 'en_US.po' or 'zh_CN.po' become 'en_US' or 'zh_CN.po' 
    get_filename_component(langName ${file} NAME_WE) 

    set(newFile "${langDir}/${langName}.po") 

    if(NOT EXISTS ${newFile}) 
    execute_process(COMMAND ${MSGMERGE_EXECUTABLE} 
     "--output-file" ${newFile} ${file} ${potFile} 
     OUTPUT_QUIET ERROR_VARIABLE error RESULT_VARIABLE ret) 

    if(ret) # Have to do this hack as msgmerge prints to stderr. 
     message(SEND_ERROR "${error}") 
    endif() 

    message(" '${langName}' copied.") 
    elseif(${file} IS_NEWER_THAN ${newFile}) 
    execute_process(COMMAND ${MSGMERGE_EXECUTABLE} 
     "--update" ${newFile} ${file} 
     OUTPUT_QUIET ERROR_VARIABLE error RESULT_VARIABLE ret) 

    if(ret) # Have to do this hack as msgmerge prints to stderr. 
     message(SEND_ERROR "${error}") 
    endif() 

    message(" '${langName}' merged.") 
    endif() 
endforeach() 

stockDir स्टॉक पो फ़ाइलें जो उपयोगकर्ता द्वारा तैयार किया जा करने के लिए नहीं होती हैं युक्त निर्देशिका है (जब तक रेपो करने से)। langDir 'लैंग' के तहत निर्माण निर्देशिका में है। यह फाइलों की उम्र के आधार पर जाता है, और या तो प्रतिलिपि बनाता है या अपडेट करता है।

+0

ग्रेट उदाहरण !! – gone

20

मुझे विश्वास है कि आप एक कस्टम कमांड का उपयोग करने में सक्षम होना चाहिए जो फ़ाइल पर निर्भर करता है। कुछ ऐसा:

add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/output.file 
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/input.file ${CMAKE_CURRENT_BINARY_DIR}/output.file 
    MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/input.file) 

मुझे बताएं कि यह ऐसा नहीं करता है। यह उस सीएमके कोड को प्रदान करने में मदद कर सकता है जिसका आप वर्तमान में उपयोग कर रहे हैं।

आप "$ {CMAKE_COMMAND} -E copy_if_different" भी आजमा सकते हैं; यह मुझे स्पष्ट नहीं है कि यह आदेश की निर्भरताओं को अलग करेगा, लेकिन मैं निश्चित रूप से कुछ खो रहा था, या यदि आप "मेक" आउटपुट का उपयोग नहीं कर रहे हैं तो यह अलग हो सकता है।


मामले में आप "पीढ़ी समय" (आप cmake चलते हैं तो), तो आप इस आदेश का उपयोग कर सकते हैं पर नकल कर रही कोशिश करना चाहते हैं (मुझे लगता है कि मेरी वाक्य रचना सही है लेकिन मैं इसे परीक्षण नहीं किया है):

file(COPY 
    ${CMAKE_CURRENT_SOURCE_DIR}/input.file 
    DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/) 

सीओपीवाई के बजाय इंस्टॉलेशन का उपयोग थोड़ा अलग व्यवहार देता है।

यदि आपको पीढ़ी के समय में मनमाने ढंग से प्रक्रिया चलाने की आवश्यकता है, तो execute_process कमांड को आजमाएं।

विवरण के लिए बेशक the CMake documentation देखें।

+1

"सीपी" यूनिक्स विशिष्ट है, लेकिन मैं इसे एक शॉट दूंगा। – Jookia

+1

"सीपी" का उपयोग करने के बजाय, आप केवल "$ {CMAKE_COMMAND} -E प्रतिलिपि" - "cmake -E" चला सकते हैं - उपलब्ध cmake -E क्रॉस-प्लेटफ़ॉर्म टूल-जैसी कमांड की सूची देखने के लिए किसी और तर्क के बिना भाग सकता है। यहां तक ​​कि एक "copy_if_different" भी है ... इस तरह एक कस्टम कमांड का उपयोग करना एकदम सही समाधान है, और जो जवाब मैंने दिया होगा, भी। – DLRdave

+0

ओह हाँ, मैंने कम से कम एक बार पहले इसका इस्तेमाल किया लेकिन पूरी तरह से इसके बारे में भूल गया। सूचक के लिए धन्यवाद। –

7

एक और विकल्प configure_fileCOPYONLY तर्क के साथ उपयोग करना है।

configure_file(input_file output_file COPYONLY) 

यह किसी भी चर प्रतिस्थापन प्रदर्शन नहीं करेगा और जब आप make चलाने "input_file" कॉपी कर देंगे। लेकिन यह एक सेमेक रन ट्रिगर करता है और यह समय की खपत के कारण अवांछनीय हो सकता है।

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