代码之家  ›  专栏  ›  技术社区  ›  jww avp

无条件复制${SRC\u DIR}中所有配方的文件

  •  0
  • jww avp  · 技术社区  · 6 年前

    我有个文件叫 adhoc.cpp.proto ${SRC_DIR} . 我需要把它复制到一个名为 adhoc.cpp 在里面 为其他任务做准备。如果文件不存在,我更喜欢创建它,但是我会无条件地复制它以保持简单。

    根据 Copy file from source directory to binary directory using CMake 我应该可以用 configure_file(old new COPYONLY) file(COPY old DESTINATION new) . 对我来说都不管用。 配置\u文件(仅新旧复制) 文件(复制旧目标新目标) 创建一个名为 new 把文件 old 在里面。

    the file command docs GENERATE

    如何无条件复制 ${SRC_DIR}/old ${SRC_DIR}/new ?


    如果需要,测试将在Fedora 28上进行:

    $ cmake --version
    cmake version 3.11.2
    

    但我需要这个来回溯到cmake2.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 回复  |  直到 6 年前
        1
  •  1
  •   Bernhard    6 年前

    你找到了正确的命令。两者 configure_file file(COPY) 完全有能力做你想做的事。

    为了 DESTINATION 是目录,不是文件名。如果目录不存在,它将创建该目录。您正在创建一个目录 adhoc.cpp 在源目录中。这就是为什么你可能有 rm -rf ../adhoc.cpp .

    你的 似乎合法。但是, configure_file 如果目标是一个目录,它将把它放在那里。也许你和你做的其他事情有冲突。

    ${SRC_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ? 虽然在这种情况下,我不认为你需要这样做无论如何,这是由CMake来解决。