From d9ea6386de95ee7212c6ff7103c239968784a752 Mon Sep 17 00:00:00 2001
From: Fabian Reister <fabian.reister@kit.edu>
Date: Wed, 25 Aug 2021 00:05:54 +0200
Subject: [PATCH] fix: both legacy and next gen mode

---
 etc/cmake/ArmarXQt4Qt5DualSupport.cmake       |  87 ++++++++++
 etc/cmake/UseArmarXGui.cmake                  | 137 +--------------
 etc/cmake/latest/GuiCommands.cmake            | 161 ++++++++++++++++++
 etc/cmake/legacy/GuiCommands.cmake            | 140 +++++++++++++++
 .../libraries/ArmarXGuiBase/CMakeLists.txt    |  18 +-
 5 files changed, 411 insertions(+), 132 deletions(-)
 create mode 100644 etc/cmake/ArmarXQt4Qt5DualSupport.cmake
 create mode 100644 etc/cmake/latest/GuiCommands.cmake
 create mode 100644 etc/cmake/legacy/GuiCommands.cmake

diff --git a/etc/cmake/ArmarXQt4Qt5DualSupport.cmake b/etc/cmake/ArmarXQt4Qt5DualSupport.cmake
new file mode 100644
index 00000000..ac9548fd
--- /dev/null
+++ b/etc/cmake/ArmarXQt4Qt5DualSupport.cmake
@@ -0,0 +1,87 @@
+
+macro(armarx_find_qt_base find_qt_base_libs find_qt_base_mode)
+    if (ArmarXGui_FOUND)
+        #qt 4 components are passed as QtCore
+        #qt 5 components are passed as Core
+        #setup some version dependent variables
+
+        set(find_qt_pkg_str "Qt5")          # the pkg is called by this name
+        set(find_qt_found_var "Qt5_FOUND")  # this var is set if qt was found
+        set(find_qt_component_pre "")       # this is the prefix for a qt component
+        set(find_qt_component_replace       # these libs are removed from the components
+        )
+        set(find_qt_component_replacement   # these libs are replacements for the removed components
+        )
+
+
+        #rewrite all names to correct version with/without Qt prefix
+        set(find_qt_components "")
+        foreach(find_qt_component ${find_qt_base_libs})
+            list(FIND find_qt_component_replace ${find_qt_component} find_qt_index)
+            #apply replacements
+            if(${find_qt_index} EQUAL -1)
+                #no replacement -< only fix prefix
+                string(REGEX REPLACE "^(Qt)+" "${find_qt_component_pre}" find_qt_component Qt${find_qt_component})
+                list(APPEND find_qt_components "${find_qt_component}")
+            else()
+                #apply replacement
+                list(GET find_qt_component_replacement ${find_qt_index} replacement)
+                string(REPLACE " " ";" replacement "${replacement}")
+                list(APPEND find_qt_components ${replacement})
+            endif()
+        endforeach(find_qt_component)
+
+        #find qt package + components
+        find_package(${find_qt_pkg_str} COMPONENTS ${find_qt_components} ${find_qt_base_mode})
+        set(QT_FOUND ${${find_qt_found_var}})
+        message(STATUS "find_package(${find_qt_pkg_str} COMPONENTS ${find_qt_components} QUIET) -> FOUND = ${QT_FOUND}")
+        #setup libraries variable
+        set(QT_LIBRARIES)
+        set(QT_INCLUDE_DIRS)
+        set(QT_DEFINITIONS)
+        set(QT_COMPILE_DEFINITIONS)
+        if(QT_FOUND)
+            foreach(var ${find_qt_components})
+                list(APPEND QT_LIBRARIES ${Qt5${var}_LIBRARIES})
+                list(APPEND QT_INCLUDE_DIRS ${Qt5${var}_INCLUDE_DIRS})
+                list(APPEND QT_DEFINITIONS ${Qt5${var}_DEFINITIONS})
+                list(APPEND QT_COMPILE_DEFINITIONS ${Qt5${var}_COMPILE_DEFINITIONS})
+            endforeach(var)
+
+            list(LENGTH QT_LIBRARIES           QT_LIBRARIES_LEN)
+            list(LENGTH QT_INCLUDE_DIRS        QT_INCLUDE_DIRS_LEN)
+            list(LENGTH QT_DEFINITIONS         QT_DEFINITIONS_LEN)
+            list(LENGTH QT_COMPILE_DEFINITIONS QT_COMPILE_DEFINITIONS_LEN)
+
+            if(NOT 0 EQUAL ${QT_LIBRARIES_LEN})
+                list(REMOVE_DUPLICATES QT_LIBRARIES)
+            endif()
+
+            if(NOT 0 EQUAL ${QT_INCLUDE_DIRS_LEN})
+                list(REMOVE_DUPLICATES QT_INCLUDE_DIRS)
+            endif()
+
+            if(NOT 0 EQUAL ${QT_DEFINITIONS_LEN})
+                list(REMOVE_DUPLICATES QT_DEFINITIONS)
+            endif()
+
+            if(NOT 0 EQUAL ${QT_COMPILE_DEFINITIONS_LEN})
+                list(REMOVE_DUPLICATES QT_COMPILE_DEFINITIONS)
+            endif()
+
+            list(REMOVE_DUPLICATES QT_LIBRARIES)
+            link_libraries(${QT_LIBRARIES})
+        endif()
+    endif()
+    armarx_build_if(QT_FOUND "Qt was not found")
+endmacro()
+
+macro(armarx_find_qt)
+    armarx_find_qt_base("${ARGN}" QUIET)
+endmacro()
+
+macro(armarx_qt_add_translation)
+    if (ArmarXGui_FOUND)
+        qt5_add_translation(${ARGN})
+    endif()
+endmacro()
diff --git a/etc/cmake/UseArmarXGui.cmake b/etc/cmake/UseArmarXGui.cmake
index 9fb8a3db..69a883e0 100644
--- a/etc/cmake/UseArmarXGui.cmake
+++ b/etc/cmake/UseArmarXGui.cmake
@@ -1,133 +1,8 @@
-add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x040800)
 
