cmake_minimum_required(VERSION 3.3) list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) include(ComputeVersion) if (NOT VERSION_FOUND) project(Dino LANGUAGES C CXX) elseif (VERSION_IS_RELEASE) project(Dino VERSION ${VERSION_FULL} LANGUAGES C CXX) else () project(Dino LANGUAGES C CXX) set(PROJECT_VERSION ${VERSION_FULL}) endif () include(CTest) option(PLUGIN_RTP_WEBRTC_AUDIO_PROCESSING "Use WebRTC audio processing" ON) # https://gitlab.kitware.com/cmake/cmake/-/issues/19804 if (WIN32) list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES .dll) endif() # Prepare Plugins set(DEFAULT_PLUGINS omemo;openpgp;http-files;ice;rtp) if (WIN32) list(APPEND DEFAULT_PLUGINS win32-fonts windows-notification) else() list(APPEND DEFAULT_PLUGINS phone-ringer) endif() foreach (plugin ${DEFAULT_PLUGINS}) if ("$CACHE{DINO_PLUGIN_ENABLED_${plugin}}" STREQUAL "") if (NOT DEFINED DINO_PLUGIN_ENABLED_${plugin}}) set(DINO_PLUGIN_ENABLED_${plugin} "yes" CACHE BOOL "Enable plugin ${plugin}") else () set(DINO_PLUGIN_ENABLED_${plugin} "${DINO_PLUGIN_ENABLED_${plugin}}" CACHE BOOL "Enable plugin ${plugin}" FORCE) endif () if (DINO_PLUGIN_ENABLED_${plugin}) message(STATUS "Enabled plugin: ${plugin}") else () message(STATUS "Disabled plugin: ${plugin}") endif () endif () endforeach (plugin) if (DISABLED_PLUGINS) foreach(plugin ${DISABLED_PLUGINS}) set(DINO_PLUGIN_ENABLED_${plugin} "no" CACHE BOOL "Enable plugin ${plugin}" FORCE) message(STATUS "Disabled plugin: ${plugin}") endforeach(plugin) endif (DISABLED_PLUGINS) if (ENABLED_PLUGINS) foreach(plugin ${ENABLED_PLUGINS}) set(DINO_PLUGIN_ENABLED_${plugin} "yes" CACHE BOOL "Enable plugin ${plugin}" FORCE) message(STATUS "Enabled plugin: ${plugin}") endforeach(plugin) endif (ENABLED_PLUGINS) set(PLUGINS "") get_cmake_property(all_variables VARIABLES) foreach (variable_name ${all_variables}) if (variable_name MATCHES "^DINO_PLUGIN_ENABLED_(.+)$" AND ${variable_name}) list(APPEND PLUGINS ${CMAKE_MATCH_1}) endif() endforeach () list(SORT PLUGINS) string(REPLACE ";" ", " PLUGINS_TEXT "${PLUGINS}") message(STATUS "Configuring Dino ${PROJECT_VERSION} with plugins: ${PLUGINS_TEXT}") # Prepare instal paths macro(set_path what val desc) if (NOT ${what}) unset(${what} CACHE) set(${what} ${val}) endif () if (NOT "${${what}}" STREQUAL "${_${what}_SET}") message(STATUS "${desc}: ${${what}}") set(_${what}_SET ${${what}} CACHE INTERNAL ${desc}) endif() endmacro(set_path) string(REGEX REPLACE "^liblib" "lib" LIBDIR_NAME "lib${LIB_SUFFIX}") set_path(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" "Installation directory for architecture-independent files") set_path(EXEC_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" "Installation directory for architecture-dependent files") set_path(SHARE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/share" "Installation directory for read-only architecture-independent data") set_path(BIN_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/bin" "Installation directory for user executables") set_path(DATA_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/dino" "Installation directory for dino-specific data") set_path(APPDATA_FILE_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/metainfo" "Installation directory for .appdata.xml files") set_path(DESKTOP_FILE_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/applications" "Installation directory for .desktop files") set_path(SERVICE_FILE_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/dbus-1/services" "Installation directory for .service files") set_path(ICON_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/icons" "Installation directory for icons") set_path(INCLUDE_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/include" "Installation directory for C header files") set_path(LIB_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/${LIBDIR_NAME}" "Installation directory for object code libraries") set_path(LOCALE_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/locale" "Installation directory for locale files") set_path(PLUGIN_INSTALL_DIR "${LIB_INSTALL_DIR}/dino/plugins" "Installation directory for dino plugin object code files") set_path(VAPI_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/vala/vapi" "Installation directory for Vala API files") set(TARGET_INSTALL LIBRARY DESTINATION ${LIB_INSTALL_DIR} RUNTIME DESTINATION ${BIN_INSTALL_DIR} PUBLIC_HEADER DESTINATION ${INCLUDE_INSTALL_DIR} ARCHIVE DESTINATION ${LIB_INSTALL_DIR}) set(PLUGIN_INSTALL LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR} RUNTIME DESTINATION ${PLUGIN_INSTALL_DIR}) include(CheckCCompilerFlag) include(CheckCSourceCompiles) macro(AddCFlagIfSupported list flag) string(REGEX REPLACE "[^a-z^A-Z^_^0-9]+" "_" flag_name ${flag}) check_c_compiler_flag(${flag} COMPILER_SUPPORTS${flag_name}) if (${COMPILER_SUPPORTS${flag_name}}) set(${list} "${${list}} ${flag}") endif () endmacro() if ("Ninja" STREQUAL ${CMAKE_GENERATOR}) AddCFlagIfSupported(CMAKE_C_FLAGS -fdiagnostics-color) endif () # Flags for all C files AddCFlagIfSupported(CMAKE_C_FLAGS -Wall) AddCFlagIfSupported(CMAKE_C_FLAGS -Wextra) AddCFlagIfSupported(CMAKE_C_FLAGS -Werror=format-security) AddCFlagIfSupported(CMAKE_C_FLAGS -Wno-duplicate-decl-specifier) AddCFlagIfSupported(CMAKE_C_FLAGS -fno-omit-frame-pointer) if (NOT VALA_WARN) set(VALA_WARN "conversion") endif () set(VALA_WARN "${VALA_WARN}" CACHE STRING "Which warnings to show when invoking C compiler on Vala compiler output") set_property(CACHE VALA_WARN PROPERTY STRINGS "all;unused;qualifier;conversion;deprecated;format;none") # Vala generates some unused stuff if (NOT ("all" IN_LIST VALA_WARN OR "unused" IN_LIST VALA_WARN)) AddCFlagIfSupported(VALA_CFLAGS -Wno-unused-but-set-variable) AddCFlagIfSupported(VALA_CFLAGS -Wno-unused-function) AddCFlagIfSupported(VALA_CFLAGS -Wno-unused-label) AddCFlagIfSupported(VALA_CFLAGS -Wno-unused-parameter) AddCFlagIfSupported(VALA_CFLAGS -Wno-unused-value) AddCFlagIfSupported(VALA_CFLAGS -Wno-unused-variable) endif () if (NOT ("all" IN_LIST VALA_WARN OR "qualifier" IN_LIST VALA_WARN)) AddCFlagIfSupported(VALA_CFLAGS -Wno-discarded-qualifiers) AddCFlagIfSupported(VALA_CFLAGS -Wno-discarded-array-qualifiers) AddCFlagIfSupported(VALA_CFLAGS -Wno-incompatible-pointer-types-discards-qualifiers) endif () if (NOT ("all" IN_LIST VALA_WARN OR "deprecated" IN_LIST VALA_WARN)) AddCFlagIfSupported(VALA_CFLAGS -Wno-deprecated-declarations) endif () if (NOT ("all" IN_LIST VALA_WARN OR "format" IN_LIST VALA_WARN)) AddCFlagIfSupported(VALA_CFLAGS -Wno-missing-braces) endif () if (NOT ("all" IN_LIST VALA_WARN OR "conversion" IN_LIST VALA_WARN)) AddCFlagIfSupported(VALA_CFLAGS -Wno-int-conversion) AddCFlagIfSupported(VALA_CFLAGS -Wno-pointer-sign) AddCFlagIfSupported(VALA_CFLAGS -Wno-incompatible-pointer-types) endif () try_compile(__WITHOUT_FILE_OFFSET_BITS_64 ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/cmake/LargeFileOffsets.c COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}) if (NOT __WITHOUT_FILE_OFFSET_BITS_64) try_compile(__WITH_FILE_OFFSET_BITS_64 ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/cmake/LargeFileOffsets.c COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -D_FILE_OFFSET_BITS=64) if (__WITH_FILE_OFFSET_BITS_64) AddCFlagIfSupported(CMAKE_C_FLAGS -D_FILE_OFFSET_BITS=64) message(STATUS "Enabled large file support using _FILE_OFFSET_BITS=64") else (__WITH_FILE_OFFSET_BITS_64) message(STATUS "Large file support not available") endif (__WITH_FILE_OFFSET_BITS_64) unset(__WITH_FILE_OFFSET_BITS_64) endif (NOT __WITHOUT_FILE_OFFSET_BITS_64) unset(__WITHOUT_FILE_OFFSET_BITS_64) if ($ENV{USE_CCACHE}) # Configure CCache if available find_program(CCACHE_BIN ccache) mark_as_advanced(CCACHE_BIN) if (CCACHE_BIN) message(STATUS "Using ccache") set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_BIN}) set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE_BIN}) else (CCACHE_BIN) message(STATUS "USE_CCACHE was set but ccache was not found") endif (CCACHE_BIN) endif ($ENV{USE_CCACHE}) if (NOT NO_DEBUG) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g") set(CMAKE_VALA_FLAGS "${CMAKE_VALA_FLAGS} -g") endif (NOT NO_DEBUG) if (WIN32) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_POSIX_C_SOURCE=1") set(CMAKE_VALA_FLAGS "${CMAKE_VALA_FLAGS} --define=_WIN32") endif(WIN32) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set(GLib_GLOBAL_VERSION 2.38) set(ICU_GLOBAL_VERSION 57) if (NOT VALA_EXECUTABLE) unset(VALA_EXECUTABLE CACHE) endif () find_package(Vala 0.34 REQUIRED) if (VALA_VERSION VERSION_GREATER "0.34.90" AND VALA_VERSION VERSION_LESS "0.36.1" OR # Due to a bug on 0.36.0 (and pre-releases), we need to disable FAST_VAPI VALA_VERSION VERSION_EQUAL "0.44.10" OR VALA_VERSION VERSION_EQUAL "0.46.4" OR VALA_VERSION VERSION_EQUAL "0.47.1" OR # See Dino issue #646 VALA_VERSION VERSION_EQUAL "0.40.21" OR VALA_VERSION VERSION_EQUAL "0.46.8" OR VALA_VERSION VERSION_EQUAL "0.48.4") # See Dino issue #816 set(DISABLE_FAST_VAPI yes) endif () include(${VALA_USE_FILE}) include(MultiFind) include(GlibCompileResourcesSupport) find_package(GLib ${GLib_GLOBAL_VERSION} REQUIRED) string(REGEX REPLACE "^([0-9]+)\\.[0-9]+(\\.[0-9]+)?" "\\1" GLib_MAJOR_VERSION "${GLib_VERSION}") string(REGEX REPLACE "^[0-9]+\\.([0-9]+)(\\.[0-9]+)?" "\\1" GLib_MINOR_VERSION "${GLib_VERSION}") math(EXPR GLib_LAST_RELEASE_MINOR_VERSION "${GLib_MINOR_VERSION} / 2 * 2") set(CMAKE_VALA_FLAGS "${CMAKE_VALA_FLAGS} --target-glib=${GLib_MAJOR_VERSION}.${GLib_LAST_RELEASE_MINOR_VERSION}") add_subdirectory(qlite) add_subdirectory(xmpp-vala) add_subdirectory(libdino) add_subdirectory(main) add_subdirectory(crypto-vala) add_subdirectory(plugins) # To generate a DEB package include(Packing) # uninstall target configure_file("${CMAKE_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" "${CMAKE_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/cmake_uninstall.cmake COMMENT "Uninstall the project...")