mirror of
git://git.gnupg.org/gnupg.git
synced 2025-01-03 12:11:33 +01:00
347 lines
10 KiB
Plaintext
347 lines
10 KiB
Plaintext
dnl macros to configure g10
|
|
|
|
|
|
dnl GNUPG_MSG_PRINT(STRING)
|
|
dnl print a message
|
|
dnl
|
|
define(GNUPG_MSG_PRINT,
|
|
[ echo $ac_n "$1"" $ac_c" 1>&AC_FD_MSG
|
|
])
|
|
|
|
|
|
dnl GNUPG_CHECK_TYPEDEF(TYPE, HAVE_NAME)
|
|
dnl Check whether a typedef exists and create a #define $2 if it exists
|
|
dnl
|
|
AC_DEFUN(GNUPG_CHECK_TYPEDEF,
|
|
[ AC_MSG_CHECKING(for $1 typedef)
|
|
AC_CACHE_VAL(gnupg_cv_typedef_$1,
|
|
[AC_TRY_COMPILE([#include <stdlib.h>
|
|
#include <sys/types.h>], [
|
|
#undef $1
|
|
int a = sizeof($1);
|
|
], gnupg_cv_typedef_$1=yes, gnupg_cv_typedef_$1=no )])
|
|
AC_MSG_RESULT($gnupg_cv_typedef_$1)
|
|
if test "$gnupg_cv_typedef_$1" = yes; then
|
|
AC_DEFINE($2)
|
|
fi
|
|
])
|
|
|
|
|
|
|
|
dnl GNUPG_LINK_FILES( SRC, DEST )
|
|
dnl same as AC_LINK_FILES, but collect the files to link in
|
|
dnl some special variables and do the link
|
|
dnl when GNUPG_DO_LINK_FILES is called
|
|
dnl This is a workaround for AC_LINK_FILES, because it does not work
|
|
dnl correct when using a caching scheme
|
|
dnl
|
|
define(GNUPG_LINK_FILES,
|
|
[ if test "x$wk_link_files_src" = "x"; then
|
|
wk_link_files_src="$1"
|
|
wk_link_files_dst="$2"
|
|
else
|
|
wk_link_files_src="$wk_link_files_src $1"
|
|
wk_link_files_dst="$wk_link_files_dst $2"
|
|
fi
|
|
])
|
|
define(GNUPG_DO_LINK_FILES,
|
|
[ AC_LINK_FILES( $wk_link_files_src, $wk_link_files_dst )
|
|
])
|
|
|
|
|
|
dnl GNUPG_CHECK_ENDIAN
|
|
dnl define either LITTLE_ENDIAN_HOST or BIG_ENDIAN_HOST
|
|
dnl
|
|
define(GNUPG_CHECK_ENDIAN,
|
|
[ if test "$cross_compiling" = yes; then
|
|
AC_MSG_WARN(cross compiling; assuming little endianess)
|
|
fi
|
|
AC_MSG_CHECKING(endianess)
|
|
AC_CACHE_VAL(gnupg_cv_c_endian,
|
|
[ gnupg_cv_c_endian=unknown
|
|
# See if sys/param.h defines the BYTE_ORDER macro.
|
|
AC_TRY_COMPILE([#include <sys/types.h>
|
|
#include <sys/param.h>], [
|
|
#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
|
|
bogus endian macros
|
|
#endif], [# It does; now see whether it defined to BIG_ENDIAN or not.
|
|
AC_TRY_COMPILE([#include <sys/types.h>
|
|
#include <sys/param.h>], [
|
|
#if BYTE_ORDER != BIG_ENDIAN
|
|
not big endian
|
|
#endif], gnupg_cv_c_endian=big, gnupg_cv_c_endian=little)])
|
|
if test "$gnupg_cv_c_endian" = unknown; then
|
|
AC_TRY_RUN([main () {
|
|
/* Are we little or big endian? From Harbison&Steele. */
|
|
union
|
|
{
|
|
long l;
|
|
char c[sizeof (long)];
|
|
} u;
|
|
u.l = 1;
|
|
exit (u.c[sizeof (long) - 1] == 1);
|
|
}],
|
|
gnupg_cv_c_endian=little,
|
|
gnupg_cv_c_endian=big,
|
|
gnupg_cv_c_endian=little
|
|
)
|
|
fi
|
|
])
|
|
AC_MSG_RESULT([$gnupg_cv_c_endian])
|
|
if test "$gnupg_cv_c_endian" = little; then
|
|
AC_DEFINE(LITTLE_ENDIAN_HOST)
|
|
else
|
|
AC_DEFINE(BIG_ENDIAN_HOST)
|
|
fi
|
|
])
|
|
|
|
dnl GNUPG_CHECK_CACHE
|
|
dnl
|
|
define(GNUPG_CHECK_CACHE,
|
|
[ AC_MSG_CHECKING(cached information)
|
|
gnupg_hostcheck="$target"
|
|
AC_CACHE_VAL(gnupg_cv_hostcheck, [ gnupg_cv_hostcheck="$gnupg_hostcheck" ])
|
|
if test "$gnupg_cv_hostcheck" != "$gnupg_hostcheck"; then
|
|
AC_MSG_RESULT(changed)
|
|
AC_MSG_WARN(config.cache exists!)
|
|
AC_MSG_ERROR(you must do 'make distclean' first to compile for
|
|
different target or different parameters.)
|
|
else
|
|
AC_MSG_RESULT(ok)
|
|
fi
|
|
])
|
|
|
|
|
|
######################################################################
|
|
# Check for -fPIC etc (taken from libtool)
|
|
# This sets CFLAGS_PIC to the required flags
|
|
# NO_PIC to yes if it is not possible to
|
|
# generate PIC
|
|
######################################################################
|
|
dnl GNUPG_CHECK_PIC
|
|
dnl
|
|
define(GNUPG_CHECK_PIC,
|
|
[ AC_MSG_CHECKING(for option to create PIC)
|
|
CFLAGS_PIC=
|
|
NO_PIC=no
|
|
if test "$cross_compiling" = yes; then
|
|
AC_MSG_RESULT(assume none)
|
|
else
|
|
if test "$GCC" = yes; then
|
|
CFLAGS_PIC="-fPIC"
|
|
else
|
|
case "$host_os" in
|
|
aix3* | aix4*)
|
|
# All rs/6000 code is PIC
|
|
# but is there any non-rs/6000 AIX platform?
|
|
;;
|
|
|
|
hpux9* | hpux10*)
|
|
CFLAGS_PIC="+Z"
|
|
;;
|
|
|
|
irix5* | irix6*)
|
|
# PIC (with -KPIC) is the default.
|
|
;;
|
|
|
|
osf3* | osf4*)
|
|
# FIXME - pic_flag is probably required for
|
|
# hppa*-osf* and i860-osf*
|
|
;;
|
|
|
|
sco3.2v5*)
|
|
CFLAGS_PIC='-Kpic'
|
|
;;
|
|
|
|
solaris2* | solaris7* )
|
|
CFLAGS_PIC='-KPIC'
|
|
;;
|
|
|
|
sunos4*)
|
|
CFLAGS_PIC='-PIC'
|
|
;;
|
|
|
|
*)
|
|
NO_PIC=yes
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
case "$host_cpu" in
|
|
rs6000 | powerpc | powerpcle)
|
|
# Yippee! All RS/6000 and PowerPC code is position-independent.
|
|
CFLAGS_PIC=""
|
|
;;
|
|
esac
|
|
|
|
if test "$NO_PIC" = yes; then
|
|
AC_MSG_RESULT(not possible)
|
|
else
|
|
if test -z "$CFLAGS_PIC"; then
|
|
AC_MSG_RESULT(none)
|
|
else
|
|
AC_MSG_RESULT($CFLAGS_PIC)
|
|
fi
|
|
fi
|
|
fi
|
|
])
|
|
|
|
|
|
######################################################################
|
|
# Check for rdynamic flag
|
|
# This sets CFLAGS_RDYNAMIC to the required flags
|
|
######################################################################
|
|
dnl GNUPG_CHECK_RDYNAMIC
|
|
dnl
|
|
define(GNUPG_CHECK_RDYNAMIC,
|
|
[ AC_MSG_CHECKING(how to specify -rdynamic)
|
|
CFLAGS_RDYNAMIC=
|
|
if test "$cross_compiling" = yes; then
|
|
AC_MSG_RESULT(assume none)
|
|
else
|
|
case "$host_os" in
|
|
solaris* )
|
|
CFLAGS_RDYNAMIC="-Wl,-dy"
|
|
;;
|
|
|
|
freebsd2* | osf4* )
|
|
CFLAGS_RDYNAMIC=""
|
|
;;
|
|
* )
|
|
CFLAGS_RDYNAMIC="-Wl,-export-dynamic"
|
|
;;
|
|
esac
|
|
AC_MSG_RESULT($CFLAGS_RDYNAMIC)
|
|
fi
|
|
])
|
|
|
|
|
|
#####################################################################
|
|
# Check for SysV IPC (from GIMP)
|
|
# And see whether we have a SHM_LOCK (FreeBSD does not have it).
|
|
#####################################################################
|
|
dnl GNUPG_CHECK_IPC
|
|
dnl
|
|
define(GNUPG_CHECK_IPC,
|
|
[ AC_CHECK_HEADERS(sys/ipc.h sys/shm.h)
|
|
if test "$ac_cv_header_sys_shm_h" = "yes"; then
|
|
AC_MSG_CHECKING(whether IPC_RMID allowes subsequent attaches)
|
|
AC_CACHE_VAL(gnupg_cv_ipc_rmid_deferred_release,
|
|
AC_TRY_RUN([
|
|
#include <sys/types.h>
|
|
#include <sys/ipc.h>
|
|
#include <sys/shm.h>
|
|
int main()
|
|
{
|
|
int id;
|
|
char *shmaddr;
|
|
id = shmget (IPC_PRIVATE, 4, IPC_CREAT | 0777);
|
|
if (id == -1)
|
|
exit (2);
|
|
shmaddr = shmat (id, 0, 0);
|
|
shmctl (id, IPC_RMID, 0);
|
|
if ((char*) shmat (id, 0, 0) == (char*) -1)
|
|
{
|
|
shmdt (shmaddr);
|
|
exit (1);
|
|
}
|
|
shmdt (shmaddr);
|
|
shmdt (shmaddr);
|
|
exit (0);
|
|
}
|
|
],
|
|
gnupg_cv_ipc_rmid_deferred_release="yes",
|
|
gnupg_cv_ipc_rmid_deferred_release="no",
|
|
gnupg_cv_ipc_rmid_deferred_release="assume-no")
|
|
)
|
|
if test "$gnupg_cv_ipc_rmid_deferred_release" = "yes"; then
|
|
AC_DEFINE(IPC_RMID_DEFERRED_RELEASE)
|
|
AC_MSG_RESULT(yes)
|
|
else
|
|
if test "$gnupg_cv_ipc_rmid_deferred_release" = "no"; then
|
|
AC_MSG_RESULT(no)
|
|
else
|
|
AC_MSG_RESULT([assuming no])
|
|
fi
|
|
fi
|
|
|
|
AC_MSG_CHECKING(whether SHM_LOCK is available)
|
|
AC_CACHE_VAL(gnupg_cv_ipc_have_shm_lock,
|
|
AC_TRY_COMPILE([#include <sys/types.h>
|
|
#include <sys/ipc.h>
|
|
#include <sys/shm.h>],[
|
|
int foo( int shm_id ) { shmctl(shm_id, SHM_LOCK, 0); }
|
|
],
|
|
gnupg_cv_ipc_have_shm_lock="yes",
|
|
gnupg_cv_ipc_have_shm_lock="no"
|
|
)
|
|
)
|
|
if test "$gnupg_cv_ipc_have_shm_lock" = "yes"; then
|
|
AC_DEFINE(IPC_HAVE_SHM_LOCK)
|
|
AC_MSG_RESULT(yes)
|
|
else
|
|
AC_MSG_RESULT(no)
|
|
fi
|
|
fi
|
|
])
|
|
|
|
|
|
######################################################################
|
|
# Check whether mlock is broken (hpux 10.20 raises a SIGBUS if mlock
|
|
# is not called from uid 0 (not tested whether uid 0 works)
|
|
######################################################################
|
|
dnl GNUPG_CHECK_MLOCK
|
|
dnl
|
|
define(GNUPG_CHECK_MLOCK,
|
|
[ AC_CHECK_FUNCS(mlock)
|
|
if test "$ac_cv_func_mlock" = "yes"; then
|
|
AC_MSG_CHECKING(whether mlock is broken)
|
|
AC_CACHE_VAL(gnupg_cv_have_broken_mlock,
|
|
AC_TRY_RUN([
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <errno.h>
|
|
#include <sys/mman.h>
|
|
#include <sys/types.h>
|
|
#include <fcntl.h>
|
|
|
|
int main()
|
|
{
|
|
char *pool;
|
|
int err;
|
|
long int pgsize = getpagesize();
|
|
|
|
pool = malloc( 4096 + pgsize );
|
|
if( !pool )
|
|
return 2;
|
|
pool += (pgsize - ((long int)pool % pgsize));
|
|
|
|
err = mlock( pool, 4096 );
|
|
if( !err || errno == EPERM )
|
|
return 0; /* okay */
|
|
|
|
return 1; /* hmmm */
|
|
}
|
|
|
|
],
|
|
gnupg_cv_have_broken_mlock="no",
|
|
gnupg_cv_have_broken_mlock="yes",
|
|
gnupg_cv_have_broken_mlock="assume-no"
|
|
)
|
|
)
|
|
if test "$gnupg_cv_have_broken_mlock" = "yes"; then
|
|
AC_DEFINE(HAVE_BROKEN_MLOCK)
|
|
AC_MSG_RESULT(yes)
|
|
else
|
|
if test "$gnupg_cv_have_broken_mlock" = "no"; then
|
|
AC_MSG_RESULT(no)
|
|
else
|
|
AC_MSG_RESULT(assuming no)
|
|
fi
|
|
fi
|
|
fi
|
|
])
|
|
|
|
|
|
dnl *-*wedit:notab*-* Please keep this as the last line.
|