# IJG auto-configuration source file. # Process this file with autoconf to produce a configure script. # # Configure script for IJG libjpeg # AC_INIT([libjpeg], [8.4.0]) # Directory where autotools helper scripts lives. AC_CONFIG_AUX_DIR([.]) # Generate configuration headers. AC_CONFIG_HEADERS([jconfig.h:jconfig.cfg]) # Hack: disable autoheader so that it doesn't overwrite our cfg template. AUTOHEADER="echo autoheader ignored" # Check system type AC_CANONICAL_TARGET # Initialize Automake # Don't require all the GNU mandated files AM_INIT_AUTOMAKE([-Wall -Werror -Wno-obsolete ansi2knr no-dist foreign]) # Make --enable-silent-rules the default. # To get verbose build output you may configure # with --disable-silent-rules or use "make V=1". AM_SILENT_RULES([yes]) # This is required when using the de-ANSI-fication feature. AM_C_PROTOTYPES # Add configure option --enable-maintainer-mode which enables # dependency checking and generation useful to package maintainers. # This is made an option to avoid confusing end users. AM_MAINTAINER_MODE # Check for programs AC_PROG_CC AC_PROG_CC_STDC AC_PROG_CPP AC_PROG_INSTALL AC_PROG_MAKE_SET AC_PROG_LN_S # Check if LD supports linker scripts, # and define automake conditional HAVE_LD_VERSION_SCRIPT if so. AC_ARG_ENABLE([ld-version-script], AS_HELP_STRING([--enable-ld-version-script], [enable linker version script (default is enabled when possible)]), [have_ld_version_script=$enableval], []) if test -z "$have_ld_version_script"; then AC_MSG_CHECKING([if LD -Wl,--version-script works]) save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" cat > conftest.map < rather than standard .])]) # See whether type size_t is defined in any ANSI-standard places; # if not, perhaps it is defined in . AC_MSG_CHECKING([for size_t]) AC_TRY_COMPILE([ #ifdef HAVE_STDDEF_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #include #ifdef NEED_BSD_STRINGS #include #else #include #endif typedef size_t my_size_t; ], [ my_size_t foovar; ], [ijg_size_t_ok=yes], [ijg_size_t_ok="not ANSI, perhaps it is in sys/types.h"]) AC_MSG_RESULT([$ijg_size_t_ok]) if test "$ijg_size_t_ok" != yes; then AC_CHECK_HEADER([sys/types.h], [AC_DEFINE([NEED_SYS_TYPES_H], [1], [Need to include in order to obtain size_t.]) AC_EGREP_CPP([size_t], [#include ], [ijg_size_t_ok="size_t is in sys/types.h"], [ijg_size_t_ok=no])], [ijg_size_t_ok=no]) AC_MSG_RESULT([$ijg_size_t_ok]) if test "$ijg_size_t_ok" = no; then AC_MSG_WARN([Type size_t is not defined in any of the usual places. Try putting '"typedef unsigned int size_t;"' in jconfig.h.]) fi fi # Check compiler characteristics AC_MSG_CHECKING([for type unsigned char]) AC_TRY_COMPILE([], [ unsigned char un_char; ], [AC_MSG_RESULT(yes) AC_DEFINE([HAVE_UNSIGNED_CHAR], [1], [Compiler supports 'unsigned char'.])], [AC_MSG_RESULT(no)]) AC_MSG_CHECKING([for type unsigned short]) AC_TRY_COMPILE([], [ unsigned short un_short; ], [AC_MSG_RESULT(yes) AC_DEFINE([HAVE_UNSIGNED_SHORT], [1], [Compiler supports 'unsigned short'.])], [AC_MSG_RESULT(no)]) AC_MSG_CHECKING([for type void]) AC_TRY_COMPILE([ /* Caution: a C++ compiler will insist on valid prototypes */ typedef void * void_ptr; /* check void * */ #ifdef HAVE_PROTOTYPES /* check ptr to function returning void */ typedef void (*void_func) (int a, int b); #else typedef void (*void_func) (); #endif #ifdef HAVE_PROTOTYPES /* check void function result */ void test3function (void_ptr arg1, void_func arg2) #else void test3function (arg1, arg2) void_ptr arg1; void_func arg2; #endif { char * locptr = (char *) arg1; /* check casting to and from void * */ arg1 = (void *) locptr; (*arg2) (1, 2); /* check call of fcn returning void */ } ], [ ], [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no) AC_DEFINE([void], [char], [Define 'void' as 'char' for archaic compilers that don't understand it.])]) AC_C_CONST # Check for non-broken inline under various spellings AC_MSG_CHECKING([for inline]) ijg_cv_inline="" AC_TRY_COMPILE([], [} __inline__ int foo() { return 0; } int bar() { return foo();], ijg_cv_inline="__inline__", [AC_TRY_COMPILE(, [} __inline int foo() { return 0; } int bar() { return foo();], ijg_cv_inline="__inline", [AC_TRY_COMPILE(, [} inline int foo() { return 0; } int bar() { return foo();], ijg_cv_inline="inline")])]) AC_MSG_RESULT($ijg_cv_inline) AC_DEFINE_UNQUOTED([INLINE], [$ijg_cv_inline], [How to obtain function inlining.]) # We cannot check for bogus warnings, but at least we can check for errors AC_MSG_CHECKING([for broken incomplete types]) AC_TRY_COMPILE([ typedef struct undefined_structure * undef_struct_ptr; ], [], [AC_MSG_RESULT(ok)], [AC_MSG_RESULT(broken) AC_DEFINE([INCOMPLETE_TYPES_BROKEN], [1], [Compiler does not support pointers to unspecified structures.])]) # Test whether global names are unique to at least 15 chars AC_MSG_CHECKING([for short external names]) AC_TRY_LINK([ int possibly_duplicate_function () { return 0; } int possibly_dupli_function () { return 1; } ], [], [AC_MSG_RESULT(ok)], [AC_MSG_RESULT(short) AC_DEFINE([NEED_SHORT_EXTERNAL_NAMES], [1], [Linker requires that global names be unique in first 15 characters.])]) # Run-time checks AC_MSG_CHECKING([to see if char is signed]) AC_TRY_RUN([ #ifdef HAVE_PROTOTYPES int is_char_signed (int arg) #else int is_char_signed (arg) int arg; #endif { if (arg == 189) { /* expected result for unsigned char */ return 0; /* type char is unsigned */ } else if (arg != -67) { /* expected result for signed char */ printf("Hmm, it seems 'char' is not eight bits wide on your machine.\n"); printf("I fear the JPEG software will not work at all.\n\n"); } return 1; /* assume char is signed otherwise */ } char signed_char_check = (char) (-67); int main() { exit(is_char_signed((int) signed_char_check)); }], [AC_MSG_RESULT(no) AC_DEFINE([CHAR_IS_UNSIGNED], [1], [Characters are unsigned])], [AC_MSG_RESULT(yes)], [AC_MSG_WARN([Assuming that char is signed on target machine. If it is unsigned, this will be a little bit inefficient.]) ]) AC_MSG_CHECKING([to see if right shift is signed]) AC_TRY_RUN([ #ifdef HAVE_PROTOTYPES int is_shifting_signed (long arg) #else int is_shifting_signed (arg) long arg; #endif /* See whether right-shift on a long is signed or not. */ { long res = arg >> 4; if (res == -0x7F7E80CL) { /* expected result for signed shift */ return 1; /* right shift is signed */ } /* see if unsigned-shift hack will fix it. */ /* we can't just test exact value since it depends on width of long... */ res |= (~0L) << (32-4); if (res == -0x7F7E80CL) { /* expected result now? */ return 0; /* right shift is unsigned */ } printf("Right shift isn't acting as I expect it to.\n"); printf("I fear the JPEG software will not work at all.\n\n"); return 0; /* try it with unsigned anyway */ } int main() { exit(is_shifting_signed(-0x7F7E80B1L)); }], [AC_MSG_RESULT(no) AC_DEFINE([RIGHT_SHIFT_IS_UNSIGNED], [1], [Broken compiler shifts signed values as an unsigned shift.])], [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(Assuming that right shift is signed on target machine.)]) AC_MSG_CHECKING([to see if fopen accepts b spec]) AC_TRY_RUN([ #include int main() { if (fopen("conftestdata", "wb") != NULL) exit(0); exit(1); }], [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no) AC_DEFINE([DONT_USE_B_MODE], [1], [Don't open files in binary mode.])], [AC_MSG_RESULT(Assuming that it does.)]) # Configure libtool AC_LIBTOOL_WIN32_DLL AC_PROG_LIBTOOL # Select memory manager depending on user input. # If no "-enable-maxmem", use jmemnobs MEMORYMGR='jmemnobs' MAXMEM="no" AC_ARG_ENABLE([maxmem], [ --enable-maxmem[=N] enable use of temp files, set max mem usage to N MB], [MAXMEM="$enableval"]) dnl [# support --with-maxmem for backwards compatibility with IJG V5.] dnl AC_ARG_WITH(maxmem, , MAXMEM="$withval") if test "x$MAXMEM" = xyes; then MAXMEM=1 fi if test "x$MAXMEM" != xno; then if test -n "`echo $MAXMEM | sed 's/[[0-9]]//g'`"; then AC_MSG_ERROR(non-numeric argument to --enable-maxmem) fi DEFAULTMAXMEM=`expr $MAXMEM \* 1048576` AC_DEFINE_UNQUOTED([DEFAULT_MAX_MEM], [${DEFAULTMAXMEM}], [Maximum data space library will allocate.]) AC_MSG_CHECKING([for 'tmpfile()']) AC_TRY_LINK([#include ], [ FILE * tfile = tmpfile(); ], [AC_MSG_RESULT(yes) MEMORYMGR='jmemansi'], [AC_MSG_RESULT(no) dnl if tmpfile is not present, must use jmemname. MEMORYMGR='jmemname' # Test for the need to remove temporary files using a signal handler # (for cjpeg/djpeg) AC_DEFINE([NEED_SIGNAL_CATCHER], [1], [Need signal handler to clean up temporary files.]) AC_MSG_CHECKING([for 'mktemp()']) AC_TRY_LINK([], [ char fname[80]; mktemp(fname); ], [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no) AC_DEFINE([NO_MKTEMP], [1], [The mktemp() function is not available.])])]) fi AC_SUBST([MEMORYMGR]) # Extract the library version IDs from jpeglib.h. AC_MSG_CHECKING([libjpeg version number]) [major=`sed -ne 's/^#define JPEG_LIB_VERSION_MAJOR *\([0-9][0-9]*\).*$/\1/p' $srcdir/jpeglib.h` minor=`sed -ne 's/^#define JPEG_LIB_VERSION_MINOR *\([0-9][0-9]*\).*$/\1/p' $srcdir/jpeglib.h`] AC_SUBST([JPEG_LIB_VERSION], [`expr $major + $minor`:0:$minor]) AC_MSG_RESULT([$JPEG_LIB_VERSION]) AC_CONFIG_FILES([Makefile]) AC_OUTPUT