cmake_minimum_required(VERSION 3.10)

SET(CMAKE_C_STANDARD 17)
SET(CMAKE_C_STANDARD_REQUIRED ON)

#set(CMAKE_C_VISIBILITY_PRESET hidden)
#set(CMAKE_CXX_VISIBILITY_PRESET hidden)

set(ALTERATOR_GLIB_VERSION 0.1.0)
set(ALTERATOR_GLIB_SOVERSION 0)

find_package(PkgConfig REQUIRED)
pkg_search_module(GLIB REQUIRED glib-2.0)
pkg_check_modules(Glib20 REQUIRED IMPORTED_TARGET glib-2.0)
pkg_check_modules(DBUS gio-2.0 dbus-1 dbus-glib-1)
pkg_check_modules(LIBTOMLC99 REQUIRED libtoml)
pkg_check_modules(LIBPOLKIT REQUIRED polkit-agent-1 polkit-gobject-1)
pkg_check_modules(GOBJECT REQUIRED gobject-2.0>=2.44)
pkg_check_modules(CJSON REQUIRED libcjson)
pkg_check_modules(GOBJECT_INTROSPECTION REQUIRED gobject-introspection-1.0)

include_directories(${DBUS_INCLUDE_DIRS})
include_directories(${GLIB_INCLUDE_DIRS})
include_directories(${LIBPOLKIT_INCLUDE_DIRS})

include(GNUInstallDirs)
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
    set(CMAKE_INSTALL_PREFIX "/usr"
        CACHE PATH "Install prefix" FORCE)
endif()

set (HEADERS
    include/alterator-object.h)

set (SOURCES
    alterator-glib.c
    alterator-glib-common.c

    objects/alterator-object.c
    objects/alterator-object-entity.c

    objects/alterator-diag-interface.c
    objects/diag1/alterator-diag1.c
    objects/diag1/alterator-object-diag-param.c
    objects/diag1/alterator-object-diag-test.c

    objects/alterator-component-interface.c
    objects/component1/alterator-component1.c
    objects/component1/alterator-component-package.c
    objects/component1/alterator-component-category.c
    objects/alterator-components-tree.c

    objects/alterator-group-component-applier-interface.c
    objects/group-component-applier/alterator-group-component-applier-impl.c

    errors/alterator-glib-errors.c

    dbussource/alterator-dbussource.c

    dbusmanager/alterator-dbusmanager-interface.c
    dbusmanager/alterator-dbusmanager-simple.c

    dbussource/apt1/alterator-apt1-interface.c
    dbussource/apt1/alterator-apt1-simple.c

    dbussource/systeminfo1/alterator-systeminfo1-interface.c
    dbussource/systeminfo1/alterator-systeminfo1-simple.c

    dbussource/batch-components1/alterator-batch-components1-interface.c
    dbussource/batch-components1/alterator-batch-components1-simple.c
    dbussource/batch-components-categories1/alterator-batch-components-categories1-interface.c
    dbussource/batch-components-categories1/alterator-batch-components-categories1-simple.c

    builders/alterator-object-builder-interface.c
    builders/alterator-objects-builders-factory.c
    builders/alterator-component1-builder.c
    builders/alterator-diag1-builder.c
    builders/alterator-object-builder.c
    builders/alterator-component-category-builder.c

    toml-parser/alterator-object-toml-parser.c
    toml-parser/alterator-diag-toml-parser.c
    toml-parser/alterator-toml-entry.c
    toml-parser/object-hash-table-property.c
    toml-parser/object-garray-int-property.c
    toml-parser/object-garray-string-property.c
    toml-parser/alterator-component-toml-parser.c
    toml-parser/alterator-component-category-toml-parser.c

    appliers/alterator-component-applier-builder-factory.c
    appliers/alterator-component-applier-interface.c
    appliers/component1/alterator-component1-applier.c
)

add_compile_definitions(__ALTERATOR_GLIB_INTERNALS__)
add_library(alterator-glib SHARED ${SOURCES})

set_target_properties(alterator-glib PROPERTIES VERSION ${ALTERATOR_GLIB_VERSION} SOVERSION ${ALTERATOR_GLIB_SOVERSION})

set(LIB_PUBLIC_HEADERS
    ${CMAKE_SOURCE_DIR}/src/include/alterator-glib.h
    ${CMAKE_SOURCE_DIR}/src/include/alteratorglib-base.h
    ${CMAKE_SOURCE_DIR}/src/include/alterator-glib-common.h)

set(LIB_BUILDERS_HEADERS
    ${CMAKE_SOURCE_DIR}/src/include/builders/alterator-objects-builders-factory.h
    ${CMAKE_SOURCE_DIR}/src/include/builders/alterator-object-builder-interface.h)

