CMAKE: выполнение копирования файла ПОСЛЕ выполнения пользовательской команды - PullRequest
3 голосов
/ 14 июля 2011

У меня есть фрагмент сценария сборки, который выглядит следующим образом:

foreach(...)
...
  add_custom_command( OUTPUT ${fn_c} ${fn_s} ${fn_p_c} {fn_p_h}
                      COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} --proto_path=${CMAKE_CURRENT_SOURCE_DIR}  ${CMAKE_CURRENT_SOURCE_DIR}/${proto_var} --cpp_out=. --plugin=protoc-gen-RBLRPC=${CMAKE_BINARY_DIR}/tools/protoc-gen-RBLRPC --RBLRPC_out=. 
                      DEPENDS ${proto_var}
  )

  if(${M_S_} OR ${M_C_})
    set(MARSHALL_RPC_FILES ${MARSHALL_RPC_FILES} ${fn_p_c})
    message(status "copy marshall -------------------")
    file(COPY ${CMAKE_CURRENT_BINARY_DIR}/${fn_c} 
              ${CMAKE_CURRENT_BINARY_DIR}/${fn_s} 
              ${CMAKE_CURRENT_BINARY_DIR}/${fn_p_h} DESTINATION ${CMAKE_SOURCE_DIR}/include/rpc/marshall)
  endif()
...
endforeach(...)

Скопированные файлы не создаются до тех пор, пока не будет выполнена пользовательская команда, однако cmake пытается скопировать файлы при первом прохождении через скрипт. Я бы приветствовал любые предложения, чтобы решить эту проблему, без радикального изменения моих записок.

1 Ответ

5 голосов
/ 14 июля 2011

Не используйте функцию file(COPY...), но добавьте следующую команду в add_custom_command:

COMMAND ${CMAKE_COMMAND} copy ${CMAKE_CURRENT_BINARY_DIR}/${fn_c}
        ${CMAKE_SOURCE_DIR}/include/rpc/marshall

Но для того, что вы собираетесь делать, я бы посоветовал вам поддерживать чистоту дерева исходных текстов, добавляя напрямую сгенерированные файлы из каталога сборки. Это может сломаться, например, если вы захотите создать два разных дерева сборки из одного исходного дерева.

редактировать:

CMAKE_COMMAND задокументировано в разделе переменных онлайновой документации по man-странице (ищите CMAKE_COMMAND, а не $ {CMAKE_COMMAND}.

В командной строке CMAKE -E покажет вам список доступных переносимых команд.

...