# Generate both header and source via template together.

myenums = gnome.mkenums('abc1',
  sources : 'meson-sample.h',
  h_template : 'enums.h.in',
  c_template : 'enums.c.in',
  install_header : true,
  install_dir : get_option('includedir'))

enums_c1 = myenums[0]
enums_h1 = myenums[1]

conf = configuration_data()
conf.set('ENUM_FILE', 'enums.h')
main = configure_file(
  input : 'main.c',
  output : 'main1.c',
  configuration : conf)

enumexe1 = executable('enumprog1', main, enums_c1, enums_h1,
dependencies : gobj)
test('enum test 1', enumexe1)

# Generate both header and source via template individually and overriding.

enums_h2 = gnome.mkenums('abc2',
  sources : 'meson-sample.h',
  h_template : 'enums2.h.in',
  ftail : '/* trailing header file info */',
  install_header : true,
  install_dir : get_option('includedir'))

enums_c2 = gnome.mkenums('abc2',
  sources : 'meson-sample.h',
  depends : [enums_h1, enums_h2],
  c_template : 'enums2.c.in',
  ftail : '/* trailing source file info */')
# explicitly don't set install_dir here, for bug testing
# See https://github.com/mesonbuild/meson/issues/9472

conf = configuration_data()
conf.set('ENUM_FILE', 'enums2.h')
main = configure_file(
  input : 'main.c',
  output : 'main2.c',
  configuration : conf)

enumexe2 = executable('enumprog2', main, enums_c2, enums_h2,
dependencies : gobj)
test('enum test 2', enumexe2)

# Generate both header and source by options only.
# These are specified in a way that should produce the same result as above
# (modulo any filename changes.)

enums_h3 = gnome.mkenums('enums3.h',
  sources : 'meson-sample.h',
  fhead : '''#ifndef MESON_ENUMS_H
#define MESON_ENUMS_H

#include <glib-object.h>

G_BEGIN_DECLS
''',
  fprod : '''
/* enumerations from "@basename@" */
''',
  vhead : '''GType @enum_name@_get_type(void) G_GNUC_CONST;
#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type())
''',
  ftail : '''
G_END_DECLS

#endif /* MESON_ENUMS_H */
''',
  install_header : true,
  install_dir : get_option('includedir'))

enums_c3 = gnome.mkenums('enums3.c',
  sources : 'meson-sample.h',
  depends : enums_h3,
  fhead : '''#include "enums3.h"
''',
  fprod : '''

/* enumerations from "@basename@" */
#include "@basename@"
''',
  vhead : '''
GType
@enum_name@_get_type(void) {
    static gsize static_g_define_type_id = 0;

    if(g_once_init_enter(&static_g_define_type_id)) {
        static const G@Type@Value values [] = {
''',
  vprod : '''            { @VALUENAME@, "@VALUENAME@", "@valuenick@" },''',
  vtail : '''            { 0, NULL, NULL }
        };

        GType g_define_type_id =
            g_@type@_register_static(g_intern_static_string("@EnumName@"), values);
        g_once_init_leave(&static_g_define_type_id, g_define_type_id);
    }

    return static_g_define_type_id;
}
''')

conf = configuration_data()
conf.set('ENUM_FILE', 'enums3.h')
main = configure_file(
  input : 'main.c',
  output : 'main3.c',
  configuration : conf)

enumexe3 = executable('enumprog3', main, enums_c3, enums_h3,
dependencies : gobj)
test('enum test 3', enumexe3)

enums4 = gnome.mkenums_simple('enums4', sources : files('meson-sample.h'),
                              function_prefix : '_')
enumexe4 = executable('enumprog4', 'main4.c', enums4, dependencies : gobj)
test('enum test 4', enumexe4)

enums5 = gnome.mkenums_simple('enums5', sources : 'meson-sample.h',
                              install_header : true,
                              decorator : 'MESON_EXPORT',
                              header_prefix : '#include "meson-decls.h"')

conf = configuration_data()
conf.set('ENUM_FILE', 'enums5.h')
main = configure_file(
  input : 'main.c',
  output : 'main5.c',
  configuration : conf)

enumexe5 = executable('enumprog5', main, enums5, dependencies : gobj)
test('enum test 5', enumexe5)

# Generate template then use as input to mkenums

gen_h_template = configure_file(input: 'enums.h.in',
  output: 'enums6.h.in',
  copy: true)

enums_h6 = gnome.mkenums('enums6',
  sources : 'meson-sample.h',
  h_template : gen_h_template,
  ftail : '/* trailing header file info */',
  install_header : true,
  install_dir : get_option('includedir'))

conf = configuration_data()
conf.set('ENUM_FILE', 'enums6.h')
main = configure_file(
  input : 'main.c',
  output : 'main6.c',
  configuration : conf)

enumexe6 = executable('enumprog6', main, enums_c2, enums_h6,
dependencies : gobj)
test('enum test 6', enumexe6)

# Test with headers coming from other directories
# https://github.com/mesonbuild/meson/pull/10855
subdir('subdir')
enums7 = gnome.mkenums_simple('enums7', sources: ['meson-sample.h', h2, h3])
main = configure_file(
  input : 'main.c',
  output : 'main7.c',
  configuration : {'ENUM_FILE': 'enums7.h'})

enumexe7 = executable('enumprog7', main, enums7, dependencies : gobj)
test('enum test 7', enumexe7)
