为所有食谱无条件复制$ {SRC_DIR}中的文件

时间:2018-10-29 06:25:01

标签: cmake

我在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)

1 个答案:

答案 0 :(得分:1)

您已找到正确的命令。 configure_filefile(COPY)都完全可以做您想要的事情。

对于file(COPY),请记住DESTINATION是目录,而不是文件名。如果目录不存在,它将创建目录。您正在源目录中创建目录adhoc.cpp。这就是为什么您可能有rm -rf ../adhoc.cpp的原因。

您的configure_file似乎合法。但是,configure_file说,如果目标是目录,它将放置在该目录中。也许您与所做的其他事情有冲突。

我的建议是防止出现这些情况,因此始终要使用源外构建,而不要像现在那样使用源内构建。 ${SRC_DIR}是您自己定义的东西吗?为什么不${CMAKE_CURRENT_SOURCE_DIR}呢?尽管在这种情况下,我认为您无论如何都不需要这样做,但这是CMake可以解决的。