summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSuren A. Chilingaryan <csa@dside.dyndns.org>2009-10-10 06:16:23 +0200
committerSuren A. Chilingaryan <csa@dside.dyndns.org>2009-10-10 06:16:23 +0200
commit69a2548913619eb81dcb6c03e27585e02fe057cd (patch)
tree21fd934d184d8de3e0f58de8f9299da98cd2fe2e
parent9e6ed416e3368b23c867e54dd2f7cc18f75a1c6e (diff)
Support systems without lockf (OpenSolaris), check GTK1 headers in configure.in, complain on missing macros in autogen.sh, patches by Ivan Borzenkov and Colin Watson for eglibc compatibility
-rw-r--r--.bzrignore1
-rwxr-xr-xautogen.sh161
-rw-r--r--configure.in25
-rw-r--r--engines/Makefile.am2
-rw-r--r--src/rcclock.c19
-rw-r--r--src/rccstring.h8
-rw-r--r--src/rccxml.c35
7 files changed, 225 insertions, 26 deletions
diff --git a/.bzrignore b/.bzrignore
index 86702ce..ac43524 100644
--- a/.bzrignore
+++ b/.bzrignore
@@ -32,3 +32,4 @@ ltsugar.m4
ltversion.m4
lt~obsolete.m4
external/rccexternal
+stamp-h.in
diff --git a/autogen.sh b/autogen.sh
index 4c39623..e04ab90 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -4,6 +4,7 @@ PROG=`basename $0`
KEYFILE=src/librcc.c
+
# Some OS's have multiple versions (autoconf259, etc.) and don't have an
# autoconf binary
@@ -11,24 +12,31 @@ AUTOCONF=`which autoconf`
if test x"${AUTOCONF}" != x -a -f "${AUTOCONF}"
then
AUTOCONF=autoconf
- AUTOMAKE=automake
- ACLOCAL=aclocal
LIBTOOLIZE=libtoolize
AUTOHEADER=autoheader
else
FINDPATH=`echo ${PATH}|sed -e 's,:, ,g'`
AUTOCONF=`find ${FINDPATH} -name "autoconf*"|sort -r|head -1`
- AUTOMAKE=`find ${FINDPATH} -name "automake*"|sort -r|head -1`
- ACLOCAL=`find ${FINDPATH} -name "aclocal*"|sort -r|head -1`
LIBTOOLIZE=`find ${FINDPATH} -name "libtoolize*"|sort -r|head -1`
AUTOHEADER=`find /usr/bin /usr/local/bin -name "autoheader*"|sort -r|head -1`
echo "$0: autoconf: using ${AUTOCONF}"
- echo "$0: automake: using ${AUTOMAKE}"
- echo "$0: aclocal: using ${ACLOCAL}"
echo "$0: libtoolize: using ${LIBTOOLIZE}"
echo "$0: autoheader: using ${AUTOHEADER}"
fi
+AUTOMAKE=`which automake`
+if test x"${AUTOMAKE}" != x -a -f "${AUTOMAKE}"
+then
+ AUTOMAKE=automake
+ ACLOCAL=aclocal
+else
+ FINDPATH=`echo ${PATH}|sed -e 's,:, ,g'`
+ AUTOMAKE=`find ${FINDPATH} -name "automake*"|sort -r|head -1`
+ ACLOCAL=`find ${FINDPATH} -name "aclocal*"|sort -r|head -1`
+ echo "$0: automake: using ${AUTOMAKE}"
+ echo "$0: aclocal: using ${ACLOCAL}"
+fi
+
GETTEXTIZE_FLAGS=--no-changelog
AUTOPOINT_FLAGS=
LIBTOOLIZE_FLAGS=--copy
@@ -45,12 +53,6 @@ AUTOHEADER_FLAGS=-Wall
AUTOMAKE_FLAGS='--add-missing --copy -Wall'
AUTOCONF_FLAGS=-Wno-obsolete
-die()
-{
- err=$?
- echo "$PROG: exited by previous error(s), return code was $err" >&2
- exit 1
-}
if [ ! -f $KEYFILE ]
then
@@ -59,6 +61,141 @@ then
exit 1
fi
+
+boldface="`tput bold 2>/dev/null`"
+normal="`tput sgr0 2>/dev/null`"
+
+printbold() {
+ echo $ECHO_N "$boldface"
+ echo "$@"
+ echo $ECHO_N "$normal"
+}
+
+printerr() {
+ echo "$@" >&2
+}
+
+die() {
+ err=$?
+ echo "$PROG: exited by previous error(s), return code was $err" >&2
+ exit 1
+}
+
+REQUIRED_M4MACROS=${REQUIRED_M4MACROS:-}
+FORBIDDEN_M4MACROS=${FORBIDDEN_M4MACROS:-}
+require_m4macro() {
+ case "$REQUIRED_M4MACROS" in
+ $1\ * | *\ $1\ * | *\ $1) ;;
+ *) REQUIRED_M4MACROS="$REQUIRED_M4MACROS $1" ;;
+ esac
+}
+
+forbid_m4macro() {
+ case "$FORBIDDEN_M4MACROS" in
+ $1\ * | *\ $1\ * | *\ $1) ;;
+ *) FORBIDDEN_M4MACROS="$FORBIDDEN_M4MACROS $1" ;;
+ esac
+}
+
+add_to_cm_macrodirs() {
+ case $cm_macrodirs in
+ "$1 "* | *" $1 "* | *" $1") ;;
+ *) cm_macrodirs="$cm_macrodirs $1";;
+ esac
+}
+
+check_m4macros() {
+ # construct list of macro directories
+ cm_macrodirs=`$ACLOCAL --print-ac-dir`
+ # aclocal also searches a version specific dir, eg. /usr/share/aclocal-1.9
+ # but it contains only Automake's own macros, so we can ignore it.
+
+ # Read the dirlist file, supported by Automake >= 1.7.
+ if compare_versions 1.7 $AUTOMAKE_VERSION && [ -s $cm_macrodirs/dirlist ]; then
+ cm_dirlist=`sed 's/[ ]*#.*//;/^$/d' $cm_macrodirs/dirlist`
+ if [ -n "$cm_dirlist" ] ; then
+ for cm_dir in $cm_dirlist; do
+ if [ -d $cm_dir ]; then
+ add_to_cm_macrodirs $cm_dir
+ fi
+ done
+ fi
+ fi
+
+ # Parse $ACLOCAL_FLAGS
+ set - $ACLOCAL_FLAGS
+ while [ $# -gt 0 ]; do
+ if [ "$1" = "-I" ]; then
+ add_to_cm_macrodirs "$2"
+ shift
+ fi
+ shift
+ done
+
+ cm_status=0
+ if [ -n "$REQUIRED_M4MACROS" ]; then
+ printbold "Checking for required M4 macros..."
+ # check that each macro file is in one of the macro dirs
+ for cm_macro in $REQUIRED_M4MACROS; do
+ cm_macrofound=false
+ for cm_dir in $cm_macrodirs; do
+ if [ -f "$cm_dir/$cm_macro" ]; then
+ cm_macrofound=true
+ break
+ fi
+ # The macro dir in Cygwin environments may contain a file
+ # called dirlist containing other directories to look in.
+ if [ -f "$cm_dir/dirlist" ]; then
+ for cm_otherdir in `cat $cm_dir/dirlist`; do
+ if [ -f "$cm_otherdir/$cm_macro" ]; then
+ cm_macrofound=true
+ break
+ fi
+ done
+ fi
+ done
+ if $cm_macrofound; then
+ :
+ else
+ printerr " $cm_macro not found"
+ cm_status=1
+ fi
+ done
+ fi
+ if [ -n "$FORBIDDEN_M4MACROS" ]; then
+ printbold "Checking for forbidden M4 macros..."
+ # check that each macro file is in one of the macro dirs
+ for cm_macro in $FORBIDDEN_M4MACROS; do
+ cm_macrofound=false
+ for cm_dir in $cm_macrodirs; do
+ if [ -f "$cm_dir/$cm_macro" ]; then
+ cm_macrofound=true
+ break
+ fi
+ done
+ if $cm_macrofound; then
+ printerr " $cm_macro found (should be cleared from macros dir)"
+ cm_status=1
+ fi
+ done
+ fi
+ if [ "$cm_status" != 0 ]; then
+ printerr "***Error***: some autoconf macros required to build $PKG_NAME"
+ printerr " were not found in your aclocal path, or some forbidden"
+ printerr " macros were found. Perhaps you need to adjust your"
+ printerr " ACLOCAL_FLAGS?"
+ printerr
+ fi
+ return $cm_status
+}
+
+
+# PKG_CONFIG
+require_m4macro pkg.m4
+check_m4macros || die
+
+
+
# gettextize ${GETTEXTIZE_FLAGS}
# autopoint ${AUTOPOINT_FLAGS}
# xml-i18n-toolize || die
diff --git a/configure.in b/configure.in
index 4e6b9e7..a430e3c 100644
--- a/configure.in
+++ b/configure.in
@@ -28,7 +28,7 @@ AC_SUBST(LIBRCC_CVS)
AC_SUBST(LIBRCC_CVS_DATE)
AM_INIT_AUTOMAKE($PACKAGE, $VERSION)
-
+AC_CONFIG_MACRO_DIR([m4])
AC_PROG_CC
AM_PROG_CC_C_O
@@ -54,6 +54,10 @@ AC_PATH_PROG(RM, rm, /bin/rm)
AC_PATH_PROG(MV, mv, /bin/mv)
AC_PATH_PROG(TAR, tar, /bin/tar)
+dnl Fixing ugly libtool, see for details
+dnl http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=523750
+RM="$RM -f"
+
dnl Checks for header files.
AC_CHECK_HEADERS(iconv.h,, [AC_MSG_ERROR(Missing iconv header)])
AC_CHECK_HEADERS(mntent.h pwd.h sys/types.h sys/stat.h sys/file.h sys/socket.h sys/un.h sys/time.h sys/select.h sys/wait.h signal.h unistd.h fcntl.h)
@@ -81,16 +85,25 @@ dnl ***
dnl *** GTK1 (Optional)
dnl ***
AC_PATH_PROG(GTK_CONFIG, gtk-config, no)
-AM_CONDITIONAL(HAVE_GTK, [ test $GTK_CONFIG != no ])
if test $GTK_CONFIG = no; then
- GTK1_LIBS=""
- GTK1_INCLUDES=""
HAVE_GTK=no
else
GTK1_LIBS="\`gtk-config --libs\`"
GTK1_INCLUDES="\`gtk-config --cflags\`"
- HAVE_GTK=yes
+
+ saved_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS `gtk-config --cflags`"
+ AC_CHECK_HEADER([gtk/gtk.h], [HAVE_GTK=yes], [HAVE_GTK=no])
+ CFLAGS=$saved_CFLAGS
fi
+
+AM_CONDITIONAL(HAVE_GTK, [ test $HAVE_GTK = yes ])
+
+if test $HAVE_GTK = no; then
+ GTK1_LIBS=""
+ GTK1_INCLUDES=""
+fi
+
AC_SUBST(GTK1_LIBS)
AC_SUBST(GTK1_INCLUDES)
@@ -361,7 +374,7 @@ dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
dnl Checks for library functions.
-AC_CHECK_FUNCS(strcasecmp strncasecmp strdup strnlen)
+AC_CHECK_FUNCS(strcasecmp strncasecmp strdup strnlen flock lockf)
AC_OUTPUT(src/Makefile engines/Makefile external/Makefile ui/Makefile examples/Makefile Makefile librcc.spec)
diff --git a/engines/Makefile.am b/engines/Makefile.am
index 93e490a..3b8c303 100644
--- a/engines/Makefile.am
+++ b/engines/Makefile.am
@@ -1,6 +1,6 @@
lib_LTLIBRARIES = western_engine.la
-libdir = $(pkgdatadir)/engines
+libdir = $(pkgdatadir)engines
if HAVE_RCD
lib_LTLIBRARIES += librcd_engine.la
diff --git a/src/rcclock.c b/src/rcclock.c
index 5683f44..b759189 100644
--- a/src/rcclock.c
+++ b/src/rcclock.c
@@ -40,6 +40,9 @@
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
#endif /* HAVE_SYS_STAT_H */
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif /* HAVE_FCNTL_H */
#include "rcchome.h"
#include "rcclock.h"
@@ -70,7 +73,14 @@ int rccLock() {
lockfd = open(stmp, O_RDWR|O_CREAT, 0644);
if (lockfd >= 0) {
for (err = -1, i = 0; i < (LIBRCC_LOCK_WAIT/10); i++) {
+#if defined(HAVE_FLOCK)
err = flock(lockfd, LOCK_EX|LOCK_NB);
+#elif defined(HAVE_LOCKF)
+ err = lockf(lockfd, F_TLOCK, 1);
+#else
+# warning "No file locking mechanism is detected"
+ err = 0; // We must believe in best
+#endif
if ((err)&&(errno == EWOULDBLOCK)) nanosleep(&wait, NULL);
else break;
}
@@ -85,7 +95,11 @@ int rccLock() {
lockfd = open(stmp, O_RDWR|O_CREAT, 0644);
if (lockfd >= 0) {
for (err = -1, i = 0; i < (LIBRCC_LOCK_WAIT/10); i++) {
+#if defined(HAVE_FLOCK)
err = flock(lockfd, LOCK_EX|LOCK_NB);
+#elif defined(HAVE_LOCKF)
+ err = lockf(lockfd, F_TLOCK, 1);
+#endif
if ((err)&&(errno == EWOULDBLOCK)) nanosleep(&wait, NULL);
else break;
}
@@ -121,7 +135,12 @@ void rccUnLock() {
sprintf(stmp,"%s/.rcc/locks/rcc.lock", rcc_home_dir);
+#if defined(HAVE_FLOCK)
flock(lockfd, LOCK_UN);
+#elif defined(HAVE_LOCKF)
+ lockf(lockfd, F_ULOCK, 1);
+#endif
+
close(lockfd);
lockfd = -1;
#endif /* HAVE_SYS_FILE_H */
diff --git a/src/rccstring.h b/src/rccstring.h
index 40bda89..8bace94 100644
--- a/src/rccstring.h
+++ b/src/rccstring.h
@@ -38,13 +38,9 @@ int rccStringSetLang(rcc_string string, const char *sn);
int rccStringFixID(rcc_string string, rcc_context ctx);
int rccStringChangeID(rcc_string string, rcc_language_id language_id);
-#ifdef HAVE_STRNLEN
-# ifndef strnlen
-size_t strnlen(const char *str, size_t size);
-# endif /* !strnlen */
-#else
+#ifndef HAVE_STRNLEN
int rccStrnlen(const char *str, size_t size);
-#endif /* HAVE_STRNLEN */
+#endif /* !HAVE_STRNLEN */
int rccIsASCII(const char *str);
size_t rccStringSizedGetChars(const char *str, size_t size);
diff --git a/src/rccxml.c b/src/rccxml.c
index 03230d0..1db5788 100644
--- a/src/rccxml.c
+++ b/src/rccxml.c
@@ -340,7 +340,12 @@ int rccSave(rcc_context ctx, const char *name) {
sprintf(config,"%s/.rcc/%s.xml",rcc_home_dir,name);
fd = open(config, O_CREAT|O_RDWR,00644);
if (fd == -1) goto clear;
+
+#if defined(HAVE_FLOCK)
flock(fd, LOCK_EX);
+#elif defined(HAVE_LOCKF)
+ lockf(fd, F_LOCK, 1);
+#endif
if ((!fstat(fd, &st))&&(st.st_size)) {
doc = xmlReadFd(fd, config, NULL, 0);
@@ -463,7 +468,13 @@ clear:
xmlFreeDoc(doc);
}
fsync(fd);
- flock(fd, LOCK_UN);
+
+#if defined(HAVE_FLOCK)
+ flock(fd, LOCK_UN);
+#elif defined(HAVE_LOCKF)
+ lockf(fd, F_ULOCK, 1);
+#endif
+
close(fd);
}
free(config);
@@ -516,11 +527,22 @@ int rccLoad(rcc_context ctx, const char *name) {
free(config);
if (fd != -1) {
+#if defined(HAVE_FLOCK)
flock(fd, LOCK_EX);
+#elif defined(HAVE_LOCKF)
+ lockf(fd, F_LOCK, 1);
+#endif
+
if ((!fstat(fd, &st))&&(st.st_size)) {
doc = xmlReadFd(fd, name, NULL, 0);
}
+
+#if defined(HAVE_FLOCK)
flock(fd, LOCK_UN);
+#elif defined(HAVE_LOCKF)
+ lockf(fd, F_ULOCK, 1);
+#endif
+
close(fd);
if (doc) {
@@ -533,11 +555,22 @@ int rccLoad(rcc_context ctx, const char *name) {
}
if (sysfd != -1) {
+#if defined(HAVE_FLOCK)
flock(sysfd, LOCK_EX);
+#elif defined(HAVE_LOCKF)
+ lockf(sysfd, F_LOCK, 1);
+#endif
+
if ((!fstat(sysfd, &st))&&(st.st_size)) {
sysdoc = xmlReadFd(sysfd, name, NULL, 0);
}
+
+#if defined(HAVE_FLOCK)
flock(sysfd, LOCK_UN);
+#elif defined(HAVE_LOCKF)
+ lockf(sysfd, F_ULOCK, 1);
+#endif
+
close(sysfd);
if (sysdoc) {