У меня есть файл с именем 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)