Skip to content
Snippets Groups Projects
Select Git revision
  • 6c31f5fe7a417ba904b7c31aa5065363a8f9d94b
  • master default protected
  • test-ci protected
  • gh-readonly-queue/master/pr-1942-ba9fab78d5081d1ede6f045d321fb731640b8f79
  • update_hunter protected
  • pr-1855/Integral-Tech/nheko/fix-html
  • pr-1838/ReillyBrogan/nheko/nheko-optional-kirigami
  • gh-readonly-queue/master/pr-1825-27683bedc41375ac97ddf87ce430fd98aac9fc7c
  • pr-1815/p12tic/nheko/workaround-bad-well-known
  • hideAllPins
  • pr-1760/nishanthkarthik/nheko/theme
  • pr-1732/nishanthkarthik/nheko/search-space
  • pr-1728/Bubu/nheko/scrollable_welcome_page
  • fixCirrusCI
  • pr-1725/checkraisefold/nheko/win_d3d11_qml
  • pr-1719/Lymkwi/nheko/feature/media-captioning
  • betterimageview
  • win_d3d11_qml
  • fixswitch
  • glitchtext
  • gitlab_as_runner protected
  • v0.12.1-1 protected
  • v0.12.1 protected
  • v0.12.0 protected
  • v0.11.3 protected
  • v0.11.2 protected
  • v0.11.1 protected
  • v0.11.0 protected
  • v0.10.2 protected
  • v0.10.1-1 protected
  • v0.10.1 protected
  • v0.10.0 protected
  • v0.9.3 protected
  • v0.9.2 protected
  • v0.9.1-1 protected
  • v0.9.1 protected
  • v0.9.0 protected
  • v0.8.2 protected
  • v0.8.2-rc2 protected
  • v0.8.2-RC protected
  • v0.8.1 protected
41 results

CMakeLists.txt