set(LIB_DBUS_MANAGER_PUBLIC_HEADER
    ${CMAKE_SOURCE_DIR}/src/include/dbusmanager/alterator-dbusmanager-interface.h)

set(LIB_DBUS_SOURCE_APT1_PUBLIC_HEADER
    ${CMAKE_SOURCE_DIR}/src/include/dbussource/apt1/alterator-apt1-interface.h)

set(LIB_APPLIERS_PUBLIC_HEADERS
    ${CMAKE_SOURCE_DIR}/src/include/appliers/alterator-component-applier-interface.h
    ${CMAKE_SOURCE_DIR}/src/include/appliers/alterator-component-applier-builder-factory.h)

set(LIB_PUBLIC_OBJECTS_HEADERS
    ${CMAKE_SOURCE_DIR}/src/include/objects/alterator-component-interface.h
    ${CMAKE_SOURCE_DIR}/src/include/objects/alterator-diag-interface.h
    ${CMAKE_SOURCE_DIR}/src/include/objects/alterator-components-tree.h
    ${CMAKE_SOURCE_DIR}/src/include/objects/alterator-group-component-applier-interface.h
    ${CMAKE_SOURCE_DIR}/src/include/objects/alterator-object.h
    ${CMAKE_SOURCE_DIR}/src/include/objects/alterator-object-entity.h
    ${CMAKE_SOURCE_DIR}/src/include/objects/alterator-diag-interface.h
    ${CMAKE_SOURCE_DIR}/src/include/objects/alterator-component-interface.h
    ${CMAKE_SOURCE_DIR}/src/include/objects/alterator-group-component-applier-interface.h)

set(LIB_PUBLIC_PARSERS_HEADERS
    ${CMAKE_SOURCE_DIR}/src/include/parsers/alterator-toml-entry.h)

set(LIB_PUBLIC_DIAG_HEADERS
    ${CMAKE_SOURCE_DIR}/src/include/objects/diag1/alterator-diag1.h
    ${CMAKE_SOURCE_DIR}/src/include/objects/diag1/alterator-object-diag-param.h
    ${CMAKE_SOURCE_DIR}/src/include/objects/diag1/alterator-object-diag-test.h)

set(LIB_PUBLIC_COMPONENTS_HEADERS
    ${CMAKE_SOURCE_DIR}/src/include/objects/component1/alterator-component1.h
    ${CMAKE_SOURCE_DIR}/src/include/objects/component1/alterator-component-category.h
    ${CMAKE_SOURCE_DIR}/src/include/objects/component1/alterator-component-package.h
    ${CMAKE_SOURCE_DIR}/src/include/objects/alterator-components-tree.h)

target_compile_options(alterator-glib PRIVATE -O0) #for memory testing purposes

target_include_directories(alterator-glib PRIVATE ${CMAKE_SOURCE_DIR}/src/include ${CJSON_INCLUDE_DIRS})
target_link_libraries(alterator-glib PUBLIC ${GOBJECT_LIBRARIES} ${DBUS_LIBRARIES}
                                            PkgConfig::Glib20 ${GLIB_LIBRARIES}
                                            ${LIBTOMLC99_LIBRARIES} ${LIBGUMBO_LIBRARIES}
                                            ${LIBPOLKIT_LIBRARIES} ${GLIB_LDFLAGS}
                                            ${CJSON_LIBRARIES})

install(TARGETS alterator-glib
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})

install(FILES ${LIB_PUBLIC_HEADERS}
    DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}/alterator-glib)

install(FILES ${LIB_BUILDERS_HEADERS}
    DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}/alterator-glib/builders)

install(FILES ${LIB_DBUS_MANAGER_PUBLIC_HEADER}
    DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}/alterator-glib/dbusmanager)

install(FILES ${LIB_DBUS_SOURCE_APT1_PUBLIC_HEADER}
    DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}/alterator-glib/dbussource/apt1)

install(FILES ${LIB_APPLIERS_PUBLIC_HEADERS}
    DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}/alterator-glib/appliers)

install(FILES ${LIB_DBUS_MANAGER_PUBLIC_HEADER}
    DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}/alterator-glib/dbusmanager)

install(FILES ${LIB_PUBLIC_OBJECTS_HEADERS}
    DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}/alterator-glib/objects)

install(FILES ${LIB_PUBLIC_PARSERS_HEADERS}
    DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}/alterator-glib/parsers)

install(FILES ${LIB_PUBLIC_DIAG_HEADERS}
    DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}/alterator-glib/objects/diag1)

install(FILES ${LIB_PUBLIC_COMPONENTS_HEADERS}
    DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}/alterator-glib/objects/component1)

# Enable testing
#enable_testing()
#add_subdirectory(tests)
