Ejecutar ejecutable justo después del edificio (c, cmake, make)

Me gustaría dirigir mi ejecutable justo después de construirlo usando un paso post-build (add_custom_command).

Hasta ahora usamos un entorno WSL en Windows 10, que funcionó. Ahora cambiamos a construir directamente en el Windows cmd, que nos da un error...

Extracto CMakeLists.txt:

# Execute unit tests after build and write output.txt into artifact directory
add_custom_command(TARGET ${PROJECT_NAME}
                   POST_BUILD
                   COMMAND ${PROJECT_NAME} ARGS -v > ${ARTIFACTS}/output.txt
                   WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
                   COMMENT "run ${PROJECT_NAME} in ${CMAKE_CURRENT_SOURCE_DIR}"
                   VERBATIM
)

Dentro de WSL utilizando comandos 'cmake -G "Unix Makefiles" $unit_tests_root'hacer', CMake genera archivo: '...\build\Pipeline\CMakeFiles\unit_tests.dir\build.make', que muestra:

...
unit_tests: CMakeFiles/unit_tests.dir/link.txt
    @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/mnt/c/repos/project-source/tests/unit_tests/build/Pipeline/CMakeFiles --progress-num=$(CMAKE_PROGRESS_30) "Linking C executable unit_tests"
    $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/unit_tests.dir/link.txt --verbose=$(VERBOSE)
    @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold "run unit_tests in /mnt/c/repos/project-source/tests/unit_tests"
    cd /mnt/c/repos/project-source/tests/unit_tests && /mnt/c/repos/project-source/tests/unit_tests/build/Pipeline/unit_tests -v > /mnt/c/repos/project-source/tests/unit_tests/artifacts/output.txt

# Rule to build all files generated by this target.
CMakeFiles/unit_tests.dir/build: unit_tests
...

Esta cadena de herramientas está funcionando: Las pruebas de unidad se ejecutan y la salida se imprime a la salida. Txt.


Dentro de cmd usando comandos 'cmake -G "MinGW Makefiles" %unit_tests_root%'hacer', CMake genera el mismo archivo: '...\build\Pipeline\CMakeFiles\unit_tests.dir\build.make', que muestra:

...
unit_tests.exe: CMakeFiles/unit_tests.dir/link.txt
    @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=C:\repos\project-source\tests\unit_tests\build\Pipeline\CMakeFiles --progress-num=$(CMAKE_PROGRESS_30) "Linking C executable unit_tests.exe"
    $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles\unit_tests.dir\link.txt --verbose=$(VERBOSE)
    @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold "run unit_tests in C:/repos/project-source/tests/unit_tests"
    cd /d C:\repos\project-source\tests\unit_tests && C:\repos\project-source\tests\unit_tests\build\Pipeline\unit_tests.exe -v > C:/repos/project-source/tests/unit_tests/artifacts/output.txt

# Rule to build all files generated by this target.
CMakeFiles/unit_tests.dir/build: unit_tests.exe
...

Mensaje de error en consola: (línea 555 corresponde a 'cd /d C:\repos\project-source\tests\unit_tests "'

...
[100%] Linking C executable unit_tests.exe
run unit_tests in C:/repos/project-source/tests/unit_tests
make[2]: *** [CMakeFiles\unit_tests.dir\build.make:555: unit_tests.exe] Error 13
make[2]: *** Deleting file 'unit_tests.exe'
make[1]: *** [CMakeFiles\Makefile2:94: CMakeFiles/unit_tests.dir/all] Error 2
make: *** [Makefile:102: all] Error 2
...

¿Cuál es el problema con la línea 555?

Cuando pienso en eladd_custom_command(...)' dentro de CMakeLists.txt, la unidad_tests. exe construye con éxito y puedo ejecutarlo manualmente con:

C:\repos\project-source\tests\unit_tests>.\build\Pipeline\unit_tests.exe -v > .\artifacts\output.txt

De alguna manera la salida no es la misma que la salida que obtengo cuando se construye y ejecuta dentro de WSL, pero al menos se puede ejecutar...

Edición 1, Información adicional: Estoy llamando a estos comandos (cmake, make) dentro de un script python a través subprocess.run(): Tengo la suposición de que esto bloquea los archivos - todavía evaluando esto ...

Edición 2 / Solución, encontré el problema: El error en realidad es devuelto por el unit_tests. exe mismo ya que tiene 13 errores (me perdí el hecho, que la unidad sale con la cantidad de errores). Por eso hace salidas con errores y elimina el ejecutable. Ahora prefiero llamar al ejecutable explícitamente en mi script python, donde también llamo al cmake y hago comandos. @Tsyvarev, lo siento por la molestia y gracias por su contribución. ;-)

Pregunta hecha hace 3 años, 4 meses, 13 días - Por csscraftsman


2 Respuestas:

  • El problema que estás experimentando en la línea 555 de tu comando de construcción se refiere a un error al ejecutar el programa unit_tests.exe. El error 13 generalmente indica que hay un problema con el archivo ejecutable en sí, no necesariamente con la ejecución de ese archivo.

    Dado que has confirmado que el ejecutable unit_tests.exe tiene errores y sale con ese código de error, eso podría estar causando que se elimine el ejecutable y se produzcan las fallas en la construcción.

    En tu edición 2 has mencionado que has encontrado el problema y has identificado que el ejecutable tiene errores que generan la salida de error y la eliminación del archivo. Es una buena práctica resolver esos errores en el código del ejecutable para evitar estos problemas en el futuro.

    Si necesitas más ayuda con la corrección de los errores en el código de unit_tests.exe, no dudes en pedir ayuda más específica. ¡Buena suerte con tu proyecto!

    Respondida el Dec 19, 2020 a las 00:23 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Me alegro que hayas podido resolver el problema. El error "Error 13" generalmente indica que el programa encontró 13 errores durante su ejecución. En este caso, el programa unit_tests.exe encontró 13 errores y salió con un código de error de 13.

    Es bueno que hayas encontrado la solución y que ahora puedas llamar al ejecutable explícitamente desde tu script de Python. Esto te dará más control sobre el proceso y te permitirá manejar cualquier error que pueda surgir.

    Si tienes alguna otra pregunta o necesitas más ayuda, no dudes en preguntar.

    Respondida el Dec 19, 2020 a las 00:33 - por Gemini

    Votos positivos: 0 | Votos negativos: 0