meson: time for the c-sharp build
authorMarcel Hollerbach <mail@marcel-hollerbach.de>
Wed, 17 Oct 2018 11:04:07 +0000 (13:04 +0200)
committerYeongjong Lee <yj34.lee@samsung.com>
Thu, 8 Nov 2018 06:40:46 +0000 (15:40 +0900)
The tests are added and build. For running C# code please see the wiki.

you can enable -Dmono=true

Differential Revision: https://phab.enlightenment.org/D7203

meson.build
meson_options.txt
src/bindings/mono/ecore_evas_mono/meson.build [new file with mode: 0644]
src/bindings/mono/efl_mono/map_generate.sh [new file with mode: 0755]
src/bindings/mono/efl_mono/meson.build [new file with mode: 0644]
src/bindings/mono/eina_mono/meson.build [new file with mode: 0644]
src/bindings/mono/eldbus_mono/meson.build [new file with mode: 0644]
src/bindings/mono/eo_mono/meson.build [new file with mode: 0644]
src/bindings/mono/eolian_mono/meson.build [new file with mode: 0644]
src/bindings/mono/meson.build [new file with mode: 0644]
src/tests/efl_mono/meson.build [new file with mode: 0644]

index 83e9dc8..b69113e 100644 (file)
@@ -1,4 +1,4 @@
-project('efl', ['c','cpp'],
+project('efl', ['c','cpp', 'cs'],
   version: '1.21.99',
   default_options : ['buildtype=plain'],
   meson_version : '>=0.46'
@@ -313,7 +313,7 @@ subdir(join_paths('src', 'bin', 'efl'))
 subdir(join_paths('src', 'generic', 'evas'))
 subdir(join_paths('src', 'generic', 'emotion'))
 
-bindings = ['luajit', 'cxx']
+bindings = ['luajit', 'cxx', 'mono']
 
 foreach binding : bindings
   if get_option(binding)
index 5ad5d6c..0c70277 100644 (file)
@@ -321,3 +321,9 @@ option('cxx',
   value: true,
   description: 'Flag for handling cxx bindings'
 )
+
+option('mono',
+  type: 'boolean',
+  value: true,
+  description: 'Flag for handling c# bindings'
+)
diff --git a/src/bindings/mono/ecore_evas_mono/meson.build b/src/bindings/mono/ecore_evas_mono/meson.build
new file mode 100644 (file)
index 0000000..6020a63
--- /dev/null
@@ -0,0 +1 @@
+mono_files += files('ecore_evas.cs')
diff --git a/src/bindings/mono/efl_mono/map_generate.sh b/src/bindings/mono/efl_mono/map_generate.sh
new file mode 100755 (executable)
index 0000000..263e2f2
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+find ${MESON_SOURCE_ROOT}/src/lib/ -iname "*\.eo" | sed -n 's/.*\/src\/lib\/\([a-z0-9_]*\)[\/a-z]*\/\([a-z0-9\._]*\)/\2,\1/pg'
diff --git a/src/bindings/mono/efl_mono/meson.build b/src/bindings/mono/efl_mono/meson.build
new file mode 100644 (file)
index 0000000..9134de5
--- /dev/null
@@ -0,0 +1,35 @@
+mono_files += files('efl_all.cs')
+
+bash = find_program('bash')
+
+map = run_command('map_generate.sh').stdout()
+
+
+efl_mono_lib = library('eflcustomexportsmono',
+    join_paths('..', '..', '..', 'lib', 'efl_mono', 'efl_custom_exports_mono.c'),
+    install : true,
+    install_dir : join_paths(dir_lib, 'efl-mono-'+version_major),
+    dependencies : [eo, eina]
+)
+
+efl_libs = configuration_data()
+efl_libs.set('EFL_MONO_LIBRARY_MAP', map)
+efl_libs.set('CUSTOM_EXPORTS_MONO_DL_MONO', 'eflcustomexportsmono')
+efl_libs.set('EVIL_DL_MONO', 'dl')
+
+foreach mono_libs : mono_sublibs
+  key = mono_libs[0].to_upper()+'_DL_MONO'
+  efl_libs.set(key, mono_libs[0].to_lower())
+endforeach
+
+configure_file(
+  input: 'efl_libs.csv.in',
+  output: 'efl_libs.csv',
+  configuration: efl_libs
+)
+
+efl_src = configure_file(
+  input: 'efl_libs.cs.in',
+  output: 'efl_libs.cs',
+  configuration: efl_libs
+)
diff --git a/src/bindings/mono/eina_mono/meson.build b/src/bindings/mono/eina_mono/meson.build
new file mode 100644 (file)
index 0000000..1d9e4e6
--- /dev/null
@@ -0,0 +1,20 @@
+mono_files += files(
+  'eina_config.cs',
+  'eina_array.cs',
+  'eina_hash.cs',
+  'eina_list.cs',
+  'eina_inarray.cs',
+  'eina_inlist.cs',
+  'eina_iterator.cs',
+  'eina_container_common.cs',
+  'eina_common.cs',
+  'eina_log.cs',
+  'eina_binbuf.cs',
+  'eina_slice.cs',
+  'eina_stringshare.cs',
+  'eina_error.cs',
+  'eina_value.cs',
+  'eina_promises.cs',
+  'eina_accessor.cs',
+  'eina_strbuf.cs'
+)
diff --git a/src/bindings/mono/eldbus_mono/meson.build b/src/bindings/mono/eldbus_mono/meson.build
new file mode 100644 (file)
index 0000000..00371eb
--- /dev/null
@@ -0,0 +1,10 @@
+mono_files += files(
+  'eldbus_common.cs',
+  'eldbus_config.cs',
+  'eldbus_connection.cs',
+  'eldbus_message.cs',
+  'eldbus_object.cs',
+  'eldbus_pending.cs',
+  'eldbus_proxy.cs',
+  'eldbus_service.cs'
+)
diff --git a/src/bindings/mono/eo_mono/meson.build b/src/bindings/mono/eo_mono/meson.build
new file mode 100644 (file)
index 0000000..4fbdf51
--- /dev/null
@@ -0,0 +1,4 @@
+mono_files += files(
+  'iwrapper.cs',
+  'workaround.cs'
+)
diff --git a/src/bindings/mono/eolian_mono/meson.build b/src/bindings/mono/eolian_mono/meson.build
new file mode 100644 (file)
index 0000000..7782c7b
--- /dev/null
@@ -0,0 +1,9 @@
+inc_dir = include_directories(join_paths('..', '..', '..', 'bin', 'eolian_mono'))
+
+eolian_mono_gen = executable('eolian_mono',
+                   join_paths('..', '..', '..', 'bin', 'eolian_mono', 'eolian_mono.cc'),
+                   dependencies: [eina_cxx, eolian_cxx],
+                   install: true,
+                   include_directories : inc_dir,
+                   cpp_args : package_c_args,
+                 )
diff --git a/src/bindings/mono/meson.build b/src/bindings/mono/meson.build
new file mode 100644 (file)
index 0000000..dc948a6
--- /dev/null
@@ -0,0 +1,130 @@
+mono_sublibs = [
+  ['Eina',        true, ], #
+  ['Eolian',      true, ], #
+  ['Eo',          true, ], #
+  ['Ecore',      false, ], #
+  ['Efl',         true, ], #
+  ['Evas',       false, ], #
+  ['Edje',       false, ], #
+  ['Eldbus',      true, ], #
+  ['Ecore_Evas',  true, ], #
+  ['Elementary', false, ]  #
+]
+
+blacklisted_files = [
+  'efl_canvas_text.eo',
+  'efl_canvas_scene3d.eo',
+  'evas_canvas3d_camera.eo',
+  'evas_canvas3d_light.eo',
+  'evas_canvas3d_material.eo',
+  'evas_canvas3d_mesh.eo',
+  'evas_canvas3d_node.eo',
+  'evas_canvas3d_object.eo',
+  'evas_canvas3d_primitive.eo',
+  'evas_canvas3d_scene.eo',
+  'evas_canvas3d_texture.eo',
+  'efl_canvas_vg_object.eo',
+  'efl_vg.eo',
+  'efl_vg_container.eo',
+  'efl_vg_gradient.eo',
+  'efl_vg_gradient_radial.eo',
+  'efl_vg_gradient_linear.eo',
+  'efl_vg_root_node.eo',
+  'efl_vg_shape.eo.cs',
+  'efl_io_buffer.eo',
+  'efl_io_positioner.eo',
+  'efl_io_queue.eo',
+  'efl_io_sizer.eo',
+  'efl_io_closer_fd.eo',
+  'efl_io_buffered_stream.eo',
+  'efl_io_positioner_fd.eo',
+  'efl_io_reader_fd.eo',
+  'efl_io_writer_fd.eo',
+  'efl_io_copier_fd.eo',
+  'efl_io_sizer_fd.eo',
+  'efl_io_stdin.eo',
+  'efl_io_stdout.eo',
+  'efl_io_stderr.eo',
+  'efl_io_file.eo',
+  'efl_io_copier.eo',
+  'efl_object_override.eo',
+  'elm_web.eo',
+  'elm_map.eo',
+  'elm_combobox.eo',
+  'elm_list.eo',
+  'elm_genlist.eo',
+  'elm_view_list.eo',
+  'elm_genlist_item.eo',
+  'elm_gengrid.eo',
+  'elm_glview.eo.cs'
+]
+
+efl_mono_lib = library('eflcustomexportsmono',
+    join_paths('..', '..', 'lib', 'efl_mono', 'efl_custom_exports_mono.c'),
+    install : true,
+    dependencies : [eo, eina]
+)
+
+mono_generator_target = []
+mono_files = []
+foreach lib : mono_sublibs
+  package_name = lib[0].to_lower()
+  eo_file_subdirs = get_variable(package_name + '_eo_subdirs')
+  file_location = join_paths('..', '..', 'lib', package_name)
+
+  if (package_name != 'eldbus')
+    foreach eo_file_subdir : eo_file_subdirs
+      if eo_file_subdir != ''
+        mono_pub_eo_files = get_variable(package_name + '_' + eo_file_subdir +'_eo_files') + get_variable(package_name + '_' + eo_file_subdir + '_eot_files')
+      else
+        mono_pub_eo_files = get_variable(package_name +'_eo_files') + get_variable(package_name + '_eot_files')
+      endif
+
+      subdir_file_location = join_paths(file_location, eo_file_subdir)
+      foreach mono_gen_file : mono_pub_eo_files
+        if not blacklisted_files.contains(mono_gen_file)
+          mono_generator_target += custom_target('eolian_mono_gen_'+mono_gen_file.underscorify()+'',
+            input : join_paths(subdir_file_location, mono_gen_file),
+            output : [mono_gen_file + '.cs'],
+            command : [eolian_mono_gen, '-I', meson.current_source_dir(), eolian_include_directories,
+                                       '--dllimport', package_name,
+                                       '-o', join_paths(meson.current_build_dir(), mono_gen_file + '.cs'),
+                                       '@INPUT@'])
+        endif
+      endforeach
+    endforeach
+  endif
+  if lib[1]
+    subdir(package_name + '_mono')
+  endif
+endforeach
+
+legacy_evas_required_by_mono = ['evas_box.eo', 'evas_image.eo', 'evas_table.eo', 'evas_text.eo']
+subdir_file_location = join_paths('..', '..', 'lib', 'evas', 'canvas')
+foreach mono_gen_file : legacy_evas_required_by_mono
+  mono_generator_target += custom_target('eolian_mono_gen_'+mono_gen_file.underscorify()+'',
+            input : join_paths(subdir_file_location, mono_gen_file),
+            output : [mono_gen_file + '.cs'],
+            command : [eolian_mono_gen, '-I', meson.current_source_dir(), eolian_include_directories,
+                                       '--dllimport', 'evas',
+                                       '-o', join_paths(meson.current_build_dir(), mono_gen_file + '.cs'),
+                                       '@INPUT@'])
+endforeach
+
+efl_mono = library('efl_mono',
+    mono_generator_target + mono_files + [efl_src],
+    install : true,
+    install_dir : join_paths(dir_lib, 'efl-mono-'+version_major)
+)
+
+efl_mono_test_suite_path=join_paths(meson.current_build_dir())
+
+pkgconfig.generate(
+  name : 'efl-mono',
+  description : 'Efl C# bindings',
+  version : version_major + '.' + version_minor,
+  libraries : ['-r:${assemblies_dir}/efl_mono.dll'],
+  variables : ['assemblies_dir='+join_paths(dir_lib, 'efl-mono-'+version_major),
+               'mono_libs=-r:${assemblies_dir}/efl_mono.dll']
+)
+test_dirs += 'efl_mono'
diff --git a/src/tests/efl_mono/meson.build b/src/tests/efl_mono/meson.build
new file mode 100644 (file)
index 0000000..9567bd0
--- /dev/null
@@ -0,0 +1,69 @@
+eo_files = ['test_child.eo', 'test_numberwrapper.eo', 'test_testing.eo']
+
+eo_file_targets = []
+
+foreach eo_file : eo_files
+  eo_file_targets += custom_target('eolian_gen_' + eo_file,
+    input : eo_file,
+    output : [eo_file + '.h'],
+    command : [eolian_gen, '-I', meson.current_source_dir(), eolian_include_directories,
+                           '-o', 'h:' + join_paths(meson.current_build_dir(), eo_file + '.h'),
+                           '-o', 'c:' + join_paths(meson.current_build_dir(), eo_file + '.c'),
+                           '-gch', '@INPUT@'])
+endforeach
+
+
+
+efl_mono_native_test = library('efl_mono_native_test',
+    eo_file_targets + ['libefl_mono_native_test.c'],
+    dependencies : [ecore, eo, efl],
+)
+
+eo_file_targets = []
+
+foreach mono_gen_file : eo_files
+  eo_file_targets += custom_target('eolian_mono_gen_'+mono_gen_file.underscorify()+'',
+    input : mono_gen_file,
+    output : [mono_gen_file + '.cs'],
+    command : [eolian_mono_gen, '-I', meson.current_source_dir(), eolian_include_directories,
+                                '--dllimport', 'efl_mono_native_test',
+                                '-o', join_paths(meson.current_build_dir(), mono_gen_file + '.cs'),
+                                '@INPUT@'])
+endforeach
+
+efl_mono_test = library('efl_mono_test',
+    eo_file_targets,
+    link_with : [efl_mono],
+)
+
+efl_mono_src = [
+     'Main.cs',
+     'TestUtils.cs',
+     'BasicDirection.cs',
+     'Eina.cs',
+     'Eldbus.cs',
+     'Eo.cs',
+     'EoPromises.cs',
+     'Errors.cs',
+     'Evas.cs',
+     'Events.cs',
+     'FunctionPointers.cs',
+     'FunctionPointerMarshalling.cs',
+     'Parts.cs',
+     'Promises.cs',
+     'Strbuf.cs',
+     'Strings.cs',
+     'Structs.cs',
+     'Value.cs',
+     'ValueEolian.cs'
+]
+
+efl_mono_suite = executable('efl-mono-suite',
+  efl_mono_src,
+  link_with : [efl_mono, efl_mono_test],
+)
+
+test('efl-mono-suite',
+  efl_mono_suite,
+  env : ['MONO_PATH='+efl_mono_test_suite_path]
+)