-set(CMAKE_GLOBAL_AUTOGEN_TARGET ON)
-set(CMAKE_GLOBAL_AUTORCC_TARGET ON)
-
-find_package(Qt5Script QUIET)
-find_package(Qt5OpenGL QUIET)
-find_package(Qt5Designer QUIET)
-find_package(Qt5Network QUIET)
-
-#https://forum.qt.io/topic/81252/cmake-qt5_wrap_ui-issue
-# > Since QT5_WRAP_UI macro is delivered as part of Qt5Widget packacge it is necessery
-# > to make a call to find_package (Qt5Widget) before issuing QT5_WRAP_UI call.
-find_package(Qt5 COMPONENTS Widgets QUIET)
-if(NOT Qt5_FOUND)
-    message(WARNING "Qt5 NOT FOUND")
+if(NOT DEFINED ${ARMARX_LEGACY_CMAKE_PROJECT} OR ${ARMARX_LEGACY_CMAKE_PROJECT})
+    message(STATUS "Using ArmarXGui scripts in legacy mode.")
+    include(${ArmarXGui_CMAKE_DIR}/legacy/GuiCommands.cmake)
+else()
+    message(STATUS "Using ArmarXGui scripts in next-gen mode.")
+    include(${ArmarXGui_CMAKE_DIR}/latest/GuiCommands.cmake)
 endif()
