clutter_clutter_includesubdir = join_paths(clutter_includesubdir, 'clutter')
clutter_clutter_includedir = join_paths(clutter_includedir, 'clutter')

clutter_headers = [
  'clutter.h',
  'clutter-action.h',
  'clutter-actor-meta.h',
  'clutter-actor.h',
  'clutter-align-constraint.h',
  'clutter-animatable.h',
  'clutter-autocleanups.h',
  'clutter-backend.h',
  'clutter-bind-constraint.h',
  'clutter-binding-pool.h',
  'clutter-bin-layout.h',
  'clutter-blur-effect.h',
  'clutter-box-layout.h',
  'clutter-brightness-contrast-effect.h',
  'clutter-cairo.h',
  'clutter-canvas.h',
  'clutter-child-meta.h',
  'clutter-click-action.h',
  'clutter-clone.h',
  'clutter-color-static.h',
  'clutter-color.h',
  'clutter-colorize-effect.h',
  'clutter-constraint.h',
  'clutter-container.h',
  'clutter-content.h',
  'clutter-deform-effect.h',
  'clutter-deprecated.h',
  'clutter-desaturate-effect.h',
  'clutter-device-manager.h',
  'clutter-drag-action.h',
  'clutter-drop-action.h',
  'clutter-effect.h',
  'clutter-enums.h',
  'clutter-event.h',
  'clutter-feature.h',
  'clutter-fixed-layout.h',
  'clutter-flow-layout.h',
  'clutter-gesture-action.h',
  'clutter-grid-layout.h',
  'clutter-group.h',
  'clutter-image.h',
  'clutter-input-device.h',
  'clutter-input-device-tool.h',
  'clutter-input-focus.h',
  'clutter-input-method.h',
  'clutter-interval.h',
  'clutter-keyframe-transition.h',
  'clutter-keymap.h',
  'clutter-keysyms.h',
  'clutter-layout-manager.h',
  'clutter-layout-meta.h',
  'clutter-macros.h',
  'clutter-main.h',
  'clutter-mutter.h',
  'clutter-offscreen-effect.h',
  'clutter-page-turn-effect.h',
  'clutter-paint-nodes.h',
  'clutter-paint-node.h',
  'clutter-pan-action.h',
  'clutter-path-constraint.h',
  'clutter-path.h',
  'clutter-property-transition.h',
  'clutter-rotate-action.h',
  'clutter-script.h',
  'clutter-scriptable.h',
  'clutter-scroll-actor.h',
  'clutter-settings.h',
  'clutter-shader-effect.h',
  'clutter-shader-types.h',
  'clutter-swipe-action.h',
  'clutter-snap-constraint.h',
  'clutter-stage.h',
  'clutter-stage-manager.h',
  'clutter-stage-view.h',
  'clutter-tap-action.h',
  'clutter-texture.h',
  'clutter-text.h',
  'clutter-text-buffer.h',
  'clutter-timeline.h',
  'clutter-transition-group.h',
  'clutter-transition.h',
  'clutter-types.h',
  'clutter-units.h',
  'clutter-virtual-input-device.h',
  'clutter-zoom-action.h',
]

