es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ejecuta la función cmake o add_custom_command solo una vez.

Tengo una solución fea para copiar archivos .dll a una carpeta “bin” que utiliza “add_custom_command”. Funciona, pero a veces, durante una compilación en paralelo, obtengo el siguiente error:

Error copying directory from

Mi suposición (no puedo saberlo, ya que CMake no me dice cuál es el problema) es que cuando se realizan llamadas a “copy” al mismo tiempo, se producen errores en el sistema de archivos.

¿Existe alguna manera en CMake de especificar que solo se debe ejecutar la primera invocación de la función o de “add_custom_command”?

Si importa, esta es mi lógica para copiar dlls (cada destino que necesita esos DLL llama a la función con sí mismo como argumento):

function(copyBla projectName)
add_custom_command(TARGET ${projectName} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${SDK_PATH}/Bla/${BLA_VERSION}/x64/bin ${CMAKE_BINARY_DIR}/bin/$)
endfunction()

PD: No quiero limitarme a que solo un objetivo llame a “copyBla”, ya que eso es frágil (otros objetivos dependen de este objetivo solo porque quieren usar los mismos dlls).

Tags:  

Answer

  1. Avatar for davy.ai

    Para garantizar que solo se ejecute una vez la primera invocación de una función o add_custom_command en construcciones en paralelo, CMake proporciona la opción IMPLICIT_DEPENDS. Configurar esta opción como ON garantiza que si el comando o función depende de un archivo que aún no existe, solo se ejecutará una vez.

    Para utilizar esta opción en la función copyBla, simplemente agregue la opción IMPLICIT_DEPENDS a la llamada de add_custom_command:

    function(copyBla projectName)
        add_custom_command(TARGET ${projectName} POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy_directory
                ${SDK_PATH}/Bla/${BLA_VERSION}/x64/bin
                ${CMAKE_BINARY_DIR}/bin/$<configuration>
            IMPLICIT_DEPENDS ${SDK_PATH}/Bla/${BLA_VERSION}/x64/bin
        )
    endfunction()
    

    Esto garantiza que el comando solo se ejecutará una vez, independientemente de cuántos objetivos llamen a la función o de cuántas construcciones en paralelo se estén ejecutando.

Comments are closed.