Test Gtk and Atk generated ABI
And fix any related issues.
This commit is contained in:
parent
c02ee2eb1a
commit
d11000fa79
9 changed files with 124 additions and 10 deletions
|
@ -9,4 +9,4 @@ before_install:
|
||||||
- sudo pip3 install git+https://github.com/mesonbuild/meson/
|
- sudo pip3 install git+https://github.com/mesonbuild/meson/
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- meson build/ && ninja -C build/
|
- meson build/ && ninja -C build/ test
|
||||||
|
|
|
@ -109,13 +109,28 @@ source_gen = custom_target('atk_generated',
|
||||||
'--extra-includes', glib_api_includes,
|
'--extra-includes', glib_api_includes,
|
||||||
'--out', meson.current_build_dir(),
|
'--out', meson.current_build_dir(),
|
||||||
'--files', ';'.join(generated_sources),
|
'--files', ';'.join(generated_sources),
|
||||||
'--assembly-name', meson.project_name()
|
'--assembly-name', assembly_name,
|
||||||
|
'--glue-includes', 'atk/atk.h',
|
||||||
|
'--abi-cs-usings', 'Atk,GLib',
|
||||||
],
|
],
|
||||||
depends: [gapi_codegen, gapi_fixup],
|
depends: [gapi_codegen, gapi_fixup],
|
||||||
input: raw_api_fname,
|
input: raw_api_fname,
|
||||||
output: generated_sources,
|
output: generated_sources,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
c_abi = custom_target(assembly_name + '_c_abi',
|
||||||
|
input: raw_api_fname,
|
||||||
|
output: assembly_name + '-abi.c',
|
||||||
|
command: [generate_api, '--fakeglue'],
|
||||||
|
depends: [source_gen])
|
||||||
|
|
||||||
|
cs_abi = custom_target(assembly_name + '_cs_abi',
|
||||||
|
input: raw_api_fname,
|
||||||
|
output: assembly_name + '-abi.cs',
|
||||||
|
command: [generate_api, '--fakeglue'],
|
||||||
|
depends: [source_gen])
|
||||||
|
|
||||||
|
|
||||||
api_xml = custom_target(pkg + '_api_xml',
|
api_xml = custom_target(pkg + '_api_xml',
|
||||||
input: raw_api_fname,
|
input: raw_api_fname,
|
||||||
output: pkg + '-api.xml',
|
output: pkg + '-api.xml',
|
||||||
|
|
|
@ -31,3 +31,14 @@ atk_sharp = library(assembly_name, source_gen, sources, assemblyinfo,
|
||||||
nuget_infos += [['AtkSharp', atk_sharp, ['GlibSharp', 'GioSharp']]]
|
nuget_infos += [['AtkSharp', atk_sharp, ['GlibSharp', 'GioSharp']]]
|
||||||
install_infos += [assembly_name, atk_sharp.full_path()]
|
install_infos += [assembly_name, atk_sharp.full_path()]
|
||||||
atk_sharp_dep = declare_dependency(link_with: [glib_sharp, atk_sharp])
|
atk_sharp_dep = declare_dependency(link_with: [glib_sharp, atk_sharp])
|
||||||
|
|
||||||
|
if add_languages('c', required: false)
|
||||||
|
c_abi_exe = executable(assembly_name + '_c_abi', c_abi,
|
||||||
|
dependencies: [glib_dep, atk_dep])
|
||||||
|
|
||||||
|
cs_abi_exe = executable(assembly_name + '_cs_abi', cs_abi,
|
||||||
|
cs_args: ['-nowarn:169', '-nowarn:108', '-nowarn:114', '-nowarn:0618', '-unsafe'],
|
||||||
|
dependencies: [atk_sharp_dep])
|
||||||
|
|
||||||
|
test(assembly_name + 'abi', diff, args: [c_abi_exe.full_path(), cs_abi_exe.full_path()])
|
||||||
|
endif
|
||||||
|
|
28
Source/audit/test_abi.py
Executable file
28
Source/audit/test_abi.py
Executable file
|
@ -0,0 +1,28 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import difflib
|
||||||
|
import sys
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
reference_abi = subprocess.check_output(sys.argv[1]).decode().split("\n")
|
||||||
|
launcher = []
|
||||||
|
if shutil.which("mono"):
|
||||||
|
launcher = ["mono", "--debug"]
|
||||||
|
csharp_abi = subprocess.check_output(launcher + [sys.argv[2]]).decode().split("\n")
|
||||||
|
print("Comparing output of %s and %s" % (sys.argv[1], sys.argv[2]))
|
||||||
|
|
||||||
|
res = 0
|
||||||
|
for line in difflib.unified_diff(reference_abi, csharp_abi):
|
||||||
|
res = 1
|
||||||
|
print(line)
|
||||||
|
|
||||||
|
if res:
|
||||||
|
files = [(sys.argv[1] + ".res", reference_abi),
|
||||||
|
(sys.argv[2] + 'res', csharp_abi)]
|
||||||
|
|
||||||
|
for f, vals in files:
|
||||||
|
with open(f, "w") as _f:
|
||||||
|
print("Outputing results in " + f)
|
||||||
|
_f.write("\n".join(vals))
|
||||||
|
sys.exit(res)
|
|
@ -16,6 +16,7 @@ if __name__ == "__main__":
|
||||||
parser.add_argument("--gapi-codegen")
|
parser.add_argument("--gapi-codegen")
|
||||||
parser.add_argument("--glue-file", default="")
|
parser.add_argument("--glue-file", default="")
|
||||||
parser.add_argument("--glue-includes", default="")
|
parser.add_argument("--glue-includes", default="")
|
||||||
|
parser.add_argument("--abi-cs-usings", default="")
|
||||||
parser.add_argument("--glue-libname", default="")
|
parser.add_argument("--glue-libname", default="")
|
||||||
parser.add_argument("--assembly-name")
|
parser.add_argument("--assembly-name")
|
||||||
parser.add_argument("--extra-includes", action='append', default=[])
|
parser.add_argument("--extra-includes", action='append', default=[])
|
||||||
|
@ -38,7 +39,7 @@ if __name__ == "__main__":
|
||||||
shutil.copyfile(opts.api_raw, api_xml)
|
shutil.copyfile(opts.api_raw, api_xml)
|
||||||
|
|
||||||
if shutil.which('mono'):
|
if shutil.which('mono'):
|
||||||
launcher = ['mono']
|
launcher = ['mono', '--debug']
|
||||||
else:
|
else:
|
||||||
launcher = []
|
launcher = []
|
||||||
|
|
||||||
|
@ -55,11 +56,17 @@ if __name__ == "__main__":
|
||||||
'--glue-filename=' + opts.glue_file,
|
'--glue-filename=' + opts.glue_file,
|
||||||
'--gluelib-name=' + opts.glue_libname,
|
'--gluelib-name=' + opts.glue_libname,
|
||||||
'--glue-includes=' + opts.glue_includes,
|
'--glue-includes=' + opts.glue_includes,
|
||||||
'--assembly-name=' + opts.assembly_name,]
|
'--assembly-name=' + opts.assembly_name,
|
||||||
|
'--abi-c-filename=' + os.path.join(opts.out, opts.assembly_name + "-abi.c"),
|
||||||
|
'--abi-cs-filename=' + os.path.join(opts.out, opts.assembly_name + "-abi.cs"),
|
||||||
|
]
|
||||||
|
|
||||||
if opts.schema:
|
if opts.schema:
|
||||||
cmd += ['--schema=' + opts.schema]
|
cmd += ['--schema=' + opts.schema]
|
||||||
|
|
||||||
|
if opts.abi_cs_usings:
|
||||||
|
cmd += ['--abi-cs-usings=' + opts.abi_cs_usings]
|
||||||
|
|
||||||
cmd += ['-I' + i for i in opts.extra_includes]
|
cmd += ['-I' + i for i in opts.extra_includes]
|
||||||
|
|
||||||
subprocess.check_call(launcher + cmd)
|
subprocess.check_call(launcher + cmd)
|
||||||
|
|
|
@ -907,10 +907,36 @@
|
||||||
<attr path="/api/namespace/object[@cname='GtkWindow']/property[@cname='is-maximized']" name="name">Maximized</attr>
|
<attr path="/api/namespace/object[@cname='GtkWindow']/property[@cname='is-maximized']" name="name">Maximized</attr>
|
||||||
<attr path="/api/namespace/object[@cname='GtkWindow']/signal[@name='ActivateDefault']" name="name">DefaultActivated</attr>
|
<attr path="/api/namespace/object[@cname='GtkWindow']/signal[@name='ActivateDefault']" name="name">DefaultActivated</attr>
|
||||||
<attr path="/api/namespace/object[@cname='GtkWindow']/signal[@name='ActivateFocus']" name="name">FocusActivated</attr>
|
<attr path="/api/namespace/object[@cname='GtkWindow']/signal[@name='ActivateFocus']" name="name">FocusActivated</attr>
|
||||||
<attr path="/api/namespace/object/class_struct[@cname='GtkRangeClass']/field[@name='Gchar']" name="name" max-matches="1">slider_detail</attr>
|
|
||||||
<attr path="/api/namespace/object/class_struct[@cname='GtkRangeClass']/field[@name='slider_detail']" name="type">gchar*</attr>
|
<attr path="/api/namespace/object/class_struct[@cname='GtkCustomPaperUnixDialogClass']" name="private">true</attr>
|
||||||
<attr path="/api/namespace/object/class_struct[@cname='GtkRangeClass']/field[@name='Gchar']" name="name">stepper_detail</attr>
|
<attr path="/api/namespace/object/class_struct[@cname='GtkWin32EmbedWidgetClass']" name="private">true</attr>
|
||||||
<attr path="/api/namespace/object/class_struct[@cname='GtkRangeClass']/field[@name='stepper_detail']" name="type">gchar*</attr>
|
<attr path="/api/namespace/object/class_struct[@cname='GtkClipboardClass']" name="private">true</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkEventControllerClass']" name="private">true</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkGestureClass']" name="private">true</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkPlacesSidebarClass']" name="private">true</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkGestureZoomClass']" name="private">true</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkGestureSwipeClass']" name="private">true</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkGestureMultiPressClass']" name="private">true</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkShortcutsSectionClass']" name="private">true</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkTrashMonitorClass']" name="private">true</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkModifierStyleClass']" name="private">true</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkPageSetupUnixDialogClass']" name="private">true</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkPlugClass']" name="private">true</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkPrinterClass']" name="private">true</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkPrintJobClass']" name="private">true</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkPrintUnixDialogClass']" name="private">true</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkSocketClass']" name="private">true</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkTrayIconClass']" name="private">true</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkTreeMenuClass']" name="private">true</attr>
|
||||||
|
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkRangeClass']/field[@name='Gchar']" name="name" max-matches="1">SliderDetail</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkRangeClass']/field[@name='SliderDetail']" name="type">gchar*</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkRangeClass']/field[@name='SliderDetail']" name="cname">slider_detail</attr>
|
||||||
|
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkRangeClass']/field[@name='Gchar']" name="name">StepperDetail</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkRangeClass']/field[@name='StepperDetail']" name="type">gchar*</attr>
|
||||||
|
<attr path="/api/namespace/object/class_struct[@cname='GtkRangeClass']/field[@name='StepperDetail']" name="cname">stepper_detail</attr>
|
||||||
|
|
||||||
<attr path="/api/namespace/struct[@cname='GtkBindingArg']" name="hidden">1</attr>
|
<attr path="/api/namespace/struct[@cname='GtkBindingArg']" name="hidden">1</attr>
|
||||||
<attr path="/api/namespace/struct[@cname='GtkBindingEntry']" name="hidden">1</attr>
|
<attr path="/api/namespace/struct[@cname='GtkBindingEntry']" name="hidden">1</attr>
|
||||||
<attr path="/api/namespace/struct[@cname='GtkBindingSet']" name="hidden">1</attr>
|
<attr path="/api/namespace/struct[@cname='GtkBindingSet']" name="hidden">1</attr>
|
||||||
|
@ -936,6 +962,7 @@
|
||||||
<attr path="/api/namespace/*[@cname='GtkTargetList']/constructor[@cname='gtk_target_list_new']" name="hidden">1</attr>
|
<attr path="/api/namespace/*[@cname='GtkTargetList']/constructor[@cname='gtk_target_list_new']" name="hidden">1</attr>
|
||||||
<attr path="/api/namespace/*[@cname='GtkTargetList']/method[@name='AddTable']/*/*[@name='targets']" name="array">1</attr>
|
<attr path="/api/namespace/*[@cname='GtkTargetList']/method[@name='AddTable']/*/*[@name='targets']" name="array">1</attr>
|
||||||
<attr path="/api/namespace/*[@cname='GtkTargetList']/method[@name='AddTable']/*/*[@name='ntargets']" name="name">n_targets</attr>
|
<attr path="/api/namespace/*[@cname='GtkTargetList']/method[@name='AddTable']/*/*[@name='ntargets']" name="name">n_targets</attr>
|
||||||
|
<attr path="/api/namespace/struct[@cname='GtkTextAppearance']" name="opaque">true</attr>
|
||||||
<attr path="/api/namespace/struct[@cname='GtkTextAppearance']/field[@cname='underline']" name="type">PangoUnderline</attr>
|
<attr path="/api/namespace/struct[@cname='GtkTextAppearance']/field[@cname='underline']" name="type">PangoUnderline</attr>
|
||||||
<attr path="/api/namespace/struct[@cname='GtkTextAppearance']/field[@cname='draw_bg']" name="hidden">1</attr>
|
<attr path="/api/namespace/struct[@cname='GtkTextAppearance']/field[@cname='draw_bg']" name="hidden">1</attr>
|
||||||
<attr path="/api/namespace/struct[@cname='GtkTextAppearance']/field[@cname='inside_selection']" name="hidden">1</attr>
|
<attr path="/api/namespace/struct[@cname='GtkTextAppearance']/field[@cname='inside_selection']" name="hidden">1</attr>
|
||||||
|
|
|
@ -1065,7 +1065,7 @@ source_gen = custom_target(assembly_name + 'codegen',
|
||||||
generate_api,
|
generate_api,
|
||||||
'--api-raw', '@INPUT@',
|
'--api-raw', '@INPUT@',
|
||||||
'--gapi-fixup', gapi_fixup.full_path(),
|
'--gapi-fixup', gapi_fixup.full_path(),
|
||||||
'--metadata', metadata_fname,
|
'--metadata', metadata,
|
||||||
'--symbols', symbols,
|
'--symbols', symbols,
|
||||||
'--gapi-codegen', gapi_codegen.full_path(),
|
'--gapi-codegen', gapi_codegen.full_path(),
|
||||||
'--extra-includes', glib_api_includes,
|
'--extra-includes', glib_api_includes,
|
||||||
|
@ -1078,10 +1078,23 @@ source_gen = custom_target(assembly_name + 'codegen',
|
||||||
'--out', meson.current_build_dir(),
|
'--out', meson.current_build_dir(),
|
||||||
'--files', ';'.join(generated_sources),
|
'--files', ';'.join(generated_sources),
|
||||||
'--assembly-name', assembly_name,
|
'--assembly-name', assembly_name,
|
||||||
|
'--abi-cs-usings', 'Gtk,GLib',
|
||||||
'--schema', schema,
|
'--schema', schema,
|
||||||
],
|
],
|
||||||
depends: [gapi_codegen, gapi_fixup])
|
depends: [gapi_codegen, gapi_fixup])
|
||||||
|
|
||||||
|
c_abi = custom_target(assembly_name + '_c_abi',
|
||||||
|
input: raw_api_fname,
|
||||||
|
output: assembly_name + '-abi.c',
|
||||||
|
command: [generate_api, '--fakeglue'],
|
||||||
|
depends: [source_gen])
|
||||||
|
|
||||||
|
cs_abi = custom_target(assembly_name + '_cs_abi',
|
||||||
|
input: raw_api_fname,
|
||||||
|
output: assembly_name + '-abi.cs',
|
||||||
|
command: [generate_api, '--fakeglue'],
|
||||||
|
depends: [source_gen])
|
||||||
|
|
||||||
api_xml = custom_target(pkg + '_api_xml',
|
api_xml = custom_target(pkg + '_api_xml',
|
||||||
input: raw_api_fname,
|
input: raw_api_fname,
|
||||||
output: pkg + '-api.xml',
|
output: pkg + '-api.xml',
|
||||||
|
|
|
@ -3,7 +3,7 @@ assembly_name = pkg + '-sharp'
|
||||||
symbols = join_paths(meson.current_source_dir(), pkg + '-symbols.xml')
|
symbols = join_paths(meson.current_source_dir(), pkg + '-symbols.xml')
|
||||||
|
|
||||||
raw_api_fname = join_paths(meson.current_source_dir(), pkg + '-api.raw')
|
raw_api_fname = join_paths(meson.current_source_dir(), pkg + '-api.raw')
|
||||||
metadata_fname = join_paths(meson.current_source_dir(), 'Gtk.metadata')
|
metadata = files('Gtk.metadata')
|
||||||
glueincludes = 'gtk/gtk.h'
|
glueincludes = 'gtk/gtk.h'
|
||||||
gluefile = join_paths(meson.current_build_dir(), 'generate.c')
|
gluefile = join_paths(meson.current_build_dir(), 'generate.c')
|
||||||
|
|
||||||
|
@ -144,3 +144,15 @@ nuget_infos += [['GtkSharp', gtk_sharp, ['GlibSharp', 'GioSharp',
|
||||||
'AtkSharp', 'GdkSharp']]]
|
'AtkSharp', 'GdkSharp']]]
|
||||||
install_infos += [assembly_name, gtk_sharp.full_path()]
|
install_infos += [assembly_name, gtk_sharp.full_path()]
|
||||||
gtk_sharp_dep = declare_dependency(link_with: deps + [gtk_sharp])
|
gtk_sharp_dep = declare_dependency(link_with: deps + [gtk_sharp])
|
||||||
|
|
||||||
|
if add_languages('c', required: false)
|
||||||
|
c_abi_exe = executable(assembly_name + '_c_abi', c_abi,
|
||||||
|
c_args: ['-Wno-deprecated', '-Wno-deprecated-declarations'],
|
||||||
|
dependencies: [glib_dep, gio_dep, atk_dep, gdk_dep, gtk_dep])
|
||||||
|
|
||||||
|
cs_abi_exe = executable(assembly_name + '_cs_abi', cs_abi,
|
||||||
|
cs_args: ['-nowarn:169', '-nowarn:108', '-nowarn:114', '-nowarn:0618', '-unsafe'],
|
||||||
|
dependencies: [gtk_sharp_dep])
|
||||||
|
|
||||||
|
test(assembly_name + 'abi', diff, args: [c_abi_exe.full_path(), cs_abi_exe.full_path()])
|
||||||
|
endif
|
||||||
|
|
|
@ -38,6 +38,7 @@ assemblyinfo='/AssemblyInfo.cs'
|
||||||
|
|
||||||
gacutil = find_program('gacutil')
|
gacutil = find_program('gacutil')
|
||||||
al = find_program('al')
|
al = find_program('al')
|
||||||
|
diff = find_program('audit/test_abi.py')
|
||||||
|
|
||||||
glib_dep = dependency('glib-2.0', version: glib_required_version,
|
glib_dep = dependency('glib-2.0', version: glib_required_version,
|
||||||
fallback: ['glib', 'libglib_dep'])
|
fallback: ['glib', 'libglib_dep'])
|
||||||
|
|
Loading…
Reference in a new issue