On 15 April 2016 at 21:56, Chad Versace <chad.vers...@intel.com> wrote: > On 04/15/2016 09:36 AM, Jason Ekstrand wrote: >> On Fri, Apr 15, 2016 at 3:03 AM, Emil Velikov <emil.l.veli...@gmail.com >> <mailto:emil.l.veli...@gmail.com>> wrote: >> >> On 15 April 2016 at 03:32, Michel Dänzer <mic...@daenzer.net >> <mailto:mic...@daenzer.net>> wrote: >> > On 15.04.2016 11:14, Michel Dänzer wrote: >> >> On 14.04.2016 22:16, Emil Velikov wrote: >> >>> On 14 April 2016 at 09:23, Michel Dänzer <mic...@daenzer.net >> <mailto:mic...@daenzer.net>> wrote: >> >>>> From: Michel Dänzer <michel.daen...@amd.com >> <mailto:michel.daen...@amd.com>> >> >>>> >> >>>> Fixes build failure due to wl_proxy_marshal_constructor_versioned >> being >> >>>> unresolved when building against current wayland. >> >>>> >> >>>> This API was introduced in wayland 1.9.91 by commit 557032e3 ("Track >> >>>> protocol object versions inside wl_proxy."). The waffle code doesn't >> >>>> reference wl_proxy_marshal_constructor_versioned directly but >> >>>> indirectly via wayland-scanner. >> >>>> >> >>>> v2: >> >>>> * Add paragraph about how wl_proxy_marshal_constructor_versioned was >> >>>> introduced. (Emil Velikov) >> >>>> * Only resolve wl_proxy_marshal_constructor_versioned with wayland >> >= >> >>>> 1.9.91. >> >>>> >> >>>> Signed-off-by: Michel Dänzer <michel.daen...@amd.com >> <mailto:michel.daen...@amd.com>> >> >>>> --- >> >>>> src/waffle/wayland/wayland_wrapper.c | 5 +++++ >> >>>> src/waffle/wayland/wayland_wrapper.h | 8 ++++++++ >> >>>> 2 files changed, 13 insertions(+) >> >>>> >> >>>> diff --git a/src/waffle/wayland/wayland_wrapper.c >> b/src/waffle/wayland/wayland_wrapper.c >> >>>> index 6ffd5a9..fb66f9a 100644 >> >>>> --- a/src/waffle/wayland/wayland_wrapper.c >> >>>> +++ b/src/waffle/wayland/wayland_wrapper.c >> >>>> @@ -106,6 +106,11 @@ wayland_wrapper_init(void) >> >>>> RETRIEVE_WL_CLIENT_SYMBOL(wl_proxy_add_listener); >> >>>> RETRIEVE_WL_CLIENT_SYMBOL(wl_proxy_marshal); >> >>>> RETRIEVE_WL_CLIENT_SYMBOL(wl_proxy_marshal_constructor); >> >>>> +#if WAYLAND_VERSION_MAJOR == 1 && \ >> >>>> + (WAYLAND_VERSION_MINOR > 9 || \ >> >>>> + (WAYLAND_VERSION_MINOR == 9 && WAYLAND_VERSION_MICRO >= 91)) >> >>>> + >> RETRIEVE_WL_CLIENT_SYMBOL(wl_proxy_marshal_constructor_versioned); >> >>>> +#endif >> >>>> #undef RETRIEVE_WL_CLIENT_SYMBOL >> >>>> >> >>> I am slightly worried about this approach. It adds a so called >> 'hidden >> >>> dependency' and with it a possibility of things going horribly wrong. >> >>> It is something that we try to avoid with mesa as the deps version at >> >>> build time != run-time one. Or in other words, one might build >> against >> >>> wayland 1.9 and things will go crazy as you run wayland 1.10, or vice >> >>> versa. > > I prefer to avoid adding this "hidden dependency" (as Emil calls it) for > a Wayland function that Waffle doesn't use or need. Jason's solution of > importing wayland-client-protocol.h avoids that dependency, and it also > prevents this build-breakage problem from occuring in the future. > Then again importing bits from other projects tend to be quite a nasty solution. The place where I borrowed the idea from (libSDL) does/did not imports the protocol.
>> I think this is actually mostly ok. In the Wayland project, we were very >> careful to ensure that anything built against 1.9 would work when linked >> against 1.10. This should continue to be the case even with waffle's >> shim-layer. >> >> The problem is not that libwayland added a new symbol nor is it a problem >> that wayland-protocol.h was updated to use that new symbol. The problem is >> that waffle sticks a shim layer in between wayland-protocol.h and libwayland. >> This makes the wayland-protocol.h file effectively internal to waffle but >> still updatable by the distro. This is a layering violation. To keep this >> from happening in the future, you probably want to just check a version of >> wayland-client-protocol.h into the waffle repo so that it doesn't change out >> from under you and make waffle just use wayland-client-core.h. You can even >> check in the version from libwayland 1.9 if you'd like to keep waffle >> building against older versions. > > I think I understand you, but I'm not confident. Wayland's header dependencies > are, we can all admit, confusing. > > If Waffle does the following... > > a. Check into the repo the wayland-client-protocol.h from Wayland 1.9. > > ... then ... > > c. Waffle will successfully build against distro-provided Wayland headers > for wayland >= 1.9. Specifically, the system's wayland-client.h will > include Waffle's imported wayland-client-protocol.h, and nothing will > explode. > > d. If Waffle is built against the system's wayland-client.h from Wayland > 1.x (where x >= 9), the libwaffle can successfully dlopen and run > against > libwayland 1.y (where y > x). > > Jason, is that correct? > > To allow Waffle to continue building against older Wayland version, we may be > able to import Wayland 1.8's (instead of 1.9's) wayland-client-protocol.h, as > 1.8 is the first release in which the wayland-client-protocol.h was split out > from wayland-client.h. > This is precisely the subtlety in the whole thing. The wayland protocol tried (and I believe so far is) backwards compatible, then again the library that we use is not. This is a fundamental difference that causes these headaches. If one is to import protocol vX, what happens as libwayland tries to use feature A or B introduced in newer protocols via the same API ? They have to reimplement everything on their own - bad idea. How about the earlier patch was resolving another ABI break ? The developers rightfully broke it because things were racy. Do we want to check-in old version and be forced to use the racy interface ? >> Another option would be to add a wrapper around >> wl_proxy_marshal_constructor_versioned that calls >> wl_proxy_marshal_constructor_versioned if it's available and falls back to >> wl_proxy_marshal_constructor it it's not. Then pull in the header from >> wayland 1.10. That way it will build and even link against any libwayland >> version but will use the new versioned constructor function when it's >> available. > > I don't like the above option. I think Waffle should *not* provide its own > re-implementation of any Wayland function. > As mentioned above if we check in the protocol you would need to copy/reimplement it in waffle. If we don't we'll effectively use the one provided by libwayland, at the expense of writing a 3-4 line patch every time things break. Which admittedly is not that often. > Is there a signficant benefit to Waffle if it uses the versioned constructor? > Keep in mind that Waffle uses Wayland very minimally. It probably doesn't > care about versioned objects. > I'd imagine at some point we might case. With my proposal (and patch should be out) in place this is just detail which we don't need to know ;-) >> In either case, I think checking wayland-client-protocol.h into the repo is >> a must. > > I'm convinced. Unfortunately I'm not ;'-( I believe I've presented enough arguments, although if you think that any of them is not off please let me know. My wayland-foo is very limited. Thanks Emil _______________________________________________ waffle mailing list firstname.lastname@example.org https://lists.freedesktop.org/mailman/listinfo/waffle