cmake_minimum_required(VERSION 3.16) project(mqttQml03 VERSION 0.1 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Opcions específiques per WebAssembly - ABANS de find_package if(EMSCRIPTEN) message(STATUS "Compilant per WebAssembly") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ALLOW_MEMORY_GROWTH=1") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ASYNCIFY=1") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s WEBSOCKET_URL=wss://") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ERROR_ON_UNDEFINED_SYMBOLS=0") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s EXPORT_ALL=1") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s FORCE_FILESYSTEM=1") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s WASM=1") # Augmentar la pila per evitar stack overflow set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s STACK_SIZE=5MB") # Habilitar excepcions per WebAssembly set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s DISABLE_EXCEPTION_CATCHING=0") endif() find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Quick Network Mqtt WebSockets) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Quick Network Mqtt WebSockets) # ============================================================ # CONFIGURACIÓ OPENSSL PER ANDROID - DESPRÉS de find_package # ============================================================ if(ANDROID) message(STATUS "================================================") message(STATUS " Configurant OpenSSL per Android") message(STATUS "================================================") message(STATUS " Qt Version: ${QT_VERSION}") message(STATUS " Qt Major: ${QT_VERSION_MAJOR}, Minor: ${QT_VERSION_MINOR}") message(STATUS " Arquitectura: ${ANDROID_ABI}") # Ruta multiplataforma (funciona a Linux, macOS i Windows) set(ANDROID_OPENSSL_ROOT "C:\\Users\\josea\\AppData\\Local\\Android\\Sdk\\android_openssl") # Per Qt 6.5+ usar OpenSSL 3.x set(OPENSSL_ROOT "${ANDROID_OPENSSL_ROOT}\\ssl_3\\${ANDROID_ABI}") set(LIB_SSL "libssl_3.so") set(LIB_CRYPTO "libcrypto_3.so") message(STATUS " Buscant OpenSSL 3.x a: ${OPENSSL_ROOT}") # Verificar que existeixen les llibreries if(EXISTS "${OPENSSL_ROOT}\\${LIB_SSL}") message(STATUS " ✓ Trobat: ${OPENSSL_ROOT}\\${LIB_SSL}") else() message(FATAL_ERROR " ✗ NO trobat: ${OPENSSL_ROOT}\\${LIB_SSL}") endif() if(EXISTS "${OPENSSL_ROOT}\\${LIB_CRYPTO}") message(STATUS " ✓ Trobat: ${OPENSSL_ROOT}\\${LIB_CRYPTO}") else() message(FATAL_ERROR " ✗ NO trobat: ${OPENSSL_ROOT}\\${LIB_CRYPTO}") endif() # CRÍTICO: Configurar les llibreries extra per Android set(ANDROID_EXTRA_LIBS "${OPENSSL_ROOT}\\${LIB_SSL}" "${OPENSSL_ROOT}\\${LIB_CRYPTO}" CACHE INTERNAL "Extra libs for Android" ) # CRÍTICO: Passar a Qt amb FORCE set(QT_ANDROID_EXTRA_LIBS "${OPENSSL_ROOT}\\${LIB_SSL};${OPENSSL_ROOT}\\${LIB_CRYPTO}" CACHE STRING "" FORCE ) message(STATUS " Llibreries configurades:") message(STATUS " - ${OPENSSL_ROOT}\\${LIB_SSL}") message(STATUS " - ${OPENSSL_ROOT}\\${LIB_CRYPTO}") message(STATUS " ✓ OpenSSL configurat correctament per Android") message(STATUS "================================================") endif() if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) qt_add_executable(appmqttQml03 MANUAL_FINALIZATION main.cpp ) qt_add_qml_module(appmqttQml03 URI mqttQml02 VERSION 1.0 QML_FILES main.qml SOURCES connexio.h connexio.cpp mqttbasic.cpp mqttbasic.h websocketiodevice.h websocketiodevice.cpp RESOURCES qml.qrc ) else() qt_add_executable(appmqttQml03 main.cpp ) qt_add_qml_module(appmqttQml03 URI mqttQml02 VERSION 1.0 QML_FILES main.qml SOURCES connexio.h connexio.cpp mqttbasic.cpp mqttbasic.h websocketiodevice.h websocketiodevice.cpp RESOURCES qml.qrc ) endif() # Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1. # If you are developing for iOS or macOS you should consider setting an # explicit, fixed bundle identifier manually though. if(${QT_VERSION} VERSION_LESS 6.1.0) set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appmqttQml03) endif() set_target_properties(appmqttQml03 PROPERTIES ${BUNDLE_ID_OPTION} MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} MACOSX_BUNDLE TRUE WIN32_EXECUTABLE TRUE ) target_link_libraries(appmqttQml03 PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Quick Qt${QT_VERSION_MAJOR}::Network Qt${QT_VERSION_MAJOR}::Mqtt Qt${QT_VERSION_MAJOR}::WebSockets ) # ============================================================ # AFEGIR LLIBRERIES OPENSSL AL TARGET (DESPRÉS de target_link_libraries) # ============================================================ if(ANDROID) set_property(TARGET appmqttQml03 APPEND PROPERTY QT_ANDROID_EXTRA_LIBS "${OPENSSL_ROOT}/${LIB_SSL}" "${OPENSSL_ROOT}/${LIB_CRYPTO}" ) message(STATUS "================================================") message(STATUS " EXTRA LIBS AFEGIDES AL TARGET apppr00") message(STATUS "================================================") endif() include(GNUInstallDirs) install(TARGETS appmqttQml03 BUNDLE DESTINATION . LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) # CRÍTICO per a WebAssembly amb Qt6 if(QT_VERSION_MAJOR EQUAL 6) qt_finalize_executable(appmqttQml03) endif()