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