Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 添加';安装&x27;目标为';全部';在CMake_Makefile_Cmake - Fatal编程技术网

Makefile 添加';安装&x27;目标为';全部';在CMake

Makefile 添加';安装&x27;目标为';全部';在CMake,makefile,cmake,Makefile,Cmake,我有一个具有以下目录树的CMake项目: build/ assets/ dest/ <other files> 构建/ 资产/ 目的地/ dest是一个目录,所有已安装的文件都应放在其中: 可执行文件通过一个简单的make进入dest/,由CMAKE\u RUNTIME\u OUTPUT\u目录控制 位于assets/上的资产,在进行安装后转到dest/ 但是我不想发布makeinstall来复制所有文件。请执行dest/dir:我想要一个简单的make来执行此操作 从这个意义上

我有一个具有以下目录树的CMake项目:

build/
assets/
dest/
<other files>
构建/
资产/
目的地/
dest
是一个目录,所有已安装的文件都应放在其中:

  • 可执行文件通过一个简单的
    make
    进入
    dest/
    ,由
    CMAKE\u RUNTIME\u OUTPUT\u目录控制

  • 位于
    assets/
    上的资产,在
    进行安装后转到
    dest/

  • 但是我不想发布
    makeinstall
    来复制所有文件。请执行
    dest/
    dir:我想要一个简单的
    make
    来执行此操作


    从这个意义上讲,如何将
    install
    目标添加到默认目标(
    all
    )?或者,有更好的方法解决这个问题吗?

    使用CMake的正常方法是在项目外部创建一个构建目录,所有编译的二进制文件都放在那里。当您完成开发并希望在系统中安装一些二进制文件时,请调用
    makeinstall
    。通过这种方式,您可以使项目源文件夹不受编译器生成的所有内容的影响

    文件目录结构示例:

    my_project/
    my_project_build/
    

    从my_project_build调用
    cmake../my_project
    生成生成文件。调用
    make
    来构建它,所有二进制文件都将在
    myu project\u build
    中,这将在构建
    后执行
    安装
    目标(可能是
    所有
    ):

    add_custom_命令(
    目标
    后期构建
    命令${CMAKE_COMMAND}--build${CMAKE_BINARY_DIR}--目标安装
    )
    
    通过使用以下宏为指定目标生成数据依赖规则,我解决了这个问题。这些规则只需要
    make
    ,而不需要
    make-install

    宏将源树中的任意文件映射到“暂存”树中,每个树结构可能不同,您可以选择重命名该文件。暂存的数据是最新的,因此如果在源代码树中对其进行更改,则它将在下次
    make
    时更新

    # Macro used to create dependencies for staging data files (e.g. config files, assets) and keeping them up-to-date.
    # The given "source" file is copied (and possibly renamed) to "staged" for the given "target".
    #
    # It works by creating a rule that creates "staged" by copying "source", then creating a target that depends upon "staged",
    # then making the given "target" depend upon the new target. Or in makefile speak:
    #
    #   staged:  source
    #       cp source staged
    #
    #   targetData1:  staged
    #
    #   target:  <existing dependencies...> targetData1
    #       <existing commands...>
    #
    # The intermediate rule is used for parallel build robustness.  For details, see:
    # http://www.cmake.org/cmake/help/v2.8.12/cmake.html#command:add_custom_command
    #
    # Example:
    #   target = myExeTarget
    #   source = "${CMAKE_CURRENT_SOURCE_DIR}/../../data/images/bush1.png"
    #   staged = "${STAGING_DATA_DIR}/images/bush1.png"
    macro(add_data_dependency target source staged)
        add_custom_command(
            OUTPUT "${staged}"
            COMMAND ${CMAKE_COMMAND} -E copy_if_different "${source}" "${staged}"    # Dir(s) will be created if needed.
            DEPENDS "${source}"
        )
    
        if (NOT DEFINED add_data_dependency_counter)
            #message(status "Setting tmp counter......")
            set(add_data_dependency_counter "0")
        endif()
    
        math(EXPR add_data_dependency_counter "${add_data_dependency_counter} + 1")
        #message(status "tmp counter is ${add_data_dependency_counter}......")
    
        set(customTarget "${target}Data${add_data_dependency_counter}")
    
        add_custom_target(${customTarget} DEPENDS "${staged}")
        add_dependencies(${target} ${customTarget})
    endmacro()
    

    然后,无论何时
    make
    ,如果文件丢失或过期(假设
    myTarget
    all
    的一部分),都会复制这些文件。

    使用以下命令不会导致递归。需要CMake>=3.15

    add_custom_command(
        TARGET ${MY_TARGET} POST_BUILD
        COMMAND ${CMAKE_COMMAND} --install ${CMAKE_BINARY_DIR} --config $<CONFIG>
    )
    

    好吧,我也可以采用这种方法,在这种情况下没有什么不同。问题是:如何仅使用
    make
    将资产文件从
    assets/
    目录复制到目标目录(我称之为
    dest/
    ,但它也可能是
    myu project\u build
    ,无论什么)?我知道如何使用
    makeinstall
    (这只是使用
    install
    命令的问题),但我想复制那些文件而不发出
    makeinstall
    :一个简单的
    make
    就可以做到这一点。现在清楚了吗?当我尝试使用此方法将'all'指定为目标时,我得到一个错误,说“没有在此目录中创建任何目标'all'。我得到了相同的尝试过的'all'、'all'、''和”“--无论我得到什么,都没有在该目录中创建任何目标'all'。这将重新触发一个生成,该生成递归地调用post_生成,这是雷吉格斯无限期建造的。这是经过测试的吗?我已将解决方案转换为答案。
    add_data_dependency(myTarget "${CMAKE_CURRENT_SOURCE_DIR}/assets/file1.ext" "${CMAKE_CURRENT_SOURCE_DIR}/dest/file1.ext")
    add_data_dependency(myTarget "${CMAKE_CURRENT_SOURCE_DIR}/assets/file2.ext" "${CMAKE_CURRENT_SOURCE_DIR}/dest/file2.ext")
    add_data_dependency(myTarget "${CMAKE_CURRENT_SOURCE_DIR}/assets/rename_me.ext" "${CMAKE_CURRENT_SOURCE_DIR}/dest/renamed.ext")
    :
    :
    
    add_custom_command(
        TARGET ${MY_TARGET} POST_BUILD
        COMMAND ${CMAKE_COMMAND} --install ${CMAKE_BINARY_DIR} --config $<CONFIG>
    )
    
    if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
        set(CMAKE_INSTALL_PREFIX "install" CACHE PATH "Default install path." FORCE)
    endif()