ChonkyStation/zep/demos/demo_qt/CMakeLists.txt
2022-07-07 16:42:31 +02:00

169 lines
5.3 KiB
CMake

IF (BUILD_DEMOS AND BUILD_QT)
set(DEMO_ROOT ${ZEP_ROOT}/demos)
# Qt Specific
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_PREFIX_PATH $ENV{QT_INSTALL_LOCATION})
# Note: The SDL2 package is required by the MUtils dependency; it isn't really used for the Qt demo
find_package(SDL2 REQUIRED)
# Used Packages
include(CMakePackageConfigHelpers)
find_package(MUtils REQUIRED)
find_package(Qt5 COMPONENTS Core Widgets Gui REQUIRED)
set_property(GLOBAL PROPERTY AUTOMOC_FOLDER Automoc)
set_property(GLOBAL PROPERTY AUTOGEN_TARGETS_FOLDER Automoc)
# Find Mac and Win deploy
find_program(WINDEPLOYQT_EXECUTABLE NAMES windeployqt HINTS ${QTDIR} ENV QTDIR PATH_SUFFIXES bin)
find_program(MACDEPLOYQT_EXECUTABLE NAMES macdeployqt HINTS ${QTDIR} ENV QTDIR PATH_SUFFIXES bin)
set(DEMO_NAME ZepDemo-qt)
project(ZepDemo-qt
VERSION 0.1.0.0)
set(IS_QT YES)
add_project_meta(META_FILES_TO_INCLUDE IS_QT)
set(RESOURCE_FOLDER
${DEMO_ROOT}/demo_qt/res)
set(RESOURCE_FILES
${DEMO_ROOT}/demo_qt/res/app.qrc)
set(DEMO_SOURCE_QT
${DEMO_ROOT}/demo_qt/CMakeLists.txt
${DEMO_ROOT}/demo_qt/mainwindow.cpp
${DEMO_ROOT}/demo_qt/mainwindow.h
${DEMO_ROOT}/demo_qt/resource.h
${DEMO_ROOT}/demo_qt/main-qt.cpp
${ZEP_ROOT}/include/zep/qt/zepdisplay_qt.h
${ZEP_ROOT}/include/zep/qt/zepwidget_qt.h
${ZEP_ROOT}/include/zep/qt/common_qt.h
${META_FILES_TO_INCLUDE}
)
# Create the Qt version of the app
add_executable (${DEMO_NAME} ${OS_BUNDLE} ${DEMO_SOURCE_QT} ${RESOURCE_FILES}) # Win32 ignored on non-windows
set_property(TARGET ${DEMO_NAME} PROPERTY POSITION_INDEPENDENT_CODE ON) # Qt requires this?
target_include_directories(${DEMO_NAME}
PRIVATE
${DEMO_ROOT}/demo_qt
${ZEP_ROOT}/src/qt
${ZEP_ROOT}/demos
${Qt5Widgets_INCLUDE_DIRS}
${Qt5Gui_INCLUDE_DIRS}
${Qt5Core_INCLUDE_DIRS}
${CMAKE_BINARY_DIR}
${M3RDPARTY_DIR}
${ZEP_ROOT}/include)
target_link_libraries(${DEMO_NAME} PRIVATE
MUtils::MUtils
Qt5::Core
Qt5::Gui
Qt5::Widgets
Zep
ZepExtensions
#efsw::efsw
${PLATFORM_LINKLIBS})
target_compile_options(${DEMO_NAME} PRIVATE $<$<CXX_COMPILER_ID:MSVC>:/W3>) # Workaround Qt + MSVC 19 compile issue in release build.
add_dependencies(${DEMO_NAME} Zep ZepExtensions)
if(WIN32)
message(STATUS "Copying required Qt libraries and binaries to output directory....")
copy_existing_files(${PROJECT_NAME} "${RESOURCE_DEPLOY_FILES}" ${CMAKE_CURRENT_BINARY_DIR}/$(Configuration) )
# Run winddeployqt if it can be found, to ensure installed dependencies
add_custom_command(TARGET ${DEMO_NAME} POST_BUILD
COMMAND ${WINDEPLOYQT_EXECUTABLE} $<TARGET_FILE:${DEMO_NAME}>)
elseif(APPLE)
add_custom_command(TARGET ${DEMO_NAME} POST_BUILD
COMMAND "${MACDEPLOYQT_EXECUTABLE}"
"$<TARGET_FILE_DIR:${DEMO_NAME}>/../.."
-always-overwrite
COMMENT "Running macdeployqt...")
endif()
if (APPLE)
install(TARGETS ${DEMO_NAME}
EXPORT zep-targets
COMPONENT binaries
BUNDLE DESTINATION . COMPONENT Runtime
RUNTIME DESTINATION bin COMPONENT Runtime
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
INCLUDES DESTINATION ${LIBLEGACY_INCLUDE_DIRS}
)
else()
install(TARGETS ${DEMO_NAME}
EXPORT zep-targets
COMPONENT binaries
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}/qt
INCLUDES DESTINATION ${LIBLEGACY_INCLUDE_DIRS}
)
endif()
install(DIRECTORY ${ZEP_ROOT}/include/zep
COMPONENT source
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
# NOTE:
# This unfortunate mess is handling the problem of deploying Qt into the install folder.
# It takes the Qt deploy application output into a folder and copies it to the install location
if(Qt5_FOUND AND WIN32 AND TARGET Qt5::qmake AND NOT TARGET Qt5::windeployqt)
MESSAGE(STATUS "Found Qt for deploy")
get_target_property(_qt5_qmake_location Qt5::qmake IMPORTED_LOCATION)
execute_process(
COMMAND "${_qt5_qmake_location}" -query QT_INSTALL_PREFIX
RESULT_VARIABLE return_code
OUTPUT_VARIABLE qt5_install_prefix
OUTPUT_STRIP_TRAILING_WHITESPACE
)
set(imported_location "${qt5_install_prefix}/bin/windeployqt.exe")
if(EXISTS ${imported_location})
add_executable(Qt5::windeployqt IMPORTED)
set_target_properties(Qt5::windeployqt PROPERTIES
IMPORTED_LOCATION ${imported_location}
)
endif()
endif()
if(TARGET Qt5::windeployqt)
# execute windeployqt in a tmp directory after build
add_custom_command(TARGET ${DEMO_NAME}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_CURRENT_BINARY_DIR}/windeployqt"
COMMAND set PATH=%PATH%$<SEMICOLON>${qt5_install_prefix}/bin
COMMAND Qt5::windeployqt --dir "${CMAKE_CURRENT_BINARY_DIR}/windeployqt" "$<TARGET_FILE_DIR:${DEMO_NAME}>/$<TARGET_FILE_NAME:${DEMO_NAME}>"
)
# copy deployment directory during installation
install(
DIRECTORY
"${CMAKE_CURRENT_BINARY_DIR}/windeployqt/"
DESTINATION ${CMAKE_INSTALL_BINDIR}/qt
COMPONENT binaries
)
endif()
source_group (Zep FILES ${DEMO_SOURCE_QT})
source_group(qt\\AutoMoc FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_automoc.cpp )
source_group(qt\\AutoMoc REGULAR_EXPRESSION "(mocs_*|qrc_.*|QtAwesome.*)" )
endif() # Build QT