From a4a3a7fe4bfeb4dae50c2c97f77f883a7af8e83f Mon Sep 17 00:00:00 2001 From: Julia DeMille Date: Mon, 5 Feb 2024 18:00:10 -0600 Subject: [PATCH] Add X-Plane plugin SDK `x-plane-sdk` Signed-off-by: Julia DeMille --- ci_config.json | 5 + releases.json | 10 ++ .../packagefiles/x-plane-sdk/meson.build | 128 ++++++++++++++++++ .../x-plane-sdk/meson_options.txt | 4 + subprojects/x-plane-sdk.wrap | 12 ++ tools/sanity_checks.py | 4 + 6 files changed, 163 insertions(+) create mode 100644 subprojects/packagefiles/x-plane-sdk/meson.build create mode 100644 subprojects/packagefiles/x-plane-sdk/meson_options.txt create mode 100644 subprojects/x-plane-sdk.wrap diff --git a/ci_config.json b/ci_config.json index c393a2b0aa..45e78effc3 100644 --- a/ci_config.json +++ b/ci_config.json @@ -869,5 +869,10 @@ "wayland:tests=false", "wayland:dtd_validation=false" ] + }, + "x-plane-sdk": { + "build_options": [ + "x-plane-sdk:cpp=enabled" + ] } } diff --git a/releases.json b/releases.json index 305cc2aa3c..daf60d53d3 100644 --- a/releases.json +++ b/releases.json @@ -3347,6 +3347,16 @@ "0.3.0-1" ] }, + "x-plane-sdk": { + "dependency_names": [ + "xplm", + "xpwidgets", + "xpcpp" + ], + "versions": [ + "4.0.1-1" + ] + }, "xtensor": { "dependency_names": [ "xtensor" diff --git a/subprojects/packagefiles/x-plane-sdk/meson.build b/subprojects/packagefiles/x-plane-sdk/meson.build new file mode 100644 index 0000000000..08fd1127b4 --- /dev/null +++ b/subprojects/packagefiles/x-plane-sdk/meson.build @@ -0,0 +1,128 @@ +project( + 'x-plane-sdk', + 'c', + version: '4.0.1', + license: 'MIT', + default_options: 'warning_level=0', +) + +xplm_incdir = include_directories('SDK/CHeaders/XPLM') +widgets_incdir = include_directories('SDK/CHeaders/Widgets') +wrappers_incdir = include_directories('SDK/CHeaders/Wrappers') + +cc = meson.get_compiler('c') + +ca = [] +xplm_level = get_option('xplm_level') + +if xplm_level >= 200 + ca += '-DXPLM200' +endif + +if xplm_level >= 210 + ca += '-DXPLM210' +endif + +if xplm_level >= 300 + ca += '-DXPLM300' +endif + +if xplm_level >= 301 + ca += '-DXPLM301' +endif + +if xplm_level >= 303 + ca += '-DXPLM303' +endif + +if xplm_level >= 400 + ca += '-DXPLM400' +endif + +if target_machine.system() == 'windows' + ca += ['-DAPL=0', '-DIBM=1', '-DLIN=0'] + xplm_dep = declare_dependency( + compile_args: ca, + include_directories: [xplm_incdir], + dependencies: [ + cc.find_library( + 'XPLM_64', + dirs: [meson.current_source_dir() / 'SDK' / 'Libraries' / 'Win'], + ), + ], + ) + xpwidgets_dep = declare_dependency( + compile_args: ca, + include_directories: [widgets_incdir], + dependencies: [ + xplm_dep, + cc.find_library( + 'XPWidgets_64', + dirs: [meson.current_source_dir() / 'SDK' / 'Libraries' / 'Win'], + ), + ], + ) +elif target_machine.system() == 'darwin' + ca += ['-DAPL=1', '-DIBM=0', '-DLIN=0'] + xplm_dep = declare_dependency( + compile_args: ca, + link_args: [ + '-F' + meson.current_source_dir() / 'SDK' / 'Libraries' / 'Mac', + '-framework', + 'XPLM', + ], + include_directories: [xplm_incdir], + ) + xpwidgets_dep = declare_dependency( + compile_args: ca, + link_args: [ + '-F' + meson.current_source_dir() / 'SDK' / 'Libraries' / 'Mac', + '-framework', + 'XPWidgets', + ], + include_directories: [widgets_incdir], + dependencies: [xplm_dep], + ) +else + ca += ['-DAPL=0', '-DIBM=0', '-DLIN=1'] + xplm_dep = declare_dependency( + compile_args: ca, + include_directories: [xplm_incdir], + ) + xpwidgets_dep = declare_dependency( + compile_args: ca, + include_directories: [widgets_incdir], + dependencies: [xplm_dep], + ) +endif + +if get_option('cpp').enabled() + add_languages('cpp') + xpcpp_dir = 'SDK/CHeaders/Wrappers' + # There is no reason to make this a dynamic library. + # Static is the only sensible choice for this particular library. + xpcpp = static_library( + 'xpcpp', + cpp_args: ca, + include_directories: [wrappers_incdir], + pic: true, + dependencies: [xplm_dep, xpwidgets_dep], + sources: [ + xpcpp_dir / 'XPCBroadcaster.cpp', + xpcpp_dir / 'XPCDisplay.cpp', + xpcpp_dir / 'XPCListener.cpp', + xpcpp_dir / 'XPCProcessing.cpp', + xpcpp_dir / 'XPCWidgetAttachments.cpp', + xpcpp_dir / 'XPCWidget.cpp', + ], + ) + + xpcpp_dep = declare_dependency( + compile_args: ca, + dependencies: [xplm_dep, xpwidgets_dep], + include_directories: [wrappers_incdir], + link_with: [xpcpp], + ) +else + xpcpp_dep = disabler() +endif diff --git a/subprojects/packagefiles/x-plane-sdk/meson_options.txt b/subprojects/packagefiles/x-plane-sdk/meson_options.txt new file mode 100644 index 0000000000..9066dafc7c --- /dev/null +++ b/subprojects/packagefiles/x-plane-sdk/meson_options.txt @@ -0,0 +1,4 @@ +option('xplm_level', type: 'integer', min: 0, max: 400, value: 0, + description: 'The XPLM compatibility level to use. See the documentation.') +option('cpp', type: 'feature', value: 'disabled', + description: 'Build C++ wrappers') diff --git a/subprojects/x-plane-sdk.wrap b/subprojects/x-plane-sdk.wrap new file mode 100644 index 0000000000..216ed746b4 --- /dev/null +++ b/subprojects/x-plane-sdk.wrap @@ -0,0 +1,12 @@ +[wrap-file] +directory = x-plane-sdk-4.0.1 +source_url = https://developer.x-plane.com/wp-content/plugins/code-sample-generation/sample_templates/XPSDK401.zip +source_filename = x-plane-sdk-4.0.1.zip +source_hash = c1104e83d9b54b03d0084c1db52ee6491e5290994503e8dd2d4a0af637e2bdd7 +patch_directory = x-plane-sdk +lead_directory_missing = true + +[provide] +xplm = xplm_dep +xpwidgets = xpwidgets_dep +xpcpp = xpcpp_dep diff --git a/tools/sanity_checks.py b/tools/sanity_checks.py index 53eef3729d..a8e723bf47 100755 --- a/tools/sanity_checks.py +++ b/tools/sanity_checks.py @@ -300,6 +300,10 @@ def check_source_url(self, name: str, wrap_section: configparser.SectionProxy, v elif name == 'directxmath': # DirectXMath source url contains only tag name without version return True + elif name == 'x-plane-sdk': + segs = version.split('.') + self.assertEqual(len(segs), 3) + version = segs[0] + segs[1] + segs[2] source_url = wrap_section['source_url'] version_ = version.replace('.', '_') self.assertTrue(version in source_url or version_ in source_url,