【问题标题】:Execute a CMake function on every build-time在每个构建时执行 CMake 函数
【发布时间】:2016-04-22 11:28:39
【问题描述】:

我有两个 cmake 函数来检查资源/着色器文件是否找不到/修改匹配以构建。

检查.cmake

function(Check sourcefile destinationfile)
    if(NOT EXISTS ${destinationfile})
        execute_process(COMMAND ${CMAKE_COMMAND}
                -E copy ${sourcefile} ${destinationfile})
    elseif(${sourcefile} IS_NEWER_THAN ${destinationfile})
        execute_process(COMMAND ${MSGMERGE_EXECUTABLE}
                "--update" ${destinationfile} ${sourcefile}
                OUTPUT_QUIET ERROR_VARIABLE error RESULT_VARIABLE ret)

        if(ret) # Have to do this hack as msgmerge prints to stderr.
            message(SEND_ERROR "${error}")
        endif()
    endif()
endfunction()

AddResources.cmake

include(./Check.cmake)

function(AddResources project)
    file(GLOB_RECURSE resources ${PROJECT_SOURCE_DIR}/src/project1/Resources/*)
    file(GLOB_RECURSE shaders ${PROJECT_SOURCE_DIR}/src/project1/Shaders/*)
    foreach( each_file1 ${resources} )
        get_filename_component(targetFile ${each_file1} NAME)
        if(WIN32)
          set(destinationfile "${CMAKE_CURRENT_SOURCE_DIR}/bin/Release/${targetFile}")
          set(destinationfile2 "${CMAKE_CURRENT_SOURCE_DIR}/bin/Debug/${targetFile}")
          set(sourcefile ${each_file1})
          Check(${sourcefile} ${destinationfile})
          Check(${sourcefile} ${destinationfile2})
        else ()
          set(destinationfile "${CMAKE_CURRENT_SOURCE_DIR}/bin/${targetFile}")
          set(sourcefile ${each_file1})
          Check(${sourcefile} ${destinationfile})
        endif()
    endforeach(each_file1)
    foreach( each_file2 ${shaders} )
        get_filename_component(targetFile ${each_file2} NAME)
        if(WIN32)
          set(destinationfile "${CMAKE_CURRENT_SOURCE_DIR}/bin/Release/${targetFile}")
          set(destinationfile2 "${CMAKE_CURRENT_SOURCE_DIR}/bin/Debug/${targetFile}")
          set(sourcefile ${each_file2})
          Check(${sourcefile} ${destinationfile})
          Check(${sourcefile} ${destinationfile2})
        else()
          set(destinationfile "${CMAKE_CURRENT_SOURCE_DIR}/bin/${targetFile}")
          set(sourcefile ${each_file2})
          Check(${sourcefile} ${destinationfile})
        endif()

    endforeach(each_file2)
endfunction()

在 CMakeLists.txt 中执行 AddResources(project1)

AddResources 会将所有资源和着色器复制到 bin 文件夹,但它只复制一次(CMake 配置过程),而不是每次构建时。

有没有办法在每次构建时使用参数执行 CMake 函数?

【问题讨论】:

  • 你是需要你的Check函数在build阶段执行,还是你只是想要@每当source 文件更改时,987654326@ 文件就会更新?如果你只想要依赖检查(第二种情况),它甚至可以在 configuration 阶段完成。见,例如this question。顺便说一句,在 source 目录(CMAKE_CURRENT_SOURCE_DIR 下)中生成文件通常不好。可能,您想在 build 目录(CMAKE_CURRENT_BINARY_DIR 下)中生成它们?

标签: cmake


【解决方案1】:

我想你在找add_custom_command

add_custom_command(TARGET target
               PRE_BUILD | PRE_LINK | POST_BUILD
               COMMAND command1 [ARGS] [args1...]
               [COMMAND command2 [ARGS] [args2...] ...]
               [WORKING_DIRECTORY dir]
               [COMMENT comment] [VERBATIM])

这定义了一个与构建指定目标相关联的新命令。该命令何时发生取决于指定以下哪一项:
PRE_BUILD - 在所有其他依赖项之前运行
PRE_LINK - 在其他依赖项之后运行
POST_BUILD - 在构建目标后运行

【讨论】:

  • 我用对了吗? "COMMAND ${CMAKE_COMMAND} -P "${PROJECT_SOURCE_DIR}/AddResources.cmake" project1" 它会导致类似MSB3073 The command "setlocal "...的错误
  • 好的。我在 Mac 中测试了该命令,在编译过程中没有错误,但它并没有改变任何东西。这不工作
  • 首先,AddResources.cmake 只是定义了一个函数,没有做任何事情。更重要的是,我认为您不能在带有 cmake -P 的脚本中使用先前声明的变量(请参阅 stackoverflow.com/a/13713505/400303
  • 我尝试执行命令 ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/src/project1/Shaders/。 ${PROJECT_SOURCE_DIR}/bin/ 在 add_custom_command 中,每当我尝试在 Visual Studio 中构建时,它都不会复制文件。我需要在 CMake 中使用其他功能。
  • 此解决方案适用于人们(请参阅stackoverflow.com/a/6126754/400303)。你应该调试你的脚本(例如make VERBOSE=1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多