| dnl Process this file with autoconf 2.69 or later to produce |
| dnl a configure script. |
| AC_PREREQ(2.69) |
| AC_INIT([config/config.h.in]) |
| AC_CONFIG_HEADERS([config/config.h]) |
| AC_PREFIX_PROGRAM(nasm) |
| AC_CONFIG_AUX_DIR(autoconf/helpers) |
| |
| dnl Mark where in config.h.in macros auto-generated by the configuration |
| dnl start; this is used to generate config/unconfig.h. |
| AH_BOTTOM([ |
| /* Begin unconfig.h */]) |
| |
| dnl Save initial CFLAGS, to see if -g -O2 came from configure or not |
| pa_init_cflags="$CFLAGS" |
| |
| dnl This prevents us from running Wine and thinking we are not |
| dnl cross-compiling when in fact we are; running Wine here is at |
| dnl the best very slow and doesn't buy us a single thing at all. |
| WINELOADER=/dev/null |
| export WINELOADER |
| |
| dnl Get the canonical target system name |
| AC_CANONICAL_HOST |
| |
| dnl Enable any available C extensions |
| AC_USE_SYSTEM_EXTENSIONS |
| AC_SYS_LARGEFILE |
| AC_PROG_CC |
| AC_PROG_CC_STDC |
| PA_ADD_CFLAGS([-std=c17], [], [], |
| [PA_ADD_CFLAGS([-std=c11], [], [], |
| [PA_ADD_CFLAGS([-std=c99])])]) |
| |
| dnl If the user did not specify a CFLAGS default, change default |
| dnl to -O0 for debugging |
| PA_ARG_DISABLED([optimization], |
| [compile without optimization (-O0) to help debugging], |
| [pa_no_optimize=true]) |
| |
| dnl Other programs |
| pa_no_optimize=false |
| |
| dnl Compile and link with dwarf debug |
| PA_ARG_ENABLED([gdb], |
| [disable optimization and compile with extra debug information for GDB debugger], |
| [PA_ADD_CFLAGS([-ggdb3]) |
| pa_no_optimize=true]) |
| |
| AS_IF([$pa_no_optimize], |
| [PA_ADD_CFLAGS([-O0]) |
| PA_ADD_CFLAGS([-fno-omit-frame-pointer])]) |
| |
| dnl Profiling |
| PA_ARG_ENABLED([profiling], |
| [compile with profiling (-pg option)], |
| [PA_ADD_CFLAGS([-pg])]) |
| |
| dnl Abort on panic |
| PA_ARG_ENABLED([panic-abort], |
| [call abort() on panic to trap in the debugger], |
| [AC_DEFINE(ABORT_ON_PANIC)]) |
| AH_TEMPLATE(ABORT_ON_PANIC, |
| [Define to 1 to call abort() on panics (internal errors), for debugging.]) |
| |
| dnl Checks for typedefs, structures, and compiler characteristics. |
| AC_TYPE_SIZE_T |
| AC_C_BIGENDIAN(AC_DEFINE(WORDS_BIGENDIAN),AC_DEFINE(WORDS_LITTLEENDIAN),,) |
| AH_TEMPLATE(WORDS_BIGENDIAN, |
| [Define to 1 if your processor stores words with the most significant |
| byte first (like Motorola and SPARC, unlike Intel and VAX).]) |
| AH_TEMPLATE(WORDS_LITTLEENDIAN, |
| [Define to 1 if your processor stores words with the least significant |
| byte first (like Intel and VAX, unlike Motorola and SPARC).]) |
| |
| dnl LLVM doesn't error out on invalid -W options unless this option is |
| dnl specified first. Enable this so this script can actually discover |
| dnl which -W options are possible for this compiler. |
| PA_ADD_CFLAGS([-Werror=unknown-warning-option]) |
| |
| dnl Force gcc and gcc-compatible compilers treat signed integers |
| dnl as 2's complement |
| PA_ADD_CFLAGS([-fwrapv]) |
| |
| dnl Force clang to behave in a predictable manner, in order to make bugs |
| dnl possible to track down. gcc appears to have this behavior by default. |
| PA_ADD_CFLAGS([-ftrivial-auto-var-init=zero]) |
| |
| dnl Some environments abuse __STRICT_ANSI__ to disable some |
| dnl function declarations |
| PA_ADD_CFLAGS([-U__STRICT_ANSI__]) |
| |
| dnl Don't put things in common if we can avoid it. We don't want to |
| dnl assume all compilers support common, and this will help find those |
| dnl problems. This also works around an OSX linker problem. |
| PA_ADD_CFLAGS([-fno-common]) |
| |
| dnl Check for library extension |
| PA_LIBEXT |
| |
| dnl Look for programs... |
| AC_PROG_LN_S |
| AC_PROG_MAKE_SET |
| AC_PROG_INSTALL |
| AC_PROG_MKDIR_P |
| |
| AC_CHECK_PROGS(NROFF, nroff, false) |
| AC_CHECK_PROGS(ASCIIDOC, asciidoc, false) |
| AC_CHECK_PROGS(XMLTO, xmlto, false) |
| AC_CHECK_PROGS(XZ, xz, false) |
| |
| dnl Check for progs needed for manpage generation |
| MANPAGES=manpages |
| AS_IF([test x$ASCIIDOC = xfalse], |
| [AC_MSG_WARN([No asciidoc package found, cannot build man pages]) |
| MANPAGES=''] |
| ) |
| AS_IF([test x"$XMLTO" = xfalse], |
| [AC_MSG_WARN([No xmlto package found, cannot build man pages]) |
| MANPAGES=''] |
| ) |
| AC_SUBST([MANPAGES]) |
| |
| dnl Don't create .pdf.xz if there is no xz |
| AS_IF([test x"$XZ" = xfalse], |
| [], |
| [XZFILES=xzfiles]) |
| AC_SUBST([XZFILES]) |
| |
| dnl Can't create NSIS package if there is no makensis |
| dnl ... but it only applies to a Windows target ... |
| dnl Note: AC_CHECK_TOOLS is supposed to check for the "plain" |
| dnl version of the program name, but it doesn't seem to. |
| AC_ARG_WITH([nsis], |
| [AS_HELP_STRING([[--with-nsis[=makensis]]], |
| [build an install .exe using NSIS on Windows hosts])], |
| [], [with_nsis=yes]) |
| AS_IF([test x"$MAKENSIS" = x], [], |
| [AS_IF([test x"$with_nsis" = xno], [] |
| [with_nsis="$MAKENSIS"])]) |
| |
| MAKENSIS=false |
| |
| AS_CASE([$host], |
| [*-win* | *-mingw*], |
| [AS_IF([test x"$with_nsis" = xno], [], |
| [NSIS=nsis |
| AS_IF([test x"$with_nsis" = xyes], |
| [AC_CHECK_TOOL(MAKENSIS_TOOL, makensis, false) |
| MAKENSIS="$MAKENSIS_TOOL" |
| AS_IF([test x"$MAKENSIS" = xfalse], |
| [AC_CHECK_PROGS(MAKENSIS_PLAIN, makensis, false) |
| MAKENSIS="$MAKENSIS_PLAIN"]) |
| AS_IF([test x"$MAKENSIS" = xfalse], |
| [AC_MSG_WARN([no makensis found, cannot build installer]) |
| NSIS=''])], |
| [MAKENSIS="$with_nsis"])])]) |
| AC_SUBST([MAKENSIS]) |
| AC_SUBST([NSIS]) |
| |
| dnl Check for host compiler tools |
| AC_CHECK_TOOL(AR, ar) |
| AC_CHECK_TOOL(RANLIB, ranlib, :) |
| AC_CHECK_TOOL(STRIP, strip) |
| |
| dnl |
| dnl NOTE: the tests for header files and library functions use constructs |
| dnl that create warnings on modern compilers, due to lack of prototypes, |
| dnl etc. Therefore, do not add the -Werror options before this. |
| dnl |
| |
| dnl Tests which may trigger warnings on some compilers |
| AC_C_CONST |
| AC_C_INLINE |
| AC_C_RESTRICT |
| |
| dnl Checks for header files. |
| AC_HEADER_STDC |
| PA_ADD_HEADERS(string.h) |
| PA_ADD_HEADERS(stdarg.h) |
| AC_CHECK_HEADERS(inttypes.h) |
| AC_CHECK_HEADERS(strings.h) |
| AC_HEADER_STDBOOL |
| AC_CHECK_HEADERS(stdnoreturn.h) |
| AC_CHECK_HEADERS(io.h) |
| AC_CHECK_HEADERS(fcntl.h) |
| AC_CHECK_HEADERS(unistd.h) |
| AC_CHECK_HEADERS(sys/mman.h) |
| AC_CHECK_HEADERS(sys/types.h) |
| AC_CHECK_HEADERS(sys/stat.h) |
| AC_CHECK_HEADERS(sys/resource.h) |
| |
| dnl Checks for library functions. |
| AC_CHECK_FUNCS(strcasecmp stricmp) |
| AC_CHECK_FUNCS(strncasecmp strnicmp) |
| AC_CHECK_FUNCS(strsep) |
| AC_CHECK_FUNCS(strnlen) |
| AC_CHECK_FUNCS(strrchrnul) |
| AC_CHECK_FUNCS(iscntrl) |
| AC_CHECK_FUNCS(isascii) |
| AC_CHECK_FUNCS(mempcpy) |
| |
| AC_CHECK_FUNCS(getuid) |
| AC_CHECK_FUNCS(getgid) |
| AC_CHECK_FUNCS(getrlimit) |
| |
| AC_CHECK_FUNCS(realpath) |
| AC_CHECK_FUNCS(canonicalize_file_name) |
| AC_CHECK_FUNCS(_fullpath) |
| AC_CHECK_FUNCS(pathconf) |
| |
| AC_FUNC_FSEEKO |
| AC_CHECK_FUNCS([_fseeki64]) |
| AC_CHECK_FUNCS([ftruncate _chsize _chsize_s]) |
| AC_CHECK_FUNCS([fileno _fileno]) |
| |
| AC_FUNC_MMAP |
| AC_CHECK_FUNCS(getpagesize) |
| AC_CHECK_FUNCS(sysconf) |
| |
| AC_CHECK_FUNCS([access _access faccessat]) |
| |
| PA_HAVE_FUNC(__builtin_expect, (1,1)) |
| |
| dnl ilog2() building blocks |
| PA_ADD_HEADERS(intrin.h) |
| PA_HAVE_FUNC(__builtin_clz, (0U)) |
| PA_HAVE_FUNC(__builtin_clzl, (0UL)) |
| PA_HAVE_FUNC(__builtin_clzll, (0ULL)) |
| PA_HAVE_FUNC(_BitScanReverse, (0)) |
| PA_HAVE_FUNC(_BitScanReverse64, (0)) |
| |
| PA_FUNC_SNPRINTF |
| PA_FUNC_VSNPRINTF |
| AC_CHECK_FUNCS([strlcpy]) |
| AC_CHECK_FUNCS([strrchrnul]) |
| |
| dnl These types are POSIX-specific, and Windows does it differently... |
| AC_CHECK_TYPES([struct _stati64]) |
| AC_CHECK_TYPES([struct stat]) |
| AC_CHECK_FUNCS([stat _stati64]) |
| AC_CHECK_FUNCS([fstat _fstati64]) |
| AC_CHECK_FUNCS([S_ISREG]) |
| |
| dnl Check for functions that might not be declared in the headers for |
| dnl various idiotic reasons (mostly because of library authors |
| dnl abusing the meaning of __STRICT_ANSI__) |
| AC_CHECK_DECLS(strcasecmp) |
| AC_CHECK_DECLS(stricmp) |
| AC_CHECK_DECLS(strncasecmp) |
| AC_CHECK_DECLS(strnicmp) |
| AC_CHECK_DECLS(strsep) |
| AC_CHECK_DECLS(strlcpy) |
| AC_CHECK_DECLS(strnlen) |
| AC_CHECK_DECLS(strrchrnul) |
| |
| dnl Check for missing types |
| AC_TYPE_UINTPTR_T |
| |
| dnl Documentation: should we generate an uncompressed PDF? It is |
| dnl about twice as big, but it can be externally compressed (e.g. with xz) |
| dnl and becomes significantly smaller than the original. |
| PA_ARG_DISABLED([pdf-compression], |
| [generate an uncompressed documentation PDF], |
| [PDFOPT='-nocompress']) |
| AC_SUBST([PDFOPT]) |
| |
| dnl |
| dnl Look for byte-swapping support... |
| dnl |
| PA_ADD_HEADERS(endian.h sys/endian.h machine/endian.h) |
| PA_HAVE_FUNC(cpu_to_le16, (0)) |
| PA_HAVE_FUNC(cpu_to_le32, (0)) |
| PA_HAVE_FUNC(cpu_to_le64, (0)) |
| PA_HAVE_FUNC(__cpu_to_le16, (0)) |
| PA_HAVE_FUNC(__cpu_to_le32, (0)) |
| PA_HAVE_FUNC(__cpu_to_le64, (0)) |
| PA_HAVE_FUNC(htole16, (0)) |
| PA_HAVE_FUNC(htole32, (0)) |
| PA_HAVE_FUNC(htole64, (0)) |
| PA_HAVE_FUNC(__bswap_16, (0)) |
| PA_HAVE_FUNC(__bswap_32, (0)) |
| PA_HAVE_FUNC(__bswap_64, (0)) |
| PA_HAVE_FUNC(__builtin_bswap16, (0)) |
| PA_HAVE_FUNC(__builtin_bswap32, (0)) |
| PA_HAVE_FUNC(__builtin_bswap64, (0)) |
| PA_HAVE_FUNC(_byteswap_ushort, (0)) |
| PA_HAVE_FUNC(_byteswap_ulong, (0)) |
| PA_HAVE_FUNC(_byteswap_uint64, (0)) |
| |
| dnl |
| dnl Some rather useful gcc extensions... |
| dnl |
| PA_HAVE_FUNC(__builtin_constant_p, (0)) |
| PA_HAVE_FUNC(__builtin_choose_expr, (0,1,2)) |
| |
| dnl |
| dnl Check for supported gcc attributes; some compilers (e.g. Sun CC) |
| dnl support these, but don't define __GNUC__ as they don't support |
| dnl some other features of gcc. |
| dnl |
| PA_ADD_CFLAGS([-Werror=attributes]) |
| PA_FUNC_ATTRIBUTE(noreturn) |
| PA_FUNC_ATTRIBUTE(returns_nonnull,,,,,never_null) |
| PA_FUNC_ATTRIBUTE(malloc) |
| PA_FUNC_ATTRIBUTE(alloc_size,[1]) |
| PA_FUNC_ATTRIBUTE(alloc_size,[1,2]) |
| PA_FUNC_ATTRIBUTE(sentinel,,, [const char *, ...], ["a","b",NULL],end_with_null) |
| PA_FUNC_ATTRIBUTE(format, [printf,1,2], int, [const char *, ...], ["%d",1]) |
| PA_FUNC_ATTRIBUTE(const) |
| PA_FUNC_ATTRIBUTE(pure) |
| PA_FUNC_ATTRIBUTE(cold,,,,,unlikely_func) |
| PA_FUNC_ATTRIBUTE(unused) |
| PA_FUNC_ATTRIBUTE_ERROR |
| |
| dnl |
| dnl support function sections (if available) |
| dnl |
| PA_ARG_DISABLED([sections], |
| [do not try to compile with function/data section support], |
| [], |
| [PA_ADD_CFLAGS([-ffunction-sections]) |
| PA_ADD_CFLAGS([-fdata-sections]) |
| PA_ADD_LDFLAGS([-Wl,--gc-sections])] |
| ) |
| |
| dnl |
| dnl support LTO |
| dnl |
| PA_ARG_ENABLED([lto], |
| [compile with gcc-style link time optimization], |
| [PA_ADD_CFLAGS([-flto]) |
| dnl Note: we use _PROG rather than _TOOL since we are prepending the full |
| dnl CC name which ought to already contain the host triplet if needed |
| ccbase=`echo "$CC" | awk '{ print $1; }'` |
| AC_CHECK_PROGS(CC_AR, [${ccbase}-ar], [$ac_cv_prog_AR]) |
| AR="$CC_AR" |
| AC_CHECK_PROGS(CC_RANLIB, [${ccbase}-ranlib], [$ac_cv_prog_RANLIB]) |
| RANLIB="$CC_RANLIB"], []) |
| |
| dnl |
| dnl support sanitizers (if available) |
| dnl |
| PA_ARG_ENABLED([sanitizer], |
| [compile with sanitizers enabled], |
| [PA_ADD_CFLAGS([-fno-omit-frame-pointer]) |
| PA_ADD_CFLAGS([-fsanitize=address]) |
| PA_ADD_CFLAGS([-fsanitize=undefined])]) |
| |
| dnl |
| dnl Don't make symbols visible, there is no point and it just |
| dnl makes the code slower. This mainly affects ELF. |
| dnl |
| PA_ADD_CFLAGS([-fvisibility=hidden]) |
| |
| dnl |
| dnl If we have gcc, add appropriate code cleanliness options. Do this |
| dnl here at the end, because configure relies on being able to use |
| dnl some very, very old C constructs. |
| dnl |
| PA_ADD_CFLAGS([-Wall]) |
| PA_ARG_DISABLED([pedantic], |
| [disable some extra paranoid compiler warnings], |
| [], |
| [PA_ADD_CFLAGS([-W]) |
| PA_ADD_CFLAGS([-pedantic]) |
| PA_ADD_CFLAGS([-Wc90-c99-compat]) |
| PA_ADD_CFLAGS([-Wc99-compat]) |
| PA_ADD_CFLAGS([-Wc99-extensions]) |
| ]) |
| dnl Suppress format warning on Windows targets due to their <inttypes.h> |
| PA_ADD_CFLAGS([-Wpedantic-ms-format],[-Wno-pedantic-ms-format]) |
| PA_ADD_CFLAGS([-Wlong-long],[-Wno-long-long]) |
| dnl This is needed because we intentionally expect strncpy() to fill |
| dnl in a zero-padded (not zero-terminated) buffer in several backends |
| PA_ADD_CFLAGS([-Wstringop-truncation],[-Wno-stringop-truncation]) |
| dnl This is needed because we assume 2's-completement signed arithmetic; |
| dnl on compilers with gcc-like command line syntax we pass the -fwrapv |
| dnl option for exactly that reason. |
| PA_ADD_CFLAGS([-Wshift-negative-value],[-Wno-shift-negative-value]) |
| |
| dnl Want to turn this on at some point... |
| dnl PA_ADD_CFLAGS([-Wwrite-strings]) |
| PA_ARG_ENABLED([werror], |
| [compile with -Werror to error out on any warning], |
| [PA_ADD_CFLAGS([-Werror])], |
| [PA_ADD_CFLAGS([-Werror=implicit]) |
| PA_ADD_CFLAGS([-Werror=missing-braces]) |
| PA_ADD_CFLAGS([-Werror=return-type]) |
| PA_ADD_CFLAGS([-Werror=trigraphs]) |
| PA_ADD_CFLAGS([-Werror=pointer-arith]) |
| PA_ADD_CFLAGS([-Werror=strict-prototypes]) |
| PA_ADD_CFLAGS([-Werror=missing-prototypes]) |
| PA_ADD_CFLAGS([-Werror=missing-declarations]) |
| PA_ADD_CFLAGS([-Werror=comment]) |
| PA_ADD_CFLAGS([-Werror=vla])] |
| ) |
| |
| dnl |
| dnl Test compiler features. On some compilers, this can be affected |
| dnl by -Werror options, so run this *after* those options are added. |
| dnl |
| PA_CHECK_BAD_STDC_INLINE |
| PA_C_TYPEOF |
| |
| dnl |
| dnl support ccache |
| dnl |
| PA_ARG_ENABLED([ccache], [compile with ccache], [CC="ccache $CC"], []) |
| |
| AC_CONFIG_FILES([Makefile doc/Makefile]) |
| AC_OUTPUT |