clutter_sources = [
  'clutter-action.c',
  'clutter-actor-box.c',
  'clutter-actor-meta.c',
  'clutter-actor.c',
  'clutter-align-constraint.c',
  'clutter-animatable.c',
  'clutter-backend.c',
  'clutter-base-types.c',
  'clutter-bezier.c',
  'clutter-bind-constraint.c',
  'clutter-binding-pool.c',
  'clutter-bin-layout.c',
  'clutter-blur-effect.c',
  'clutter-box-layout.c',
  'clutter-brightness-contrast-effect.c',
  'clutter-cairo.c',
  'clutter-canvas.c',
  'clutter-child-meta.c',
  'clutter-click-action.c',
  'clutter-clone.c',
  'clutter-color.c',
  'clutter-colorize-effect.c',
  'clutter-constraint.c',
  'clutter-container.c',
  'clutter-content.c',
  'clutter-deform-effect.c',
  'clutter-desaturate-effect.c',
  'clutter-device-manager.c',
  'clutter-drag-action.c',
  'clutter-drop-action.c',
  'clutter-effect.c',
  'clutter-event.c',
  'clutter-feature.c',
  'clutter-fixed-layout.c',
  'clutter-flatten-effect.c',
  'clutter-flow-layout.c',
  'clutter-gesture-action.c',
  'clutter-grid-layout.c',
  'clutter-image.c',
  'clutter-input-device.c',
  'clutter-input-device-tool.c',
  'clutter-input-focus.c',
  'clutter-input-method.c',
  'clutter-input-pointer-a11y.c',
  'clutter-virtual-input-device.c',
  'clutter-interval.c',
  'clutter-keyframe-transition.c',
  'clutter-keymap.c',
  'clutter-keysyms-table.c',
  'clutter-layout-manager.c',
  'clutter-layout-meta.c',
  'clutter-main.c',
  'clutter-master-clock.c',
  'clutter-master-clock-default.c',
  'clutter-offscreen-effect.c',
  'clutter-page-turn-effect.c',
  'clutter-paint-nodes.c',
  'clutter-paint-node.c',
  'clutter-pan-action.c',
  'clutter-path-constraint.c',
  'clutter-path.c',
  'clutter-property-transition.c',
  'clutter-rotate-action.c',
  'clutter-script.c',
  'clutter-script-parser.c',
  'clutter-scriptable.c',
  'clutter-scroll-actor.c',
  'clutter-settings.c',
  'clutter-shader-effect.c',
  'clutter-shader-types.c',
  'clutter-swipe-action.c',
  'clutter-snap-constraint.c',
  'clutter-stage.c',
  'clutter-stage-manager.c',
  'clutter-stage-view.c',
  'clutter-stage-window.c',
  'clutter-tap-action.c',
  'clutter-text.c',
  'clutter-text-buffer.c',
  'clutter-transition-group.c',
  'clutter-transition.c',
  'clutter-timeline.c',
  'clutter-units.c',
  'clutter-util.c',
  'clutter-paint-volume.c',
  'clutter-zoom-action.c',
]

clutter_private_headers = [
  'clutter-actor-meta-private.h',
  'clutter-actor-private.h',
  'clutter-backend-private.h',
  'clutter-bezier.h',
  'clutter-constraint-private.h',
  'clutter-content-private.h',
  'clutter-debug.h',
  'clutter-device-manager-private.h',
  'clutter-easing.h',
  'clutter-effect-private.h',
  'clutter-event-private.h',
  'clutter-flatten-effect.h',
  'clutter-gesture-action-private.h',
  'clutter-id-pool.h',
  'clutter-input-focus-private.h',
  'clutter-input-method-private.h',
  'clutter-input-pointer-a11y-private.h',
  'clutter-master-clock.h',
  'clutter-master-clock-default.h',
  'clutter-offscreen-effect-private.h',
  'clutter-paint-node-private.h',
  'clutter-paint-volume-private.h',
  'clutter-private.h',
  'clutter-script-private.h',
  'clutter-settings-private.h',
  'clutter-stage-manager-private.h',
  'clutter-stage-private.h',
  'clutter-stage-view-private.h',
  'clutter-stage-window.h',
]

clutter_nonintrospected_sources = [
  'clutter-easing.c',
  'clutter-id-pool.c',
]

