summaryrefslogtreecommitdiff
path: root/src/ivicore
diff options
context:
space:
mode:
authorDominik Holland <dominik.holland@qt.io>2021-02-17 17:34:35 +0100
committerDominik Holland <dominik.holland@qt.io>2021-05-10 17:28:11 +0200
commit8e3d637e7776638149119bd62f459178cbca2955 (patch)
tree077f7a597039a05555da2c2fe33c1535227dd35e /src/ivicore
parenteac2590d4266e234f0f2ec4d261d940b14dd79bf (diff)
downloadqtivi-8e3d637e7776638149119bd62f459178cbca2955.tar.gz
cmake integration of the ivigenerator
Rerun pro2cmake.py for all examples and tests. Ivigenerator based tests and examples are compiling fine, but the cmake files need to be reworked to be also able to run them. Task-number: AUTOSUITE-1633 Change-Id: Icb95ecfa62ecb319d042dc30ea9f643b69a4aacf Reviewed-by: Robert Griebl <robert.griebl@qt.io>
Diffstat (limited to 'src/ivicore')
-rw-r--r--src/ivicore/CMakeLists.txt3
-rw-r--r--src/ivicore/Qt6IviCoreConfigExtras.cmake.in3
-rw-r--r--src/ivicore/Qt6IviCoreMacros.cmake199
3 files changed, 205 insertions, 0 deletions
diff --git a/src/ivicore/CMakeLists.txt b/src/ivicore/CMakeLists.txt
index 01e55f7..d6d7aed 100644
--- a/src/ivicore/CMakeLists.txt
+++ b/src/ivicore/CMakeLists.txt
@@ -39,6 +39,9 @@ qt_add_module(IviCore
PRIVATE_MODULE_INTERFACE
Qt::CorePrivate
Qt::QmlPrivate
+ EXTRA_CMAKE_FILES
+ Qt6IviCoreConfigExtras.cmake.in
+ Qt6IviCoreMacros.cmake
)
#### Keys ignored in scope 1:.:.:ivicore.pro:<TRUE>:
diff --git a/src/ivicore/Qt6IviCoreConfigExtras.cmake.in b/src/ivicore/Qt6IviCoreConfigExtras.cmake.in
new file mode 100644
index 0000000..057a591
--- /dev/null
+++ b/src/ivicore/Qt6IviCoreConfigExtras.cmake.in
@@ -0,0 +1,3 @@
+
+# install layout information, following what qmake -query provides
+get_filename_component(QTIVI_INSTALL_PREFIX ${CMAKE_CURRENT_LIST_DIR}/../../../ ABSOLUTE)
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()