当非源代码文件发生更改时触发构建。

使用 CMAKE,我添加了一个自定义命令,将 LUA 文件从源目录复制到输出目录,当它们发生更改时。然而,这个命令只有在 Visual Studio 决定构建一个项目时才会被触发(即使我在自定义命令中使用了 PRE_BUILD)。Visual Studio 只在源文件(在本例中是 c++)更改时决定构建,所以当我仅更改 LUA 文件时,它们不会被添加到输出目录中。

现在在 Visual Studio 中,我可以将 LUA 文件的属性页面中的“Item Type”从“Does not participate in build”更改为“Text”。在这种情况下,当仅更改 LUA 文件时,Visual Studio 确实会触发构建。那么我如何确保 CMAKE 将正确的 Item Type 分配给 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 指令。

点赞
用户1782465
用户1782465

如果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-04 08:42:25