# 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

# Simple trick to copy the file without substitutions, can be
# removed when https://github.com/mesonbuild/meson/pull/3383 is fixed
gen_h_template = configure_file(input: 'enums.h.in',
  output: 'enums6.h.in',
  configuration: configuration_data(),
  format: 'cmake')

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)