clutter_deprecated_headers = [
  'deprecated/clutter-actor.h',
  'deprecated/clutter-alpha.h',
  'deprecated/clutter-animatable.h',
  'deprecated/clutter-animation.h',
  'deprecated/clutter-behaviour.h',
  'deprecated/clutter-behaviour-depth.h',
  'deprecated/clutter-behaviour-opacity.h',
  'deprecated/clutter-behaviour-scale.h',
  'deprecated/clutter-bin-layout.h',
  'deprecated/clutter-box.h',
  'deprecated/clutter-cairo-texture.h',
  'deprecated/clutter-container.h',
  'deprecated/clutter-group.h',
  'deprecated/clutter-keysyms.h',
  'deprecated/clutter-rectangle.h',
  'deprecated/clutter-stage-manager.h',
  'deprecated/clutter-stage.h',
  'deprecated/clutter-state.h',
  'deprecated/clutter-table-layout.h',
  'deprecated/clutter-texture.h',
  'deprecated/clutter-timeline.h',
]

clutter_deprecated_sources = [
  'deprecated/clutter-actor-deprecated.c',
  'deprecated/clutter-alpha.c',
  'deprecated/clutter-animation.c',
  'deprecated/clutter-behaviour.c',
  'deprecated/clutter-behaviour-depth.c',
  'deprecated/clutter-behaviour-opacity.c',
  'deprecated/clutter-behaviour-scale.c',
  'deprecated/clutter-box.c',
  'deprecated/clutter-cairo-texture.c',
  'deprecated/clutter-group.c',
  'deprecated/clutter-layout-manager-deprecated.c',
  'deprecated/clutter-rectangle.c',
  'deprecated/clutter-state.c',
  'deprecated/clutter-table-layout.c',
  'deprecated/clutter-texture.c',
]

clutter_backend_sources = []
clutter_backend_nonintrospected_sources = [
  'cogl/clutter-stage-cogl.c',
]
clutter_backend_headers = []
clutter_backend_private_headers = [
  'cogl/clutter-stage-cogl.h',
]

if have_x11
  clutter_x11_sources = [
    'x11/clutter-backend-x11.c',
  ]
  clutter_backend_sources += clutter_x11_sources

  clutter_x11_headers = [
    'x11/clutter-x11.h',
  ]
  clutter_backend_headers += clutter_x11_headers

  clutter_x11_private_headers = [
    'x11/clutter-backend-x11.h',
    'x11/clutter-settings-x11.h',
  ]
  clutter_backend_private_headers += clutter_x11_private_headers

  clutter_x11_nonintrospected_sources = [
    'x11/xsettings/xsettings-client.c',
    'x11/xsettings/xsettings-client.h',
    'x11/xsettings/xsettings-common.c',
    'x11/xsettings/xsettings-common.h',
  ]
  clutter_backend_nonintrospected_sources += clutter_x11_nonintrospected_sources
endif

if have_native_backend
  clutter_native_nonintrospected_sources = [
    'egl/clutter-backend-eglnative.c',
  ]
  clutter_backend_nonintrospected_sources += clutter_native_nonintrospected_sources
endif

if have_wayland
  clutter_wayland_private_headers = [
    'wayland/clutter-wayland-compositor.h',
  ]
  clutter_backend_private_headers += clutter_wayland_private_headers
endif

cally_headers = [
    'cally/cally-actor.h',
    'cally/cally-clone.h',
    'cally/cally-factory.h',
    'cally/cally-group.h',
    'cally/cally.h',
    'cally/cally-main.h',
    'cally/cally-rectangle.h',
    'cally/cally-root.h',
    'cally/cally-stage.h',
    'cally/cally-text.h',
    'cally/cally-texture.h',
    'cally/cally-util.h',
]

cally_sources = [
    'cally/cally-actor.c',
    'cally/cally.c',
    'cally/cally-clone.c',
    'cally/cally-group.c',
    'cally/cally-rectangle.c',
    'cally/cally-root.c',
    'cally/cally-stage.c',
    'cally/cally-text.c',
    'cally/cally-texture.c',
    'cally/cally-util.c',
]

cally_private_headers = [
  'cally/cally-actor-private.h',
]

clutter_built_sources = []
clutter_built_headers = []
clutter_built_private_headers = []

