# GSettings.cmake
# Originally based on CMake macros written for Marlin
# Updated by Yorba for newer versions of GLib.
#
# NOTE: This module does an in-place compilation of GSettings; the
#       resulting gschemas.compiled file will end up in the same
#       source folder as the original schema(s).

option(GSETTINGS_COMPILE "Compile GSettings schemas. Can be disabled for packaging reasons." ON)
option(GSETTINGS_COMPILE_IN_PLACE "Compile GSettings schemas in the build folder. This is used for running an appliction without installing the GSettings systemwide.  The application will need to set GSETTINGS_SCHEMA_DIR" ON)

if (GSETTINGS_COMPILE)
    message(STATUS "GSettings schemas will be compiled.")
endif ()

if (GSETTINGS_COMPILE_IN_PLACE)
    message(STATUS "GSettings schemas will be compiled in-place.")
endif ()

macro(add_schemas GSETTINGS_TARGET SCHEMA_DIRECTORY)
    set(PKG_CONFIG_EXECUTABLE pkg-config)
    
    # Locate all schema files.
    file(GLOB all_schema_files
        "${SCHEMA_DIRECTORY}/*.gschema.xml"
    )
    
    # Find the GLib path for schema installation
    execute_process(
        COMMAND
            ${PKG_CONFIG_EXECUTABLE}
            glib-2.0
            --variable prefix
        OUTPUT_VARIABLE
            _glib_prefix
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )
    
    set(GSETTINGS_DIR "${_glib_prefix}/share/glib-2.0/schemas/" CACHE INTERNAL "")
    
    # Fetch path for schema compiler from pkg-config
    execute_process(
        COMMAND
            ${PKG_CONFIG_EXECUTABLE}
            gio-2.0
            --variable
            glib_compile_schemas
        OUTPUT_VARIABLE
            _glib_compile_schemas
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )
    
    set(glib_schema_compiler ${_glib_compile_schemas} CACHE INTERNAL "")
    
    if (GSETTINGS_COMPILE_IN_PLACE)
        set(COMPILE_IN_PLACE_DIR ${CMAKE_BINARY_DIR}/gsettings)
        add_custom_command(
            TARGET
                ${GSETTINGS_TARGET}
            COMMAND 
                ${CMAKE_COMMAND} -E make_directory "${COMPILE_IN_PLACE_DIR}"
        )
        
        # Copy all schemas to the build folder.
        foreach(schema_file ${all_schema_files})
            add_custom_command(
                TARGET
                    ${GSETTINGS_TARGET}
                COMMAND 
                    ${CMAKE_COMMAND} -E copy "${schema_file}" "${COMPILE_IN_PLACE_DIR}"
                COMMENT "Copying schema ${schema_file} to ${COMPILE_IN_PLACE_DIR}"
            )
        endforeach()
        
        # Compile schema in-place.
        add_custom_command(
            TARGET 
                ${GSETTINGS_TARGET}
            COMMAND
                ${glib_schema_compiler} ${COMPILE_IN_PLACE_DIR}
            COMMENT "Compiling schemas in folder: ${COMPILE_IN_PLACE_DIR}"
        )
    endif ()
        
    # Install and recompile schemas
    message(STATUS "GSettings schemas will be installed into ${GSETTINGS_DIR}")
    
    install(
        FILES
            ${all_schema_files}
        DESTINATION
            ${GSETTINGS_DIR}
        OPTIONAL
    )
    
    if (GSETTINGS_COMPILE)
        install(
            CODE
                "message (STATUS \"Compiling GSettings schemas\")"
        )
        
        install(
            CODE
                "execute_process (COMMAND ${glib_schema_compiler} ${GSETTINGS_DIR})"
        )
    endif ()
endmacro(add_schemas)

