Magic 8 Ball

 cmake_minimum_required(VERSION 3.16)
 project(Magic8Ball LANGUAGES CXX)

 if(NOT DEFINED INSTALL_EXAMPLESDIR)
     set(INSTALL_EXAMPLESDIR "examples")
 endif()

 set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/grpc/magic8ball")

 find_package(Qt6 REQUIRED COMPONENTS Core Protobuf Grpc Quick)

 qt_standard_project_setup()

 add_subdirectory(grpc_server_example)

 qt_add_executable(magic8ball
     main.cpp
 )

 qt_add_protobuf(magic8ball
     PROTO_FILES
         proto/exampleservice.proto
 )

 qt_add_grpc(magic8ball CLIENT
     PROTO_FILES
         proto/exampleservice.proto
 )

 set_target_properties(magic8ball PROPERTIES
     WIN32_EXECUTABLE TRUE
     MACOSX_BUNDLE TRUE
 )

 qt_add_qml_module(magic8ball
     URI qtgrpc.examples.magic8ball
     VERSION 1.0
     AUTO_RESOURCE_PREFIX
     SOURCES
         clientservice.h
         clientservice.cpp
     QML_FILES
         "WaitingAnimation.qml"
         "AnimatedAnswer.qml"
         "MagicText.qml"
         "ProgressDot.qml"
         "Main.qml"
 )

 target_link_libraries(magic8ball PRIVATE
     Qt6::Core
     Qt6::Quick
     Qt6::Protobuf
     Qt6::Grpc
 )

 install(TARGETS magic8ball
     RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
     BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
     LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
 )