Почему CMake удаляет мои исходные файлы для add_custom_command - PullRequest
0 голосов
/ 19 октября 2019

У меня есть функция CMake, которая компилирует некоторый код (GLSL), который у меня есть, в формат, который мне нужен для запуска моего исходного кода. Функция принимает некоторые входные файлы, запускает на них несколько сценариев и выводит некоторые соответствующие файлы. Функция отлично работает на Windows, и мои выводы генерируются. Однако на Mac (Unix?) Мои источники (входы) удаляются после генерации выходов. Почему это происходит?

Вот моя функция:

# adds a custom target that compiles the GLSL code using the compile-glsl-code.py python script
function(build_glsl)
    set(optionArgs "")
    set(oneValueArgs "TARGET" "VULKAN")
    set(multiValueArgs "SOURCES")
    cmake_parse_arguments(FUNCTION_ARGS "${optionArgs}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

    # Make sure python is installed
    find_package(Python3 COMPONENTS Interpreter)
    if (NOT Python3_FOUND)
        message(FATAL_ERROR "Could not find python3!")
    endif()

    if(WIN32)
        set(glslangValidator ${FUNCTION_ARGS_VULKAN}/Bin/glslangValidator.exe)
    else()
        set(glslangValidator ${FUNCTION_ARGS_VULKAN}/bin/glslangValidator)
    endif()
    set(spvConverter ${CMAKE_SOURCE_DIR}/src/spv-converter.py)
    set(entryPoint "main")
    set(GLSL_COMPILED_SOURCES "")
    foreach(file IN LISTS FUNCTION_ARGS_SOURCES)
        if(file MATCHES ".*.vert.glsl$" OR file MATCHES ".*.frag.glsl$" OR file MATCHES ".*.geom.glsl$" OR file MATCHES ".*.tesc.glsl$" OR file MATCHES ".*.tese.glsl$" OR file MATCHES ".*.comp.glsl$")
            set(tmpFile ${file}.tmp.spv)
            set(outputFile ${file}.spv)
            list(APPEND GLSL_COMPILED_SOURCES ${outputFile})
            add_custom_command(
                OUTPUT ${outputFile}
                COMMAND ${glslangValidator} "-V" "--entry-point" "${entryPoint}" "${file}" "-o" "${tmpFile}" # compile ${file} into ${tmpFile}
                COMMAND ${Python3_EXECUTABLE} ${spvConverter} "${tmpFile}" "${outputFile}" # compile ${tmpFile} into ${outputFile}
                COMMAND ${CMAKE_COMMAND} -E remove -f ${tmpFile} # delete ${tmpFile}
                SOURCES ${file}
                VERBATIM
            )
        endif()
    endforeach()

    add_custom_target(${FUNCTION_ARGS_TARGET}
        SOURCES ${FUNCTION_ARGS_SOURCES}
        DEPENDS ${GLSL_COMPILED_SOURCES}
        VERBATIM
    )
endfunction()

Более кратко, эта часть:

add_custom_command(
    OUTPUT ${outputFile}
    COMMAND ${glslangValidator} "-V" "--entry-point" "${entryPoint}" "${file}" "-o" "${tmpFile}" # compile ${file} into ${tmpFile}
    COMMAND ${Python3_EXECUTABLE} ${spvConverter} "${tmpFile}" "${outputFile}" # compile ${tmpFile} into ${outputFile}
    COMMAND ${CMAKE_COMMAND} -E remove -f ${tmpFile} # delete ${tmpFile}
    SOURCES ${file}
    VERBATIM
)

Сценарий glslangValidator и python не удаляетисходный файл. Если я удаляю строку COMMAND ${CMAKE_COMMAND} -E remove -f ${tmpFile}, она не удаляет мой источник (ни файл tmp), но я хочу удалить файл tmp. Что может быть причиной этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...