Makefile 添加';安装&x27;目标为';全部';在CMake
我有一个具有以下目录树的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来执行此操作 从这个意义上
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()