add_compile_definitions(
  MIR_LOG_COMPONENT_FALLBACK="mirserver"
  MIR_VERSION="${PROJECT_VERSION}"
)

add_compile_definitions(MIR_SERVER_INPUT_PLATFORM_VERSION="${MIR_SERVER_INPUT_PLATFORM_VERSION}")

add_compile_definitions(MIR_SERVER_PLATFORM_PATH="${MIR_SERVER_PLATFORM_PATH}")
add_compile_definitions(MIR_SERVER_GRAPHICS_PLATFORM_VERSION="${MIR_SERVER_GRAPHICS_PLATFORM_VERSION}")

add_subdirectory(compositor/)
add_subdirectory(graphics/)
add_subdirectory(input/)
add_subdirectory(report/)
add_subdirectory(scene/)
add_subdirectory(frontend_wayland/)
add_subdirectory(frontend_xwayland/)
add_subdirectory(shell/)
add_subdirectory(console/)
add_subdirectory(time/)

configure_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/mirserver.pc.in
  ${CMAKE_CURRENT_BINARY_DIR}/mirserver.pc
  @ONLY
)

configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/mirserver-internal.pc.in
    ${CMAKE_CURRENT_BINARY_DIR}/mirserver-internal.pc
    @ONLY
)

configure_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/version.h.in
  ${PROJECT_SOURCE_DIR}/include/server/mir/version.h
)

add_library(mirserverobjects OBJECT
  run_mir.cpp
  terminate_with_current_exception.cpp
  display_server.cpp
  default_server_configuration.cpp
  glib_main_loop.cpp
  glib_main_loop_sources.cpp
  default_emergency_cleanup.cpp
  server.cpp
  lockable_callback_wrapper.cpp
  basic_callback.cpp
  shm_backing.cpp
  shm_backing.h
  ${PROJECT_SOURCE_DIR}/src/include/server/mir/time/alarm_factory.h
  ${PROJECT_SOURCE_DIR}/src/include/server/mir/time/alarm.h
  ${PROJECT_SOURCE_DIR}/src/include/server/mir/observer_registrar.h
  ${PROJECT_SOURCE_DIR}/src/include/server/mir/observer_multiplexer.h
  ${PROJECT_SOURCE_DIR}/src/include/server/mir/glib_main_loop.h
  ${PROJECT_SOURCE_DIR}/src/include/server/mir/glib_main_loop_sources.h
)

target_include_directories(mirserverobjects
  PUBLIC
    ${PROJECT_SOURCE_DIR}/include/server
  PRIVATE
    ${PROJECT_SOURCE_DIR}/src/include/server
)

target_link_libraries(mirserverobjects
  PUBLIC
    mirplatform
    mircommon
    mircore
  PRIVATE
    PkgConfig::GLIB
    PkgConfig::GIO
)

set_property(
    SOURCE glib_main_loop.cpp glib_main_loop_sources.cpp default_server_configuration.cpp
    PROPERTY COMPILE_OPTIONS -Wno-variadic-macros)

if(GLIB_VERSION VERSION_GREATER_EQUAL 2.85)
    # This version fixes the (at least) 11 year old bug we encountered in LP #1401488
    # Unfortunately, the fix interacts badly with our workaround to the bug
    # Fortunately, we added the workaround we added a #define to turn it off, and
    # use the correct code!
    set_property(
        SOURCE glib_main_loop_sources.cpp
        APPEND
        PROPERTY COMPILE_DEFINITIONS GLIB_HAS_FIXED_LP_1401488)
endif()

set(MIR_SERVER_REFERENCES
  mirserverobjects
  mirinput
  mirscene
  mircompositor
  mirgraphics
  mirfrontend-wayland
  mirfrontend-xwayland
  mirshell
  mirshelldecoration
  mirlttng
  mirreport
  mirlogging
  mirnullreport
  mirconsole
  mirservertime

  PkgConfig::DRM
  PkgConfig::EGL
  PkgConfig::GLESv2
  PkgConfig::UDEV
  PkgConfig::GLIB
  PkgConfig::GIO
  PkgConfig::UUID
  PkgConfig::LTTNG_UST
)

set(MIR_SERVER_REFERENCES ${MIR_SERVER_REFERENCES} PARENT_SCOPE)

add_library(mirserver SHARED)

target_link_libraries(mirserver
  PUBLIC


    mirplatform
    mircommon
    mirwayland

    server_platform_common
    Boost::iostreams
    PkgConfig::DRM
    PkgConfig::EGL
    PkgConfig::GLESv2
    PkgConfig::UDEV
    PkgConfig::GLIB
    PkgConfig::GIO
    PkgConfig::UUID
    PkgConfig::XCB
    PkgConfig::XCB_COMPOSITE
    PkgConfig::XCB_XFIXES
    PkgConfig::XCB_RANDR
    PkgConfig::XCB_RENDER
    PkgConfig::XCB_RES
    PkgConfig::X11_XCURSOR
    PkgConfig::LTTNG_UST
    PkgConfig::FREETYPE
    atomic

  PRIVATE
    ${MIR_SERVER_REFERENCES}
)

if (MIR_USE_APPARMOR)
  target_link_libraries(mirserver PUBLIC PkgConfig::APPARMOR)
endif()

install(TARGETS mirserver
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
install(DIRECTORY
  ${CMAKE_SOURCE_DIR}/include/platform/mir DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/mirplatform"
)
install(DIRECTORY
  ${CMAKE_SOURCE_DIR}/include/server/mir DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/mirserver"
)
install(DIRECTORY
    ${CMAKE_SOURCE_DIR}/src/include/server/mir DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/mirserver-internal"
)

set(MIRSERVER_ABI 66) # Be sure to increment PROJECT_VERSION_MINOR at the same time
set(symbol_map ${CMAKE_CURRENT_SOURCE_DIR}/symbols.map)

set_target_properties(
  mirserver

  PROPERTIES
  SOVERSION ${MIRSERVER_ABI}
  LINK_FLAGS "-Wl,--exclude-libs=ALL -Wl,--version-script,${symbol_map}"
  LINK_DEPENDS ${symbol_map}
)

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/mirserver.pc
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
)

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/mirserver-internal.pc
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
)

add_custom_target(
    generate-mirserver-symbols-map
    COMMAND ${PROJECT_SOURCE_DIR}/tools/symbols_map_generator/main.py
        --library-name mir_server
        --version ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
        --symbols-map-path="${CMAKE_CURRENT_SOURCE_DIR}/symbols.map"
        --include-dirs="$<JOIN:$<TARGET_PROPERTY:mirserver,INCLUDE_DIRECTORIES>,:>"
    WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}")

add_custom_target(
  check-mirserver-symbols-map
  COMMAND ${PROJECT_SOURCE_DIR}/tools/symbols_map_generator/main.py
      --library-name mir_server
      --version ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
      --symbols-map-path="${CMAKE_CURRENT_SOURCE_DIR}/symbols.map"
      --include-dirs "$<JOIN:$<TARGET_PROPERTY:mirserver,INCLUDE_DIRECTORIES>,:>"
      --diff
  WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}")