cdata = configuration_data()
cdata.set_quoted('MUTTER_VERSION', meson.project_version())
cdata.set('CLUTTER_DRIVERS', '"*"')
cdata.set('HAVE_EVDEV', have_native_backend)
cdata.set('HAVE_LIBWACOM', have_libwacom)
cdata.set('HAVE_PANGO_FT2', have_pango_ft2)

clutter_build_config_h = configure_file(
  input: 'clutter-build-config.h.meson',
  output: 'clutter-build-config.h',
  configuration: cdata,
  install: false,
)
clutter_built_private_headers += clutter_build_config_h

clutter_config_defines = []
if have_wayland
  clutter_config_defines += [
    '#define CLUTTER_HAS_WAYLAND_COMPOSITOR_SUPPORT 1',
  ]
endif
if have_x11
  clutter_config_defines += [
    '#define CLUTTER_WINDOWING_X11 "x11"',
    '#define CLUTTER_INPUT_X11 "x11"',
    '#define CLUTTER_WINDOWING_GLX "glx"',
  ]
endif
if have_native_backend
  clutter_config_defines += [
    '#define CLUTTER_WINDOWING_EGL "eglnative"',
    '#define CLUTTER_INPUT_EVDEV "evdev"',
  ]
endif
clutter_config_defines += [
  '#define CLUTTER_INPUT_NULL "null"',
]
clutter_config_defines_string = ''
foreach clutter_config_define : clutter_config_defines
  clutter_config_defines_string += clutter_config_define + '\n'
endforeach

cdata = configuration_data()
cdata.set('CLUTTER_CONFIG_DEFINES', clutter_config_defines_string)

clutter_config_h = configure_file(
  input: 'clutter-config.h.in',
  output: 'clutter-config.h',
  configuration: cdata,
  install: true,
  install_dir: clutter_clutter_includedir,
)
clutter_built_headers += clutter_config_h

clutter_enum_types = gnome.mkenums('clutter-enum-types',
  sources: [clutter_headers, clutter_deprecated_headers],
  c_template: 'clutter-enum-types.c.in',
  h_template: 'clutter-enum-types.h.in',
  install_dir: clutter_clutter_includedir,
  install_header: true,
)
clutter_built_sources += clutter_enum_types[0]
clutter_built_headers += clutter_enum_types[1]

clutter_marshal = gnome.genmarshal('clutter-marshal',
  prefix: '_clutter_marshal',
  sources: 'clutter-marshal.list',
  valist_marshallers: true,
  extra_args: ['--quiet'],
  install_dir: clutter_clutter_includedir,
  install_header: true,
)
clutter_built_sources += clutter_marshal[0]
clutter_built_headers += clutter_marshal[1]

libmutter_clutter_name = 'mutter-clutter-' + libmutter_api_version
libmutter_clutter = shared_library(libmutter_clutter_name,
  sources: [
    clutter_sources,
    clutter_headers,
    clutter_private_headers,
    clutter_nonintrospected_sources,
    clutter_deprecated_sources,
    clutter_deprecated_headers,
    clutter_backend_sources,
    clutter_backend_nonintrospected_sources,
    clutter_backend_headers,
    clutter_backend_private_headers,
    clutter_built_sources,
    clutter_built_headers,
    cally_sources,
    cally_headers,
    cally_private_headers,
  ],
  version: '0.0.0',
  soversion: 0,
  c_args: clutter_c_args,
  include_directories: clutter_includes,
  dependencies: [clutter_deps],
  gnu_symbol_visibility: 'hidden',
  link_with: [
    libmutter_cogl,
    libmutter_cogl_pango,
    libmutter_cogl_path,
  ],
  install_rpath: pkglibdir,
  install_dir: pkglibdir,
  install: true,
)
libmutter_clutter_dep = declare_dependency(
  sources: [clutter_enum_types[1]],
  link_with: libmutter_clutter,
)

