diff options
Diffstat (limited to 'src/ivicore/Qt6IviCoreMacros.cmake')
-rw-r--r-- | src/ivicore/Qt6IviCoreMacros.cmake | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/src/ivicore/Qt6IviCoreMacros.cmake b/src/ivicore/Qt6IviCoreMacros.cmake new file mode 100644 index 0000000..5101501 --- /dev/null +++ b/src/ivicore/Qt6IviCoreMacros.cmake @@ -0,0 +1,199 @@ +function(qt6_ivigenerator target) + qt6_ivigenerator_generate(${ARGN}) + qt6_ivigenerator_include(${target} ${ARGN}) +endfunction() + +if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS) + function(qt_ivigenerator) + qt6_ivigenerator(${ARGV}) + endfunction() +endif() + +macro(internal_resolve_ivigenerator_path) + if (DEFINED QtIvi_BINARY_DIR AND (NOT DEFINED QT_BUILD_STANDALONE_TESTS)) + set (VIRTUALENV ${QtIvi_BINARY_DIR}/src/tools/ivigenerator/qtivi_qface_virtualenv) + set (GENERATOR_PATH ${QtIvi_SOURCE_DIR}/src/tools/ivigenerator) + set (IVIGENERATOR_CONFIG ${QtIvi_BINARY_DIR}/src/tools/ivigenerator/.config) + else() + set (GENERATOR_PATH ${QTIVI_INSTALL_PREFIX}/${QT6_INSTALL_BINS}/ivigenerator) + set (VIRTUALENV ${GENERATOR_PATH}/qtivi_qface_virtualenv) + endif() +endmacro() + +function(qt6_ivigenerator_generate) + internal_resolve_ivigenerator_path() + + if (NOT EXISTS ${VIRTUALENV}/bin/activate AND NOT EXISTS ${VIRTUALENV}/Scripts/activate.bat) + return() + endif() + + cmake_parse_arguments( + PARSE_ARGV 0 + ARG + "" "QFACE_FORMAT;QFACE_OUTPUT_DIR;QFACE_SOURCES;QFACE_HEADERS_OUTPUT_DIR" "QFACE_ANNOTATIONS;QFACE_IMPORT_PATH" + ) + + if (DEFINED ARG_KEYWORDS_MISSING_VALUES) + message(FATAL_ERROR "Keywords can't be empty: ${ARG_KEYWORDS_MISSING_VALUES}") + endif() + + if (NOT DEFINED ARG_QFACE_FORMAT) + set(ARG_QFACE_FORMAT frontend) + endif() + set(QFACE_OUTPUT_DIR ${ARG_QFACE_OUTPUT_DIR}) + if (NOT DEFINED ARG_QFACE_OUTPUT_DIR) + set(QFACE_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) + endif() + if (NOT DEFINED ARG_QFACE_SOURCES) + message(FATAL_ERROR "QFACE_SOURCES can't be empty") + endif() + get_filename_component(QFACE_SOURCES "${ARG_QFACE_SOURCES}" REALPATH BASE_DIR) + get_filename_component(QFACE_SOURCE_DIR "${ARG_QFACE_SOURCES}" DIRECTORY) + get_filename_component(QFACE_BASE_NAME "${ARG_QFACE_SOURCES}" NAME_WLE) + get_filename_component(QFACE_SOURCE_ANNOTATION ${QFACE_SOURCE_DIR}/${QFACE_BASE_NAME}.yaml REALPATH BASE_DIR) + + set(QFACE_TEMPLATE_PWD "${GENERATOR_PATH}/templates/${ARG_QFACE_FORMAT}") + if(EXISTS ${QFACE_TEMPLATE_PWD}) + set(FORMAT_PATH ${QFACE_TEMPLATE_PWD}) + set(QFACE_FORMAT ${ARG_QFACE_FORMAT}) + else() + get_filename_component(FORMAT_PATH "${ARG_QFACE_FORMAT}" REALPATH) + if(EXISTS ${FORMAT_PATH}) + set(QFACE_FORMAT ${FORMAT_PATH}) + endif() + endif() + if (NOT DEFINED QFACE_FORMAT) + message(FATAL_ERROR "Invalid QFACE_FORMAT: Couldn't find the template folder: ${FORMAT_PATH}") + endif() + + # Register all source files to cause a cmake rerun + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${QFACE_SOURCES}) + if (EXISTS ${QFACE_SOURCE_ANNOTATION}) + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${QFACE_SOURCE_ANNOTATION}) + endif() + # Also register all files which are part of the current template + file(GLOB FORMAT_FILES ${FORMAT_PATH}/*) + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${FORMAT_FILES}) + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${FORMAT_PATH}.yaml) + # Most templates also have a dependency to a common folder + file(GLOB COMMON_FORMAT_FILES ${GENERATOR_PATH}/templates/*common*/*) + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${COMMON_FORMAT_FILES}) + + set(GENERATOR_ARGUMENTS --format=${QFACE_FORMAT} --force) + foreach(ANNOTATION ${ARG_QFACE_ANNOTATIONS}) + get_filename_component(ANNOTATION_PATH "${ANNOTATION}" REALPATH BASE_DIR) + list(APPEND GENERATOR_ARGUMENTS -A ${ANNOTATION_PATH}) + # Dependency for regeneration + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${ANNOTATION_PATH}) + endforeach() + + foreach(IMPORT ${ARG_QFACE_IMPORT_PATH}) + get_filename_component(IMPORT_PATH "${IMPORT}" REALPATH BASE_DIR) + list(APPEND GENERATOR_ARGUMENTS -I ${IMPORT_PATH}) + # Dependency for regeneration + file(GLOB QFACE_FILES ${IMPORT_PATH}/*.qface) + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${QFACE_FILES}) + endforeach() + + # If the generator was run successfully before + # Check for the timestamps to determine when to run it again. + # TODO, this needs to be extended to also include template and yaml changes + if (${QFACE_SOURCES} IS_NEWER_THAN ${QFACE_OUTPUT_DIR}/.stamp-ivigenerator) + # TODO How to best unset those again afterwards ? + # Use cmake -E slee + cmake -E env COMMAND instead ? + #equals(QMAKE_HOST.os, Windows): ENV = chcp 65001 && + if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") + set(PYTHON_EXECUTABLE ${VIRTUALENV}/Scripts/python.exe) + file(TO_NATIVE_PATH "${VIRTUALENV}" VIRTUALENV) + else() + set(PYTHON_EXECUTABLE ${VIRTUALENV}/bin/python) + set(ENV{LC_ALL} en_US.UTF-8) + set(ENV{LD_LIBRARY_PATH} ${VIRTUALENV}/bin) + endif() + if (DEFINED IVIGENERATOR_CONFIG) + set(ENV{IVIGENERATOR_CONFIG} ${IVIGENERATOR_CONFIG}) + endif() + set(ENV{PYTHONHOME} ${VIRTUALENV}) + set(ENV{VIRTUAL_ENV} ${VIRTUALENV}) + + message(STATUS "Running ivigenerator for ${QFACE_SOURCES}") + execute_process( + COMMAND ${PYTHON_EXECUTABLE} + ${GENERATOR_PATH}/generate.py + ${GENERATOR_ARGUMENTS} + ${QFACE_SOURCES} + ${QFACE_OUTPUT_DIR} + RESULT_VARIABLE RET_CODE + OUTPUT_VARIABLE GENERATOR_LOG + ERROR_VARIABLE GENERATOR_LOG + COMMAND_ECHO STDOUT + ) + message("${GENERATOR_LOG}") + + # Touch the stamp file if the generator run was successful + if("${RET_CODE}" EQUAL "0") + execute_process(COMMAND ${CMAKE_COMMAND} -E touch ${QFACE_OUTPUT_DIR}/.stamp-ivigenerator) + else() + message(FATAL_ERROR "Error while running the ivigenerator") + endif() + endif() + + # hack for the developer-build to have all headers where the Qt build expects them + if (DEFINED ARG_QFACE_HEADERS_OUTPUT_DIR) + file(GLOB HEADER_FILES ${QFACE_OUTPUT_DIR}/*.h) + file(COPY ${HEADER_FILES} DESTINATION ${ARG_QFACE_HEADERS_OUTPUT_DIR}) + endif() + +endfunction() + +if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS) + function(qt_ivigenerator_generate) + qt6_ivigenerator_generate(${ARGV}) + endfunction() +endif() + +function(qt6_ivigenerator_include target) + internal_resolve_ivigenerator_path() + + if (NOT EXISTS ${VIRTUALENV}/bin/activate AND NOT EXISTS ${VIRTUALENV}/Scripts/activate.bat) + # Create a dummy target instead + if (NOT TARGET ${target} AND NOT TEST ${target}) + if (DEFINED QtIvi_BINARY_DIR) + file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/cmake_dummy.cpp) + add_library(${target} ${CMAKE_CURRENT_BINARY_DIR}/cmake_dummy.cpp) + else() + message(FATAL_ERROR "No virtualenv environment to run the ivigenerator") + endif() + endif() + return() + endif() + + cmake_parse_arguments( + PARSE_ARGV 1 + ARG + "" "QFACE_SOURCES;QFACE_OUTPUT_DIR" "" + ) + + if (DEFINED ARG_KEYWORDS_MISSING_VALUES) + message(FATAL_ERROR "Keywords can't be empty: ${ARG_KEYWORDS_MISSING_VALUES}") + endif() + + set(QFACE_OUTPUT_DIR ${ARG_QFACE_OUTPUT_DIR}) + if (NOT DEFINED ARG_QFACE_OUTPUT_DIR) + set(QFACE_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) + endif() + if (NOT DEFINED ARG_QFACE_SOURCES) + message(FATAL_ERROR "QFACE_SOURCES can't be empty") + endif() + get_filename_component(QFACE_SOURCES "${ARG_QFACE_SOURCES}" REALPATH BASE_DIR) + get_filename_component(QFACE_BASE_NAME "${ARG_QFACE_SOURCES}" NAME_WLE) + + set(CURRENT_TARGET "${target}") + include(${QFACE_OUTPUT_DIR}/${QFACE_BASE_NAME}.cmake) +endfunction() + +if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS) + function(qt_ivigenerator_include) + qt6_ivigenerator_include(${ARGV}) + endfunction() +endif() |