cmake_minimum_required(VERSION 3.16) project(chatgui VERSION 0.1.0 LANGUAGES C CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_C_STANDARD 99) find_package(OpenSSL REQUIRED) find_package(Qt6 COMPONENTS Widgets Network Test QUIET) if(NOT Qt6_FOUND) find_package(Qt5 COMPONENTS Widgets Network Test REQUIRED) set(QT_LIBS Qt5::Widgets Qt5::Network) set(QT_CORE Qt5::Core) set(QT_TEST_LIB Qt5::Test) else() set(QT_LIBS Qt6::Widgets Qt6::Network) set(QT_CORE Qt6::Core) set(QT_TEST_LIB Qt6::Test) endif() find_package(rlottie REQUIRED) find_package(ZLIB REQUIRED) find_package(OpenSSL REQUIRED) set(ZXING_READERS ON CACHE BOOL "") set(ZXING_WRITERS "OLD" CACHE STRING "") set(ZXING_ENABLE_QRCODE ON CACHE BOOL "") set(ZXING_ENABLE_AZTEC OFF CACHE BOOL "") set(ZXING_ENABLE_DATAMATRIX OFF CACHE BOOL "") set(ZXING_ENABLE_MAXICODE OFF CACHE BOOL "") set(ZXING_ENABLE_PDF417 OFF CACHE BOOL "") set(ZXING_ENABLE_1D OFF CACHE BOOL "") set(ZXING_C_API OFF CACHE BOOL "") set(ZXING_EXAMPLES OFF CACHE BOOL "") set(ZXING_EXAMPLES_QT OFF CACHE BOOL "") set(ZXING_BLACKBOX_TESTS OFF CACHE BOOL "") set(ZXING_UNIT_TESTS OFF CACHE BOOL "") set(BUILD_SHARED_LIBS OFF CACHE BOOL "") add_subdirectory(zxing-cpp) set_target_properties(ZXing PROPERTIES AUTOMOC OFF) # FFmpeg - custom built shared libraries set(FFMPEG_INSTALL_DIR "${CMAKE_SOURCE_DIR}/ffmpeg/ffmpeg_build/install") set(ENV{PKG_CONFIG_PATH} "${FFMPEG_INSTALL_DIR}/lib/pkgconfig") find_package(PkgConfig QUIET) if(PkgConfig_FOUND) pkg_check_modules(FFMPEG_PC libavcodec libavformat libavutil libswscale libswresample IMPORTED_TARGET) if(FFMPEG_PC_FOUND) set(FFMPEG_FOUND TRUE) set(FFMPEG_TARGET PkgConfig::FFMPEG_PC) set(FFMPEG_INCLUDE_DIRS "${FFMPEG_PC_INCLUDE_DIRS}") endif() endif() if(NOT FFMPEG_FOUND) message(STATUS "pkg-config search failed, trying direct library search") find_path(FFMPEG_INCLUDE_DIR libavcodec/avcodec.h PATHS "${FFMPEG_INSTALL_DIR}/include" NO_DEFAULT_PATH) find_library(AVCODEC_LIBRARY avcodec PATHS "${FFMPEG_INSTALL_DIR}/lib" NO_DEFAULT_PATH) find_library(AVFORMAT_LIBRARY avformat PATHS "${FFMPEG_INSTALL_DIR}/lib" NO_DEFAULT_PATH) find_library(AVUTIL_LIBRARY avutil PATHS "${FFMPEG_INSTALL_DIR}/lib" NO_DEFAULT_PATH) find_library(SWSCALE_LIBRARY swscale PATHS "${FFMPEG_INSTALL_DIR}/lib" NO_DEFAULT_PATH) find_library(SWRESAMPLE_LIBRARY swresample PATHS "${FFMPEG_INSTALL_DIR}/lib" NO_DEFAULT_PATH) if(FFMPEG_INCLUDE_DIR AND AVCODEC_LIBRARY AND AVFORMAT_LIBRARY AND AVUTIL_LIBRARY) set(FFMPEG_FOUND TRUE) set(FFMPEG_INCLUDE_DIRS "${FFMPEG_INCLUDE_DIR}") set(FFMPEG_LIBRARIES "${AVCODEC_LIBRARY}" "${AVFORMAT_LIBRARY}" "${AVUTIL_LIBRARY}" "${SWSCALE_LIBRARY}" "${SWRESAMPLE_LIBRARY}") message(STATUS "FFmpeg found via direct search") endif() endif() if(NOT FFMPEG_FOUND) message(WARNING "FFmpeg not found at ${FFMPEG_INSTALL_DIR}. Video transcoding disabled. Run ./ffmpeg/build_ffmpeg.sh to enable.") set(FFMPEG_TARGET "") set(FFMPEG_LIBRARIES "") set(FFMPEG_INCLUDE_DIRS "") endif() if(UNIX AND NOT APPLE AND FFMPEG_FOUND) set(CMAKE_BUILD_RPATH "${FFMPEG_INSTALL_DIR}/lib") set(CMAKE_INSTALL_RPATH "${FFMPEG_INSTALL_DIR}/lib") endif() # uTun core library (C, built from ../src/ and ../lib/) add_subdirectory(libutun) add_executable(chatgui src/main.cpp src/mainwindow.cpp src/channellist.cpp src/creategroupdialog.cpp src/channeldelegate.cpp src/chatview.cpp src/messagedelegate.cpp src/messagelist.cpp src/accountlist.cpp src/accountdelegate.cpp src/memberpropsdialog.cpp src/renamedialog.cpp src/memberlistmodel.cpp src/emoji.cpp src/emojipanel.cpp src/emojitabbar.cpp src/inputbar.cpp src/lottieicon.cpp src/animtimer.cpp src/qrcode_utils.cpp src/invite_link.cpp src/invitedialog.cpp src/joindialog.cpp src/settingsdialog.cpp src/networksettingspage.cpp src/databasesettingspage.cpp src/statuspage.cpp src/nodespage.cpp src/soundsettingspage.cpp src/sound_manager.cpp src/audiorecorder.cpp src/voicemessageencoder.cpp src/voiceplayback.cpp src/media_blocks.cpp src/audiodevicesettingspage.cpp src/storagesettingspage.cpp transport/utun_node.cpp transport/node_config.cpp transport/config_updater.cpp transport/gui_bridge_impl.cpp transport/miniaudio_impl.c db/db_manager.cpp ../../lib/sqlite3.c resources/chatgui.qrc ) target_include_directories(chatgui PRIVATE ${CMAKE_SOURCE_DIR}/../../lib ${CMAKE_SOURCE_DIR}/../../src ${CMAKE_SOURCE_DIR}/db ${CMAKE_SOURCE_DIR}/../../lib/libopus/include ${FFMPEG_INCLUDE_DIRS}) target_compile_definitions(chatgui PRIVATE SQLITE_THREADSAFE=1 USE_SQLITE) set_source_files_properties(../../lib/sqlite3.c transport/miniaudio_impl.c PROPERTIES LANGUAGE C) if(WIN32) target_link_libraries(chatgui PRIVATE ${QT_LIBS} rlottie::rlottie ZLIB::ZLIB OpenSSL::Crypto ZXing::ZXing utun pthread ${FFMPEG_TARGET} ${FFMPEG_LIBRARIES}) else() target_link_libraries(chatgui PRIVATE ${QT_LIBS} rlottie::rlottie ZLIB::ZLIB OpenSSL::Crypto ZXing::ZXing utun pthread dl ${FFMPEG_TARGET} ${FFMPEG_LIBRARIES}) endif() # ============================================================================ # Tests # ============================================================================ add_executable(test_member_sync ../../lib/sqlite3.c ../../tests/test_member_sync.c ) target_include_directories(test_member_sync PRIVATE transport ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/../../lib ${CMAKE_SOURCE_DIR}/../../src zxing-cpp/core/src ../../tests ) target_compile_definitions(test_member_sync PRIVATE USE_SQLITE SQLITE_THREADSAFE=1) set_source_files_properties(../../lib/sqlite3.c ../../tests/test_member_sync.c PROPERTIES LANGUAGE C) if(WIN32) target_link_libraries(test_member_sync PRIVATE OpenSSL::Crypto pthread) else() target_link_libraries(test_member_sync PRIVATE OpenSSL::Crypto pthread dl) endif() # ============================================================================ # Tests # ============================================================================ enable_testing() add_executable(test_config_updater tests/test_config_updater.cpp transport/config_updater.cpp ) target_include_directories(test_config_updater PRIVATE ${CMAKE_SOURCE_DIR}) target_link_libraries(test_config_updater PRIVATE ${QT_CORE} pthread) add_test(NAME test_config_updater COMMAND test_config_updater)