Безоговорочно скопируйте файл в $ {SRC_DIR} для всех рецептов - PullRequest
0 голосов
/ 29 октября 2018

У меня есть файл с именем adhoc.cpp.proto в ${SRC_DIR}. Мне нужно скопировать его в файл с именем adhoc.cpp в ${SRC_DIR} при подготовке к некоторым другим задачам. Я предпочитаю создавать файл, если он не существует, но я возьму безусловную копию, чтобы все было просто.

Согласно Скопировать файл из исходного каталога в двоичный каталог с помощью CMake Я должен иметь возможность использовать configure_file(old new COPYONLY) или file(COPY old DESTINATION new). Ни одна из них не работает для меня. configure_file(old new COPYONLY) ничего не делает, а file(COPY old DESTINATION new) создает каталог с именем new и помещает в него файл old.

Согласно команда file docs GENERATE также может работать. Проблема в том, что я не могу понять, как использовать это из документов, и я не могу найти примеры этого.

Как безоговорочно скопировать ${SRC_DIR}/old в ${SRC_DIR}/new?


В случае необходимости тестирование проводится на Fedora 28 с:

$ cmake --version
cmake version 3.11.2

Но мне нужно это, чтобы вернуться к CMake 2.8, который находится в поле для текущих дистрибутивов.


$ cat CMakeLists.txt
# <head notes ...>

cmake_minimum_required(VERSION 2.8.6)
if (${CMAKE_VERSION} VERSION_LESS "3.0.0")
  project(cryptopp)
  set(cryptopp_VERSION_MAJOR 7)
  set(cryptopp_VERSION_MINOR 0)
  set(cryptopp_VERSION_PATCH 0)
else ()
  cmake_policy(SET CMP0048 NEW)
  project(cryptopp VERSION 7.0.0)
  if (NOT ${CMAKE_VERSION} VERSION_LESS "3.1.0")
    cmake_policy(SET CMP0054 NEW)
  endif ()
endif ()

set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})

include(GNUInstallDirs)
include(CheckCXXCompilerFlag)

# Create adhoc.cpp from adhoc.cpp.proto.
# configure_file(adhoc.cpp.proto adhoc.cpp COPYONLY)
# file(COPY ${SRC_DIR}/adhoc.cpp.proto DESTINATION/${SRC_DIR} adhoc.cpp)
file(COPY ${SRC_DIR}/adhoc.cpp.proto DESTINATION ${SRC_DIR} adhoc.cpp)
...

configure_file(adhoc.cpp.proto adhoc.cpp COPYONLY) производит:

cmake_build$ rm -rf * && rm -rf ../adhoc.cpp && cmake ..
-- The C compiler identification is GNU 8.2.1
...
# Nothing is copied
cmake_build$ ls ../adhoc*
../adhoc.cpp.proto

file(COPY ${SRC_DIR}/adhoc.cpp.proto DESTINATION ${SRC_DIR}/adhoc.cpp) создает каталоги:

cmake_build$ rm -rf * && rm -rf ../adhoc.cpp && cmake ..
-- The C compiler identification is GNU 8.2.1
...
# Puts old file in directory
cmake_build$ ls ../adhoc*
../adhoc.cpp.proto

../adhoc.cpp:
adhoc.cpp.proto

file(COPY ${SRC_DIR}/adhoc.cpp.proto ${SRC_DIR}/adhoc.cpp DESTINATION ${SRC_DIR}) не удается:

cmake_build$ rm -rf * && rm -rf ../adhoc.cpp && cmake ..
-- The C compiler identification is GNU 8.2.1
...
CMake Error at CMakeLists.txt:65 (file):
  file COPY cannot find "/home/test/cryptopp/adhoc.cpp".

file(GENERATE OUTPUT ${SRC_DIR}/adhoc.cpp ${SRC_DIR}/adhoc.cpp.proto CONDITION true) тоже не работает (как и CONDITION 1):

cmake_build$ rm -rf * && rm -rf ../adhoc.cpp && cmake ..
-- The C compiler identification is GNU 8.2.1
...
CMake Error at CMakeLists.txt:66 (file):
  file Incorrect arguments to GENERATE subcommand.

file(WRITE ${SRC_DIR}/adhoc.cpp file(READ ${SRC_DIR}/adhoc.cpp.proto)) создает файл, но не оценивает выражение file(READ ...):

cmake_build$ rm -rf * && rm -rf ../adhoc.cpp && cmake ..
-- The C compiler identification is GNU 8.2.1
...

$ cat ../adhoc.cpp
file(READ/home/test/cryptopp/adhoc.cpp.proto)

1 Ответ

0 голосов
/ 29 октября 2018

Вы нашли правильные команды. И configure_file, и file(COPY) прекрасно способны делать то, что вы хотите.

Для file(COPY) имейте в виду, что DESTINATION - это каталог, а не имя файла. Он создаст каталог, если он не существует. Вы создаете каталог adhoc.cpp в исходном каталоге. Вот почему у вас, вероятно, есть rm -rf ../adhoc.cpp.

Ваш configure_file кажется законным. Но configure_file говорит, что если местом назначения является каталог, он поместит его туда. Может быть, у вас есть конфликт с другими вещами, которые вы сделали.

Моя рекомендация не допускать, чтобы в этих версиях всегда была сборка из исходного кода, а не из исходного, как у вас сейчас. ${SRC_DIR} - это то, что вы определяете сами? Почему не ${CMAKE_CURRENT_SOURCE_DIR}? Хотя в этом случае я не думаю, что вам все равно нужно это делать, это для CMake, чтобы выяснить.

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