1 # clutter package version number, (as distinct from shared library version)
2 # An odd micro number indicates in-progress development from Git
3 # An even micro number indicates a released version
5 # Making a point release:
6 # - increase clutter_micro_version to the next even number
7 # - increase clutter_interface_age to the next even number
9 # - increase clutter_micro_version to the next odd number
10 # - increase clutter_interface_version to the next odd number
11 m4_define([clutter_major_version], [1])
12 m4_define([clutter_minor_version], [9])
13 m4_define([clutter_micro_version], [3])
15 # • for stable releases: increase the interface age by 1 for each release;
16 # if the API changes, set to 0. interface_age and binary_age are used to
17 # create the soname of the shared object:
19 # (<minor> * 100 + <micro>) - <interface_age>
21 # this allows using the same soname for different micro-releases in case
22 # no API was added or deprecated. for instance:
24 # clutter 1.2.0 -> 100 * 2 + 0 = 200, interface age = 0 -> 200
25 # clutter 1.2.2 -> 100 * 2 + 2 = 202, interface age = 2 -> 200
26 # clutter 1.2.4 -> 100 * 2 + 4 = 204, interface age = 4 -> 200
27 # [ API addition, deprecation ]
28 # clutter 1.2.6 -> 100 * 2 + 6 = 206, interface age = 0 -> 206
29 # clutter 1.2.8 -> 100 * 2 + 8 = 208, interface age = 2 -> 206
30 # clutter 1.2.10 -> 100 * 2 + 10 = 210, interface age = 4 -> 206
33 # • for development releases: keep clutter_interface_age to 0
34 m4_define([clutter_interface_age], [0])
36 m4_define([clutter_binary_age], [m4_eval(100 * clutter_minor_version + clutter_micro_version)])
38 m4_define([clutter_release_status],
39 [m4_if(m4_eval(clutter_micro_version % 2), [1], [git],
40 [m4_if(m4_eval(clutter_minor_version % 2), [1], [snapshot],
43 m4_define([clutter_version], [clutter_major_version.clutter_minor_version.clutter_micro_version])
45 # change this only when breaking the API
46 m4_define([clutter_api_version], [1.0])
52 [http://bugzilla.gnome.org/enter_bug.cgi?product=clutter],
54 [http://www.clutter-project.org])
56 AC_CONFIG_SRCDIR([clutter/clutter.h])
57 AC_CONFIG_HEADERS([config.h])
58 AC_CONFIG_AUX_DIR([build])
59 AC_CONFIG_MACRO_DIR([build/autotools])
61 AM_INIT_AUTOMAKE([1.11 foreign -Wno-portability no-define no-dist-gzip dist-xz tar-ustar])
62 AM_SILENT_RULES([yes])
64 AC_SUBST([CLUTTER_MAJOR_VERSION], [clutter_major_version])
65 AC_SUBST([CLUTTER_MINOR_VERSION], [clutter_minor_version])
66 AC_SUBST([CLUTTER_MICRO_VERSION], [clutter_micro_version])
67 AC_SUBST([CLUTTER_VERSION], [clutter_version])
68 AC_SUBST([CLUTTER_API_VERSION], [clutter_api_version])
69 AC_SUBST([CLUTTER_API_VERSION_AM], [$CLUTTER_MAJOR_VERSION\_0])
70 AC_SUBST([CLUTTER_RELEASE_STATUS], [clutter_release_status])
72 m4_define([lt_current], [m4_eval(100 * clutter_minor_version + clutter_micro_version - clutter_interface_age)])
73 m4_define([lt_revision], [clutter_interface_age])
74 m4_define([lt_age], [m4_eval(clutter_binary_age - clutter_interface_age)])
75 CLUTTER_LT_CURRENT=lt_current
76 CLUTTER_LT_REV=lt_revision
78 CLUTTER_LT_VERSION="$CLUTTER_LT_CURRENT:$CLUTTER_LT_REV:$CLUTTER_LT_AGE"
79 CLUTTER_LT_LDFLAGS="-version-info $CLUTTER_LT_VERSION"
80 AC_SUBST([CLUTTER_LT_CURRENT], [lt_current])
81 AC_SUBST([CLUTTER_LT_REVISION], [lt_revision])
82 AC_SUBST([CLUTTER_LT_VERSION], [$CLUTTER_LT_VERSION])
86 dnl = Preliminary platform checks =============================================
94 AC_MSG_CHECKING([if building for some Win32 platform])
96 [*-*-mingw*|*-*-cygwin*],
98 CLUTTER_LT_LDFLAGS="$CLUTTER_LT_LDFLAGS -no-undefined"
104 AC_MSG_RESULT([$platform_win32])
106 AM_CONDITIONAL(OS_WIN32, [test "$platform_win32" = "yes"])
108 AC_CHECK_HEADER([OpenGL/gl.h], [platform_quartz=yes], [platform_quartz=no])
109 AM_CONDITIONAL(OS_QUARTZ, [test "$platform_quartz" = "yes"])
111 AC_CHECK_HEADER([GL/glx.h], [platform_glx=yes], [platform_glx=no])
112 AC_CHECK_LIB([GL], [glXCreateContext], [platform_glx=yes], [platform_glx=no])
113 AM_CONDITIONAL(OS_GLX, [test "$platform_glx" = "yes"])
115 AC_SUBST(CLUTTER_LT_LDFLAGS)
119 dnl = Dependencies =========================================================
121 # Checks for programs.
124 # require libtool >= 2.2
126 LT_INIT([disable-static])
128 # Checks for header files.
131 # required versions for dependencies
132 m4_define([glib_req_version], [2.31.0])
133 m4_define([cogl_req_version], [1.9.1])
134 m4_define([json_glib_req_version], [0.12.0])
135 m4_define([atk_req_version], [2.1.5])
136 m4_define([cairo_req_version], [1.10])
137 m4_define([pango_req_version], [1.20])
138 m4_define([gi_req_version], [0.9.5])
139 m4_define([uprof_req_version], [0.3])
140 m4_define([gtk_doc_req_version], [1.15])
141 m4_define([xfixes_req_version], [3])
142 m4_define([xcomposite_req_version], [0.4])
143 m4_define([gdk_req_version], [3.0.0])
145 AC_SUBST([GLIB_REQ_VERSION], [glib_req_version])
146 AC_SUBST([COGL_REQ_VERSION], [cogl_req_version])
147 AC_SUBST([JSON_GLIB_REQ_VERSION], [json_glib_req_version])
148 AC_SUBST([ATK_REQ_VERSION], [atk_req_version])
149 AC_SUBST([CAIRO_REQ_VERSION], [cairo_req_version])
150 AC_SUBST([PANGO_REQ_VERSION], [pango_req_version])
151 AC_SUBST([GI_REQ_VERSION], [gi_req_version])
152 AC_SUBST([UPROF_REQ_VERSION], [uprof_req_version])
153 AC_SUBST([GTK_DOC_REQ_VERSION], [gtk_doc_req_version])
154 AC_SUBST([XFIXES_REQ_VERSION], [xfixes_req_version])
155 AC_SUBST([XCOMPOSITE_REQ_VERSION], [xcomposite_req_version])
156 AC_SUBST([GDK_REQ_VERSION], [gdk_req_version])
158 # Checks for typedefs, structures, and compiler characteristics.
159 AM_PATH_GLIB_2_0([glib_req_version],
161 [AC_MSG_ERROR([glib-2.0 is required])],
162 [gobject gthread gmodule-no-export])
164 # Check for -Bsymbolic-functions to avoid intra-library PLT jumps
165 AC_ARG_ENABLE([Bsymbolic],
166 [AS_HELP_STRING([--disable-Bsymbolic],
167 [Avoid linking with -Bsymbolic])],
170 saved_LDFLAGS="${LDFLAGS}"
171 AC_MSG_CHECKING([for -Bsymbolic-functions linker flag])
172 LDFLAGS=-Wl,-Bsymbolic-functions
173 AC_TRY_LINK([], [int main (void) { return 0; }],
182 LDFLAGS="${saved_LDFLAGS}"
185 AS_IF([test "x$enable_Bsymbolic" = "xyes"], [CLUTTER_LINK_FLAGS=-Wl[,]-Bsymbolic-functions])
186 AC_SUBST(CLUTTER_LINK_FLAGS)
190 dnl ========================================================================
195 CLUTTER_INPUT_BACKENDS=""
196 CLUTTER_CONFIG_DEFINES=
198 experimental_backend=no
199 experimental_input_backend=no
201 # base dependencies for core
202 CLUTTER_BASE_PC_FILES="cogl-1.0 >= $COGL_REQ_VERSION cairo-gobject >= $CAIRO_REQ_VERSION atk >= $ATK_REQ_VERSION pangocairo >= $PANGO_REQ_VERSION cogl-pango-1.0 json-glib-1.0 >= $JSON_GLIB_REQ_VERSION"
204 # private base dependencies
205 CLUTTER_BASE_PC_FILES_PRIVATE=""
207 # backend specific pkg-config files
210 # private backend specific dependencies
211 BACKEND_PC_FILES_PRIVATE=""
213 dnl === Clutter windowing system backend ======================================
215 AC_ARG_ENABLE([x11-backend],
216 [AS_HELP_STRING([--enable-x11-backend=@<:@yes/no@:>@], [Enable the X11 backend (default=check)])],
217 [enable_x11=$enableval],
219 AC_ARG_ENABLE([win32-backend],
220 [AS_HELP_STRING([--enable-win32-backend=@<:@yes/no@:>@], [Enable the Windows backend (default=check)])],
221 [enable_win32=$enableval],
222 [enable_win32=check])
223 AC_ARG_ENABLE([quartz-backend],
224 [AS_HELP_STRING([--enable-quartz-backend=@<:@yes/no@:>@], [Enable the OS X backend (default=check)])],
225 [enable_osx=$enableval],
227 AC_ARG_ENABLE([gdk-backend],
228 [AS_HELP_STRING([--enable-gdk-backend=@<:@yes/no@:>@], [Enable the GDK backend (default=check)])],
229 [enable_gdk=$enableval],
231 AC_ARG_ENABLE([wayland-backend],
232 [AS_HELP_STRING([--enable-wayland-backend=@<:@yes/no@:>@], [Enable the Wayland client backend (default=no)])],
233 [enable_wayland=$enableval],
235 AC_ARG_ENABLE([egl-backend],
236 [AS_HELP_STRING([--enable-egl-backend=@<:@yes/no@:>@], [Enable the EGL framebuffer backend (default=no)])],
237 [enable_egl=$enableval],
239 AC_ARG_ENABLE([cex100-backend],
240 [AS_HELP_STRING([--enable-cex100-backend=@<:@yes/no@:>@], [Enable the CEx100 backend (default=no)])],
241 [enable_cex100=$enableval],
244 dnl Define default values
245 AS_IF([test "x$enable_x11" = "xcheck"],
247 AS_IF([test "x$platform_glx" = "xyes"], [enable_x11=yes], [enable_x11=no])
250 AS_IF([test "x$enable_win32" = "xcheck"],
252 AS_IF([test "x$platform_win32" = "xyes"], [enable_win32=yes], [enable_win32=no])
255 AS_IF([test "x$enable_osx" = "xcheck"],
257 AS_IF([test "x$platform_quartz" = "xyes"], [enable_osx=yes], [enable_osx=no])
260 AS_IF([test "x$enable_gdk" = "xcheck"],
262 PKG_CHECK_EXISTS([gdk-3.0 >= gdk_req_version], [enable_gdk=yes], [enable_gdk=no])
265 dnl Per-backend rules
266 AS_IF([test "x$enable_x11" = "xyes"],
268 CLUTTER_BACKENDS="$CLUTTER_BACKENDS x11"
269 CLUTTER_INPUT_BACKENDS="$CLUTTER_INPUT_BACKENDS x11"
275 # Mesa 7.3 added a GL pkg-config file, finally, but if a pkg-config
276 # file isn't found just add -lGL and hope for the best.
277 PKG_CHECK_EXISTS([gl],
278 [BACKEND_PC_FILES="$BACKEND_PC_FILES gl"],
279 [FLAVOUR_LIBS="$FLAVOUR_LIBS -lGL"])
281 # We might fall back to DRM for sync-to-vblank on GLX
282 PKG_CHECK_EXISTS([libdrm],
284 AC_DEFINE([HAVE_DRM], [1], [Have libdrm support])
285 BACKEND_PC_FILES="$BACKEND_PC_FILES libdrm"
289 # we use fontconfig API and pango-fc when the fontconfig
290 # configuration changes
291 PKG_CHECK_EXISTS([pangoft2],
293 AC_DEFINE([HAVE_PANGO_FT2], [1], [Supports PangoFt2])
294 BACKEND_PC_FILES="$BACKEND_PC_FILES pangoft2"
298 AC_DEFINE([HAVE_CLUTTER_GLX], [1], [Have the GLX backend])
301 AS_IF([test "x$enable_gdk" = "xyes"],
303 CLUTTER_BACKENDS="$CLUTTER_BACKENDS gdk"
304 CLUTTER_INPUT_BACKENDS="$CLUTTER_INPUT_BACKENDS gdk"
309 BACKEND_PC_FILES="$BACKEND_PC_FILES gdk-3.0"
310 PKG_CHECK_EXISTS([gl], [BACKEND_PC_FILES="$BACKEND_PC_FILES gl"], [])
313 AS_IF([test "x$enable_wayland" = "xyes"],
315 CLUTTER_BACKENDS="$CLUTTER_BACKENDS wayland"
316 CLUTTER_INPUT_BACKENDS="$CLUTTER_INPUT_BACKENDS wayland"
318 experimental_backend="yes"
322 PKG_CHECK_EXISTS([wayland-client xkbcommon gdk-pixbuf-2.0],
324 BACKEND_PC_FILES="$BACKEND_PC_FILES wayland-client xkbcommon",
325 BACKEND_PC_FILES_PRIVATE="$BACKEND_PC_FILES_PRIVATE gdk-pixbuf-2.0"
329 AC_DEFINE([HAVE_CLUTTER_WAYLAND], [1], [Have the Wayland client backend])
332 dnl Note this is orthogonal to the client side support and you can
333 dnl use the Wayland compositor features with any of the clutter
334 dnl backends with corresponding Cogl support.
335 AC_ARG_ENABLE([wayland-compositor],
336 [AS_HELP_STRING([--enable-wayland-compositor=@<:@yes/no@:>@],
337 [Enable Wayland compositor features (default=no)])],
339 [AS_IF([test "x$SUPPORT_EGL" = "x1"],
340 [enable_wayland_compositor=yes],
341 [enable_wayland_compositor=no])
344 AS_IF([test "x$enable_wayland_compositor" = "xyes"],
346 PKG_CHECK_EXISTS([wayland-server],
347 [BACKEND_PC_FILES="$BACKEND_PC_FILES wayland-server"], [])
348 SUPPORT_WAYLAND_COMPOSITOR=1
349 CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
350 #define CLUTTER_HAS_WAYLAND_COMPOSITOR_SUPPORT 1"
351 AC_DEFINE([HAVE_CLUTTER_WAYLAND_COMPOSITOR], [1], [Have Wayland compositor support])
354 AM_CONDITIONAL(SUPPORT_WAYLAND_COMPOSITOR, [test "x$SUPPORT_WAYLAND_COMPOSITOR" = "x1"])
356 AS_IF([test "x$enable_wayland_compositor" != "xyes" -a "x$enable_wayland" != "xyes"],
358 # The wayland headers introduce so much symbol shadowing that build
359 # logs become incomprehensible with -Wshadow so we only use it for
360 # non-wayland builds.
361 MAINTAINER_COMPILER_FLAGS="-Wshadow"
364 AS_IF([test "x$enable_cex100" = "xyes"],
366 CLUTTER_BACKENDS="$CLUTTER_BACKENDS cex100"
368 experimental_backend="yes"
374 AC_CHECK_HEADERS([libgdl.h], [have_gdl=yes])
376 AS_IF([test "x$have_gdl" = "xno"],
378 AC_CHECK_HEADERS([CE4100/libgdl.h],
380 FLAVOUR_CFLAGS="-I/usr/include/CE4100"
382 CLUTTER_CEX100_LIBGDL_PREFIX=CE4100/
386 AS_IF([test "x$have_gdl" = "xno"],
387 [AC_MSG_ERROR([libgdl.h not found but the CEx100 backend has been explicitly enabled])])
389 AC_SUBST(CLUTTER_CEX100_LIBGDL_PREFIX)
391 FLAVOUR_LIBS="$FLAVOUR_LIBS -lgdl"
393 AC_DEFINE([CLUTTER_EGL_BACKEND_CEX100], [1], [Use CEX100 EGL backend])
394 AC_DEFINE([CLUTTER_EGL_BACKEND_GENERIC], [1], [Use Generic EGL backend])
395 AC_DEFINE([HAVE_CLUTTER_EGL], [1], [Have the EGL backend])
398 AS_IF([test "x$enable_egl" = "xyes"],
400 CLUTTER_BACKENDS="$CLUTTER_BACKENDS egl"
402 experimental_backend="yes"
407 # if Mesa has support for egl, we can use it as well
408 PKG_CHECK_EXISTS([egl],
410 BACKEND_PC_FILES="$BACKEND_PC_FILES egl"
414 FLAVOUR_LIBS="$FLAVOUR_LIBS $TSLIB_LIBS $EVDEV_LIBS"
415 FLAVOUR_CFLAGS="$FLAVOUR_CFLAGS $TSLIB_CFLAGS $EVDEV_CFLAGS"
417 AC_DEFINE([CLUTTER_EGL_BACKEND_GENERIC], [1], [Use Generic EGL backend])
419 AC_DEFINE([HAVE_CLUTTER_EGL], [1], [Have the EGL backend])
422 AS_IF([test "x$enable_osx" = "xyes"],
424 CLUTTER_BACKENDS="$CLUTTER_BACKENDS osx"
425 CLUTTER_INPUT_BACKENDS="$CLUTTER_INPUT_BACKENDS osx"
427 AC_DEFINE([HAVE_CLUTTER_OSX], [1], [Have the OSX backend])
429 FLAVOUR_LIBS="$FLAVOUR_LIBS -framework Cocoa -framework OpenGL"
434 AS_IF([test "x$enable_win32" = "xyes"],
436 CLUTTER_BACKENDS="$CLUTTER_BACKENDS win32"
437 CLUTTER_INPUT_BACKENDS="$CLUTTER_INPUT_BACKENDS win32"
439 AC_DEFINE([HAVE_CLUTTER_WIN32], [1], [Have the Win32 backend])
441 FLAVOUR_LIBS="$FLAVOUR_LIBS -lopengl32 -lgdi32 -lwinmm"
442 FLAVOUR_CFLAGS="$FLAVOUR_CFLAGS -D_WIN32_WINNT=0x0500"
444 AC_CHECK_TOOL(WINDRES, [windres], [AC_MSG_ERROR([*** windres is required])])
449 AS_IF([test "x$CLUTTER_BACKENDS" = "x"],
451 AC_MSG_ERROR([No backend enabled. You need to enable at least one backend.])
454 # additional input backends
456 AC_ARG_ENABLE([tslib-input],
457 [AS_HELP_STRING([--enable-tslib-input=@<:@yes/no@:>@], [Enable TSLib for input events (default=no)])],
458 [enable_tslib=$enableval],
460 AC_ARG_ENABLE([evdev-input],
461 [AS_HELP_STRING([--with-evdev=@<:@yes/no@:>@], [Enable evdev for input events (default=no)])],
462 [enable_evdev=$enableval],
465 AS_IF([test "x$enable_tslib" = "xyes"],
467 PKG_CHECK_MODULES(TSLIB, [tslib-1.0], [have_tslib=yes], [have_tslib=no])
468 AS_IF([test "x$have_tslib" = "xyes"],
470 CLUTTER_INPUT_BACKENDS="$CLUTTER_INPUT_BACKENDS tslib"
471 experimental_input_backend="yes"
472 AC_DEFINE([HAVE_TSLIB], [1], [Have tslib for touchscreen handling])
477 AS_IF([test "x$enable_evdev" = "xyes"],
479 PKG_CHECK_MODULES(EVDEV, [gudev-1.0 xkbcommon], [have_evdev=yes], [have_evdev=no])
480 AS_IF([test "x$have_evdev" = "xyes"],
482 CLUTTER_INPUT_BACKENDS="$CLUTTER_INPUT_BACKENDS evdev"
483 BACKEND_PC_FILES="$BACKEND_PC_FILES gudev-1.0 xkbcommon"
484 experimental_input_backend="yes"
485 AC_DEFINE([HAVE_EVDEV], [1], [Have evdev support for input handling])
490 # conditionals for use in automake files...
491 AM_CONDITIONAL(SUPPORT_GLX, [test "x$SUPPORT_GLX" = "x1"])
492 AM_CONDITIONAL(SUPPORT_X11, [test "x$SUPPORT_X11" = "x1"])
493 AM_CONDITIONAL(SUPPORT_GDK, [test "x$SUPPORT_GDK" = "x1"])
494 AM_CONDITIONAL(SUPPORT_EGL, [test "x$SUPPORT_EGL" = "x1"])
495 AM_CONDITIONAL(SUPPORT_OSX, [test "x$SUPPORT_OSX" = "x1"])
496 AM_CONDITIONAL(SUPPORT_WIN32, [test "x$SUPPORT_WIN32" = "x1"])
497 AM_CONDITIONAL(SUPPORT_CEX100, [test "x$SUPPORT_CEX100" = "x1"])
498 AM_CONDITIONAL(SUPPORT_WAYLAND, [test "x$SUPPORT_WAYLAND" = "x1"])
499 AM_CONDITIONAL(SUPPORT_STUB, [test "x$SUPPORT_WIN32" = "x1" -o \
500 "x$SUPPORT_OSX" = "x1"])
502 AM_CONDITIONAL(USE_COGL, [test "x$SUPPORT_COGL" = "x1"])
503 AM_CONDITIONAL(USE_TSLIB, [test "x$have_tslib" = "xyes"])
504 AM_CONDITIONAL(USE_EVDEV, [test "x$have_evdev" = "xyes"])
505 AM_CONDITIONAL(USE_GLD, [test "x$have_gdl" = "xyes"])
507 dnl Instead of using AM_CFLAGS to ensure
508 dnl COGL_ENABLE_EXPERIMENTAL_2_0_API is defined while compiling clutter
509 dnl and cogl code we use a define in config.h instead. This helps ensure
510 dnl other tools such as glib-mkenums and gir-scanner don't end up
511 dnl using the define also.
512 AC_DEFINE([COGL_ENABLE_EXPERIMENTAL_2_0_API], [1], [Can use Cogl 2.0 API internally])
514 dnl strip leading spaces
515 CLUTTER_BACKENDS=${CLUTTER_BACKENDS#* }
516 AC_SUBST(CLUTTER_BACKENDS)
518 CLUTTER_INPUT_BACKENDS=${CLUTTER_INPUT_BACKENDS#* }
519 AC_SUBST(CLUTTER_INPUT_BACKENDS)
523 dnl === Clutter configuration =================================================
526 AS_IF([test "x$SUPPORT_X11" = "x1"],
527 [CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
528 #define CLUTTER_WINDOWING_X11 \"x11\"
529 #define CLUTTER_INPUT_X11 \"x11\""])
530 AS_IF([test "x$SUPPORT_GDK" = "x1"],
531 [CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
532 #define CLUTTER_WINDOWING_GDK \"gdk\"
533 #define CLUTTER_INPUT_GDK \"gdk\""])
534 AS_IF([test "x$SUPPORT_GLX" = "x1"],
535 [CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
536 #define CLUTTER_WINDOWING_GLX \"glx\""])
537 AS_IF([test "x$SUPPORT_EGL" = "x1"],
538 [CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
539 #define CLUTTER_WINDOWING_EGL \"eglnative\""])
540 AS_IF([test "x$SUPPORT_WAYLAND" = "x1"],
541 [CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
542 #define CLUTTER_WINDOWING_WAYLAND \"wayland\""])
543 AS_IF([test "x$SUPPORT_OSX" = "x1"],
544 [CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
545 #define CLUTTER_WINDOWING_OSX \"osx\"
546 #define CLUTTER_INPUT_OSX \"osx\""])
547 AS_IF([test "x$SUPPORT_WIN32" = "x1"],
548 [CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
549 #define CLUTTER_WINDOWING_WIN32 \"win32\"
550 #define CLUTTER_INPUT_WIN32 \"win32\""])
551 AS_IF([test "x$SUPPORT_CEX100" = "x1"],
552 [CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
553 #define CLUTTER_WINDOWING_CEX100 \"cex100\""])
554 AS_IF([test "x$SUPPORT_EVDEV" = "x1"],
555 [CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
556 #define CLUTTER_INPUT_EVDEV \"evdev\""])
557 AS_IF([test "x$SUPPORT_TSLIB" = "x1"],
558 [CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
559 #define CLUTTER_INPUT_TSLIB \"tslib\""])
560 AS_IF([test "x$SUPPORT_WAYLAND" = "x1"],
561 [CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
562 #define CLUTTER_INPUT_WAYLAND \"wayland\""])
564 # the 'null' input backend is special
565 CLUTTER_CONFIG_DEFINES="$CLUTTER_CONFIG_DEFINES
566 #define CLUTTER_INPUT_NULL \"null\""
568 AC_SUBST([CLUTTER_CONFIG_DEFINES])
570 dnl === Clutter substitutions kept for backwards compatibility ================
571 AC_SUBST([CLUTTER_WINSYS], [deprecated])
572 AC_SUBST([CLUTTER_WINSYS_BASE], [deprecated])
573 AC_SUBST([CLUTTER_STAGE_TYPE], [deprecated])
574 AC_SUBST([CLUTTER_SONAME_INFIX], [deprecated])
575 AC_SUBST([CLUTTER_FLAVOUR], [deprecated])
576 AC_SUBST([CLUTTER_COGL], [deprecated])
577 AC_SUBST([COGL_DRIVER], [deprecated])
579 dnl === X11 checks, only for X11-based backends ===============================
584 AS_IF([test "x$SUPPORT_X11" = "x1"],
586 # base X11 includes and libraries
587 AC_MSG_CHECKING([for X11])
589 # start with pkg-config
590 PKG_CHECK_EXISTS([x11], [have_x11=yes], [have_x11=no])
591 AS_IF([test "x$have_x11" = "xyes"],
595 # we actually need to ask for CFLAGS and LIBS
596 X11_CFLAGS=`$PKG_CONFIG --cflags $X11_PC_FILES`
597 X11_LIBS=`$PKG_CONFIG --libs $X11_PC_FILES`
599 AC_MSG_RESULT([found])
602 # no pkg-config, let's go old school
605 AS_IF([test "x$no_x" = "xyes"],
606 [AC_MSG_ERROR([No X11 Libraries found])],
608 AS_IF([test "x$x_includes" != "xNONE" && test -n "$x_includes"],
609 [X11_CFLAGS=-I`echo $x_includes | sed -e "s/:/ -I/g"`])
611 AS_IF([test "x$x_libraries" != "xNONE" && test -n "$x_libraries"],
612 [X11_LIBS=-L`echo $x_libraries | sed -e "s/:/ -L/g"`])
614 AC_MSG_RESULT([found])
621 AC_MSG_CHECKING([for XEXT extension])
622 PKG_CHECK_EXISTS([xext], [have_xext=yes], [have_xext=no])
623 AS_IF([test "x$have_xext" = "xyes"],
625 AC_DEFINE(HAVE_XEXT, [1], [Define to 1 if we have the XEXT X extension])
627 X11_LIBS="$X11_LIBS -lXext"
628 X11_PC_FILES="$X11_PC_FILES xext"
629 X11_EXTS="$X11_EXTS xext"
631 AC_MSG_RESULT([found])
633 [AC_MSG_ERROR([Not found])]
637 AC_MSG_CHECKING([for XFIXES extension >= $XFIXES_REQ_VERSION])
638 PKG_CHECK_EXISTS([xfixes >= $XFIXES_REQ_VERSION], [have_xfixes=yes], [have_xfixes=no])
639 AS_IF([test "x$have_xfixes" = "xyes"],
641 AC_DEFINE(HAVE_XFIXES, [1], [Define to 1 if we have the XFIXES X extension])
643 X11_LIBS="$X11_LIBS -lXfixes"
644 X11_PC_FILES="$X11_PC_FILES xfixes >= $XFIXES_REQ_VERSION"
645 X11_EXTS="$X11_EXTS xfixes"
647 AC_MSG_RESULT([found])
649 [AC_MSG_ERROR([Not found])]
653 AC_MSG_CHECKING([for XDAMAGE extension])
654 PKG_CHECK_EXISTS([xdamage], [have_xdamage=yes], [have_xdamage=no])
655 AS_IF([test "x$have_xdamage" = "xyes"],
657 AC_DEFINE(HAVE_XDAMAGE, [1], [Define to 1 if we have the XDAMAGE X extension])
659 X11_LIBS="$X11_LIBS -lXdamage"
660 X11_PC_FILES="$X11_PC_FILES xdamage"
661 X11_EXTS="$X11_EXTS xdamage"
663 AC_MSG_RESULT([found])
665 [AC_MSG_ERROR([not found])]
668 # XCOMPOSITE (optional)
669 AC_MSG_CHECKING([for XCOMPOSITE extension >= $XCOMPOSITE_REQ_VERSION])
670 PKG_CHECK_EXISTS([xcomposite >= $XCOMPOSITE_REQ_VERSION], [have_xcomposite=yes], [have_xcomposite=no])
671 AS_IF([test "x$have_xcomposite" = "xyes"],
673 AC_DEFINE(HAVE_XCOMPOSITE, [1], [Define to 1 if we have the XCOMPOSITE X extension])
675 X11_LIBS="$X11_LIBS -lXcomposite"
676 X11_PC_FILES="$X11_PC_FILES xcomposite >= $XCOMPOSITE_REQ_VERSION"
677 X11_EXTS="$X11_EXTS xcomposite"
679 AC_MSG_RESULT([found])
681 [AC_MSG_ERROR([not found])]
684 # X Generic Extensions (optional)
685 clutter_save_CPPFLAGS="$CPPFLAGS"
686 CPPFLAGS="$CPPFLAGS $X11_CFLAGS"
688 clutter_save_LIBS="$LIBS"
689 LIBS="$LIBS $X11_LIBS"
692 AC_CHECK_FUNC([XGetEventData],
694 AC_DEFINE([HAVE_XGE], [1], [Define to 1 if X Generic Extensions is available])
696 X11_EXTS="$X11_EXTS xge"
699 CPPFLAGS="$clutter_save_CPPFLAGS"
700 LIBS="$clutter_save_LIBS"
703 AC_ARG_ENABLE([xinput],
704 [AS_HELP_STRING([--enable-xinput], [Use the XI X extension])],
708 AS_IF([test "x$enable_xinput" = "xyes"],
710 PKG_CHECK_EXISTS([xi], [have_xinput=yes], [have_xinput=no])
716 AS_CASE([$have_xinput],
720 AC_CHECK_HEADERS([X11/extensions/XInput2.h],
723 AC_DEFINE([HAVE_XINPUT_2],
725 [Define to 1 if XI2 is available])
729 AC_DEFINE([HAVE_XINPUT],
731 [Define to 1 if XInput is available])
734 X11_LIBS="$X11_LIBS $XINPUT_LIBS"
735 X11_PC_FILES="$X11_PC_FILES xi"
736 X11_EXTS="$X11_EXTS xi"
743 [AC_MSG_ERROR([Invalid argument for --enable-xinput])]
747 clutter_save_CPPFLAGS="$CPPFLAGS"
748 CPPFLAGS="$CPPFLAGS $X11_CFLAGS"
750 clutter_save_LIBS="$LIBS"
751 LIBS="$LIBS $X11_LIBS"
754 AC_CHECK_FUNC([XkbQueryExtension],
756 AC_DEFINE(HAVE_XKB, 1, [Define to use XKB extension])
759 X11_EXTS="$X11_EXTS xkb"
762 CPPFLAGS="$clutter_save_CPPFLAGS"
763 LIBS="$clutter_save_LIBS"
766 BACKEND_PC_FILES="$BACKEND_PC_FILES $X11_PC_FILES"
767 FLAVOUR_LIBS="$FLAVOUR_LIBS $X11_LIBS"
768 FLAVOUR_CFLAGS="$FLAVOUR_CFLAGS $X11_CFLAGS"
772 AM_CONDITIONAL([BUILD_XI2], [test "x$have_xinput2" = "xyes"])
773 AM_CONDITIONAL([X11_TESTS], [test "x$x11_tests" = "xyes"])
775 X11_EXTS=${X11_EXTS#* }
779 dnl === Enable debug level ====================================================
781 m4_define([debug_default], [m4_if(m4_eval(clutter_minor_version % 2), [1], [yes], [minimum])])
782 AC_ARG_ENABLE([debug],
783 [AS_HELP_STRING([--enable-debug=@<:@no/minimum/yes@:>@],
784 [Control Clutter debugging level @<:@default=]debug_default[@:>@])],
786 [enable_debug=debug_default])
788 AS_CASE([$enable_debug],
792 test "$cflags_set" = set || CFLAGS="$CFLAGS -g"
793 CLUTTER_DEBUG_CFLAGS="-DCLUTTER_ENABLE_DEBUG"
797 [CLUTTER_DEBUG_CFLAGS="-DCLUTTER_ENABLE_DEBUG -DG_DISABLE_CAST_CHECKS"],
800 [CLUTTER_DEBUG_CFLAGS="-DG_DISABLE_ASSERT -DG_DISABLE_CHECKS -DG_DISABLE_CAST_CHECKS"],
802 [AC_MSG_ERROR([Unknown argument for --enable-debug])]
805 AC_SUBST(CLUTTER_DEBUG_CFLAGS)
807 dnl === Enable deprecation guards ==================================================
809 m4_define([deprecated_default],
810 [m4_if(m4_eval(clutter_minor_version % 2),
815 AC_ARG_ENABLE([deprecated],
816 [AS_HELP_STRING([--enable-deprecated=@<:@no/yes@:>@],
817 [Whether deprecated symbols should be disabled when compiling Clutter @<:@default=]deprecated_default[@:>@])],
819 [enable_deprecated=deprecated_default])
821 AS_CASE([$enable_deprecated],
825 CLUTTER_DEPRECATED_CFLAGS="-DG_DISABLE_SINGLE_INCLUDES -DCOGL_DISABLE_DEPRECATED"
830 CLUTTER_DEPRECATED_CFLAGS="-DGLIB_DISABLE_DEPRECATION_WARNINGS -DCLUTTER_DISABLE_DEPRECATION_WARNINGS"
833 [AC_MSG_ERROR([Unknown argument for --enable-deprecated])]
836 AC_SUBST([CLUTTER_DEPRECATED_CFLAGS])
839 dnl === Conformance test suite ================================================
841 AC_ARG_ENABLE([conformance],
842 [AS_HELP_STRING([--enable-conformance=@<:@no/yes@:>@],
843 [Build conformance test suite @<:@default=yes@:>@])],
845 [enable_conformance=yes])
847 AM_CONDITIONAL([BUILD_TESTS], [test "x$enable_conformance" = "xyes"])
849 dnl === Profiling =============================================================
851 m4_define([profile_default], [no])
852 AC_ARG_ENABLE(profile,
853 AS_HELP_STRING([--enable-profile=@<:@no/yes@:>@],
854 [Turn on profiling support. yes; All profiling probe points are compiled in and may be runtime enabled. no; No profiling support will built into clutter. @<:@default=no@:>@]),
856 [enable_profile=profile_default])
858 AS_CASE([$enable_profile],
862 AS_IF([test "x$GCC" = "xyes"],
864 PKG_CHECK_MODULES([PROFILE_DEP], [uprof-0.3])
865 CLUTTER_PROFILE_CFLAGS="-DCLUTTER_ENABLE_PROFILE $PROFILE_DEP_CFLAGS"
866 CLUTTER_PROFILE_LDFLAGS="$PROFILE_DEP_LIBS"
868 AS_IF([test "x$enable_debug" = "xyes"], [CLUTTER_PROFILE_CFLAGS+=" -DUPROF_DEBUG"])
871 AC_MSG_ERROR([--enable-profile is currently only supported if using GCC])
877 CLUTTER_PROFILE_CFLAGS=""
878 CLUTTER_PROFILE_LDFLAGS=""
881 [*], [AC_MSG_ERROR([Invalid value for --enable-profile])]
883 AM_CONDITIONAL(PROFILE, test "x$enable_profile" != "xno")
884 AC_SUBST(CLUTTER_PROFILE_CFLAGS)
885 AC_SUBST(CLUTTER_PROFILE_LDFLAGS)
887 dnl === Coverage report =======================================================
889 AC_PATH_PROG([GCOV], [gcov], [enable_gcov=no])
891 AC_MSG_CHECKING([whether to build with gcov testing])
893 AC_ARG_ENABLE([gcov],
894 [AS_HELP_STRING([--enable-gcov],
895 [Whether to enable coverage testing (requires gcc
900 AS_IF([test "x$enable_gcov" = "xyes" && test "x$GCC" = "xyes"],
902 AS_IF([test "x$enable_conformance" = "xno"],
903 [AC_MSG_WARN([Conformance test suite is disabled, the coverage report will be incomplete])],
904 [AC_MSG_RESULT([yes])]
907 GCOV_CFLAGS="-g -O0 -fprofile-arcs -ftest-coverage"
908 GCOV_LDFLAGS="-lgcov"
910 [AC_MSG_RESULT([no])]
913 AM_CONDITIONAL([GCOV_ENABLED], [test "x$enable_gcov" = "xyes"])
914 AC_SUBST([GCOV_CFLAGS])
915 AC_SUBST([GCOV_LDFLAGS])
917 dnl === Enable strict compiler flags ==========================================
919 # use strict compiler flags only when building from git; the rules for
920 # distcheck will take care of turning this on when making a release
921 m4_define([maintainer_flags_default], [m4_if(m4_eval(clutter_micro_version % 2), [1], [yes], [no])])
922 AC_ARG_ENABLE([maintainer-flags],
923 [AS_HELP_STRING([--enable-maintainer-flags=@<:@no/yes/error@:>@],
924 [Use strict compiler flags @<:@default=]maintainer_flags_default[@:>@])],
926 [enable_maintainer_flags=maintainer_flags_default])
928 MAINTAINER_COMPILER_FLAGS="$MAINTAINER_COMPILER_FLAGS
929 -Wall -Wcast-align -Wuninitialized
930 -Wno-strict-aliasing -Wempty-body -Wformat
931 -Wformat-security -Winit-self
932 -Wdeclaration-after-statement -Wvla
935 AS_CASE([$enable_maintainer_flags],
938 AS_COMPILER_FLAGS([MAINTAINER_CFLAGS], [$MAINTAINER_COMPILER_FLAGS])
947 MAINTAINER_COMPILER_FLAGS="$MAINTAINER_COMPILER_FLAGS -Werror"
948 AS_COMPILER_FLAGS([MAINTAINER_CFLAGS], [$MAINTAINER_COMPILER_FLAGS])
952 [AC_MSG_ERROR([Invalid option for --enable-maintainer-flags])]
955 # strip leading spaces
956 MAINTAINER_CFLAGS=${MAINTAINER_CFLAGS#* }
957 AC_SUBST(MAINTAINER_CFLAGS)
959 dnl === Dependencies, compiler flags and linker libraries =====================
960 # strip leading space
961 BACKEND_PC_FILES=${BACKEND_PC_FILES#* }
963 CLUTTER_REQUIRES="$CLUTTER_BASE_PC_FILES $BACKEND_PC_FILES"
964 PKG_CHECK_MODULES(CLUTTER_DEPS, [$CLUTTER_REQUIRES])
965 AC_SUBST(CLUTTER_REQUIRES)
967 AS_IF([test "x$CLUTTER_BASE_PC_FILES_PRIVATE" != "x" && test "x$BACKEND_PC_FILES_PRIVATE" != "x"],
969 CLUTTER_REQUIRES_PRIVATE="$CLUTTER_BASE_PC_FILES_PRIVATE $BACKEND_PC_FILES_PRIVATE"
970 PKG_CHECK_MODULES(CLUTTER_DEPS_PRIVATE, [$CLUTTER_REQUIRES_PRIVATE])
973 CLUTTER_REQUIRES_PRIVATE=""
974 CLUTTER_DEPS_PRIVATE_CFLAGS=""
975 CLUTTER_DEPS_PRIVATE_LIBS=""
978 AC_SUBST(CLUTTER_REQUIRES_PRIVATE)
980 CLUTTER_CFLAGS="$FLAVOUR_CFLAGS $CLUTTER_DEPS_CFLAGS $CLUTTER_PROFILE_CFLAGS $GLIB_CFLAGS"
981 CLUTTER_LIBS="$FLAVOUR_LIBS $CLUTTER_DEPS_LIBS $CLUTTER_PROFILE_LDFLAGS $GLIB_LIBS"
982 AC_SUBST(CLUTTER_CFLAGS)
983 AC_SUBST(CLUTTER_LIBS)
986 dnl === GObject-Introspection check ===========================================
988 GOBJECT_INTROSPECTION_CHECK([gi_req_version])
990 dnl === GTK Doc check =========================================================
992 GTK_DOC_CHECK([gtk_doc_req_version], [--flavour no-tmpl])
994 # we don't want to build the documentation from a Git clone unless we
995 # explicitly tell configure to do so; this allows avoiding to recurse into
996 # the documentation directory when building Clutter inside Poky for a
997 # target device that doesn't have gtk-doc installed. for reference
998 # see: http://bugzilla.openedhand.com/show_bug.cgi?id=1047
1000 # we use autogen.sh as it exists only inside the Git clones, and it
1001 # is not packaged into tarballs.
1002 AM_CONDITIONAL([BUILD_GTK_DOC], [test "x$enable_gtk_doc" = "xyes" || test ! -f "autogen.sh"])
1004 # prefixes for fixing gtk-doc references
1005 CAIRO_PREFIX="`$PKG_CONFIG --variable=prefix cairo`"
1006 GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`"
1007 PANGO_PREFIX="`$PKG_CONFIG --variable=prefix pango`"
1008 COGL_PREFIX="`$PKG_CONFIG --variable=prefix cogl-1.0`"
1009 ATK_PREFIX="`$PKG_CONFIG --variable=prefix atk`"
1010 AC_SUBST(CAIRO_PREFIX)
1011 AC_SUBST(GLIB_PREFIX)
1012 AC_SUBST(PANGO_PREFIX)
1013 AC_SUBST(COGL_PREFIX)
1014 AC_SUBST(ATK_PREFIX)
1016 dnl === Manual ================================================================
1018 AC_ARG_ENABLE([docs],
1019 [AS_HELP_STRING([--enable-docs=@<:@no/yes@:>@],
1020 [Build optional documentation; requires xsltproc and jw.])],
1021 [enable_docs=$enableval],
1025 AS_IF([test "x$enable_docs" = "xyes"],
1027 AC_PATH_PROG(JW, [jw], [no])
1028 AS_IF([test "x$JW" = "xno"],
1030 AC_MSG_WARN([jw not found; pdf generation has been disabled])
1034 AC_PATH_PROG(XSLTPROC, [xsltproc], [no])
1035 AS_IF([test "x$XSLTPROC" = "xno"],
1037 AC_MSG_ERROR([xsltproc not found])
1042 AM_CONDITIONAL(ENABLE_DOCS, [test "x$enable_docs" = "xyes"])
1043 AM_CONDITIONAL(ENABLE_PDFS, [test "x$enable_pdfs" = "xyes"])
1045 dnl === I18N ==================================================================
1047 AM_GNU_GETTEXT_VERSION([0.17])
1048 AM_GNU_GETTEXT([external])
1050 GETTEXT_PACKAGE="clutter-1.0"
1051 AC_SUBST(GETTEXT_PACKAGE)
1052 AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE],
1053 ["$GETTEXT_PACKAGE"],
1054 [The prefix for our gettext translation domains.])
1057 dnl ===========================================================================
1065 build/autotools/Makefile
1066 build/mingw/Makefile
1067 build/win32/Makefile
1068 build/win32/vs9/Makefile
1069 build/win32/vs10/Makefile
1072 clutter/clutter-config.h
1073 clutter/clutter-version.h
1074 clutter/clutter-version.h.win32
1075 clutter/clutter-$CLUTTER_API_VERSION.pc:clutter/clutter.pc.in
1077 clutter/cally/cally-$CLUTTER_API_VERSION.pc:clutter/cally/cally.pc.in
1079 clutter/cex100/clutter-cex100.h
1082 tests/accessibility/Makefile
1083 tests/conform/Makefile
1084 tests/conform/test-launcher.sh
1086 tests/interactive/Makefile
1087 tests/interactive/wrapper.sh
1088 tests/micro-bench/Makefile
1089 tests/performance/Makefile
1092 doc/reference/Makefile
1093 doc/reference/clutter/Makefile
1094 doc/reference/clutter/clutter-docs.xml
1095 doc/reference/cally/Makefile
1096 doc/reference/cally/cally-docs.xml
1098 doc/cookbook/Makefile
1099 doc/cookbook/clutter-cookbook.xml
1100 doc/cookbook/examples/Makefile
1107 dnl === Summary ===============================================================
1110 echo "Clutter - $VERSION (${CLUTTER_RELEASE_STATUS})"
1115 echo " Prefix: ${prefix}"
1116 echo " Libdir: ${libdir}"
1117 echo " Sysconfdir: ${sysconfdir}"
1119 # Compiler/Debug related flags
1121 echo " • Compiler options:"
1122 echo " Clutter debug level: ${enable_debug}"
1123 echo " Compiler flags: ${CFLAGS} ${MAINTAINER_CFLAGS}"
1124 echo " Profiling enabled: ${enable_profile}"
1125 echo " Enable coverage tests: ${enable_gcov}"
1126 echo " Enable deprecated symbols: ${enable_deprecated}"
1130 echo " • Documentation:"
1131 echo " Build API Reference: ${enable_gtk_doc}"
1132 echo " Build Additional Documentation: ${enable_docs} (Generate PDF: ${enable_pdfs})"
1137 echo " Build introspection data: ${enable_introspection}"
1138 echo " Build conformance test suite: ${enable_conformance}"
1139 echo " Build X11-specific tests: ${x11_tests}"
1141 # Clutter backend related flags
1143 echo " • Clutter Backends:"
1145 if test "x$experimental_backend" = "xno"; then
1146 echo " Windowing systems: ${CLUTTER_BACKENDS}"
1148 echo " Windowing systems: ${CLUTTER_BACKENDS} (WARNING: Experimental backends enabled)"
1151 if test "x$experimental_input_backend" = "xno"; then
1152 echo " Input backends: ${CLUTTER_INPUT_BACKENDS}"
1154 echo " Input backends: ${CLUTTER_INPUT_BACKENDS} (WARNING: Experimental backends enabled)"
1157 if test "x$SUPPORT_X11" = "x1"; then
1159 echo " - X11 backend options:"
1160 echo " Enabled extensions: ${X11_EXTS}"
1161 echo " Build X11-specific tests: ${x11_tests}"
1164 if test "x$SUPPORT_CEX100" = "x1"; then
1166 echo " - CEx100 backend options (WARNING: Experimental):"
1167 echo " libGDL include prefix: ${CLUTTER_CEX100_LIBGDL_PREFIX}"
1170 if test "x$SUPPORT_WAYLAND_COMPOSITOR" = "x1"; then
1172 echo " - Wayland compositor support enabled (WARNING: Experimental)"
1177 # General warning about experimental features
1178 if test "x$experimental_backend" = "xyes"; then
1180 echo "☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠"
1181 echo "*WARNING* *WARNING* *WARNING* *WARNING* *WARNING* *WARNING* *WARNING*"
1183 echo " The stability of your build might be affected by one or more"
1184 echo " experimental backends or experimental and unsupported features"
1186 echo "*WARNING* *WARNING* *WARNING* *WARNING* *WARNING* *WARNING* *WARNING*"
1187 echo "☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠☠"