2011-12-08 9 views
13

W CMake mam folder zawierający predefiniowane katalogi Gettext, które w czasie kompilacji kopiuję do folderu, a następnie je modyfikuję. Problem polega jednak na tym, że za każdym razem, gdy uruchomię cel, skopiuje on predefiniowany plik na lokalnej kopii (która prawdopodobnie jest zmodyfikowana). Czy istnieje sposób na skopiowanie, jeśli plik jest inny niż stan wcześniej, w przeciwnym razie pozostaw go w spokoju?Kopiowanie CMake, jeśli oryginalny plik zmienił się

Myślałem również, że sposobem na zrobienie tego byłoby skopiowanie ich w czasie generowania CMake'a, ale czuję się trochę zmęczony robieniem tego, ponieważ ludzie mogą usuwać foldery i spieprzać. Również nie wiem, jak wykonywać polecenia w czasie generowania, tylko w czasie kompilacji.

Odpowiedz

5

Alrighty, udało mi się to naprawić, ale zapomniałem o tej odpowiedzi. Przepraszam wszystkich, którzy opuścili to i nie mieli odpowiedzi!

# ----- 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 jest katalog zawierający pliki zaopatrzony PO, które nie mają być edytowane użytkownik (chyba, zobowiązując się do repo). langDir znajduje się w katalogu kompilacji pod "langiem". Przechodzi i kopiuje lub aktualizuje je na podstawie wieku plików.

+0

Świetny przykład !! – gone

20

Uważam, że powinieneś być w stanie użyć niestandardowego polecenia, które zależy od pliku. Coś jak:

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) 

Daj mi znać, jeśli to nie zrobi. To może pomóc w dostarczeniu kodu CMake, z którego aktualnie korzystasz.

Możesz również spróbować "$ {CMAKE_COMMAND} -E copy_if_different"; nie jest dla mnie jasne, czy byłoby inaczej, biorąc pod uwagę zależności polecenia, ale z pewnością mógłbym czegoś przegapić, lub może być inaczej, jeśli nie używasz wyjścia "make".


W przypadku, gdy chcesz spróbować zrobić kopię na „czas generacji” (podczas uruchamiania cmake), można użyć tego polecenia (myślę, że moje składnia jest poprawna, ale nie testowałem go):

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

Użycie INSTALL zamiast COPY daje nieco inne zachowanie.

Jeśli chcesz uruchomić dowolny proces w czasie generowania, wypróbuj komendę execute_process.

Oczywiście po szczegóły patrz: the CMake documentation.

+1

"cp" jest specyficzne dla Uniksa, ale dam mu szansę. – Jookia

+1

Zamiast używać "cp", możesz po prostu użyć "$ {CMAKE_COMMAND} -E copy" - uruchom "cmake -E" bez żadnych dalszych argumentów, aby zobaczyć listę dostępnych poleceń multikompletowych typu cmake -E może biec. Jest nawet "copy_if_different" ... Używanie niestandardowego polecenia, takiego jak to, jest idealnym rozwiązaniem, a odpowiedź też bym podał. – DLRdave

+0

O tak, użyłem tego przynajmniej raz wcześniej, ale zupełnie o tym zapomniałem. Dzięki za wskaźnik. –

7

Inną opcją jest użycie argumentu configure_file z argumentem COPYONLY.

configure_file(input_file output_file COPYONLY) 

To nie będzie wykonywać żadnych podstawienia zmiennej i skopiuje „input_file” po uruchomieniu make. Ale uruchamia przebieg cmake i może to być niepożądane ze względu na zużycie czasu.

Powiązane problemy