dnl configure.ac dnl Process this file with autoconf to produce a configure script. AC_PREREQ([2.63]) AC_INIT([libglvnd], [1.5.0], [kbrenneman@nvidia.com]) AC_CONFIG_SRCDIR([config.h.in]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_AUX_DIR([bin]) AC_CONFIG_MACRO_DIR([m4]) AC_CANONICAL_SYSTEM dnl Add an --enable-debug option AX_CHECK_ENABLE_DEBUG(no, DEBUG) AC_USE_SYSTEM_EXTENSIONS AM_INIT_AUTOMAKE([1.11 foreign silent-rules]) AM_SILENT_RULES([yes]) dnl Checks for programs. AC_PROG_CC AC_PROG_CC_C99 AM_PROG_AS AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET AC_PROG_LIBTOOL AC_PROG_MKDIR_P PKG_PROG_PKG_CONFIG AC_PROG_NM AC_ARG_ENABLE([werror], [AS_HELP_STRING([--enable-werror], [Build with -Werror @<:@default=disabled@:>@])], [enable_werror=$enableval], [enable_werror=no]) if test "x$enable_werror" = xyes; then CFLAGS="$CFLAGS -Werror" fi # The tarball from "make dist" already contains all of the generated files. If # we're building from that, then we won't need Python. if test -e "$srcdir/src/GLdispatch/vnd-glapi/g_glapi_mapi_gl_tmp.h" ; then AM_PATH_PYTHON([2.7],, [:]) else AM_PATH_PYTHON([2.7]) fi AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != :]) if test "x$ac_cv_prog_cc_c99" = xno; then AC_MSG_ERROR([Building libglvnd requires a C99-enabled compiler]) fi AC_ARG_ENABLE([egl], [AS_HELP_STRING([--disable-egl], [Disable EGL support @<:@default=enabled@:>@])], [enable_egl="$enableval"], [enable_egl=yes] ) AM_CONDITIONAL([ENABLE_EGL], [test "x$enable_egl" = "xyes"]) AC_ARG_ENABLE([x11], [AS_HELP_STRING([--disable-x11], [Disable X11 support. Implies --disable-glx @<:@default=enabled@:>@])], [enable_x11="$enableval"], [enable_x11=yes] ) AM_CONDITIONAL([ENABLE_X11], [test "x$enable_x11" = "xyes"]) AC_ARG_ENABLE([glx], [AS_HELP_STRING([--disable-glx], [Disable GLX support @<:@default=enabled@:>@])], [enable_glx="$enableval"], [enable_glx="$enable_x11"] ) AM_CONDITIONAL([ENABLE_GLX], [test "x$enable_glx" = "xyes"]) if test "x$enable_x11" != "xyes" -a "x$enable_glx" = "xyes" ; then AC_MSG_ERROR([Can't build GLX without X11.]) fi AC_ARG_ENABLE([gles1], [AS_HELP_STRING([--disable-gles1], [disable support for OpenGL ES 1.x API @<:@default=enabled@:>@])], [enable_gles1="$enableval"], [enable_gles1=yes]) AM_CONDITIONAL([ENABLE_GLES1], [test "x$enable_gles1" = "xyes"]) AC_ARG_ENABLE([gles2], [AS_HELP_STRING([--disable-gles2], [disable support for OpenGL ES 2.x and 3.x API @<:@default=enabled@:>@])], [enable_gles2="$enableval"], [enable_gles2=yes]) AM_CONDITIONAL([ENABLE_GLES2], [test "x$enable_gles2" = "xyes"]) AC_ARG_ENABLE([headers], [AS_HELP_STRING([--disable-headers], [Do not install the GL/GLES/GLX/EGL header files @<:@default=enabled@:>@])], [enable_headers="$enableval"], [enable_headers=yes] ) AM_CONDITIONAL([ENABLE_GL_HEADERS], [test "x$enable_headers" = "xyes"]) AM_CONDITIONAL([ENABLE_EGL_HEADERS], [test "x$enable_headers" = "xyes" -a "x$enable_egl" = "xyes"]) AM_CONDITIONAL([ENABLE_GLX_HEADERS], [test "x$enable_headers" = "xyes" -a "x$enable_glx" = "xyes"]) AM_CONDITIONAL([ENABLE_GLES1_HEADERS], [test "x$enable_headers" = "xyes" -a "x$enable_gles1" = "xyes"]) AM_CONDITIONAL([ENABLE_GLES2_HEADERS], [test "x$enable_headers" = "xyes" -a "x$enable_gles2" = "xyes"]) AC_ARG_ENABLE([entrypoint-patching], [AS_HELP_STRING([--disable-entrypoint-patching], [Disable OpenGL entrypoint patching optimization @<:@default=enabled@:>@])], [enable_entrypoint_patching="$enableval"], [enable_entrypoint_patching=yes] ) AS_IF([test "x$enable_entrypoint_patching" = "xyes"], [AC_DEFINE([GLDISPATCH_ENABLE_PATCHING], 1, [Define to 1 to enable entrypoint patching in libGLdispatch.])]) dnl dnl Arch/platform-specific settings. Copied from mesa dnl AC_ARG_ENABLE([asm], [AS_HELP_STRING([--disable-asm], [disable assembly usage @<:@default=enabled on supported platforms@:>@])], [enable_asm="$enableval"], [enable_asm=yes] ) asm_arch="" AC_MSG_CHECKING([whether to enable assembly]) test "x$enable_asm" = xno && AC_MSG_RESULT([no]) # check for supported arches if test "x$enable_asm" = xyes; then case "$host_cpu" in i?86) case "$host_os" in linux* | *freebsd* | dragonfly* | *netbsd*) asm_arch=x86 ;; gnu*) asm_arch=x86 ;; esac ;; x86_64 | amd64) case "$host_os" in linux* | *freebsd* | dragonfly* | *netbsd*) asm_arch=x86_64 ;; esac ;; armv7*l | armv8*l) asm_arch=armv7l ;; aarch64) asm_arch=aarch64 ;; powerpc64le) asm_arch=ppc64 ;; powerpc64) AC_COMPILE_IFELSE([AC_LANG_SOURCE([ #if !defined(_CALL_ELF) || (_CALL_ELF) == 1 # error "ELFv1 ABI" #endif ])], [asm_arch=ppc64],[]) ;; loongarch64) asm_arch=loongarch64 ;; esac case "$asm_arch" in x86) DEFINES="$DEFINES -DUSE_X86_ASM" AC_MSG_RESULT([yes, x86]) ;; x86_64) DEFINES="$DEFINES -DUSE_X86_64_ASM" AC_MSG_RESULT([yes, x86_64]) ;; armv7l) DEFINES="$DEFINES -DUSE_ARMV7_ASM" AC_MSG_RESULT([yes, armv7l]) ;; aarch64) DEFINES="$DEFINES -DUSE_AARCH64_ASM" AC_MSG_RESULT([yes, aarch64]) ;; ppc64) DEFINES="$DEFINES -DUSE_PPC64_ASM" AC_MSG_RESULT([yes, ppc64]) ;; loongarch64) DEFINES="$DEFINES -DUSE_LOONGARCH64_ASM" AC_MSG_RESULT([yes, loongarch64]) ;; *) AC_MSG_RESULT([no, platform '$host_cpu' not supported]) ;; esac fi dnl dnl mapi top-relative paths: defined here so mapi can be used elsewhere dnl dnl Checks for libraries. AX_PTHREAD() if test "x$enable_x11" = "xyes" ; then PKG_CHECK_MODULES([X11], [x11]) AC_DEFINE([ENABLE_EGL_X11], 1, [Define to 1 if X11 support is enabled.]) fi if test "x$enable_glx" = "xyes" ; then PKG_CHECK_MODULES([XEXT], [xext]) PKG_CHECK_MODULES([GLPROTO], [glproto]) fi dnl Checks for typedefs, structures, and compiler characteristics. AC_C_TYPEOF dnl Checks for library functions. AC_FUNC_STRNLEN dnl TLS detection AC_ARG_ENABLE([tls], [AS_HELP_STRING([--disable-tls], [disable TLS usage @<:@default=enabled on supported platforms@:>@])], [enable_tls="$enableval"], [enable_tls=yes] ) AC_MSG_CHECKING([for __thread]) if test "x$enable_tls" = "xyes"; then AC_COMPILE_IFELSE([AC_LANG_SOURCE([ __thread int foo; ])], [HAVE_TLS=yes],[HAVE_TLS=no]) else HAVE_TLS=no fi AC_MSG_RESULT($HAVE_TLS) # Figure out what implementation to use for the entrypoint stubs. # This will set an automake condition, which is then used in # src/GLdispatch/vnd-glapi/entry_files.mk. AC_MSG_CHECKING([for entrypoint stub type]) case "x$asm_arch" in xx86 | xx86_64 | xppc64) # TLS asm requires initial-exec, which is not portable (only supported by # FreeBSD and glibc). on other platforms we use TSD stubs to allow calling # extension functions unknown at compile time. # https://gitlab.freedesktop.org/glvnd/libglvnd/-/merge_requests/249 case "$host_os$HAVE_TLS" in *gnu*yes|*freebsd*yes) gldispatch_entry_type=${asm_arch}_tls ;; *) gldispatch_entry_type=${asm_arch}_tsd ;; esac ;; xarmv7l) # For ARMv7, only the TSD stubs have been implemented yet. gldispatch_entry_type=armv7_tsd ;; xaarch64) # For aarch64, only the TSD stubs have been implemented yet. gldispatch_entry_type=aarch64_tsd ;; xloongarch64) # For loongarch64, only the TSD stubs have been implemented yet. gldispatch_entry_type=loongarch64_tsd ;; *) # The C stubs will work with either TLS or TSD. gldispatch_entry_type=pure_c ;; esac AC_MSG_RESULT([$gldispatch_entry_type, TLS=$HAVE_TLS]) case "$gldispatch_entry_type" in # -mtls-dialect=gnu2 speeds up non-initial-exec TLS significantly but requires # full toolchain (including libc) support. # # tls stubs are incompatible with tlsdesc, but are only compatible with # initial-exec which is faster anyways *_tls) ;; *) case " $CFLAGS" in *' -mtls-dialect='*) ;; *) saved_CFLAGS="$CFLAGS" AC_MSG_CHECKING([for -mtls-dialect=gnu2]) # -fpic to force dynamic tls, otherwise TLS relaxation defeats check CFLAGS="$CFLAGS -mtls-dialect=gnu2 -fpic" HAVE_TLSDESC=no # need AC_RUN_IFELSE to check libc support. since this is just an # optimization we skip it when cross-compiling AC_RUN_IFELSE([AC_LANG_SOURCE([__thread int x; int main() { return x; }])], [HAVE_TLSDESC=yes; AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)], [AC_MSG_WARN([cannot auto-detect -mtls-dialect when cross-compiling, using compiler default])] ) CFLAGS="$saved_CFLAGS" if test "$HAVE_TLSDESC" = yes; then CFLAGS="$CFLAGS -mtls-dialect=gnu2" fi esac esac AS_IF([test "x$HAVE_TLS" = "xyes"], [AC_DEFINE([GLDISPATCH_USE_TLS], 1, [Define to 1 if libGLdispatch should use a TLS variable for the dispatch table.])]) AM_CONDITIONAL([GLDISPATCH_USE_TLS], [test "x$HAVE_TLS" = "xyes"]) AM_CONDITIONAL([GLDISPATCH_TYPE_X86_TLS], [test "x$gldispatch_entry_type" = "xx86_tls"]) AM_CONDITIONAL([GLDISPATCH_TYPE_X86_TSD], [test "x$gldispatch_entry_type" = "xx86_tsd"]) AM_CONDITIONAL([GLDISPATCH_TYPE_X86_64_TLS], [test "x$gldispatch_entry_type" = "xx86_64_tls"]) AM_CONDITIONAL([GLDISPATCH_TYPE_X86_64_TSD], [test "x$gldispatch_entry_type" = "xx86_64_tsd"]) AM_CONDITIONAL([GLDISPATCH_TYPE_PPC64_TLS], [test "x$gldispatch_entry_type" = "xppc64_tls"]) AM_CONDITIONAL([GLDISPATCH_TYPE_PPC64_TSD], [test "x$gldispatch_entry_type" = "xppc64_tsd"]) AM_CONDITIONAL([GLDISPATCH_TYPE_ARMV7_TSD], [test "x$gldispatch_entry_type" = "xarmv7_tsd"]) AM_CONDITIONAL([GLDISPATCH_TYPE_AARCH64_TSD], [test "x$gldispatch_entry_type" = "xaarch64_tsd"]) AM_CONDITIONAL([GLDISPATCH_TYPE_LOONGARCH64_TSD], [test "x$gldispatch_entry_type" = "xloongarch64_tsd"]) AM_CONDITIONAL([GLDISPATCH_TYPE_PURE_C], [test "x$gldispatch_entry_type" = "xpure_c"]) AS_IF([test "x$gldispatch_entry_type" != "xpure_c"], [AC_DEFINE([USE_DISPATCH_ASM], 1, [Define to 1 if libGLdispatch and libGLX should use assembly dispatch functions.])]) AC_MSG_CHECKING([for constructor attributes]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([ void __attribute__ ((constructor)) foo(void) { } void __attribute__ ((destructor)) bar(void) { } ])], [USE_ATTRIBUTE_CONSTRUCTOR=yes],[USE_ATTRIBUTE_CONSTRUCTOR=no]) AC_MSG_RESULT($USE_ATTRIBUTE_CONSTRUCTOR) AS_IF([test "x$USE_ATTRIBUTE_CONSTRUCTOR" = "xyes"], [AC_DEFINE([USE_ATTRIBUTE_CONSTRUCTOR], 1, [Define to 1 if the compiler supports constructor attributes.])]) AC_MSG_CHECKING([for pthreads rwlocks]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([ #include void foo(void) { pthread_rwlock_t lock; pthread_rwlock_init(&lock, NULL); } ])], [HAVE_PTHREAD_RWLOCK_T=yes],[HAVE_PTHREAD_RWLOCK_T=no]) AC_MSG_RESULT($HAVE_PTHREAD_RWLOCK_T) AS_IF([test "x$HAVE_PTHREAD_RWLOCK_T" = "xyes"], [AC_DEFINE([HAVE_PTHREAD_RWLOCK_T], 1, [Define to 1 if the compiler supports pthreads rwlocks.])]) AC_MSG_CHECKING([for sync intrinsics]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([ int foo(int volatile *val, int oldVal, int newVal) { return __sync_add_and_fetch(val, 1); return __sync_lock_test_and_set(val, newVal); return __sync_val_compare_and_swap(val, oldVal, newVal); } ])], [HAVE_SYNC_INTRINSICS=yes],[HAVE_SYNC_INTRINSICS=no]) AC_MSG_RESULT($HAVE_SYNC_INTRINSICS) AS_IF([test "x$HAVE_SYNC_INTRINSICS" = "xyes"], [AC_DEFINE([HAVE_SYNC_INTRINSICS], 1, [Define to 1 if the compiler supports __sync intrinsic functions.])]) AC_CHECK_FUNC(mincore, [AC_DEFINE([HAVE_MINCORE], [1], [Define to 1 if mincore is available.])]) AC_CHECK_FUNC(dlopen, [], [AC_SUBST([LIB_DL], [-ldl])]) AC_MSG_CHECKING([for RTLD_NOLOAD]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([ #include void foo(void) { (void) RTLD_NOLOAD; } ])], [HAVE_RTLD_NOLOAD=yes],[HAVE_RTLD_NOLOAD=no]) AC_MSG_RESULT($HAVE_RTLD_NOLOAD) AS_IF([test "x$HAVE_RTLD_NOLOAD" = "xyes"], [AC_DEFINE([HAVE_RTLD_NOLOAD], 1, [Define to 1 if the compiler supports RTLD_NOLOAD.])]) AC_MSG_CHECKING([for dirent.d_type]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([ #include void foo(struct dirent *ent) { (void) ent->d_type; } ])], [HAVE_DIRENT_DTYPE=yes],[HAVE_DIRENT_DTYPE=no]) AC_MSG_RESULT($HAVE_DIRENT_DTYPE) AS_IF([test "x$HAVE_DIRENT_DTYPE" = "xyes"], [AC_DEFINE([HAVE_DIRENT_DTYPE], 1, [Define to 1 if struct dirent has a d_type member.])]) # See if the linker supports the --no-undefined flag. AX_CHECK_LINK_FLAG([-Xlinker --no-undefined], [AC_SUBST([LINKER_FLAG_NO_UNDEFINED], ["-Xlinker --no-undefined"])], [AC_SUBST([LINKER_FLAG_NO_UNDEFINED], [""])]) AC_ARG_VAR([GLDISPATCH_PAGE_SIZE], [Page size to align static dispatch stubs]) AS_IF([test "x$GLDISPATCH_PAGE_SIZE" != "x"], [AC_DEFINE_UNQUOTED([GLDISPATCH_PAGE_SIZE], [$GLDISPATCH_PAGE_SIZE], [Page size to align static dispatch stubs.])]) # Set EGL_NO_X11 unconditionally. Libglvnd doesn't make any assumptions about # native display or drawable types, so we don't need X11-specific typedefs for # them. DEFINES="$DEFINES -DEGL_NO_X11" dnl default CFLAGS CFLAGS="$CFLAGS -Wall -include config.h -fvisibility=hidden $DEFINES" AC_CONFIG_FILES([Makefile libglvnd.pc include/Makefile src/Makefile src/GL/Makefile src/GL/gl.pc src/OpenGL/opengl.pc src/OpenGL/Makefile src/GLESv1/glesv1_cm.pc src/GLESv1/Makefile src/GLESv2/glesv2.pc src/GLESv2/Makefile src/GLX/glx.pc src/GLX/Makefile src/EGL/Makefile src/EGL/egl.pc src/GLdispatch/Makefile src/GLdispatch/vnd-glapi/Makefile src/util/Makefile tests/Makefile tests/dummy/Makefile]) AC_OUTPUT