非源文件更改时触发构建

时间:2013-09-04 08:18:57

标签: c++ visual-studio-2012 lua cmake

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

1 个答案:

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