CMСкопировать, если исходный файл изменился - PullRequest
15 голосов
/ 08 декабря 2011

В CMake у меня есть папка, содержащая предопределенные каталоги Gettext, которые во время сборки я копирую в папку и затем изменяю их.Но проблема в том, что каждый раз, когда я запускаю цель, она будет копировать предопределенный файл в локальную копию (которая, вероятно, изменена).Есть ли способ скопировать, если файл отличается от того состояния, в котором он был раньше, иначе оставить его в покое?

Я также думал, что способ сделать это - скопировать их во время генерации CMake,но я чувствую себя немного уставшим от этого, поскольку люди могут удалять папки и все испортить.Также я не знаю, как выполнять команды во время генерации, только во время сборки.

Ответы [ 3 ]

21 голосов
/ 09 декабря 2011

Полагаю, вы сможете использовать пользовательскую команду, которая зависит от файла. Что-то вроде:

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, который вы сейчас используете.

Вы также можете попробовать "$ {CMAKE_COMMAND} -E copy_if_different"; Мне не ясно, будет ли это иначе, учитывая зависимости команды, но я наверняка что-то упустил, или это могло бы быть иначе, если вы не используете вывод "make".


Если вы хотите попробовать сделать копию во время генерации (когда вы запускаете cmake), вы можете использовать эту команду (я думаю, что мой синтаксис правильный, но я его не проверял):

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

Использование INSTALL вместо COPY дает немного другое поведение.

Если вам нужно запустить произвольный процесс во время генерации, попробуйте команду execute_process.

Конечно, подробности см. Документация CMake .

9 голосов
/ 26 июля 2015

Другой вариант - использовать configure_file с аргументом COPYONLY.

configure_file(input_file output_file COPYONLY)

Это не будет выполнять подстановку переменных и будет копировать "input_file" при запуске make.Но он запускает запуск cmake, и это может быть нежелательно из-за затрат времени.

5 голосов
/ 29 сентября 2012

Хорошо, мне удалось исправить это некоторое время назад, но забыл об этом ответе.Извините всех людей, которые пропустили это и не получили ответа!

# ----- 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 - это каталог, в котором хранятся po-файлы, которые не предназначены для редактирования пользователем (кроме случаев, когда выполняется репо),langDir находится в каталоге сборки под 'lang'.Он проходит и копирует или обновляет его в зависимости от возраста файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...