aboutsummaryrefslogtreecommitdiff
path: root/graphics/wayland
diff options
context:
space:
mode:
authorBaptiste Daroussin <bapt@FreeBSD.org>2017-01-29 23:04:45 +0000
committerBaptiste Daroussin <bapt@FreeBSD.org>2017-01-29 23:04:45 +0000
commit7dc166606b9e5b155f45ee2f6cac61ac9ab04da9 (patch)
tree6b35b83e514ea208d1c7de1955b63e15a0bc7a3b /graphics/wayland
parent1a8c14a698805c423849e71432146cbc4b81b474 (diff)
downloadports-7dc166606b9e5b155f45ee2f6cac61ac9ab04da9.tar.gz
ports-7dc166606b9e5b155f45ee2f6cac61ac9ab04da9.zip
Move wayland to a better location
Notes
Notes: svn path=/head/; revision=432804
Diffstat (limited to 'graphics/wayland')
-rw-r--r--graphics/wayland/Makefile47
-rw-r--r--graphics/wayland/distinfo3
-rw-r--r--graphics/wayland/files/patch-Makefile.am29
-rw-r--r--graphics/wayland/files/patch-configure.ac56
-rw-r--r--graphics/wayland/files/patch-src_wayland-os.c114
-rw-r--r--graphics/wayland/files/patch-src_wayland-os.h28
-rw-r--r--graphics/wayland/files/patch-src_wayland-server.c82
-rw-r--r--graphics/wayland/files/patch-src_wayland-shm.c147
-rw-r--r--graphics/wayland/files/patch-tests_client-test.c19
-rw-r--r--graphics/wayland/files/patch-tests_connection-test.c29
-rw-r--r--graphics/wayland/files/patch-tests_event-loop-test.c40
-rw-r--r--graphics/wayland/files/patch-tests_os-wrappers-test.c185
-rw-r--r--graphics/wayland/files/patch-tests_queue-test.c21
-rw-r--r--graphics/wayland/files/patch-tests_sanity-test.c22
-rw-r--r--graphics/wayland/files/patch-tests_test-helpers.c52
-rw-r--r--graphics/wayland/files/patch-tests_test-runner.c170
-rw-r--r--graphics/wayland/pkg-descr13
-rw-r--r--graphics/wayland/pkg-plist32
18 files changed, 1089 insertions, 0 deletions
diff --git a/graphics/wayland/Makefile b/graphics/wayland/Makefile
new file mode 100644
index 000000000000..e0ea92859936
--- /dev/null
+++ b/graphics/wayland/Makefile
@@ -0,0 +1,47 @@
+# Created by: kwm@FreeBSD.org
+# $FreeBSD$
+
+# NOTE
+# Changes made by kwm to use kevent instead of epoll
+# are still in place. However, since libinput depends
+# on libepoll-shim the simplest to do was to have Wayland
+# also use it. Currently build will fail if epoll-shim
+# is not available but can be built without epoll-shim
+# if EPOLLSHIM_LIBS is cleared (configure.ac)
+#
+# TODO: Add condition for this in configure
+#
+# If we want to build Wayland with kwm's kevent patches
+# and use epoll-shim for libinput we have to change it
+# so that Wayland ignore epoll headers installed by
+# epoll-shim.
+# Maybe best is to use epoll-shim if it is good enough
+# and keep diff with upstream minimal.
+
+PORTNAME= wayland
+PORTVERSION= 1.12.0
+CATEGORIES= graphics wayland
+MASTER_SITES= http://wayland.freedesktop.org/releases/
+
+MAINTAINER= x11@FreeBSD.org
+COMMENT= Wayland composite "server"
+
+LICENSE= MIT
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+LIB_DEPENDS= libexpat.so:textproc/expat2 \
+ libffi.so:devel/libffi \
+ libepoll-shim.so:devel/libepoll-shim
+
+CFLAGS+= "-I${LOCALBASE}/include/libepoll-shim"
+
+WITH_DEBUG= 1
+
+USES= autoreconf gmake libtool localbase pathfix pkgconfig tar:xz
+USE_GNOME= libxslt:build
+USE_LDCONFIG= yes
+GNU_CONFIGURE= yes
+CONFIGURE_ARGS= --disable-documentation
+INSTALL_TARGET= install-strip
+
+.include <bsd.port.mk>
diff --git a/graphics/wayland/distinfo b/graphics/wayland/distinfo
new file mode 100644
index 000000000000..1217bc965ee2
--- /dev/null
+++ b/graphics/wayland/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1481659324
+SHA256 (wayland-1.12.0.tar.xz) = d6b4135cba0188abcb7275513c72dede751d6194f6edc5b82183a3ba8b821ab1
+SIZE (wayland-1.12.0.tar.xz) = 379520
diff --git a/graphics/wayland/files/patch-Makefile.am b/graphics/wayland/files/patch-Makefile.am
new file mode 100644
index 000000000000..c3b12cae4ba3
--- /dev/null
+++ b/graphics/wayland/files/patch-Makefile.am
@@ -0,0 +1,29 @@
+--- Makefile.am.orig 2016-02-29 23:30:58 UTC
++++ Makefile.am
+@@ -73,7 +73,7 @@ nodist_include_HEADERS = \
+ protocol/wayland-client-protocol.h
+
+ libwayland_server_la_CFLAGS = $(FFI_CFLAGS) $(AM_CFLAGS) -pthread
+-libwayland_server_la_LIBADD = $(FFI_LIBS) libwayland-private.la libwayland-util.la -lrt -lm
++libwayland_server_la_LIBADD = $(FFI_LIBS) $(EPOLLSHIM_LIBS) libwayland-private.la libwayland-util.la -lrt -lm
+ libwayland_server_la_LDFLAGS = -version-info 1:0:1
+ libwayland_server_la_SOURCES = \
+ src/wayland-server.c \
+@@ -85,7 +85,7 @@ nodist_libwayland_server_la_SOURCES = \
+ protocol/wayland-protocol.c
+
+ libwayland_client_la_CFLAGS = $(FFI_CFLAGS) $(AM_CFLAGS) -pthread
+-libwayland_client_la_LIBADD = $(FFI_LIBS) libwayland-private.la libwayland-util.la -lrt -lm
++libwayland_client_la_LIBADD = $(FFI_LIBS) $(EPOLLSHIM_LIBS) libwayland-private.la libwayland-util.la -lrt -lm
+ libwayland_client_la_LDFLAGS = -version-info 3:0:3
+ libwayland_client_la_SOURCES = \
+ src/wayland-client.c
+@@ -186,7 +186,7 @@ libtest_runner_la_LIBADD = \
+ libwayland-util.la \
+ libwayland-client.la \
+ libwayland-server.la \
+- -lrt -ldl $(FFI_LIBS)
++ -lrt $(DL_LIBS) $(FFI_LIBS) $(EPOLLSHIM_LIBS)
+
+
+ array_test_SOURCES = tests/array-test.c
diff --git a/graphics/wayland/files/patch-configure.ac b/graphics/wayland/files/patch-configure.ac
new file mode 100644
index 000000000000..a6c0d1737262
--- /dev/null
+++ b/graphics/wayland/files/patch-configure.ac
@@ -0,0 +1,56 @@
+--- configure.ac.orig 2016-06-01 00:11:10 UTC
++++ configure.ac
+@@ -63,6 +63,28 @@ AC_SUBST(GCC_CFLAGS)
+
+ AC_CHECK_FUNCS([accept4 mkostemp posix_fallocate])
+
++AC_CHECK_HEADERS([sys/signalfd.h sys/timerfd.h])
++
++# Use epoll on Linux or kqueue on BSD
++AC_CHECK_HEADERS([sys/epoll.h sys/event.h])
++if test "x$ac_cv_header_sys_epoll_h" != "xyes" && test "x$ac_cv_header_sys_event_h" != "xyes"; then
++ AC_MSG_ERROR([Can't find sys/epoll.h or sys/event.h. Please ensure either epoll or kqueue is available.])
++fi
++
++# Credential support on FreeBSD
++AC_CHECK_HEADERS([sys/ucred.h])
++
++# dlopen()
++AC_CHECK_LIB([dl], [dlsym], [DL_LIBS=-ldl])
++AC_SUBST([DL_LIBS])
++
++# Defines __FreeBSD__ if we're on FreeBSD
++AC_CHECK_HEADERS([sys/param.h])
++
++# waitid() and signal.h are needed for the test suite.
++AC_CHECK_FUNCS([waitid])
++AC_CHECK_HEADERS([signal.h])
++
+ AC_ARG_ENABLE([libraries],
+ [AC_HELP_STRING([--disable-libraries],
+ [Disable compilation of wayland libraries])],
+@@ -98,11 +120,12 @@ AC_SUBST([ICONDIR])
+
+ if test "x$enable_libraries" = "xyes"; then
+ PKG_CHECK_MODULES(FFI, [libffi])
++dnl convert SFD_CLOEXEC and TFD_CLOEXEC to warning while figuring out how to do this.
+ AC_CHECK_DECL(SFD_CLOEXEC,[],
+- [AC_MSG_ERROR("SFD_CLOEXEC is needed to compile wayland libraries")],
++ [AC_MSG_WARN("SFD_CLOEXEC is needed to compile wayland libraries")],
+ [[#include <sys/signalfd.h>]])
+ AC_CHECK_DECL(TFD_CLOEXEC,[],
+- [AC_MSG_ERROR("TFD_CLOEXEC is needed to compile wayland libraries")],
++ [AC_MSG_WARN("TFD_CLOEXEC is needed to compile wayland libraries")],
+ [[#include <sys/timerfd.h>]])
+ AC_CHECK_DECL(CLOCK_MONOTONIC,[],
+ [AC_MSG_ERROR("CLOCK_MONOTONIC is needed to compile wayland libraries")],
+@@ -110,6 +133,9 @@ if test "x$enable_libraries" = "xyes"; t
+ AC_CHECK_HEADERS([execinfo.h])
+ fi
+
++EPOLLSHIM_LIBS="-lepoll-shim"
++AC_SUBST(EPOLLSHIM_LIBS)
++
+ PKG_CHECK_MODULES(EXPAT, [expat], [],
+ [AC_CHECK_HEADERS(expat.h, [],
+ [AC_MSG_ERROR([Can't find expat.h. Please install expat.])])
diff --git a/graphics/wayland/files/patch-src_wayland-os.c b/graphics/wayland/files/patch-src_wayland-os.c
new file mode 100644
index 000000000000..5cb746638d3e
--- /dev/null
+++ b/graphics/wayland/files/patch-src_wayland-os.c
@@ -0,0 +1,114 @@
+--- src/wayland-os.c.orig 2015-07-06 19:38:51 UTC
++++ src/wayland-os.c
+@@ -25,14 +25,20 @@
+
+ #define _GNU_SOURCE
+
++#include "../config.h"
++
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ #include <unistd.h>
+ #include <fcntl.h>
+ #include <errno.h>
++#ifdef HAVE_SYS_EPOLL_H
+ #include <sys/epoll.h>
++#endif
++#ifdef HAVE_SYS_EVENT_H
++#include <sys/event.h>
++#endif
+
+-#include "../config.h"
+ #include "wayland-os.h"
+
+ static int
+@@ -62,26 +68,50 @@ wl_os_socket_cloexec(int domain, int typ
+ {
+ int fd;
+
++#ifdef SOCK_CLOEXEC
+ fd = socket(domain, type | SOCK_CLOEXEC, protocol);
+ if (fd >= 0)
+ return fd;
+ if (errno != EINVAL)
+ return -1;
++#endif
+
+ fd = socket(domain, type, protocol);
+ return set_cloexec_or_close(fd);
+ }
+
+ int
++wl_os_socketpair_cloexec(int domain, int type, int protocol, int sv[2])
++{
++ int retval;
++
++#ifdef SOCK_CLOEXEC
++ retval = socketpair(domain, type | SOCK_CLOEXEC, protocol, sv);
++ if (retval >= 0)
++ return retval;
++ if (errno != EINVAL)
++ return -1;
++#endif
++
++ retval = socketpair(domain, type, protocol, sv);
++ if (set_cloexec_or_close(sv[0]) < 0 || set_cloexec_or_close(sv[1]) < 0)
++ retval = -1;
++
++ return retval;
++}
++
++int
+ wl_os_dupfd_cloexec(int fd, long minfd)
+ {
+ int newfd;
+
++#ifdef F_DUPFD_CLOEXEC
+ newfd = fcntl(fd, F_DUPFD_CLOEXEC, minfd);
+ if (newfd >= 0)
+ return newfd;
+ if (errno != EINVAL)
+ return -1;
++#endif
+
+ newfd = fcntl(fd, F_DUPFD, minfd);
+ return set_cloexec_or_close(newfd);
+@@ -123,15 +153,18 @@ wl_os_recvmsg_cloexec(int sockfd, struct
+ {
+ ssize_t len;
+
++#ifdef MSG_CMSG_CLOEXEC
+ len = recvmsg(sockfd, msg, flags | MSG_CMSG_CLOEXEC);
+ if (len >= 0)
+ return len;
+ if (errno != EINVAL)
+ return -1;
++#endif
+
+ return recvmsg_cloexec_fallback(sockfd, msg, flags);
+ }
+
++#ifdef HAVE_SYS_EPOLL_H
+ int
+ wl_os_epoll_create_cloexec(void)
+ {
+@@ -148,6 +181,19 @@ wl_os_epoll_create_cloexec(void)
+ fd = epoll_create(1);
+ return set_cloexec_or_close(fd);
+ }
++#endif
++
++#ifdef HAVE_SYS_EVENT_H
++int
++wl_os_kqueue_create_cloexec(void)
++{
++ int fd;
++
++ fd = kqueue();
++
++ return set_cloexec_or_close(fd);
++}
++#endif
+
+ int
+ wl_os_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
diff --git a/graphics/wayland/files/patch-src_wayland-os.h b/graphics/wayland/files/patch-src_wayland-os.h
new file mode 100644
index 000000000000..a710f8b627f2
--- /dev/null
+++ b/graphics/wayland/files/patch-src_wayland-os.h
@@ -0,0 +1,28 @@
+--- src/wayland-os.h.orig 2015-07-06 19:38:51 UTC
++++ src/wayland-os.h
+@@ -30,13 +30,25 @@ int
+ wl_os_socket_cloexec(int domain, int type, int protocol);
+
+ int
++wl_os_socketpair_cloexec(int domain, int type, int protocol, int sv[2]);
++
++int
+ wl_os_dupfd_cloexec(int fd, long minfd);
+
+ ssize_t
+ wl_os_recvmsg_cloexec(int sockfd, struct msghdr *msg, int flags);
+
++/* FIXME? not sure if this will work in this header like this ...
++ though seems build only header perhaps? */
++#ifdef HAVE_SYS_EPOLL_H
+ int
+ wl_os_epoll_create_cloexec(void);
++#endif
++
++#ifdef HAVE_SYS_EVENT_H
++int
++wl_os_kqueue_create_cloexec(void);
++#endif
+
+ int
+ wl_os_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
diff --git a/graphics/wayland/files/patch-src_wayland-server.c b/graphics/wayland/files/patch-src_wayland-server.c
new file mode 100644
index 000000000000..efc16114e97f
--- /dev/null
+++ b/graphics/wayland/files/patch-src_wayland-server.c
@@ -0,0 +1,82 @@
+--- src/wayland-server.c.orig 2016-09-20 17:33:11.000000000 +0000
++++ src/wayland-server.c 2016-12-13 20:07:06.878000000 +0000
+@@ -25,6 +25,8 @@
+
+ #define _GNU_SOURCE
+
++#include "../config.h"
++
+ #include <stdlib.h>
+ #include <stdint.h>
+ #include <stddef.h>
+@@ -43,6 +45,11 @@
+ #include <sys/file.h>
+ #include <sys/stat.h>
+
++#ifdef HAVE_SYS_UCRED_H
++#include <sys/types.h>
++#include <sys/ucred.h>
++#endif
++
+ #include "wayland-util.h"
+ #include "wayland-private.h"
+ #include "wayland-server.h"
+@@ -79,7 +86,13 @@
+ struct wl_list link;
+ struct wl_map objects;
+ struct wl_signal destroy_signal;
++#ifdef HAVE_SYS_UCRED_H
++ /* FreeBSD */
++ struct xucred xucred;
++#else
++ /* Linux */
+ struct ucred ucred;
++#endif
+ int error;
+ struct wl_signal resource_created_signal;
+ };
+@@ -466,10 +479,20 @@
+ if (!client->source)
+ goto err_client;
+
++#if defined(SO_PEERCRED)
++ /* Linux */
+ len = sizeof client->ucred;
+ if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED,
+ &client->ucred, &len) < 0)
+ goto err_source;
++#elif defined(LOCAL_PEERCRED)
++ /* FreeBSD */
++ len = sizeof client->xucred;
++ if (getsockopt(fd, SOL_SOCKET, LOCAL_PEERCRED,
++ &client->xucred, &len) < 0 ||
++ client->xucred.cr_version != XUCRED_VERSION)
++ goto err_source;
++#endif
+
+ client->connection = wl_connection_create(fd);
+ if (client->connection == NULL)
+@@ -523,12 +546,23 @@
+ wl_client_get_credentials(struct wl_client *client,
+ pid_t *pid, uid_t *uid, gid_t *gid)
+ {
++#ifdef HAVE_SYS_UCRED_H
++ /* FreeBSD */
++ if (pid)
++ *pid = 0; /* FIXME: not defined on FreeBSD */
++ if (uid)
++ *uid = client->xucred.cr_uid;
++ if (gid)
++ *gid = client->xucred.cr_gid;
++#else
++ /* Linux */
+ if (pid)
+ *pid = client->ucred.pid;
+ if (uid)
+ *uid = client->ucred.uid;
+ if (gid)
+ *gid = client->ucred.gid;
++#endif
+ }
+
+ /** Get the file descriptor for the client
diff --git a/graphics/wayland/files/patch-src_wayland-shm.c b/graphics/wayland/files/patch-src_wayland-shm.c
new file mode 100644
index 000000000000..e773606d9fba
--- /dev/null
+++ b/graphics/wayland/files/patch-src_wayland-shm.c
@@ -0,0 +1,147 @@
+--- src/wayland-shm.c.orig 2016-03-09 00:55:02 UTC
++++ src/wayland-shm.c
+@@ -30,6 +30,8 @@
+
+ #define _GNU_SOURCE
+
++#include "../config.h"
++
+ #include <stdbool.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+@@ -57,6 +59,9 @@ struct wl_shm_pool {
+ char *data;
+ int32_t size;
+ int32_t new_size;
++#ifdef HAVE_SYS_UCRED_H
++ int fd;
++#endif
+ };
+
+ struct wl_shm_buffer {
+@@ -74,15 +79,24 @@ struct wl_shm_sigbus_data {
+ int fallback_mapping_used;
+ };
+
++static void *mremap_compat_maymove(void *, size_t, size_t, int, int, int);
++
+ static void
+ shm_pool_finish_resize(struct wl_shm_pool *pool)
+ {
+ void *data;
++ int fd = -1;
+
+ if (pool->size == pool->new_size)
+ return;
+
+- data = mremap(pool->data, pool->size, pool->new_size, MREMAP_MAYMOVE);
++#ifdef HAVE_SYS_UCRED_H
++ fd = pool->fd;
++#endif
++
++ data = mremap_compat_maymove(pool->data, pool->size, pool->new_size,
++ PROT_READ | PROT_WRITE, MAP_SHARED, fd);
++
+ if (data == MAP_FAILED) {
+ wl_resource_post_error(pool->resource,
+ WL_SHM_ERROR_INVALID_FD,
+@@ -108,6 +122,10 @@ shm_pool_unref(struct wl_shm_pool *pool,
+ if (pool->internal_refcount + pool->external_refcount)
+ return;
+
++#ifdef HAVE_SYS_UCRED_H
++ close(pool->fd);
++#endif
++
+ munmap(pool->data, pool->size);
+ free(pool);
+ }
+@@ -221,6 +239,73 @@ shm_pool_destroy(struct wl_client *clien
+ wl_resource_destroy(resource);
+ }
+
++#ifdef HAVE_MREMAP
++static void *
++mremap_compat_maymove(void *old_address, size_t old_size, size_t new_size,
++ int old_prot, int old_flags, int old_fd)
++{
++ return mremap(old_address, old_size, new_size, MREMAP_MAYMOVE);
++}
++#else
++static void *
++mremap_compat_maymove(void *old_address, size_t old_size, size_t new_size,
++ int old_prot, int old_flags, int old_fd)
++{
++ /* FreeBSD doesn't support mremap() yet, so we have to emulate it.
++ * This assumes MREMAP_MAYMOVE is the only flag in use. */
++ if (new_size == old_size) {
++ return old_address;
++ } else if (new_size < old_size) {
++ /* Shrinking: munmap() the spare region. */
++ munmap(old_address + old_size, new_size - old_size);
++ return old_address;
++ } else {
++ void *ret;
++
++ /* Growing. Try and mmap() the extra region at the end of
++ * our existing allocation. If that gets mapped in the
++ * wrong place, fall back to mmap()ing an entirely new
++ * region of new_size and copying the data across. */
++ ret = mmap(old_address + old_size, new_size - old_size,
++ old_prot, old_flags, old_fd, 0);
++
++/* FIXME TODO: msync() before munmap()? */
++ if (ret == MAP_FAILED) {
++ /* Total failure! */
++ return ret;
++ } else if (ret == old_address + old_size) {
++ /* Success. */
++ return old_address;
++ } else if (ret != old_address + old_size) {
++ /* Partial failure. Fall back to mapping an
++ * entirely new region. Unmap the region we
++ * just mapped first. */
++ munmap(ret, new_size - old_size);
++
++ /* Map an entirely new region. */
++ ret = mmap(NULL, new_size,
++ old_prot, old_flags, old_fd, 0);
++ if (ret == MAP_FAILED) {
++ /* Total failure! */
++ return ret;
++ }
++
++ /* Copy the old data across. Implicit assumption
++ * that the old and new regions don't overlap. */
++ memcpy(ret, old_address, old_size);
++
++ /* Unmap the old region. */
++ munmap(old_address, old_size);
++
++ return ret;
++ }
++ }
++
++ /* Unreachable. */
++ return MAP_FAILED;
++}
++#endif
++
+ static void
+ shm_pool_resize(struct wl_client *client, struct wl_resource *resource,
+ int32_t size)
+@@ -282,7 +367,14 @@ shm_create_pool(struct wl_client *client
+ "failed mmap fd %d", fd);
+ goto err_free;
+ }
++
++#ifdef HAVE_SYS_UCRED_H
++ /* We need to keep the FD around on FreeBSD so we can implement
++ * mremap(). See: mremap_compat_maymove(). */
++ pool->fd = fd;
++#else
+ close(fd);
++#endif
+
+ pool->resource =
+ wl_resource_create(client, &wl_shm_pool_interface, 1, id);
diff --git a/graphics/wayland/files/patch-tests_client-test.c b/graphics/wayland/files/patch-tests_client-test.c
new file mode 100644
index 000000000000..88822779dd6a
--- /dev/null
+++ b/graphics/wayland/files/patch-tests_client-test.c
@@ -0,0 +1,19 @@
+--- tests/client-test.c.orig 2015-07-06 19:38:51 UTC
++++ tests/client-test.c
+@@ -34,6 +34,7 @@
+ #include <sys/types.h>
+ #include <sys/stat.h>
+
++#include "wayland-os.h"
+ #include "wayland-private.h"
+ #include "wayland-server.h"
+ #include "test-runner.h"
+@@ -59,7 +60,7 @@ TEST(client_destroy_listener)
+ struct client_destroy_listener a, b;
+ int s[2];
+
+- assert(socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, s) == 0);
++ assert(wl_os_socketpair_cloexec(AF_UNIX, SOCK_STREAM, 0, s) == 0);
+ display = wl_display_create();
+ assert(display);
+ client = wl_client_create(display, s[0]);
diff --git a/graphics/wayland/files/patch-tests_connection-test.c b/graphics/wayland/files/patch-tests_connection-test.c
new file mode 100644
index 000000000000..2d06aa680d65
--- /dev/null
+++ b/graphics/wayland/files/patch-tests_connection-test.c
@@ -0,0 +1,29 @@
+--- tests/connection-test.c.orig 2016-02-17 01:13:16 UTC
++++ tests/connection-test.c
+@@ -36,6 +36,7 @@
+ #include <sys/stat.h>
+ #include <poll.h>
+
++#include "wayland-os.h"
+ #include "wayland-private.h"
+ #include "test-runner.h"
+ #include "test-compositor.h"
+@@ -47,7 +48,7 @@ setup(int *s)
+ {
+ struct wl_connection *connection;
+
+- assert(socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, s) == 0);
++ assert(wl_os_socketpair_cloexec(AF_UNIX, SOCK_STREAM, 0, s) == 0);
+
+ connection = wl_connection_create(s[0]);
+ assert(connection);
+@@ -145,8 +146,7 @@ struct marshal_data {
+ static void
+ setup_marshal_data(struct marshal_data *data)
+ {
+- assert(socketpair(AF_UNIX,
+- SOCK_STREAM | SOCK_CLOEXEC, 0, data->s) == 0);
++ assert(wl_os_socketpair_cloexec(AF_UNIX, SOCK_STREAM, 0, data->s) == 0);
+ data->read_connection = wl_connection_create(data->s[0]);
+ assert(data->read_connection);
+ data->write_connection = wl_connection_create(data->s[1]);
diff --git a/graphics/wayland/files/patch-tests_event-loop-test.c b/graphics/wayland/files/patch-tests_event-loop-test.c
new file mode 100644
index 000000000000..ab9416671168
--- /dev/null
+++ b/graphics/wayland/files/patch-tests_event-loop-test.c
@@ -0,0 +1,40 @@
+--- tests/event-loop-test.c.orig 2015-07-06 19:38:51 UTC
++++ tests/event-loop-test.c
+@@ -166,10 +166,10 @@ TEST(event_loop_signal)
+ signal_callback, &got_it);
+ assert(source);
+
+- wl_event_loop_dispatch(loop, 0);
++ assert(wl_event_loop_dispatch(loop, 0) == 0);
+ assert(!got_it);
+- kill(getpid(), SIGUSR1);
+- wl_event_loop_dispatch(loop, 0);
++ assert(kill(getpid(), SIGUSR1) == 0);
++ assert(wl_event_loop_dispatch(loop, 0) == 0);
+ assert(got_it == 1);
+
+ wl_event_source_remove(source);
+@@ -233,12 +233,20 @@ TEST(event_loop_timer)
+
+ source = wl_event_loop_add_timer(loop, timer_callback, &got_it);
+ assert(source);
+- wl_event_source_timer_update(source, 10);
+- wl_event_loop_dispatch(loop, 0);
++ assert(wl_event_source_timer_update(source, 10) == 0);
++ assert(wl_event_loop_dispatch(loop, 0) == 0);
+ assert(!got_it);
+- wl_event_loop_dispatch(loop, 20);
++ /* FreeBSD has a bug where it converts ms_timeout to ticks; it always adds 1 to the tick count.
++ * Consequently, we need to grossly overcompensate here.
++ * See: http://unix.derkeiler.com/Mailing-Lists/FreeBSD/hackers/2012-07/msg00319.html */
++ assert(wl_event_loop_dispatch(loop, 50) == 0);
+ assert(got_it == 1);
+
++ /* Check it doesn't fire again. */
++ got_it = 0;
++ assert(wl_event_loop_dispatch(loop, 20) == 0);
++ assert(!got_it);
++
+ wl_event_source_remove(source);
+ wl_event_loop_destroy(loop);
+ }
diff --git a/graphics/wayland/files/patch-tests_os-wrappers-test.c b/graphics/wayland/files/patch-tests_os-wrappers-test.c
new file mode 100644
index 000000000000..c8ec9c5492ce
--- /dev/null
+++ b/graphics/wayland/files/patch-tests_os-wrappers-test.c
@@ -0,0 +1,185 @@
+--- tests/os-wrappers-test.c.orig 2015-07-06 19:38:51 UTC
++++ tests/os-wrappers-test.c
+@@ -26,6 +26,8 @@
+
+ #define _GNU_SOURCE
+
++#include "../config.h"
++
+ #include <stdlib.h>
+ #include <assert.h>
+ #include <sys/types.h>
+@@ -37,7 +39,13 @@
+ #include <stdarg.h>
+ #include <fcntl.h>
+ #include <stdio.h>
++
++#ifdef HAVE_SYS_EPOLL_H
+ #include <sys/epoll.h>
++#elif HAVE_SYS_EVENT_H
++#include <sys/event.h>
++#include <sys/types.h>
++#endif
+
+ #include "wayland-private.h"
+ #include "test-runner.h"
+@@ -54,8 +62,13 @@ static int wrapped_calls_fcntl;
+ static ssize_t (*real_recvmsg)(int, struct msghdr *, int);
+ static int wrapped_calls_recvmsg;
+
++#ifdef HAVE_SYS_EPOLL_H
+ static int (*real_epoll_create1)(int);
+ static int wrapped_calls_epoll_create1;
++#elif HAVE_SYS_EVENT_H
++static int (*real_kqueue)(void);
++static int wrapped_calls_kqueue;
++#endif
+
+ static void
+ init_fallbacks(int do_fallbacks)
+@@ -64,7 +77,11 @@ init_fallbacks(int do_fallbacks)
+ real_socket = dlsym(RTLD_NEXT, "socket");
+ real_fcntl = dlsym(RTLD_NEXT, "fcntl");
+ real_recvmsg = dlsym(RTLD_NEXT, "recvmsg");
++#ifdef HAVE_SYS_EPOLL_H
+ real_epoll_create1 = dlsym(RTLD_NEXT, "epoll_create1");
++#elif HAVE_SYS_EVENT_H
++ real_kqueue = dlsym(RTLD_NEXT, "kqueue");
++#endif
+ }
+
+ __attribute__ ((visibility("default"))) int
+@@ -72,10 +89,12 @@ socket(int domain, int type, int protoco
+ {
+ wrapped_calls_socket++;
+
++#ifdef SOCK_CLOEXEC
+ if (fall_back && (type & SOCK_CLOEXEC)) {
+ errno = EINVAL;
+ return -1;
+ }
++#endif
+
+ return real_socket(domain, type, protocol);
+ }
+@@ -88,10 +107,12 @@ fcntl(int fd, int cmd, ...)
+
+ wrapped_calls_fcntl++;
+
++#ifdef F_DUPFD_CLOEXEC
+ if (fall_back && (cmd == F_DUPFD_CLOEXEC)) {
+ errno = EINVAL;
+ return -1;
+ }
++#endif
+
+ va_start(ap, cmd);
+ arg = va_arg(ap, void*);
+@@ -105,14 +126,17 @@ recvmsg(int sockfd, struct msghdr *msg,
+ {
+ wrapped_calls_recvmsg++;
+
++#ifdef MSG_CMSG_CLOEXEC
+ if (fall_back && (flags & MSG_CMSG_CLOEXEC)) {
+ errno = EINVAL;
+ return -1;
+ }
++#endif
+
+ return real_recvmsg(sockfd, msg, flags);
+ }
+
++#ifdef HAVE_SYS_EPOLL_H
+ __attribute__ ((visibility("default"))) int
+ epoll_create1(int flags)
+ {
+@@ -126,6 +150,15 @@ epoll_create1(int flags)
+
+ return real_epoll_create1(flags);
+ }
++#elif HAVE_SYS_EVENT_H
++__attribute__ ((visibility("default"))) int
++kqueue(void)
++{
++ wrapped_calls_kqueue++;
++
++ return real_kqueue();
++}
++#endif
+
+ static void
+ do_os_wrappers_socket_cloexec(int n)
+@@ -155,12 +188,14 @@ TEST(os_wrappers_socket_cloexec)
+ do_os_wrappers_socket_cloexec(0);
+ }
+
++#ifdef SOCK_CLOEXEC
+ TEST(os_wrappers_socket_cloexec_fallback)
+ {
+ /* forced fallback */
+ init_fallbacks(1);
+ do_os_wrappers_socket_cloexec(1);
+ }
++#endif
+
+ static void
+ do_os_wrappers_dupfd_cloexec(int n)
+@@ -194,11 +229,13 @@ TEST(os_wrappers_dupfd_cloexec)
+ do_os_wrappers_dupfd_cloexec(0);
+ }
+
++#ifdef F_DUPFD_CLOEXEC
+ TEST(os_wrappers_dupfd_cloexec_fallback)
+ {
+ init_fallbacks(1);
+ do_os_wrappers_dupfd_cloexec(3);
+ }
++#endif
+
+ struct marshal_data {
+ struct wl_connection *read_connection;
+@@ -217,8 +254,7 @@ struct marshal_data {
+ static void
+ setup_marshal_data(struct marshal_data *data)
+ {
+- assert(socketpair(AF_UNIX,
+- SOCK_STREAM | SOCK_CLOEXEC, 0, data->s) == 0);
++ assert(wl_os_socketpair_cloexec(AF_UNIX, SOCK_STREAM, 0, data->s) == 0);
+
+ data->read_connection = wl_connection_create(data->s[0]);
+ assert(data->read_connection);
+@@ -327,11 +363,13 @@ TEST(os_wrappers_recvmsg_cloexec)
+ do_os_wrappers_recvmsg_cloexec(0);
+ }
+
++#ifdef MSG_CMSG_CLOEXEC
+ TEST(os_wrappers_recvmsg_cloexec_fallback)
+ {
+ init_fallbacks(1);
+ do_os_wrappers_recvmsg_cloexec(1);
+ }
++#endif
+
+ static void
+ do_os_wrappers_epoll_create_cloexec(int n)
+@@ -341,12 +379,20 @@ do_os_wrappers_epoll_create_cloexec(int
+
+ nr_fds = count_open_fds();
+
++#ifdef HAVE_SYS_EPOLL_H
+ fd = wl_os_epoll_create_cloexec();
++#elif HAVE_SYS_EVENT_H
++ fd = wl_os_kqueue_create_cloexec();
++#endif
+ assert(fd >= 0);
+
+ #ifdef EPOLL_CLOEXEC
++#ifdef HAVE_SYS_EPOLL_H
+ assert(wrapped_calls_epoll_create1 == n);
+ #else
++ assert(wrapped_calls_kqueue == n);
++#endif
++#else
+ printf("No epoll_create1.\n");
+ #endif
+
diff --git a/graphics/wayland/files/patch-tests_queue-test.c b/graphics/wayland/files/patch-tests_queue-test.c
new file mode 100644
index 000000000000..9f38fa230fdb
--- /dev/null
+++ b/graphics/wayland/files/patch-tests_queue-test.c
@@ -0,0 +1,21 @@
+--- tests/queue-test.c.orig 2016-04-29 23:36:09 UTC
++++ tests/queue-test.c
+@@ -23,6 +23,8 @@
+ * SOFTWARE.
+ */
+
++#include "../config.h"
++
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <stdbool.h>
+@@ -30,6 +32,9 @@
+ #include <sys/types.h>
+ #include <sys/wait.h>
+ #include <assert.h>
++#ifdef HAVE_SIGNAL_H
++#include <signal.h>
++#endif
+
+ #include "wayland-client.h"
+ #include "wayland-server.h"
diff --git a/graphics/wayland/files/patch-tests_sanity-test.c b/graphics/wayland/files/patch-tests_sanity-test.c
new file mode 100644
index 000000000000..fab1eaec289a
--- /dev/null
+++ b/graphics/wayland/files/patch-tests_sanity-test.c
@@ -0,0 +1,22 @@
+--- tests/sanity-test.c.orig 2016-02-17 01:13:16 UTC
++++ tests/sanity-test.c
+@@ -92,7 +92,8 @@ FAIL_TEST(sanity_malloc_direct)
+ TEST(disable_leak_checks)
+ {
+ volatile void *mem;
+- assert(leak_check_enabled);
++// XXX FreeBSD disables leak checks...
++// assert(leak_check_enabled);
+ /* normally this should be on the beginning of the test.
+ * Here we need to be sure, that the leak checks are
+ * turned on */
+@@ -171,7 +172,8 @@ sanity_fd_no_leak(void)
+ {
+ int fd[2];
+
+- assert(leak_check_enabled);
++// XXX FreeBSD leak checks are disabled
++// assert(leak_check_enabled);
+
+ /* leak 2 file descriptors */
+ if (pipe(fd) < 0)
diff --git a/graphics/wayland/files/patch-tests_test-helpers.c b/graphics/wayland/files/patch-tests_test-helpers.c
new file mode 100644
index 000000000000..8be22e6e9052
--- /dev/null
+++ b/graphics/wayland/files/patch-tests_test-helpers.c
@@ -0,0 +1,52 @@
+--- tests/test-helpers.c.orig 2015-07-06 19:38:51 UTC
++++ tests/test-helpers.c
+@@ -23,6 +23,12 @@
+ * SOFTWARE.
+ */
+
++#include "../config.h"
++
++#ifdef HAVE_SYS_PARAM_H
++#include <sys/param.h>
++#endif
++
+ #include <assert.h>
+ #include <errno.h>
+ #include <dirent.h>
+@@ -32,6 +38,16 @@
+
+ #include "test-runner.h"
+
++#ifdef __FreeBSD__
++/* FreeBSD uses fdescfs (which must be mounted using:
++ * mount -t fdescfs fdescfs /dev/fd
++ * before the test suite can be run). */
++#define OPEN_FDS_DIR "/dev/fd"
++#else
++/* Linux. */
++#define OPEN_FDS_DIR "/proc/self/fd"
++#endif
++
+ int
+ count_open_fds(void)
+ {
+@@ -39,8 +55,8 @@ count_open_fds(void)
+ struct dirent *ent;
+ int count = 0;
+
+- dir = opendir("/proc/self/fd");
+- assert(dir && "opening /proc/self/fd failed.");
++ dir = opendir(OPEN_FDS_DIR);
++ assert(dir && "opening " OPEN_FDS_DIR " failed.");
+
+ errno = 0;
+ while ((ent = readdir(dir))) {
+@@ -49,7 +65,7 @@ count_open_fds(void)
+ continue;
+ count++;
+ }
+- assert(errno == 0 && "reading /proc/self/fd failed.");
++ assert(errno == 0 && "reading " OPEN_FDS_DIR " failed.");
+
+ closedir(dir);
+
diff --git a/graphics/wayland/files/patch-tests_test-runner.c b/graphics/wayland/files/patch-tests_test-runner.c
new file mode 100644
index 000000000000..1949c52317ed
--- /dev/null
+++ b/graphics/wayland/files/patch-tests_test-runner.c
@@ -0,0 +1,170 @@
+--- tests/test-runner.c.orig 2016-05-03 00:46:35 UTC
++++ tests/test-runner.c
+@@ -25,6 +25,12 @@
+
+ #define _GNU_SOURCE
+
++#include "../config.h"
++
++#ifdef HAVE_SYS_PARAM_H
++#include <sys/param.h>
++#endif
++
+ #include <unistd.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+@@ -37,18 +43,35 @@
+ #include <errno.h>
+ #include <limits.h>
+ #include <sys/ptrace.h>
++#ifdef __linux__
+ #include <sys/prctl.h>
++#endif
+ #ifndef PR_SET_PTRACER
+ # define PR_SET_PTRACER 0x59616d61
+ #endif
++#include <signal.h>
+
+ #include "test-runner.h"
+
+ static int num_alloc;
++
++extern const struct test __start_test_section, __stop_test_section;
++
++/* This is all disabled for FreeBSD because it gives "can't allocate initial
++ * thread" aborts otherwise. */
++#ifndef __FreeBSD__
+ static void* (*sys_malloc)(size_t);
+ static void (*sys_free)(void*);
+ static void* (*sys_realloc)(void*, size_t);
+ static void* (*sys_calloc)(size_t, size_t);
++#endif
++
++#ifdef __FreeBSD__
++/* XXX review ptrace() usage */
++#define PTRACE_ATTACH PT_ATTACH
++#define PTRACE_CONT PT_CONTINUE
++#define PTRACE_DETACH PT_DETACH
++#endif
+
+ /* when set to 1, check if tests are not leaking memory and opened files.
+ * It is turned on by default. It can be turned off by
+@@ -57,7 +80,7 @@ int leak_check_enabled;
+
+ /* when this var is set to 0, every call to test_set_timeout() is
+ * suppressed - handy when debugging the test. Can be set by
+- * WAYLAND_TEST_NO_TIMEOUTS environment variable. */
++ * WAYLAND_TESTS_NO_TIMEOUTS evnironment var */
+ static int timeouts_enabled = 1;
+
+ /* set to one if the output goes to the terminal */
+@@ -65,6 +88,7 @@ static int is_atty = 0;
+
+ extern const struct test __start_test_section, __stop_test_section;
+
++#ifndef __FreeBSD__
+ __attribute__ ((visibility("default"))) void *
+ malloc(size_t size)
+ {
+@@ -98,6 +122,7 @@ calloc(size_t nmemb, size_t size)
+
+ return sys_calloc(nmemb, size);
+ }
++#endif
+
+ static const struct test *
+ find_test(const char *name)
+@@ -291,6 +316,8 @@ is_debugger_attached(void)
+ return 0;
+ }
+
++
++// xxx start here
+ pid = fork();
+ if (pid == -1) {
+ perror("fork");
+@@ -311,7 +338,7 @@ is_debugger_attached(void)
+ _exit(1);
+ if (!waitpid(-1, NULL, 0))
+ _exit(1);
+- ptrace(PTRACE_CONT, NULL, NULL);
++ ptrace(PTRACE_CONT, ppid, NULL, NULL);
+ ptrace(PTRACE_DETACH, ppid, NULL, NULL);
+ _exit(0);
+ } else {
+@@ -345,17 +372,19 @@ int main(int argc, char *argv[])
+ const struct test *t;
+ pid_t pid;
+ int total, pass;
++#ifdef HAVE_WAITID
+ siginfo_t info;
++#else
++ int status;
++#endif
+
++#ifndef __FreeBSD__
+ /* Load system malloc, free, and realloc */
+ sys_calloc = dlsym(RTLD_NEXT, "calloc");
+ sys_realloc = dlsym(RTLD_NEXT, "realloc");
+ sys_malloc = dlsym(RTLD_NEXT, "malloc");
+ sys_free = dlsym(RTLD_NEXT, "free");
+
+- if (isatty(fileno(stderr)))
+- is_atty = 1;
+-
+ if (is_debugger_attached()) {
+ leak_check_enabled = 0;
+ timeouts_enabled = 0;
+@@ -363,6 +392,16 @@ int main(int argc, char *argv[])
+ leak_check_enabled = !getenv("WAYLAND_TEST_NO_LEAK_CHECK");
+ timeouts_enabled = !getenv("WAYLAND_TEST_NO_TIMEOUTS");
+ }
++#else
++ /* Disable leak checking on FreeBSD since we can't override malloc(). */
++ leak_check_enabled = 0;
++ /* XXX review later */
++ timeouts_enabled = 0;
++#endif
++
++ if (isatty(fileno(stderr)))
++ is_atty = 1;
++
+
+ if (argc == 2 && strcmp(argv[1], "--help") == 0)
+ usage(argv[0], EXIT_SUCCESS);
+@@ -394,7 +433,8 @@ int main(int argc, char *argv[])
+ if (pid == 0)
+ run_test(t); /* never returns */
+
+- if (waitid(P_PID, pid, &info, WEXITED)) {
++#ifdef HAVE_WAITID
++ if (waitid(P_PID, 0, &info, WEXITED)) {
+ stderr_set_color(RED);
+ fprintf(stderr, "waitid failed: %m\n");
+ stderr_reset_color();
+@@ -425,6 +465,25 @@ int main(int argc, char *argv[])
+
+ break;
+ }
++#else
++ if (waitpid(-1, &status, 0) == -1) {
++ fprintf(stderr, "waitpid failed: %s\n",
++ strerror(errno));
++ abort();
++ }
++
++ fprintf(stderr, "test \"%s\":\t", t->name);
++ if (WIFEXITED(status)) {
++ fprintf(stderr, "exit status %d", WEXITSTATUS(status));
++ if (WEXITSTATUS(status) == EXIT_SUCCESS)
++ success = 1;
++ } else if (WIFSIGNALED(status)) {
++ fprintf(stderr, "signal %d", WTERMSIG(status));
++ }
++#endif
++
++ if (t->must_fail)
++ success = !success;
+
+ if (success) {
+ pass++;
diff --git a/graphics/wayland/pkg-descr b/graphics/wayland/pkg-descr
new file mode 100644
index 000000000000..efb42d4b323d
--- /dev/null
+++ b/graphics/wayland/pkg-descr
@@ -0,0 +1,13 @@
+Wayland is intended as a simpler replacement for X, easier to develop and
+maintain. GNOME and KDE are expected to be ported to it.
+
+Wayland is a protocol for a compositor to talk to its clients as well as
+a C library implementation of that protocol. The compositor can be a
+standalone display server running on Linux kernel modesetting and evdev
+input devices, an X application, or a wayland client itself. The clients can
+be traditional applications, X servers (rootless or fullscreen) or other
+display servers.
+
+Please report bugs to the FreeBSD bugtracker!
+
+WWW: http://wayland.freedesktop.org/
diff --git a/graphics/wayland/pkg-plist b/graphics/wayland/pkg-plist
new file mode 100644
index 000000000000..ccbc459bd7c5
--- /dev/null
+++ b/graphics/wayland/pkg-plist
@@ -0,0 +1,32 @@
+bin/wayland-scanner
+include/wayland-client-core.h
+include/wayland-client-protocol.h
+include/wayland-client.h
+include/wayland-cursor.h
+include/wayland-egl-core.h
+include/wayland-egl.h
+include/wayland-server-core.h
+include/wayland-server-protocol.h
+include/wayland-server.h
+include/wayland-util.h
+include/wayland-version.h
+lib/libwayland-client.a
+lib/libwayland-client.so
+lib/libwayland-client.so.0
+lib/libwayland-client.so.0.3.0
+lib/libwayland-cursor.a
+lib/libwayland-cursor.so
+lib/libwayland-cursor.so.0
+lib/libwayland-cursor.so.0.0.0
+lib/libwayland-server.a
+lib/libwayland-server.so
+lib/libwayland-server.so.0
+lib/libwayland-server.so.0.1.0
+libdata/pkgconfig/wayland-client.pc
+libdata/pkgconfig/wayland-cursor.pc
+libdata/pkgconfig/wayland-scanner.pc
+libdata/pkgconfig/wayland-server.pc
+share/aclocal/wayland-scanner.m4
+%%DATADIR%%/wayland-scanner.mk
+%%DATADIR%%/wayland.dtd
+%%DATADIR%%/wayland.xml