-find_package(Qt5LinguistTools QUIET)
-
-string(REGEX REPLACE "/[^/]+$" "" QT_EXECUTABLE_PRE "${QT_MOC_EXECUTABLE}")
-
-function(armarx_gui_library PLUGIN_NAME SOURCES QT_MOC_HDRS QT_UIS QT_RESOURCES COMPONENT_LIBS)
-    if(NOT "${ARMARX_PROJECT_NAME}" STREQUAL "ArmarXGui")
-        armarx_build_if(ArmarXGui_FOUND "ArmarXGui not available")
-        if(NOT ArmarXGui_FOUND)
-            return()
-        endif()
-    endif()
-
-    armarx_find_qt_base("QtCore;QtGui;QtOpenGL;QtXml;QtScript;QtDesigner" REQUIRED)
-
-
-    if(NOT "ArmarXGuiBase" STREQUAL "${PLUGIN_NAME}")
-        if(COMPONENT_LIBS)
-            list(APPEND COMPONENT_LIBS ArmarXCore ArmarXGuiBase ${QT_LIBRARIES})
-        else()
-            set(COMPONENT_LIBS ArmarXCore ArmarXGuiBase ${QT_LIBRARIES})
-        endif()
-    endif()
-
-    list(APPEND SOURCES ${QT_RESOURCES})
-    list(APPEND HEADERS ${QT_MOC_HDRS})
-    list(APPEND HEADERS ${QT_UIS})
-
-    set(GENERATE_BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_NAME}_autogen/include")
-
-    install(DIRECTORY "${GENERATE_BASE_DIR}" DESTINATION "include" COMPONENT headers)
-    printtarget("${HEADERS}" "${SOURCES}" "${QT_RESOURCES}" "${COMPONENT_LIBS}")
-
-    armarx_add_library("${PLUGIN_NAME}" "${SOURCES}" "${HEADERS}" "${COMPONENT_LIBS}")
-    target_include_directories("${PLUGIN_NAME}" PUBLIC $<BUILD_INTERFACE:${GENERATE_BASE_DIR}> )
-    target_compile_definitions("${PLUGIN_NAME}" PUBLIC -DQ_COMPILER_INITIALIZER_LISTS)
-
-    set_target_properties("${PLUGIN_NAME}" PROPERTIES AUTOMOC ON)
-    set_target_properties("${PLUGIN_NAME}" PROPERTIES AUTOUIC ON)
-    set_target_properties("${PLUGIN_NAME}" PROPERTIES AUTORCC ON)
-    set_target_properties("${PLUGIN_NAME}" PROPERTIES AUTOUIC_SEARCH_PATHS ${${ARMARX_PROJECT_NAME}_SOURCE_DIR}/source)
-
-    file(RELATIVE_PATH CORRECT_INCLUDE "${CMAKE_SOURCE_DIR}/source" ${CMAKE_CURRENT_SOURCE_DIR})
-
-    message(STATUS "cmake: ${CMAKE_COMMAND} ${PLUGIN_NAME}")
-    add_custom_command(TARGET ${PLUGIN_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND}
-        ARGS "-DPROJECT_NAME=${PROJECT_NAME}" "-DDIR=${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_NAME}_autogen/include/"
-        "-DCORRECT_INCLUDE=${CORRECT_INCLUDE}" "-DPROJECT_SOURCE_DIR=${CMAKE_SOURCE_DIR}/source"
-        "-P" "${ArmarXGui_CMAKE_DIR}/check_qt_moc_includes.cmake"
-        #COMMENT "Checking qt moc includes"
-        )
-
-
-    if(${VERBOSE})
-        message(STATUS "        Gui Library Directories:")
-        printlist("              " "${ArmarXGui_LIBRARY_DIRS}")
-        message(STATUS "        Include Directories: ")
-        printlist("              " "${INCLUDE_DIRECTORIES}")
-    endif()
-endfunction()
-
-function(armarx_gui_plugin PLUGIN_NAME SOURCES QT_MOC_HDRS QT_UIS QT_RESOURCES COMPONENT_LIBS)
-    list(APPEND SOURCES ${QT_RESOURCES})
-    list(APPEND HEADERS ${QT_MOC_HDRS})
-    list(APPEND HEADERS ${QT_UIS})
-
-    set(GENERATE_BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_NAME}_autogen/include")
-
-    #gui plugin name
-    # Make sure to remove only the last 'GuiPlugin' otherwise you cannot name your plugins '*GuiPlugin'
-    string(REGEX REPLACE "GuiPlugin$" "" ARMARX_GUI_PLUGIN_PREFIX "${ARMARX_TARGET_NAME}")
-
-    #autogen header if none was supplied
-    set(tmp_headers ${HEADERS})
-    set(tmp_regex "(^|\\.*/)${ARMARX_GUI_PLUGIN_PREFIX}GuiPlugin\\.h")
-    list(FILTER tmp_headers INCLUDE REGEX "${tmp_regex}")
-    list(REMOVE_DUPLICATES tmp_headers)
-    list(LENGTH tmp_headers tmp_headers_len)
-
-    if("0" STREQUAL "${tmp_headers_len}")
-        ########################################################################
-        #get rel path for subdir
-        file(RELATIVE_PATH subdir "${PROJECT_SOURCECODE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
-        ########################################################################
-        #get the widget controller header
-        set(tmp_headers ${HEADERS})
-        set(tmp_regex "(^|\\.*/)${ARMARX_GUI_PLUGIN_PREFIX}WidgetController\\.h")
-        list(FILTER tmp_headers INCLUDE REGEX "${tmp_regex}")
-        list(REMOVE_DUPLICATES tmp_headers)
-        list(LENGTH tmp_headers tmp_headers_len)
-        if(NOT "1" STREQUAL "${tmp_headers_len}")
-            message(FATAL_ERROR "Failed to auto generate the GuiPlugin headers! Error: Can't find the widget controller '${tmp_regex}'")
-        endif()
-        list(GET tmp_headers 0 tmp_hdr)
-        set(ARMARX_GUI_PLUGIN_WIDGET_CONTROLLER_HEDER "${subdir}/${tmp_hdr}")
-        ########################################################################
-        #generate and add files
-        set(outfile "${GENERATE_BASE_DIR}/${subdir}/${ARMARX_TARGET_NAME}")
-        foreach(suff h cpp)
-        configure_file(
-            "${ArmarXCore_TEMPLATES_DIR}/GuiPluginTemplate/GuiPlugin.tmp.${suff}"
-            "${outfile}.${suff}"
-            @ONLY
-        )
-        endforeach()
-        list(APPEND SOURCES "${outfile}.cpp")
-        list(APPEND HEADERS "${outfile}.h")
-    endif()
-    
-    armarx_gui_library( 
-        "${PLUGIN_NAME}" 
-        "${SOURCES}" 
-        "${HEADERS}" 
-        "" 
-        "${QT_RESOURCES}" 
-        "${COMPONENT_LIBS}")
-endfunction()
diff --git a/etc/cmake/latest/GuiCommands.cmake b/etc/cmake/latest/GuiCommands.cmake
new file mode 100644
index 00000000..b0362666
--- /dev/null
+++ b/etc/cmake/latest/GuiCommands.cmake
@@ -0,0 +1,161 @@
+
+
+add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x040800)
+
+set(CMAKE_GLOBAL_AUTOGEN_TARGET ON)
+set(CMAKE_GLOBAL_AUTORCC_TARGET ON)
+
+find_package(Qt5Script QUIET)
+find_package(Qt5OpenGL QUIET)
+find_package(Qt5Designer QUIET)
+find_package(Qt5Network QUIET)
+
+# Qt4 is dead
+#include(${ArmarXGui_CMAKE_DIR}/ArmarXQt4Qt5DualSupport.cmake)
+
+#https://forum.qt.io/topic/81252/cmake-qt5_wrap_ui-issue
+# > Since QT5_WRAP_UI macro is delivered as part of Qt5Widget packacge it is necessery
+# > to make a call to find_package (Qt5Widget) before issuing QT5_WRAP_UI call.
+find_package(Qt5 COMPONENTS Widgets QUIET)
+if(NOT Qt5_FOUND)
+    message(WARNING "Qt5 NOT FOUND")
+endif()
+find_package(Qt5LinguistTools QUIET)
+
+string(REGEX REPLACE "/[^/]+$" "" QT_EXECUTABLE_PRE "${QT_MOC_EXECUTABLE}")
+
+function(armarx_gui_library PLUGIN_NAME)
+
+    set(single_param)
+    set(flag_param)
+    set(multi_param SOURCES QT_MOC_HDRS QT_UIS QT_RESOURCES DEPENDENCIES)
+    cmake_parse_arguments(AX "${flag_param}" "${single_param}" "${multi_param}" ${ARGN})
+    if(DEFINED AX_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "${TARGET}: Unknown arguments `${AX_UNPARSED_ARGUMENTS}`.")
+    endif()
+
+    # variables that are modified within this context
+    set(SOURCES "${AX_SOURCES}")
+    set(DEPENDENCIES "${AX_DEPENDENCIES}")
+
+    armarx_find_qt_base("QtCore;QtGui;QtOpenGL;QtXml;QtScript;QtDesigner" REQUIRED)
+
+    if(NOT "ArmarXGuiBase" STREQUAL "${PLUGIN_NAME}")
+        if(DEPENDENCIES)
+            list(APPEND DEPENDENCIES ArmarXCore ArmarXGuiBase ${QT_LIBRARIES})
+        else()
+            set(DEPENDENCIES ArmarXCore ArmarXGuiBase ${QT_LIBRARIES})
+        endif()
+    endif()
+
+    list(APPEND SOURCES ${AX_QT_RESOURCES})
+    list(APPEND HEADERS ${AX_QT_MOC_HDRS})
+    list(APPEND HEADERS ${AX_QT_UIS})
+
+    set(GENERATE_BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_NAME}_autogen/include")
+
+    install(DIRECTORY "${GENERATE_BASE_DIR}" DESTINATION "include" COMPONENT headers)
+    printtarget("${HEADERS}" "${SOURCES}" "${AX_QT_RESOURCES}" "${DEPENDENCIES}")
+
+    armarx_add_library("${PLUGIN_NAME}"
+        SOURCES "${SOURCES}" 
+        HEADERS "${HEADERS}"
+        DEPENDENCIES "${DEPENDENCIES}"
+    )
+    target_include_directories("${PLUGIN_NAME}" PUBLIC $<BUILD_INTERFACE:${GENERATE_BASE_DIR}> )
+    target_compile_definitions("${PLUGIN_NAME}" PUBLIC -DQ_COMPILER_INITIALIZER_LISTS)
+
+    set_target_properties("${PLUGIN_NAME}" PROPERTIES AUTOMOC ON)
+    set_target_properties("${PLUGIN_NAME}" PROPERTIES AUTOUIC ON)
+    set_target_properties("${PLUGIN_NAME}" PROPERTIES AUTORCC ON)
+    set_target_properties("${PLUGIN_NAME}" PROPERTIES AUTOUIC_SEARCH_PATHS ${${ARMARX_PROJECT_NAME}_SOURCE_DIR}/source)
+
+    file(RELATIVE_PATH CORRECT_INCLUDE "${CMAKE_SOURCE_DIR}/source" ${CMAKE_CURRENT_SOURCE_DIR})
+
+    message(STATUS "cmake: ${CMAKE_COMMAND} ${PLUGIN_NAME}")
+    add_custom_command(TARGET ${PLUGIN_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND}
+        ARGS "-DPROJECT_NAME=${PROJECT_NAME}" "-DDIR=${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_NAME}_autogen/include/"
+        "-DCORRECT_INCLUDE=${CORRECT_INCLUDE}" "-DPROJECT_SOURCE_DIR=${CMAKE_SOURCE_DIR}/source"
+        "-P" "${ArmarXGui_CMAKE_DIR}/check_qt_moc_includes.cmake"
+        #COMMENT "Checking qt moc includes"
+        )
+
+
+    if(${VERBOSE})
+        message(STATUS "        Gui Library Directories:")
+        printlist("              " "${ArmarXGui_LIBRARY_DIRS}")
+        message(STATUS "        Include Directories: ")
+        printlist("              " "${INCLUDE_DIRECTORIES}")
+    endif()
+endfunction()
+
+
+function(armarx_gui_plugin PLUGIN_NAME)
+
+    set(single_param)
+    set(flag_param)
+    set(multi_param SOURCES QT_MOC_HDRS QT_UIS QT_RESOURCES DEPENDENCIES)
+    cmake_parse_arguments(AX "${flag_param}" "${single_param}" "${multi_param}" ${ARGN})
+    if(DEFINED AX_UNPARSED_ARGUMENTS)
+      message(FATAL_ERROR "${TARGET}: Unknown arguments `${AX_UNPARSED_ARGUMENTS}`.")
+    endif()
+
+    # variables that are modified within this context
+    set(SOURCES "${AX_SOURCES}")
+    set(DEPENDENCIES "${AX_DEPENDENCIES}")
+
+    list(APPEND SOURCES ${AX_QT_RESOURCES})
+    list(APPEND HEADERS ${AX_QT_MOC_HDRS})
+    list(APPEND HEADERS ${AX_QT_UIS})
+
+    set(GENERATE_BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_NAME}_autogen/include")
+
+    #gui plugin name
+    # Make sure to remove only the last 'GuiPlugin' otherwise you cannot name your plugins '*GuiPlugin'
+    string(REGEX REPLACE "GuiPlugin$" "" ARMARX_GUI_PLUGIN_PREFIX "${ARMARX_TARGET_NAME}")
+
+    #autogen header if none was supplied
+    set(tmp_headers ${HEADERS})
+    set(tmp_regex "(^|\\.*/)${ARMARX_GUI_PLUGIN_PREFIX}GuiPlugin\\.h")
+    list(FILTER tmp_headers INCLUDE REGEX "${tmp_regex}")
+    list(REMOVE_DUPLICATES tmp_headers)
+    list(LENGTH tmp_headers tmp_headers_len)
+
+    if("0" STREQUAL "${tmp_headers_len}")
+        ########################################################################
+        #get rel path for subdir
+        file(RELATIVE_PATH subdir "${PROJECT_SOURCECODE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
+        ########################################################################
+        #get the widget controller header
+        set(tmp_headers ${HEADERS})
+        set(tmp_regex "(^|\\.*/)${ARMARX_GUI_PLUGIN_PREFIX}WidgetController\\.h")
+        list(FILTER tmp_headers INCLUDE REGEX "${tmp_regex}")
+        list(REMOVE_DUPLICATES tmp_headers)
+        list(LENGTH tmp_headers tmp_headers_len)
+        if(NOT "1" STREQUAL "${tmp_headers_len}")
+            message(FATAL_ERROR "Failed to auto generate the GuiPlugin headers! Error: Can't find the widget controller '${tmp_regex}'")
+        endif()
+        list(GET tmp_headers 0 tmp_hdr)
+        set(ARMARX_GUI_PLUGIN_WIDGET_CONTROLLER_HEDER "${subdir}/${tmp_hdr}")
+        ########################################################################
+        #generate and add files
+        set(outfile "${GENERATE_BASE_DIR}/${subdir}/${ARMARX_TARGET_NAME}")
+        foreach(suff h cpp)
+        configure_file(
+            "${ArmarXCore_TEMPLATES_DIR}/GuiPluginTemplate/GuiPlugin.tmp.${suff}"
+            "${outfile}.${suff}"
+            @ONLY
+        )
+        endforeach()
+        list(APPEND SOURCES "${outfile}.cpp")
+        list(APPEND HEADERS "${outfile}.h")
+    endif()
+    
+    armarx_gui_library("${PLUGIN_NAME}" 
+        SOURCES "${SOURCES}" 
+        QT_MOC_HDRS "${HEADERS}" 
+        QT_UIS "" 
+        QT_RESOURCES "${AX_QT_RESOURCES}" 
+        DEPENDENCIES "${AX_DEPENDENCIES}"
+    )
+endfunction()
diff --git a/etc/cmake/legacy/GuiCommands.cmake b/etc/cmake/legacy/GuiCommands.cmake
new file mode 100644
index 00000000..87bd0cc6
--- /dev/null
+++ b/etc/cmake/legacy/GuiCommands.cmake
@@ -0,0 +1,140 @@
+
+
+add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x040800)
+
+set(CMAKE_GLOBAL_AUTOGEN_TARGET ON)
+set(CMAKE_GLOBAL_AUTORCC_TARGET ON)
+
+find_package(Qt5Script QUIET)
+find_package(Qt5OpenGL QUIET)
+find_package(Qt5Designer QUIET)
+find_package(Qt5Network QUIET)
+
+include(${ArmarXGui_CMAKE_DIR}/ArmarXQt4Qt5DualSupport.cmake)
+#https://forum.qt.io/topic/81252/cmake-qt5_wrap_ui-issue
+# > Since QT5_WRAP_UI macro is delivered as part of Qt5Widget packacge it is necessery
+# > to make a call to find_package (Qt5Widget) before issuing QT5_WRAP_UI call.
+find_package(Qt5 COMPONENTS Widgets QUIET)
+if(NOT Qt5_FOUND)
+    message(WARNING "Qt5 NOT FOUND")
+endif()
+find_package(Qt5LinguistTools QUIET)
+
+string(REGEX REPLACE "/[^/]+$" "" QT_EXECUTABLE_PRE "${QT_MOC_EXECUTABLE}")
+
+function(armarx_gui_library PLUGIN_NAME SOURCES QT_MOC_HDRS QT_UIS QT_RESOURCES COMPONENT_LIBS)
+    if(NOT "${ARMARX_PROJECT_NAME}" STREQUAL "ArmarXGui")
+        armarx_build_if(ArmarXGui_FOUND "ArmarXGui not available")
+        if(NOT ArmarXGui_FOUND)
+            return()
+        endif()
+    endif()
+
+    armarx_find_qt_base("QtCore;QtGui;QtOpenGL;QtXml;QtScript;QtDesigner" REQUIRED)
+
+
+    if(NOT "ArmarXGuiBase" STREQUAL "${PLUGIN_NAME}")
+        if(COMPONENT_LIBS)
+            list(APPEND COMPONENT_LIBS ArmarXCore ArmarXGuiBase ${QT_LIBRARIES})
+        else()
+            set(COMPONENT_LIBS ArmarXCore ArmarXGuiBase ${QT_LIBRARIES})
+        endif()
+    endif()
+
+    list(APPEND SOURCES ${QT_RESOURCES})
+    list(APPEND HEADERS ${QT_MOC_HDRS})
+    list(APPEND HEADERS ${QT_UIS})
+
+    set(GENERATE_BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_NAME}_autogen/include")
+
+    install(DIRECTORY "${GENERATE_BASE_DIR}" DESTINATION "include" COMPONENT headers)
+    printtarget("${HEADERS}" "${SOURCES}" "${QT_RESOURCES}" "${COMPONENT_LIBS}")
+
+    armarx_add_library("${PLUGIN_NAME}"
+         "${SOURCES}" 
+         "${HEADERS}"
+         "${COMPONENT_LIBS}"
+    )
+    target_include_directories("${PLUGIN_NAME}" PUBLIC $<BUILD_INTERFACE:${GENERATE_BASE_DIR}> )
+    target_compile_definitions("${PLUGIN_NAME}" PUBLIC -DQ_COMPILER_INITIALIZER_LISTS)
+
+    set_target_properties("${PLUGIN_NAME}" PROPERTIES AUTOMOC ON)
+    set_target_properties("${PLUGIN_NAME}" PROPERTIES AUTOUIC ON)
+    set_target_properties("${PLUGIN_NAME}" PROPERTIES AUTORCC ON)
+    set_target_properties("${PLUGIN_NAME}" PROPERTIES AUTOUIC_SEARCH_PATHS ${${ARMARX_PROJECT_NAME}_SOURCE_DIR}/source)
+
+    file(RELATIVE_PATH CORRECT_INCLUDE "${CMAKE_SOURCE_DIR}/source" ${CMAKE_CURRENT_SOURCE_DIR})
+
+    message(STATUS "cmake: ${CMAKE_COMMAND} ${PLUGIN_NAME}")
+    add_custom_command(TARGET ${PLUGIN_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND}
+        ARGS "-DPROJECT_NAME=${PROJECT_NAME}" "-DDIR=${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_NAME}_autogen/include/"
+        "-DCORRECT_INCLUDE=${CORRECT_INCLUDE}" "-DPROJECT_SOURCE_DIR=${CMAKE_SOURCE_DIR}/source"
+        "-P" "${ArmarXGui_CMAKE_DIR}/check_qt_moc_includes.cmake"
+        #COMMENT "Checking qt moc includes"
+        )
+
+
+    if(${VERBOSE})
+        message(STATUS "        Gui Library Directories:")
+        printlist("              " "${ArmarXGui_LIBRARY_DIRS}")
+        message(STATUS "        Include Directories: ")
+        printlist("              " "${INCLUDE_DIRECTORIES}")
+    endif()
+endfunction()
+
+function(armarx_gui_plugin PLUGIN_NAME SOURCES QT_MOC_HDRS QT_UIS QT_RESOURCES COMPONENT_LIBS)
+    list(APPEND SOURCES ${QT_RESOURCES})
+    list(APPEND HEADERS ${QT_MOC_HDRS})
+    list(APPEND HEADERS ${QT_UIS})
+
+    set(GENERATE_BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_NAME}_autogen/include")
+
+    #gui plugin name
+    # Make sure to remove only the last 'GuiPlugin' otherwise you cannot name your plugins '*GuiPlugin'
+    string(REGEX REPLACE "GuiPlugin$" "" ARMARX_GUI_PLUGIN_PREFIX "${ARMARX_TARGET_NAME}")
+
+    #autogen header if none was supplied
+    set(tmp_headers ${HEADERS})
+    set(tmp_regex "(^|\\.*/)${ARMARX_GUI_PLUGIN_PREFIX}GuiPlugin\\.h")
+    list(FILTER tmp_headers INCLUDE REGEX "${tmp_regex}")
+    list(REMOVE_DUPLICATES tmp_headers)
+    list(LENGTH tmp_headers tmp_headers_len)
+
+    if("0" STREQUAL "${tmp_headers_len}")
+        ########################################################################
+        #get rel path for subdir
+        file(RELATIVE_PATH subdir "${PROJECT_SOURCECODE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
+        ########################################################################
+        #get the widget controller header
+        set(tmp_headers ${HEADERS})
+        set(tmp_regex "(^|\\.*/)${ARMARX_GUI_PLUGIN_PREFIX}WidgetController\\.h")
+        list(FILTER tmp_headers INCLUDE REGEX "${tmp_regex}")
+        list(REMOVE_DUPLICATES tmp_headers)
+        list(LENGTH tmp_headers tmp_headers_len)
+        if(NOT "1" STREQUAL "${tmp_headers_len}")
+            message(FATAL_ERROR "Failed to auto generate the GuiPlugin headers! Error: Can't find the widget controller '${tmp_regex}'")
+        endif()
+        list(GET tmp_headers 0 tmp_hdr)
+        set(ARMARX_GUI_PLUGIN_WIDGET_CONTROLLER_HEDER "${subdir}/${tmp_hdr}")
+        ########################################################################
+        #generate and add files
+        set(outfile "${GENERATE_BASE_DIR}/${subdir}/${ARMARX_TARGET_NAME}")
+        foreach(suff h cpp)
+        configure_file(
+            "${ArmarXCore_TEMPLATES_DIR}/GuiPluginTemplate/GuiPlugin.tmp.${suff}"
+            "${outfile}.${suff}"
+            @ONLY
+        )
+        endforeach()
+        list(APPEND SOURCES "${outfile}.cpp")
+        list(APPEND HEADERS "${outfile}.h")
+    endif()
+    
+    armarx_gui_library( 
+        "${PLUGIN_NAME}" 
+        "${SOURCES}" 
+        "${HEADERS}" 
+        "" 
+        "${QT_RESOURCES}" 
+        "${COMPONENT_LIBS}")
+endfunction()
diff --git a/source/ArmarXGui/libraries/ArmarXGuiBase/CMakeLists.txt b/source/ArmarXGui/libraries/ArmarXGuiBase/CMakeLists.txt
index ce75fcb9..4401f361 100644
--- a/source/ArmarXGui/libraries/ArmarXGuiBase/CMakeLists.txt
+++ b/source/ArmarXGui/libraries/ArmarXGuiBase/CMakeLists.txt
@@ -71,7 +71,23 @@ list(APPEND FILES ${QT_RESOURCES})
 
 install(DIRECTORY icons/ DESTINATION share/${PROJECT_NAME} COMPONENT data)
 
-armarx_gui_library("${LIB_NAME}"  "${FILES}" "${HEADERS}" "" "${QT_RESOURCES}" "${LIBS}")
+# TODO: next gen, enable after migration
+# armarx_gui_library("${LIB_NAME}"
+#     SOURCES "${FILES}" 
+#     QT_MOC_HDRS "${HEADERS}" 
+#     QT_UIS "" 
+#     QT_RESOURCES "${QT_RESOURCES}"
+#     DEPENDENCIES "${LIBS}"
+# )
+
+armarx_gui_library("${LIB_NAME}"
+     "${FILES}" 
+     "${HEADERS}" 
+     "" 
+     "${QT_RESOURCES}"
+     "${LIBS}"
+)
+
 
 if(Coin3D_FOUND AND SOQT_FOUND)
     target_include_directories(${LIB_NAME} SYSTEM PUBLIC ${Coin3D_INCLUDE_DIRS})
-- 
GitLab