我在adhoc.cpp.proto
中有一个名为${SRC_DIR}
的文件。我需要将其复制到adhoc.cpp
中名为${SRC_DIR}
的文件中,以准备其他一些任务。如果文件不存在,我更喜欢创建该文件,但是我将无条件复制该文件以使事情变得简单。
根据Copy file from source directory to binary directory using CMake,我应该可以使用configure_file(old new COPYONLY)
或file(COPY old DESTINATION new)
。都不适合我。 configure_file(old new COPYONLY)
什么也不做,file(COPY old DESTINATION new)
创建一个名为new
的目录,并将文件old
放入其中。
根据the file
command 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)
答案 0 :(得分:1)
您已找到正确的命令。 configure_file
和file(COPY)
都完全可以做您想要的事情。
对于file(COPY)
,请记住DESTINATION
是目录,而不是文件名。如果目录不存在,它将创建目录。您正在源目录中创建目录adhoc.cpp
。这就是为什么您可能有rm -rf ../adhoc.cpp
的原因。
您的configure_file
似乎合法。但是,configure_file说,如果目标是目录,它将放置在该目录中。也许您与所做的其他事情有冲突。
我的建议是防止出现这些情况,因此始终要使用源外构建,而不要像现在那样使用源内构建。 ${SRC_DIR}
是您自己定义的东西吗?为什么不${CMAKE_CURRENT_SOURCE_DIR}
呢?尽管在这种情况下,我认为您无论如何都不需要这样做,但这是CMake可以解决的。