aboutsummaryrefslogtreecommitdiff
path: root/cmake/GSettings.cmake
blob: 5902baabb37e8162b8144700d8bff7d66fc0043d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# 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)