aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Tari <robert@tari.in>2021-10-15 00:28:09 +0200
committerMike Gabriel <mike.gabriel@das-netzwerkteam.de>2021-10-21 21:55:54 +0200
commit813ad9093f7d7d7a37af255bbe676b9988502b60 (patch)
tree7241ba9efb24254851a20c88274f225ce2d86e00
parent8ce6d07d97690e50d4da24441232b053a0eade1e (diff)
downloadayatana-indicator-messages-813ad9093f7d7d7a37af255bbe676b9988502b60.tar.gz
ayatana-indicator-messages-813ad9093f7d7d7a37af255bbe676b9988502b60.tar.bz2
ayatana-indicator-messages-813ad9093f7d7d7a37af255bbe676b9988502b60.zip
Add CMake files
-rw-r--r--CMakeLists.txt97
-rw-r--r--cmake/FindGObjectIntrospection.cmake61
-rw-r--r--cmake/FindVala.cmake57
-rw-r--r--cmake/GdbusCodegen.cmake36
-rw-r--r--data/CMakeLists.txt40
-rw-r--r--doc/CMakeLists.txt1
-rw-r--r--doc/reference/CMakeLists.txt206
-rw-r--r--libmessaging-menu/CMakeLists.txt106
-rw-r--r--po/CMakeLists.txt2
-rw-r--r--src/CMakeLists.txt50
-rw-r--r--tests/CMakeLists.txt78
11 files changed, 734 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..1e73a3b
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,97 @@
+project(ayatana-indicator-messages C CXX)
+cmake_minimum_required(VERSION 3.13)
+list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
+
+# Globals
+
+set(PROJECT_VERSION "0.9.0")
+set(PACKAGE ${CMAKE_PROJECT_NAME})
+set(GETTEXT_PACKAGE ${CMAKE_PROJECT_NAME})
+
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+ SET(CMAKE_INSTALL_PREFIX "/usr" CACHE PATH "..." FORCE)
+endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+
+if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+ set(COMPILE_FLAGS "${COMPILE_FLAGS} -Weverything")
+ set(COMPILE_FLAGS "${COMPILE_FLAGS} -Wno-c++98-compat -Wno-padded")
+ set(COMPILE_FLAGS "${COMPILE_FLAGS} -Wno-documentation")
+else()
+ set(COMPILE_FLAGS "${COMPILE_FLAGS} -Wall")
+endif()
+
+# Options
+
+option(ENABLE_TESTS "Enable all tests and checks" OFF)
+option(ENABLE_COVERAGE "Enable coverage reports (includes enabling all tests and checks)" OFF)
+option(ENABLE_WERROR "Treat all build warnings as errors" OFF)
+
+if(ENABLE_COVERAGE)
+ set(ENABLE_TESTS ON)
+ set(CMAKE_BUILD_TYPE "Coverage")
+else()
+ set(CMAKE_BUILD_TYPE "Release")
+endif()
+
+if(ENABLE_WERROR)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
+endif()
+
+# Check for prerequisites
+
+include (GNUInstallDirs)
+find_package(PkgConfig REQUIRED)
+include(FindPkgConfig)
+
+pkg_check_modules(
+ PROJECT_DEPS
+ REQUIRED
+ glib-2.0>=2.36
+ gio-unix-2.0>=2.36
+ accountsservice
+)
+
+# Cppcheck
+
+add_custom_target(
+ cppcheck
+ COMMAND
+ cppcheck
+ --enable=all
+ -q
+ --error-exitcode=2
+ --inline-suppr
+ ${CMAKE_SOURCE_DIR}/src
+ ${CMAKE_SOURCE_DIR}/tests
+)
+
+# Build
+
+add_subdirectory(src)
+add_subdirectory(libmessaging-menu)
+add_subdirectory(data)
+add_subdirectory(po)
+add_subdirectory(doc)
+
+# Testing and coverage
+
+if (ENABLE_TESTS)
+ include(CTest)
+ enable_testing()
+ add_subdirectory(tests)
+ if (ENABLE_COVERAGE)
+ find_package(CoverageReport)
+ ENABLE_COVERAGE_REPORT(
+ TARGETS "messaging-menu" "indicator-messages-service"
+ TESTS ${COVERAGE_TEST_TARGETS}
+ FILTER /usr/include ${CMAKE_BINARY_DIR}/*
+ )
+ endif ()
+endif ()
+
+# Display config info
+
+message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}")
+message(STATUS "Unit tests: ${ENABLE_TESTS}")
+message(STATUS "Build with -Werror: ${ENABLE_WERROR}")
diff --git a/cmake/FindGObjectIntrospection.cmake b/cmake/FindGObjectIntrospection.cmake
new file mode 100644
index 0000000..2073c3c
--- /dev/null
+++ b/cmake/FindGObjectIntrospection.cmake
@@ -0,0 +1,61 @@
+# - try to find gobject-introspection
+#
+# Once done this will define
+#
+# INTROSPECTION_FOUND - system has gobject-introspection
+# INTROSPECTION_SCANNER - the gobject-introspection scanner, g-ir-scanner
+# INTROSPECTION_COMPILER - the gobject-introspection compiler, g-ir-compiler
+# INTROSPECTION_GENERATE - the gobject-introspection generate, g-ir-generate
+# INTROSPECTION_GIRDIR
+# INTROSPECTION_TYPELIBDIR
+# INTROSPECTION_CFLAGS
+# INTROSPECTION_LIBS
+#
+# Copyright (C) 2010, Pino Toscano, <pino@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+macro(_GIR_GET_PKGCONFIG_VAR _outvar _varname)
+ execute_process(
+ COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=${_varname} gobject-introspection-1.0
+ OUTPUT_VARIABLE _result
+ RESULT_VARIABLE _null
+ )
+
+ if (_null)
+ else()
+ string(REGEX REPLACE "[\r\n]" " " _result "${_result}")
+ string(REGEX REPLACE " +$" "" _result "${_result}")
+ separate_arguments(_result)
+ set(${_outvar} ${_result} CACHE INTERNAL "")
+ endif()
+endmacro(_GIR_GET_PKGCONFIG_VAR)
+
+find_package(PkgConfig)
+if(PKG_CONFIG_FOUND)
+ if(PACKAGE_FIND_VERSION_COUNT GREATER 0)
+ set(_gir_version_cmp ">=${PACKAGE_FIND_VERSION}")
+ endif()
+ pkg_check_modules(_pc_gir gobject-introspection-1.0${_gir_version_cmp})
+ if(_pc_gir_FOUND)
+ set(INTROSPECTION_FOUND TRUE)
+ _gir_get_pkgconfig_var(INTROSPECTION_SCANNER "g_ir_scanner")
+ _gir_get_pkgconfig_var(INTROSPECTION_COMPILER "g_ir_compiler")
+ _gir_get_pkgconfig_var(INTROSPECTION_GENERATE "g_ir_generate")
+ _gir_get_pkgconfig_var(INTROSPECTION_GIRDIR "girdir")
+ _gir_get_pkgconfig_var(INTROSPECTION_TYPELIBDIR "typelibdir")
+ set(INTROSPECTION_CFLAGS "${_pc_gir_CFLAGS}")
+ set(INTROSPECTION_LIBS "${_pc_gir_LIBS}")
+ endif()
+endif()
+
+mark_as_advanced(
+ INTROSPECTION_SCANNER
+ INTROSPECTION_COMPILER
+ INTROSPECTION_GENERATE
+ INTROSPECTION_GIRDIR
+ INTROSPECTION_TYPELIBDIR
+ INTROSPECTION_CFLAGS
+ INTROSPECTION_LIBS
+)
diff --git a/cmake/FindVala.cmake b/cmake/FindVala.cmake
new file mode 100644
index 0000000..a638735
--- /dev/null
+++ b/cmake/FindVala.cmake
@@ -0,0 +1,57 @@
+# - Find Vala
+# This module looks for valac.
+# This module defines the following values:
+# VALA_FOUND
+# VALA_COMPILER
+# VALA_VERSION
+# VAPI_GEN
+# VAPI_GEN_VERSION
+
+#=============================================================================
+# Copyright Přemysl Janouch 2011
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+# OF SUCH DAMAGE.
+#=============================================================================
+
+find_program (VALA_COMPILER "valac")
+
+if (VALA_COMPILER)
+ execute_process (COMMAND ${VALA_COMPILER} --version
+ OUTPUT_VARIABLE VALA_VERSION)
+ string (REGEX MATCH "[.0-9]+" VALA_VERSION "${VALA_VERSION}")
+endif (VALA_COMPILER)
+
+find_program (VAPI_GEN "vapigen")
+
+if (VAPI_GEN)
+ execute_process (COMMAND ${VAPI_GEN} --version
+ OUTPUT_VARIABLE VAPI_GEN_VERSION)
+ string (REGEX MATCH "[.0-9]+" VAPI_GEN_VERSION "${VAPI_GEN_VERSION}")
+endif (VAPI_GEN)
+
+include (FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS (Vala
+ REQUIRED_VARS VALA_COMPILER
+ VERSION_VAR VALA_VERSION)
+
+mark_as_advanced (VALA_COMPILER VALA_VERSION VAPI_GEN)
+
diff --git a/cmake/GdbusCodegen.cmake b/cmake/GdbusCodegen.cmake
new file mode 100644
index 0000000..5261ba8
--- /dev/null
+++ b/cmake/GdbusCodegen.cmake
@@ -0,0 +1,36 @@
+cmake_minimum_required(VERSION 3.13)
+if(POLICY CMP0011)
+ cmake_policy(SET CMP0011 NEW)
+endif(POLICY CMP0011)
+
+find_program(GDBUS_CODEGEN NAMES gdbus-codegen DOC "gdbus-codegen executable")
+if(NOT GDBUS_CODEGEN)
+ message(FATAL_ERROR "Excutable gdbus-codegen not found")
+endif()
+
+macro(add_gdbus_codegen outfiles name prefix service_xml)
+ add_custom_command(
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${name}.h" "${CMAKE_CURRENT_BINARY_DIR}/${name}.c"
+ COMMAND "${GDBUS_CODEGEN}"
+ --interface-prefix "${prefix}"
+ --generate-c-code "${name}"
+ "${service_xml}"
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ DEPENDS ${ARGN} "${service_xml}"
+ )
+ list(APPEND ${outfiles} "${CMAKE_CURRENT_BINARY_DIR}/${name}.c")
+endmacro(add_gdbus_codegen)
+
+macro(add_gdbus_codegen_with_namespace outfiles name prefix namespace service_xml)
+ add_custom_command(
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${name}.h" "${CMAKE_CURRENT_BINARY_DIR}/${name}.c"
+ COMMAND "${GDBUS_CODEGEN}"
+ --interface-prefix "${prefix}"
+ --generate-c-code "${name}"
+ --c-namespace "${namespace}"
+ "${service_xml}"
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ DEPENDS ${ARGN} "${service_xml}"
+ )
+ list(APPEND ${outfiles} "${CMAKE_CURRENT_BINARY_DIR}/${name}.c")
+endmacro(add_gdbus_codegen_with_namespace)
diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt
new file mode 100644
index 0000000..03fba70
--- /dev/null
+++ b/data/CMakeLists.txt
@@ -0,0 +1,40 @@
+# org.ayatana.indicator.session.gschema.xml
+
+find_package(GSettings)
+set(GSETTINGS_COMPILE ON)
+add_schema("org.ayatana.indicator.messages.gschema.xml")
+
+# ayatana-indicator-messages.service
+
+pkg_check_modules(SYSTEMD systemd)
+
+if (${SYSTEMD_FOUND})
+ pkg_get_variable(SYSTEMD_USER_DIR systemd systemduserunitdir)
+ set (pkglibexecdir "${CMAKE_INSTALL_FULL_LIBEXECDIR}/ayatana-indicator-messages")# Rewrite and drop once we've switched to CMake
+ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/ayatana-indicator-messages.service.in" "${CMAKE_CURRENT_BINARY_DIR}/ayatana-indicator-messages.service")
+ install(FILES "${CMAKE_CURRENT_BINARY_DIR}/ayatana-indicator-messages.service" DESTINATION "${SYSTEMD_USER_DIR}")
+endif()
+
+# ayatana-indicator-messages.desktop
+
+set(pkglibexecdir "${CMAKE_INSTALL_FULL_LIBEXECDIR}/ayatana-indicator-messages")# Rewrite and drop once we've switched to CMake
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/ayatana-indicator-messages.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/ayatana-indicator-messages.desktop")
+install(FILES "${CMAKE_CURRENT_BINARY_DIR}/ayatana-indicator-messages.desktop" DESTINATION "${CMAKE_INSTALL_FULL_SYSCONFDIR}/xdg/autostart")
+
+# org.ayatana.indicator.messages
+
+install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/org.ayatana.indicator.messages" DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/ayatana/indicators")
+
+# icons/*
+
+install(
+ DIRECTORY
+ icons/16x16
+ icons/22x22
+ icons/24x24
+ icons/32x32
+ icons/48x48
+ icons/scalable
+ DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/icons/hicolor"
+ FILES_MATCHING PATTERN "*.png" PATTERN "*.svg"
+)
diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt
new file mode 100644
index 0000000..90bb2b5
--- /dev/null
+++ b/doc/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory(reference)
diff --git a/doc/reference/CMakeLists.txt b/doc/reference/CMakeLists.txt
new file mode 100644
index 0000000..4688d41
--- /dev/null
+++ b/doc/reference/CMakeLists.txt
@@ -0,0 +1,206 @@
+# messaging-menu-docs.xml
+
+set(PACKAGE_VERSION ${PROJECT_VERSION})# Rewrite and drop once we've switched to CMake
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/messaging-menu-docs.xml.in" "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu-docs.xml" @ONLY)
+
+# messaging-menu-decl.txt
+# messaging-menu-decl-list.txt
+# messaging-menu-overrides.txt
+# messaging-menu-sections.txt
+# messaging-menu.types
+
+find_program(GTKDOC_SCAN gtkdoc-scan)
+
+add_custom_command(
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu-decl.txt"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu-decl-list.txt"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu-overrides.txt"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu-sections.txt"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu.types"
+ DEPENDS "messaging-menu"
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND
+ ${GTKDOC_SCAN}
+ --module=messaging-menu
+ --source-dir="${CMAKE_SOURCE_DIR}/libmessaging-menu"
+)
+
+# scangobj.sh
+
+list(JOIN PROJECT_DEPS_INCLUDE_DIRS " -I" GTKDOC_SCANGOBJ_INCLUDE_DIRS)
+list(JOIN PROJECT_DEPS_LIBRARIES " -l" GTKDOC_SCANGOBJ_LIBRARIES)
+set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/scangobj.sh" GENERATED)
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/scangobj.sh" "LD_LIBRARY_PATH=\"$LD_LIBRARY_PATH:${CMAKE_BINARY_DIR}/libmessaging-menu\" CFLAGS=\"-I${GTKDOC_SCANGOBJ_INCLUDE_DIRS}\" LDFLAGS=\"-l${GTKDOC_SCANGOBJ_LIBRARIES} -L${CMAKE_BINARY_DIR}/libmessaging-menu -lmessaging-menu\" gtkdoc-scangobj --module=messaging-menu")
+
+# messaging-menu.actions"
+# messaging-menu.args"
+# messaging-menu.hierarchy"
+# messaging-menu.interfaces"
+# messaging-menu.prerequisites"
+# messaging-menu.signals"
+
+add_custom_command(
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu.actions"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu.args"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu.hierarchy"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu.interfaces"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu.prerequisites"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu.signals"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu-decl.txt"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu-decl-list.txt"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu-overrides.txt"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu-sections.txt"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu.types"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/scangobj.sh"
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND sh scangobj.sh
+)
+
+# messaging-menu-undeclared.txt
+# messaging-menu-undocumented.txt
+# messaging-menu-unused.txt
+# sgml.stamp
+# xml/annotation-glossary.xml
+# xml/api-index-deprecated.xml
+# xml/api-index-full.xml
+# xml/messaging-menu-app.xml
+# xml/messaging-menu-doc.bottom
+# xml/messaging-menu-doc.top
+# xml/messaging-menu-message.xml
+# xml/object_index.sgml
+# xml/tree_index.sgml
+
+find_program(GTKDOC_MKDB gtkdoc-mkdb)
+list(JOIN PROJECT_DEPS_INCLUDE_DIRS ";-I" GTKDOC_SCANGOBJ_INCLUDE_DIRS)
+list(JOIN PROJECT_DEPS_LIBRARIES ";-l" GTKDOC_SCANGOBJ_LIBRARIES)
+
+add_custom_command(
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu-undeclared.txt"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu-undocumented.txt"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu-unused.txt"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/xml/annotation-glossary.xml"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/xml/api-index-deprecated.xml"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/xml/api-index-full.xml"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/xml/messaging-menu-app.xml"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/xml/messaging-menu-doc.bottom"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/xml/messaging-menu-doc.top"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/xml/xml/messaging-menu-message.xml"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/xml/object_index.sgml"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/xml/tree_index.sgml"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu.actions"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu.args"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu.hierarchy"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu.interfaces"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu.prerequisites"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu.signals"
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND
+ ${GTKDOC_MKDB}
+ --module=messaging-menu
+ --output-format=xml
+ --expand-content-files=""
+ --main-sgml-file=messaging-menu-docs.xml
+ --source-dir="${CMAKE_SOURCE_DIR}/libmessaging-menu"
+ --xml-mode
+)
+
+# html
+
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/html")
+
+# html/annotation-glossary.html
+# html/api-index-full.html
+# html/ch01.html
+# html/home.png
+# html/index.html
+# html/left.png
+# html/left-insensitive.png
+# html/messaging-menu.devhelp2
+# html/MessagingMenuApp.html
+# html/MessagingMenuMessage.html
+# html/object-tree.html
+# html/right.png
+# html/right-insensitive.png
+# html/style.css
+# html/up.png
+# html/up-insensitive.png
+
+find_program(GTKDOC_MKHTML gtkdoc-mkhtml)
+
+add_custom_command(
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/html/annotation-glossary.html"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/html/api-index-full.html"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/html/ch01.html"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/html/home.png"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/html/index.html"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/html/left.png"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/html/left-insensitive.png"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/html/messaging-menu.devhelp2"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/html/MessagingMenuApp.html"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/html/MessagingMenuMessage.html"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/html/object-tree.html"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/html/right.png"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/html/right-insensitive.png"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/html/style.css"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/html/up.png"
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/html/up-insensitive.png"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu-undeclared.txt"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu-undocumented.txt"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu-unused.txt"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/xml/annotation-glossary.xml"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/xml/api-index-deprecated.xml"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/xml/api-index-full.xml"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/xml/messaging-menu-app.xml"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/xml/messaging-menu-doc.bottom"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/xml/messaging-menu-doc.top"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/xml/xml/messaging-menu-message.xml"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/xml/object_index.sgml"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/xml/tree_index.sgml"
+ WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/html"
+ COMMAND
+ ${GTKDOC_MKHTML}
+ --path=${CMAKE_CURRENT_BINARY_DIR}
+ messaging-menu
+ messaging-menu-docs.xml
+)
+
+# html/annotation-glossary.html
+# html/api-index-deprecated.html
+# html/api-index-full.html
+# html/ch01.html
+# html/index.html
+# html/object-tree.html
+# html/style.css
+
+find_program(GTKDOC_FIXXREF gtkdoc-fixxref)
+
+add_custom_command(
+ OUTPUT "fixxref"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/html/annotation-glossary.html"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/html/api-index-full.html"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/html/ch01.html"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/html/home.png"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/html/index.html"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/html/left.png"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/html/left-insensitive.png"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/html/messaging-menu.devhelp2"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/html/MessagingMenuApp.html"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/html/MessagingMenuMessage.html"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/html/object-tree.html"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/html/right.png"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/html/right-insensitive.png"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/html/style.css"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/html/up.png"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/html/up-insensitive.png"
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND
+ ${GTKDOC_FIXXREF}
+ --module=messaging-menu
+ --module-dir=html
+ --html-dir="${CMAKE_INSTALL_FULL_DATADIR}/gtk-doc/html"
+)
+
+set_source_files_properties("fixxref" PROPERTIES SYMBOLIC TRUE)
+install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/html/" DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/gtk-doc/html/messaging-menu")
+
+add_custom_target("docs-references" ALL DEPENDS "fixxref")
diff --git a/libmessaging-menu/CMakeLists.txt b/libmessaging-menu/CMakeLists.txt
new file mode 100644
index 0000000..f2f9c24
--- /dev/null
+++ b/libmessaging-menu/CMakeLists.txt
@@ -0,0 +1,106 @@
+# messaging-menu.pc
+
+set(prefix "${CMAKE_INSTALL_PREFIX}")# Rewrite and drop once we've switched to CMake
+set(exec_prefix "\${prefix}")# Rewrite and drop once we've switched to CMake
+set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")# Rewrite and drop once we've switched to CMake
+set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")# Rewrite and drop once we've switched to CMake
+set(VERSION "${PROJECT_VERSION}")# Rewrite and drop once we've switched to CMake
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/messaging-menu.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu.pc" @ONLY)
+install(FILES "${CMAKE_CURRENT_BINARY_DIR}/messaging-menu.pc" DESTINATION "${CMAKE_INSTALL_FULL_LIBDIR}/pkgconfig")
+
+# messaging-menu-app.h
+# messaging-menu-message.h
+# messaging-menu.h
+
+install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/messaging-menu-app.h" DESTINATION "${CMAKE_INSTALL_FULL_INCLUDEDIR}/messaging-menu")
+install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/messaging-menu-message.h" DESTINATION "${CMAKE_INSTALL_FULL_INCLUDEDIR}/messaging-menu")
+install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/messaging-menu.h" DESTINATION "${CMAKE_INSTALL_FULL_INCLUDEDIR}/messaging-menu")
+
+# libmessaging-menu.so
+
+set(
+ SOURCES
+ messaging-menu-app.c
+ messaging-menu-message.c
+)
+
+set(
+ SOURCES_GEN
+ ${CMAKE_BINARY_DIR}/src/indicator-messages-service.c
+ ${CMAKE_BINARY_DIR}/src/indicator-messages-application.c
+)
+
+set_source_files_properties(${SOURCES_GEN} PROPERTIES GENERATED TRUE)
+set_source_files_properties(${SOURCES} PROPERTIES COMPILE_FLAGS ${COMPILE_FLAGS})
+add_library("messaging-menu" SHARED ${SOURCES} ${SOURCES_GEN})
+set_target_properties("messaging-menu" PROPERTIES VERSION 0.0.0 SOVERSION 0)
+target_include_directories("messaging-menu" PUBLIC ${PROJECT_DEPS_INCLUDE_DIRS} "${CMAKE_BINARY_DIR}/src")
+target_link_libraries("messaging-menu" ${PROJECT_DEPS_LIBRARIES})
+add_dependencies("messaging-menu" "ayatana-indicator-messages-service")
+install(TARGETS "messaging-menu" DESTINATION "${CMAKE_INSTALL_FULL_LIBDIR}")
+
+# MessagingMenu-1.0.gir
+
+find_package(GObjectIntrospection REQUIRED)
+
+set(
+ HEADERS
+ messaging-menu-app.h
+ messaging-menu-message.h
+)
+
+add_custom_command(
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/MessagingMenu-1.0.gir"
+ DEPENDS "messaging-menu"
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ COMMAND
+ ${INTROSPECTION_SCANNER}
+ ${HEADERS} ${SOURCES}
+ --namespace=MessagingMenu
+ --nsversion=1.0
+ --quiet
+ --warn-all
+ --include=GObject-2.0
+ --include=Gio-2.0
+ --pkg-export=messaging-menu
+ --library="messaging-menu"
+ --c-include="messaging-menu.h"
+ --library-path=${CMAKE_CURRENT_BINARY_DIR}
+ --output "${CMAKE_CURRENT_BINARY_DIR}/MessagingMenu-1.0.gir"
+)
+
+install(FILES "${CMAKE_CURRENT_BINARY_DIR}/MessagingMenu-1.0.gir" DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/gir-1.0")
+
+# MessagingMenu-1.0.typelib
+
+add_custom_command(
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/MessagingMenu-1.0.typelib"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/MessagingMenu-1.0.gir"
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND
+ ${INTROSPECTION_COMPILER}
+ --includedir=${CMAKE_CURRENT_BINARY_DIR}
+ ${CMAKE_CURRENT_BINARY_DIR}/MessagingMenu-1.0.gir
+ -o "${CMAKE_CURRENT_BINARY_DIR}/MessagingMenu-1.0.typelib"
+)
+
+install(FILES "${CMAKE_CURRENT_BINARY_DIR}/MessagingMenu-1.0.typelib" DESTINATION "${CMAKE_INSTALL_FULL_LIBDIR}/girepository-1.0")
+
+# MessagingMenu-1.0.vapi
+
+find_package(Vala REQUIRED)
+
+add_custom_command(
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/MessagingMenu-1.0.vapi"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/MessagingMenu-1.0.typelib"
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND
+ ${VAPI_GEN}
+ --library=MessagingMenu-1.0
+ --pkg gio-2.0
+ MessagingMenu-1.0.gir
+)
+
+install(FILES "${CMAKE_CURRENT_BINARY_DIR}/MessagingMenu-1.0.vapi" DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/vala/vapi")
+
+add_custom_target("libmessaging-menu" ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/MessagingMenu-1.0.vapi")
diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt
new file mode 100644
index 0000000..8435188
--- /dev/null
+++ b/po/CMakeLists.txt
@@ -0,0 +1,2 @@
+find_package(Intltool REQUIRED)
+intltool_install_translations(ALL GETTEXT_PACKAGE ${GETTEXT_PACKAGE})
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000..c5cdc56
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,50 @@
+include(GdbusCodegen)
+set(SOURCES_GEN)
+
+# indicator-messages-service.h
+# indicator-messages-service.c
+
+add_gdbus_codegen_with_namespace(
+ SOURCES_GEN indicator-messages-service
+ org.ayatana.indicator.messages
+ IndicatorMessages
+ ${CMAKE_SOURCE_DIR}/common/org.ayatana.indicator.messages.service.xml
+)
+
+# indicator-messages-application.h
+# indicator-messages-application.c
+
+add_gdbus_codegen_with_namespace(
+ SOURCES_GEN indicator-messages-application
+ org.ayatana.indicator.messages
+ IndicatorMessages
+ ${CMAKE_SOURCE_DIR}/common/org.ayatana.indicator.messages.application.xml
+)
+
+# ayatana-indicator-messages-service
+
+set(
+ SOURCES
+ gactionmuxer.c
+ gsettingsstrv.c
+ im-accounts-service.c
+ im-application-list.c
+ im-desktop-menu.c
+ im-menu.c
+ im-phone-menu.c
+ indicator-desktop-shortcuts.c
+ messages-service.c
+)
+
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/config.h" "")# Dummy file - drop all includes once we've switched to CMake
+set_source_files_properties(${SOURCES} PROPERTIES COMPILE_FLAGS ${COMPILE_FLAGS})
+add_executable("ayatana-indicator-messages-service" ${SOURCES} ${SOURCES_GEN})
+target_compile_definitions(
+ "ayatana-indicator-messages-service" PUBLIC
+ G_LOG_DOMAIN="Ayatana-Indicator-Messages"
+ GETTEXT_PACKAGE="${GETTEXT_PACKAGE}"
+ LOCALEDIR="${CMAKE_INSTALL_FULL_LOCALEDIR}"
+)
+target_include_directories("ayatana-indicator-messages-service" PUBLIC ${PROJECT_DEPS_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR})
+target_link_libraries("ayatana-indicator-messages-service" ${PROJECT_DEPS_LIBRARIES})
+install(TARGETS "ayatana-indicator-messages-service" RUNTIME DESTINATION "${CMAKE_INSTALL_FULL_LIBEXECDIR}/ayatana-indicator-messages")
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
new file mode 100644
index 0000000..bb5399e
--- /dev/null
+++ b/tests/CMakeLists.txt
@@ -0,0 +1,78 @@
+# libindicator-messages-service
+
+find_package(GMock)
+
+set(
+ HEADERS
+ ${CMAKE_SOURCE_DIR}/src/gactionmuxer.h
+ ${CMAKE_SOURCE_DIR}/src/dbus-data.h
+)
+
+set(
+ SOURCES
+ ${CMAKE_SOURCE_DIR}/src/gactionmuxer.c
+)
+
+set(
+ HEADERS_GEN
+ ${CMAKE_BINARY_DIR}/src/indicator-messages-service.h
+)
+
+set(
+ SOURCES_GEN
+ ${CMAKE_BINARY_DIR}/src/indicator-messages-service.c
+)
+
+set_source_files_properties(${HEADERS_GEN} ${SOURCES_GEN} PROPERTIES GENERATED TRUE)
+set_source_files_properties(${HEADERS} ${SOURCES} PROPERTIES COMPILE_FLAGS ${COMPILE_FLAGS})
+add_library("indicator-messages-service" STATIC ${HEADERS} ${HEADERS_GEN} ${SOURCES} ${SOURCES_GEN})
+target_include_directories("indicator-messages-service" PUBLIC ${PROJECT_DEPS_INCLUDE_DIRS})
+target_compile_definitions("indicator-messages-service" PUBLIC G_LOG_DOMAIN="Ayatana-Indicator-Messages")
+target_link_libraries("indicator-messages-service")
+
+# test-gactionmuxer
+
+set_source_files_properties(gtest-menuitems.cpp PROPERTIES COMPILE_FLAGS ${COMPILE_FLAGS})
+add_executable("test-gactionmuxer" test-gactionmuxer.cpp)
+target_link_options("test-gactionmuxer" PRIVATE -no-pie)
+target_include_directories("test-gactionmuxer" PUBLIC ${PROJECT_DEPS_INCLUDE_DIRS} "${CMAKE_SOURCE_DIR}/src")
+target_link_libraries("test-gactionmuxer" "indicator-messages-service" ${PROJECT_DEPS_LIBRARIES} ${GTEST_LIBRARIES} ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARIES})
+if (ENABLE_COVERAGE)
+ target_link_libraries("test-gactionmuxer" "-lgcov")
+endif()
+add_test("test-gactionmuxer" "test-gactionmuxer")
+add_dependencies("test-gactionmuxer" "indicator-messages-service")
+set(COVERAGE_TEST_TARGETS ${COVERAGE_TEST_TARGETS} "test-gactionmuxer" PARENT_SCOPE)
+
+# gschemas.compiled
+
+set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES gschemas.compiled)
+set_source_files_properties(gschemas.compiled GENERATED)
+execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} gio-2.0 --variable glib_compile_schemas OUTPUT_VARIABLE COMPILE_SCHEMA_EXECUTABLE OUTPUT_STRIP_TRAILING_WHITESPACE)
+add_custom_command(OUTPUT gschemas.compiled COMMAND cp -f ${CMAKE_SOURCE_DIR}/data/org.ayatana.indicator.messages.gschema.xml ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${COMPILE_SCHEMA_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR})
+add_custom_target("gschemas-compiled" ALL DEPENDS gschemas.compiled)
+
+# indicator-test
+
+pkg_check_modules(DBUSTEST REQUIRED dbustest-1)
+set_source_files_properties(indicator-test.cpp PROPERTIES COMPILE_FLAGS ${COMPILE_FLAGS})
+add_executable("indicator-test" indicator-test.cpp)
+target_link_options("indicator-test" PRIVATE -no-pie)
+target_include_directories("indicator-test" PUBLIC ${PROJECT_DEPS_INCLUDE_DIRS} ${DBUSTEST_INCLUDE_DIRS} "${CMAKE_SOURCE_DIR}/libmessaging-menu")
+target_link_libraries("indicator-test" "messaging-menu" ${PROJECT_DEPS_LIBRARIES} ${DBUSTEST_LIBRARIES} ${GTEST_LIBRARIES} ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARIES})
+target_compile_definitions(
+ "indicator-test"
+ PUBLIC
+ INDICATOR_MESSAGES_SERVICE_BINARY="${CMAKE_BINARY_DIR}/src/ayatana-indicator-messages-service"
+ SCHEMA_DIR="${CMAKE_CURRENT_BINARY_DIR}"
+ XDG_DATA_DIRS="${CMAKE_CURRENT_SOURCE_DIR}"
+)
+#add_test("indicator-test" "indicator-test")
+add_dependencies("indicator-test" "messaging-menu" "gschemas-compiled")
+set(COVERAGE_TEST_TARGETS ${COVERAGE_TEST_TARGETS} "indicator-test" PARENT_SCOPE)
+
+# test-client.sh
+
+set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/test-client.sh" GENERATED)
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/test-client.sh" "export LD_LIBRARY_PATH=\"${CMAKE_BINARY_DIR}/libmessaging-menu\"; export GI_TYPELIB_PATH=\"${CMAKE_BINARY_DIR}/libmessaging-menu\"; export XDG_DATA_DIRS=\"${CMAKE_CURRENT_SOURCE_DIR}\"; python3 \"${CMAKE_CURRENT_SOURCE_DIR}/test-client.py\"")
+add_test(NAME "test-client" COMMAND sh "${CMAKE_CURRENT_BINARY_DIR}/test-client.sh")