3

使用 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 指令。

4

1 回答 1

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 文件,然后创建一个自定义目标,该目标将根据其输出驱动这些自定义命令。现在依赖跟踪将正常工作。

于 2013-09-04T08:42:25.207 回答