Blame
  • redsky17's avatar
    Joe Donofry authored
    Add initial loading of qt jdenticon plugin:
    https://github.com/redsky17/qt-jdenticon
    
    Currently, the library's functionality has not been integrated
    into the rest of nheko.  Next step is to add a configuration
    item in the User Settings and use the plugin to generate
    avatars for users without their own picture.  These avatars
    should be cached in the Cache object.
    6c31f5fe
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    CMakeLists.txt 12.82 KiB
    cmake_minimum_required(VERSION 3.1)
    
    option(APPVEYOR_BUILD "Build on appveyor" OFF)
    option(ASAN "Compile with address sanitizers" OFF)
    
    set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
    
    add_definitions(-DBOOST_MPL_LIMIT_LIST_SIZE=30)
    add_definitions(-DBOOST_MPL_CFG_NO_PREPROCESSED_HEADERS)
    
    include(GNUInstallDirs)
    
    # Include Qt basic functions
    include(QtCommon)
    
    project(nheko LANGUAGES C CXX)
    set(CPACK_PACKAGE_VERSION_MAJOR "0")
    set(CPACK_PACKAGE_VERSION_MINOR "6")
    set(CPACK_PACKAGE_VERSION_PATCH "2")
    set(PROJECT_VERSION_MAJOR ${CPACK_PACKAGE_VERSION_MAJOR})
    set(PROJECT_VERSION_MINOR ${CPACK_PACKAGE_VERSION_MINOR})
    set(PROJECT_VERSION_PATCH ${CPACK_PACKAGE_VERSION_PATCH})
    
    # Set PROJECT_VERSION_PATCH & PROJECT_VERSION_TWEAK to 0 if not present
    # Needed by add_project_meta.
    fix_project_version()
    
    # Set additional project information
    set(COMPANY "Nheko")
    set(COPYRIGHT "Copyright (c) 2018 Nheko Contributors")
    set(IDENTIFIER "com.github.mujx.nheko")
    
    add_project_meta(META_FILES_TO_INCLUDE)
    
    if(APPLE)
        set(OPENSSL_ROOT_DIR /usr/local/opt/openssl)
    endif()
    
    if(NOT MSVC AND NOT APPLE)
      set(THREADS_PREFER_PTHREAD_FLAG ON)
      find_package(Threads REQUIRED)
    endif()
    
    if (BUILD_DOCS)
        find_package(Doxygen)
    
        if (DOXYGEN_FOUND)
            set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Doxyfile.in)
            set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
    
            configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT})
    
            add_custom_target(docs ALL
                COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
                WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
                COMMENT "Generating API documentation with Doxygen"
                VERBATIM )
        else (DOXYGEN_FOUND)
            message("Doxygen need to be installed to generate the doxygen documentation")
        endif (DOXYGEN_FOUND)
    endif()
    
    
    #
    # LMDB
    #
    include(LMDB)
    
    #
    # Discover Qt dependencies.
    #
    find_package(Qt5 COMPONENTS Core Widgets LinguistTools Concurrent Svg Multimedia REQUIRED)
    find_package(Qt5DBus)
    
    if (APPLE)
        find_package(Qt5MacExtras REQUIRED)
    endif(APPLE)
    
    if (Qt5Widgets_FOUND)
        if (Qt5Widgets_VERSION VERSION_LESS 5.7.0)
            message(STATUS "Qt version ${Qt5Widgets_VERSION}")
            message(WARNING "Minimum supported Qt5 version is 5.7!")
        endif()
    endif(Qt5Widgets_FOUND)
    
    #
    # Set up compiler flags.
    #
    if (NOT MSVC)
        set(CMAKE_C_COMPILER gcc)
    endif(NOT MSVC)
    
    set(CMAKE_CXX_STANDARD 14)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
    if(NOT MSVC)
      set(
        CMAKE_CXX_FLAGS
        "${CMAKE_CXX_FLAGS} \
            -Wall \
            -Wextra \
            -Werror \
            -pipe \
            -pedantic \
            -fsized-deallocation \
            -fdiagnostics-color=always \
            -Wunreachable-code"
        )
        if (NOT CMAKE_COMPILER_IS_GNUCXX)
            # -Wshadow is buggy and broken in GCC, so do not enable it.
            # see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79328
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wshadow")
        endif()
    endif()
    
    if(NOT (CMAKE_BUILD_TYPE OR CMAKE_CONFIGURATION_TYPES))
        set(CMAKE_BUILD_TYPE "Debug" CACHE STRING
            "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
            FORCE)
        message("Setting build type to '${CMAKE_BUILD_TYPE}'")
    else(NOT (CMAKE_BUILD_TYPE OR CMAKE_CONFIGURATION_TYPES))
        message("Build type set to '${CMAKE_BUILD_TYPE}'")
    endif(NOT (CMAKE_BUILD_TYPE OR CMAKE_CONFIGURATION_TYPES))
    
    set(SPDLOG_DEBUG_ON false)
    
    # Windows doesn't handle CMAKE_BUILD_TYPE.
    if(NOT WIN32)
        if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
            set(SPDLOG_DEBUG_ON true)
        else()
            set(SPDLOG_DEBUG_ON false)
        endif()
    endif()
    
    find_program(GIT git)
    if(GIT)
        execute_process(
            WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
            COMMAND ${GIT} rev-parse --short HEAD
            OUTPUT_VARIABLE GIT_OUT OUTPUT_STRIP_TRAILING_WHITESPACE
            )
        if(GIT_OUT)
            set(CPACK_PACKAGE_VERSION_PATCH "${CPACK_PACKAGE_VERSION_PATCH}-${GIT_OUT}")
        else()
            set(CPACK_PACKAGE_VERSION_PATCH "${CPACK_PACKAGE_VERSION_PATCH}")
        endif()
    endif(GIT)
    
    set(CPACK_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH})
    set(PROJECT_VERSION ${CPACK_PACKAGE_VERSION})
    
    message(STATUS "Version: ${PROJECT_VERSION}")
    
    cmake_host_system_information(RESULT BUILD_HOST QUERY HOSTNAME)
    set(BUILD_USER $ENV{USER})
    configure_file(cmake/nheko.h config/nheko.h)
    
    
    #
    # Declare source and header files.
    #
    set(SRC_FILES
        # Dialogs
        src/dialogs/CreateRoom.cpp
        src/dialogs/ImageOverlay.cpp
        src/dialogs/PreviewUploadOverlay.cpp
        src/dialogs/InviteUsers.cpp
        src/dialogs/JoinRoom.cpp
        src/dialogs/MemberList.cpp
        src/dialogs/LeaveRoom.cpp
        src/dialogs/Logout.cpp
        src/dialogs/UserProfile.cpp
        src/dialogs/ReadReceipts.cpp
        src/dialogs/ReCaptcha.cpp
        src/dialogs/RoomSettings.cpp
    
        # Emoji
        src/emoji/Provider.cpp
    
        # Timeline
        src/timeline/TimelineViewManager.cpp
        src/timeline/TimelineItem.cpp
        src/timeline/TimelineView.cpp
        src/timeline/widgets/AudioItem.cpp
        src/timeline/widgets/FileItem.cpp
        src/timeline/widgets/ImageItem.cpp
        src/timeline/widgets/VideoItem.cpp
    
        # UI components
        src/ui/Avatar.cpp
        src/ui/Badge.cpp
        src/ui/LoadingIndicator.cpp
        src/ui/InfoMessage.cpp
        src/ui/FlatButton.cpp
        src/ui/FloatingButton.cpp
        src/ui/Label.cpp
        src/ui/OverlayModal.cpp
        src/ui/SnackBar.cpp
        src/ui/RaisedButton.cpp
        src/ui/Ripple.cpp
        src/ui/RippleOverlay.cpp
        src/ui/OverlayWidget.cpp
        src/ui/TextField.cpp
        src/ui/TextLabel.cpp
        src/ui/ToggleButton.cpp
        src/ui/Theme.cpp
        src/ui/ThemeManager.cpp
    
        src/AvatarProvider.cpp
        src/Cache.cpp
        src/ChatPage.cpp
        src/CommunitiesListItem.cpp
        src/CommunitiesList.cpp
        src/InviteeItem.cpp
        src/LoginPage.cpp
        src/Logging.cpp
        src/MainWindow.cpp
        src/MatrixClient.cpp
        src/QuickSwitcher.cpp
        src/Olm.cpp
        src/RegisterPage.cpp
        src/RoomInfoListItem.cpp
        src/RoomList.cpp
        src/RunGuard.cpp
        src/SideBarActions.cpp
        src/Splitter.cpp
        src/SuggestionsPopup.cpp
        src/TextInputWidget.cpp
        src/TopRoomBar.cpp
        src/TrayIcon.cpp
        src/TypingDisplay.cpp
        src/Utils.cpp
        src/UserInfoWidget.cpp
        src/UserSettingsPage.cpp
        src/WelcomePage.cpp
        src/main.cpp
    )
    
    # ExternalProject dependencies
    set(EXTERNAL_PROJECT_DEPS "")
    
    set(Boost_USE_STATIC_LIBS OFF)
    set(Boost_USE_STATIC_RUNTIME OFF)
    set(Boost_USE_MULTITHREADED ON)
    find_package(Boost 1.66 REQUIRED
                 COMPONENTS atomic
                            chrono
                            date_time
                            iostreams
                            random
                            regex
                            system
                            thread)
    find_package(ZLIB REQUIRED)
    find_package(OpenSSL REQUIRED)
    find_package(MatrixClient 0.1.0 REQUIRED)
    find_package(Olm 2 REQUIRED)
    find_package(spdlog 1.0.0 CONFIG REQUIRED)
    find_package(cmark REQUIRED)
    
    if(NOT LMDBXX_INCLUDE_DIR)
        find_path(LMDBXX_INCLUDE_DIR
                NAMES lmdb++.h
                PATHS /usr/include
                      /usr/local/include
                      $ENV{LIB_DIR}/include
                      $ENV{LIB_DIR}/include/lmdbxx)
    endif()
    include_directories(SYSTEM ${LMDBXX_INCLUDE_DIR})
    
    if(NOT TWEENY_INCLUDE_DIR)
        find_path(TWEENY_INCLUDE_DIR
                NAMES tweeny/tweeny.h
                PATHS /usr/include/
                      /usr/local/include/
                      $ENV{LIB_DIR}/include/
                      $ENV{LIB_DIR}/include/tweeny)
    endif()
    include_directories(SYSTEM ${TWEENY_INCLUDE_DIR})
    
    include_directories(${CMAKE_SOURCE_DIR}/src)
    include_directories(${Boost_INCLUDE_DIRS})
    
    # local inclue directory
    include_directories(includes)
    
    qt5_wrap_cpp(MOC_HEADERS
        # Dialogs
        src/dialogs/CreateRoom.h
        src/dialogs/ImageOverlay.h
        src/dialogs/PreviewUploadOverlay.h
        src/dialogs/InviteUsers.h
        src/dialogs/JoinRoom.h
        src/dialogs/MemberList.h
        src/dialogs/LeaveRoom.h
        src/dialogs/Logout.h
        src/dialogs/UserProfile.h
        src/dialogs/RawMessage.h
        src/dialogs/ReadReceipts.h
        src/dialogs/ReCaptcha.h
        src/dialogs/RoomSettings.h
    
        # Timeline
        src/timeline/TimelineItem.h
        src/timeline/TimelineView.h
        src/timeline/TimelineViewManager.h
        src/timeline/widgets/AudioItem.h
        src/timeline/widgets/FileItem.h
        src/timeline/widgets/ImageItem.h
        src/timeline/widgets/VideoItem.h
    
        # UI components
        src/ui/Avatar.h
        src/ui/Badge.h
        src/ui/LoadingIndicator.h
        src/ui/InfoMessage.h
        src/ui/FlatButton.h
        src/ui/Label.h
        src/ui/FloatingButton.h
        src/ui/Menu.h
        src/ui/OverlayWidget.h
        src/ui/SnackBar.h
        src/ui/RaisedButton.h
        src/ui/Ripple.h
        src/ui/RippleOverlay.h
        src/ui/TextField.h
        src/ui/TextLabel.h
        src/ui/ToggleButton.h
        src/ui/Theme.h
        src/ui/ThemeManager.h
    
        src/notifications/Manager.h
    
        src/AvatarProvider.h
        src/Cache.h
        src/ChatPage.h
        src/CommunitiesListItem.h
        src/CommunitiesList.h
        src/LoginPage.h
        src/MainWindow.h
        src/MatrixClient.h
        src/InviteeItem.h
        src/QuickSwitcher.h
        src/RegisterPage.h
        src/RoomInfoListItem.h
        src/RoomList.h
        src/SideBarActions.h
        src/Splitter.h
        src/SuggestionsPopup.h
        src/TextInputWidget.h
        src/TopRoomBar.h
        src/TrayIcon.h
        src/TypingDisplay.h
        src/UserInfoWidget.h
        src/UserSettingsPage.h
        src/WelcomePage.h
    )
    
    #
    # Bundle translations.
    #
    include(Translations)
    set(TRANSLATION_DEPS ${LANG_QRC} ${QRC} ${QM_SRC})
    
    set(COMMON_LIBS
        MatrixClient::MatrixClient
        ${Boost_LIBRARIES}
        cmark::cmark
        Qt5::Widgets
        Qt5::Svg
        Qt5::Concurrent
        Qt5::Multimedia)
    
    if(APPVEYOR_BUILD)
        set(NHEKO_LIBS ${COMMON_LIBS} lmdb)
    else()
        set(NHEKO_LIBS ${COMMON_LIBS} ${LMDB_LIBRARY})
    endif()
    
    if (APPLE)
        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework Foundation -framework Cocoa")
        set(SRC_FILES ${SRC_FILES} src/notifications/ManagerMac.mm src/emoji/MacHelper.mm)
    elseif (WIN32)
        file(DOWNLOAD
             "https://raw.githubusercontent.com/mohabouje/WinToast/41ed1c58d5dce0ee9c01dbdeac05be45358d4f57/src/wintoastlib.cpp"
             ${PROJECT_SOURCE_DIR}/src/wintoastlib.cpp
             EXPECTED_HASH SHA256=1A1A7CE41C1052B12946798F4A6C67CE1FAD209C967F5ED4D720B173527E2073)
    
        file(DOWNLOAD
             "https://raw.githubusercontent.com/mohabouje/WinToast/41ed1c58d5dce0ee9c01dbdeac05be45358d4f57/src/wintoastlib.h"
             ${PROJECT_SOURCE_DIR}/src/wintoastlib.h
             EXPECTED_HASH SHA256=b4481023c5782733795838be22bf1a75f45d87458cd4d9a5a75f664a146eea11)
    
        set(SRC_FILES ${SRC_FILES} src/notifications/ManagerWin.cpp src/wintoastlib.cpp)
    else ()
        set(SRC_FILES ${SRC_FILES} src/notifications/ManagerLinux.cpp)
    endif ()
    
    set(NHEKO_DEPS
        ${SRC_FILES}
        ${UI_HEADERS}
        ${MOC_HEADERS}
        ${TRANSLATION_DEPS}
        ${META_FILES_TO_INCLUDE})
    
    if(ASAN)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address,undefined")
    endif()
    
    if(APPLE)
        add_executable (nheko ${OS_BUNDLE} ${NHEKO_DEPS})
        target_link_libraries (nheko ${NHEKO_LIBS} Qt5::MacExtras)
    elseif(WIN32)
        add_executable (nheko ${OS_BUNDLE} ${ICON_FILE} ${NHEKO_DEPS})
        target_link_libraries (nheko ${NTDLIB} ${NHEKO_LIBS} Qt5::WinMain)
    else()
        add_executable (nheko ${OS_BUNDLE} ${NHEKO_DEPS})
        target_link_libraries (nheko ${NHEKO_LIBS} Qt5::DBus)
    endif()
    
    if(EXTERNAL_PROJECT_DEPS)
        add_dependencies(nheko ${EXTERNAL_PROJECT_DEPS})
    endif()
    
    if(UNIX AND NOT APPLE)
        install (TARGETS nheko RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
        install (FILES "resources/nheko-16.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/16x16/apps" RENAME "nheko.png")
        install (FILES "resources/nheko-32.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/32x32/apps" RENAME "nheko.png")
        install (FILES "resources/nheko-48.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/48x48/apps" RENAME "nheko.png")
        install (FILES "resources/nheko-64.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/64x64/apps" RENAME "nheko.png")
        install (FILES "resources/nheko-128.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps" RENAME "nheko.png")
        install (FILES "resources/nheko-256.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256/apps" RENAME "nheko.png")
        install (FILES "resources/nheko-512.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/512x512/apps" RENAME "nheko.png")
        install (FILES "resources/nheko.desktop" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications")
        install (FILES "resources/nheko.appdata.xml" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/metainfo")
    
        if(NOT TARGET uninstall)
            configure_file(
    	    "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
                "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
                IMMEDIATE @ONLY)
            add_custom_target(uninstall
                COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
        endif()
    endif()