diff --git a/meson.build b/meson.build index 83e9dc8117..b69113efa3 100644 --- a/meson.build +++ b/meson.build @@ -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) diff --git a/meson_options.txt b/meson_options.txt index 5ad5d6c8a6..0c70277826 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -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 index 0000000000..6020a63a75 --- /dev/null +++ b/src/bindings/mono/ecore_evas_mono/meson.build @@ -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 index 0000000000..263e2f2fa9 --- /dev/null +++ b/src/bindings/mono/efl_mono/map_generate.sh @@ -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 index 0000000000..9134de5bbd --- /dev/null +++ b/src/bindings/mono/efl_mono/meson.build @@ -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 index 0000000000..1d9e4e6a43 --- /dev/null +++ b/src/bindings/mono/eina_mono/meson.build @@ -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 index 0000000000..00371eb826 --- /dev/null +++ b/src/bindings/mono/eldbus_mono/meson.build @@ -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 index 0000000000..4fbdf51360 --- /dev/null +++ b/src/bindings/mono/eo_mono/meson.build @@ -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 index 0000000000..7782c7b31d --- /dev/null +++ b/src/bindings/mono/eolian_mono/meson.build @@ -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 index 0000000000..dc948a652e --- /dev/null +++ b/src/bindings/mono/meson.build @@ -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 index 0000000000..9567bd05ca --- /dev/null +++ b/src/tests/efl_mono/meson.build @@ -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] +)