使用CMAKE我在更改时将源目录中的自定义命令top copy LUA文件添加到输出目录。但是,只有在Visual Studio决定构建项目时才会触发此命令(即使我使用PRE_BUILD作为自定义命令)。 Visual Studio仅决定在源文件(在本例中为c ++)发生更改时进行构建,因此当我只更改LUA文件时,它们不会添加到输出目录中。
现在在Visual Studio中,我可以将LUA文件的属性页中的“项类型”从“不参与构建”更改为“文本”。在这种情况下,只有LUA文件发生更改时,Visual Studio才会触发构建。那么如何确保CMAKE为LUA文件分配正确的项类型? (或者还有其他解决方案吗?)
CMakeLists.txt的相关部分
SET(LUA_Sources
"lua/initialization.lua")
SOURCE_GROUP("lua" FILES ${LUA_Sources})
ADD_LIBRARY(engine
${LUA_Sources})
foreach(LuaFile ${LUA_Sources})
ADD_CUSTOM_COMMAND(
TARGET engine
PRE_BUILD
COMMAND ${CMAKE_COMMAND}
ARGS -E
copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${LuaFile} ${EXECUTABLE_OUTPUT_PATH}/Debug/${LuaFile})
endforeach()
===========================
参考解决方案,受到Angew的启发,是
SET(LUA_Sources
"lua/initialization.lua")
SOURCE_GROUP("lua" FILES ${LUA_Sources})
set(LUA_Outputs "")
foreach(LuaFile ${LUA_Sources})
list(APPEND LUA_Outputs ${EXECUTABLE_OUTPUT_PATH}/Debug/${LuaFile})
endforeach()
add_custom_target(
lua ALL
DEPENDS ${LUA_Outputs}
COMMENT "Copying LUA files"
VERBATIM
)
foreach(LuaFile ${LUA_Sources})
ADD_CUSTOM_COMMAND(
TARGET lua
COMMAND ${CMAKE_COMMAND}
ARGS -E
copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${LuaFile}
endforeach()
我不得不稍微改变一下,因为如果文件较新,则不会总是复制文件。可能是因为ADD_CUSTOM_COMMAND中的OUTPUT指令而不是我现在使用的TARGET指令。
答案 0 :(得分:4)
如果CMakeList摘录已完成且engine
目标仅用作复制Lua源的占位符,那么您将以错误的方式处理问题。您应该使用自定义命令+自定义目标组合,如下所示:
set(LUA_Sources
"lua/initialization.lua")
source_group("lua" FILES ${LUA_Sources})
set(LUA_Outputs "")
foreach(LuaFile ${LUA_Sources})
add_custom_command(
OUTPUT ${EXECUTABLE_OUTPUT_PATH}/Debug/${LuaFile}
COMMAND ${CMAKE_COMMAND}
ARGS -E copy_if_different
${CMAKE_CURRENT_SOURCE_DIR}/${LuaFile}
${EXECUTABLE_OUTPUT_PATH}/Debug/${LuaFile}
)
list(APPEND LUA_Outputs ${EXECUTABLE_OUTPUT_PATH}/Debug/${LuaFile})
endforeach()
add_custom_target(
engine ALL
DEPENDS ${LUA_Outputs}
COMMENT "Copying LUA files"
VERBATIM
)
此CMakeList创建一个自定义命令来复制每个LUA文件,然后创建一个自定义目标,它将根据输出驱动这些自定义命令。现在依赖性跟踪可以正常工作。