if have_introspection
  clutter_introspection_args = introspection_args + [
    '-DCLUTTER_SYSCONFDIR="@0@"'.format(join_paths(prefix, sysconfdir)),
    '-DCLUTTER_COMPILATION=1',
    '-DCOGL_DISABLE_DEPRECATION_WARNINGS',
    '-DG_LOG_DOMAIN="Clutter"'
  ]

  libmutter_clutter_gir = gnome.generate_gir(libmutter_clutter,
    sources: [
      clutter_built_sources,
      clutter_built_headers,
      clutter_sources,
      clutter_headers,
      clutter_deprecated_sources,
      clutter_deprecated_headers,
    ],
    nsversion: libmutter_api_version,
    namespace: 'Clutter',
    export_packages: [libmutter_clutter_name],
    includes: [
      libmutter_cogl_gir[0],
      libmutter_cogl_pango_gir[0],
      'GL-1.0',
      'GObject-2.0',
      'cairo-1.0',
      'Atk-1.0',
      'Json-1.0',
    ],
    dependencies: [cogl_deps],
    extra_args: clutter_introspection_args + ['--c-include=clutter/clutter.h'],
    install_dir_gir: pkglibdir,
    install_dir_typelib: pkglibdir,
    install: true,
  )

  libmutter_cally_gir = gnome.generate_gir(libmutter_clutter,
    sources: [
      cally_sources,
      cally_headers,
    ],
    nsversion: libmutter_api_version,
    namespace: 'Cally',
    includes: [
      libmutter_cogl_gir[0],
      libmutter_cogl_pango_gir[0],
      libmutter_clutter_gir[0],
    ],
    dependencies: [cogl_deps],
    extra_args: clutter_introspection_args,
    install_dir_gir: pkglibdir,
    install_dir_typelib: pkglibdir,
    install: true
  )

  if have_x11
    libmutter_clutter_x11_gir = gnome.generate_gir(libmutter_clutter,
      sources: [
        clutter_x11_sources,
        clutter_x11_headers,
      ],
      nsversion: libmutter_api_version,
      namespace: 'ClutterX11',
      export_packages: ['mutter-clutter-x11-' + libmutter_api_version],
      includes: [
        libmutter_cogl_gir[0],
        libmutter_cogl_pango_gir[0],
        libmutter_clutter_gir[0],
        'xlib-2.0',
      ],
      dependencies: [],
      extra_args: clutter_introspection_args,
      install_dir_gir: pkglibdir,
      install_dir_typelib: pkglibdir,
      install: true
    )
  endif
endif

install_headers(clutter_headers,
  subdir: clutter_clutter_includesubdir)

install_headers(cally_headers,
  subdir: join_paths(clutter_includesubdir, 'cally'))

install_headers(clutter_deprecated_headers,
  subdir: join_paths(clutter_clutter_includesubdir, 'deprecated'))

install_headers(clutter_x11_headers,
  subdir: join_paths(clutter_clutter_includesubdir, 'x11'))

pkg.generate(libmutter_clutter,
  name: 'Mutters Clutter',
  filebase: libmutter_clutter_name,
  description: 'Mutters Clutter Private Library',
  libraries: [m_dep],
  subdirs: join_paths(pkgname, 'clutter'),
  requires: [clutter_pkg_deps, libmutter_cogl_name],
  version: meson.project_version(),
  variables: [
    'apiversion=' + libmutter_api_version,
  ],
  install_dir: pcdir,
)

pkg.generate(libmutter_clutter,
  name: 'Mutters ClutterX11',
  filebase: 'mutter-clutter-x11-' + libmutter_api_version,
  description: 'Mutters ClutterX11 Private Library',
  libraries: [m_dep],
  subdirs: join_paths(pkgname, 'clutter'),
  requires: [clutter_pkg_deps, libmutter_cogl_name],
  version: meson.project_version(),
  variables: [
    'apiversion=' + libmutter_api_version,
  ],
  install_dir: pcdir,
)
