[PATCH] xutil.c: remove duplicate copies, create new library libutil.a to contain xutil.

Jani Nikula jani at nikula.org
Mon Oct 31 02:20:13 PDT 2011


Hi David, this patch (commit 1dedfc90f6eee7cad10f1a1ceb39a7a1c4dbd1b1)
broke my build with:

CXX -O2 lib/libnotmuch.so.2.0.0
lib/message-file.o: In function `copy_header_unfolding':
message-file.c:(.text+0xea): undefined reference to `xrealloc'
lib/message-file.o: In function
`notmuch_message_file_restrict_headersv':
message-file.c:(.text+0x2cc): undefined reference to `xstrdup'
lib/message-file.o: In function `notmuch_message_file_get_header':
message-file.c:(.text+0x4af): undefined reference to `xstrndup'
message-file.c:(.text+0x5c8): undefined reference to `xmalloc'
lib/messages.o: In function `notmuch_messages_collect_tags':
messages.c:(.text+0x1c4): undefined reference to `xstrdup'
lib/sha1.o: In function `_hex_of_sha1_digest':
sha1.c:(.text+0x18): undefined reference to `xcalloc'
lib/thread.o: In function `_notmuch_thread_create':
thread.cc:(.text+0x34e): undefined reference to `xstrdup'
thread.cc:(.text+0x58c): undefined reference to `xstrdup'
/usr/bin/ld: lib/libnotmuch.so.2.0.0: hidden symbol `xmalloc' isn't
defined
/usr/bin/ld: final link failed: Bad value
collect2: ld returned 1 exit status
make: *** [lib/libnotmuch.so.2.0.0] Error 1

I don't have the time to debug this further right now, but I bisected
the failure to this commit and did a clean clone to make sure leftover
files weren't the cause.

BR,
Jani.


On Sun, 23 Oct 2011 12:18:53 -0300, David Bremner <david at tethera.net> wrote:
> From: David Bremner <bremner at debian.org>
> 
> We keep the lib/xutil.c version. As a consequence, also factor out
> _internal_error and associated macros.  It might be overkill to make a
> new file error_util.c for this, but _internal_error does not really
> belong in database.cc.
> ---
> 
> This turned out to be more disruptive than I thought. On the other
> hand, having two copies of xutil.c seems like a recipe for disaster.
> I wanted to factor out the logic in xregcomp so I could use it in
> situations where miscompilation is not an internal error, but more
> likely a user error.
> 
>  Makefile              |    2 +-
>  Makefile.local        |    7 +--
>  lib/Makefile.local    |    5 +-
>  lib/database.cc       |   15 -----
>  lib/notmuch-private.h |   20 +-------
>  lib/xutil.c           |  134 -----------------------------------------------
>  lib/xutil.h           |   55 -------------------
>  util/Makefile         |    5 ++
>  util/Makefile.local   |   11 ++++
>  util/error_util.c     |   41 +++++++++++++++
>  util/error_util.h     |   45 ++++++++++++++++
>  util/xutil.c          |  136 ++++++++++++++++++++++++++++++++++++++++++++++++
>  util/xutil.h          |   55 +++++++++++++++++++
>  xutil.c               |  138 -------------------------------------------------
>  14 files changed, 300 insertions(+), 369 deletions(-)
>  delete mode 100644 lib/xutil.c
>  delete mode 100644 lib/xutil.h
>  create mode 100644 util/Makefile
>  create mode 100644 util/Makefile.local
>  create mode 100644 util/error_util.c
>  create mode 100644 util/error_util.h
>  create mode 100644 util/xutil.c
>  create mode 100644 util/xutil.h
>  delete mode 100644 xutil.c
> 
> diff --git a/Makefile b/Makefile
> index 11e3a3d..2fb2a61 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -3,7 +3,7 @@
>  all:
>  
>  # List all subdirectories here. Each contains its own Makefile.local
> -subdirs = compat completion emacs lib test
> +subdirs = compat completion emacs lib util test
>  
>  # We make all targets depend on the Makefiles themselves.
>  global_deps = Makefile Makefile.config Makefile.local \
> diff --git a/Makefile.local b/Makefile.local
> index 38f6c17..e31defa 100644
> --- a/Makefile.local
> +++ b/Makefile.local
> @@ -39,7 +39,7 @@ PV_FILE=bindings/python/notmuch/version.py
>  # Smash together user's values with our extra values
>  FINAL_CFLAGS = -DNOTMUCH_VERSION=$(VERSION) $(CFLAGS) $(WARN_CFLAGS) $(CONFIGURE_CFLAGS) $(extra_cflags)
>  FINAL_CXXFLAGS = $(CXXFLAGS) $(WARN_CXXFLAGS) $(CONFIGURE_CXXFLAGS) $(extra_cflags) $(extra_cxxflags)
> -FINAL_NOTMUCH_LDFLAGS = $(LDFLAGS) -Llib -lnotmuch $(AS_NEEDED_LDFLAGS) $(GMIME_LDFLAGS) $(TALLOC_LDFLAGS)
> +FINAL_NOTMUCH_LDFLAGS = $(LDFLAGS) -Lutil -lutil -Llib -lnotmuch $(AS_NEEDED_LDFLAGS) $(GMIME_LDFLAGS) $(TALLOC_LDFLAGS)
>  FINAL_NOTMUCH_LINKER = CC
>  ifneq ($(LINKER_RESOLVES_LIBRARY_DEPENDENCIES),1)
>  FINAL_NOTMUCH_LDFLAGS += $(CONFIGURE_LDFLAGS)
> @@ -288,12 +288,11 @@ notmuch_client_srcs =		\
>  	notmuch-time.c		\
>  	query-string.c		\
>  	show-message.c		\
> -	json.c			\
> -	xutil.c
> +	json.c			
>  
>  notmuch_client_modules = $(notmuch_client_srcs:.c=.o)
>  
> -notmuch: $(notmuch_client_modules) lib/libnotmuch.a
> +notmuch: $(notmuch_client_modules) lib/libnotmuch.a util/libutil.a
>  	$(call quiet,CXX $(CFLAGS)) $^ $(FINAL_LIBNOTMUCH_LDFLAGS) -o $@
>  
>  notmuch-shared: $(notmuch_client_modules) lib/$(LINKER_NAME)
> diff --git a/lib/Makefile.local b/lib/Makefile.local
> index ea20b2b..f148661 100644
> --- a/lib/Makefile.local
> +++ b/lib/Makefile.local
> @@ -49,8 +49,7 @@ libnotmuch_c_srcs =		\
>  	$(dir)/message-file.c	\
>  	$(dir)/messages.c	\
>  	$(dir)/sha1.c		\
> -	$(dir)/tags.c		\
> -	$(dir)/xutil.c
> +	$(dir)/tags.c		
>  
>  libnotmuch_cxx_srcs =		\
>  	$(dir)/database.cc	\
> @@ -66,7 +65,7 @@ $(dir)/libnotmuch.a: $(libnotmuch_modules)
>  	$(call quiet,AR) rcs $@ $^
>  
>  $(dir)/$(LIBNAME): $(libnotmuch_modules) notmuch.sym
> -	$(call quiet,CXX $(CXXFLAGS)) $(libnotmuch_modules) $(FINAL_LIBNOTMUCH_LDFLAGS) $(LIBRARY_LINK_FLAG) -o $@
> +	$(call quiet,CXX $(CXXFLAGS)) $(libnotmuch_modules) $(FINAL_LIBNOTMUCH_LDFLAGS) $(LIBRARY_LINK_FLAG) -o $@ -L$(srcdir)/util -lutil
>  
>  notmuch.sym: lib/notmuch.h $(libnotmuch_modules)
>  	sh lib/gen-version-script.sh $< $(libnotmuch_modules) > $@
> diff --git a/lib/database.cc b/lib/database.cc
> index e77fd53..88be939 100644
> --- a/lib/database.cc
> +++ b/lib/database.cc
> @@ -209,21 +209,6 @@ static prefix_t PROBABILISTIC_PREFIX[]= {
>      { "folder",			"XFOLDER"}
>  };
>  
> -int
> -_internal_error (const char *format, ...)
> -{
> -    va_list va_args;
> -
> -    va_start (va_args, format);
> -
> -    fprintf (stderr, "Internal error: ");
> -    vfprintf (stderr, format, va_args);
> -
> -    exit (1);
> -
> -    return 1;
> -}
> -
>  const char *
>  _find_prefix (const char *name)
>  {
> diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h
> index d319530..0d3cc27 100644
> --- a/lib/notmuch-private.h
> +++ b/lib/notmuch-private.h
> @@ -47,6 +47,7 @@ NOTMUCH_BEGIN_DECLS
>  #include <talloc.h>
>  
>  #include "xutil.h"
> +#include "error_util.h"
>  
>  #pragma GCC visibility push(hidden)
>  
> @@ -60,25 +61,6 @@ NOTMUCH_BEGIN_DECLS
>  #define STRNCMP_LITERAL(var, literal) \
>      strncmp ((var), (literal), sizeof (literal) - 1)
>  
> -/* There's no point in continuing when we've detected that we've done
> - * something wrong internally (as opposed to the user passing in a
> - * bogus value).
> - *
> - * Note that PRINTF_ATTRIBUTE comes from talloc.h
> - */
> -int
> -_internal_error (const char *format, ...) PRINTF_ATTRIBUTE (1, 2);
> -
> -/* There's no point in continuing when we've detected that we've done
> - * something wrong internally (as opposed to the user passing in a
> - * bogus value).
> - *
> - * Note that __location__ comes from talloc.h.
> - */
> -#define INTERNAL_ERROR(format, ...)			\
> -    _internal_error (format " (%s).\n",			\
> -		     ##__VA_ARGS__, __location__)
> -
>  #define unused(x) x __attribute__ ((unused))
>  
>  #ifdef __cplusplus
> diff --git a/lib/xutil.c b/lib/xutil.c
> deleted file mode 100644
> index 268225b..0000000
> diff --git a/lib/xutil.h b/lib/xutil.h
> deleted file mode 100644
> index fd77f73..0000000
> diff --git a/util/Makefile b/util/Makefile
> new file mode 100644
> index 0000000..fa25832
> --- /dev/null
> +++ b/util/Makefile
> @@ -0,0 +1,5 @@
> +all:
> +	$(MAKE) -C .. all
> +
> +.DEFAULT:
> +	$(MAKE) -C .. $@
> diff --git a/util/Makefile.local b/util/Makefile.local
> new file mode 100644
> index 0000000..2ff42b3
> --- /dev/null
> +++ b/util/Makefile.local
> @@ -0,0 +1,11 @@
> +# -*- makefile -*-
> +
> +dir := util
> +extra_cflags += -I$(srcdir)/$(dir)
> +
> +libutil_c_srcs := $(dir)/xutil.c $(dir)/error_util.c
> +
> +libutil_modules := $(libutil_c_srcs:.c=.o)
> +
> +$(dir)/libutil.a: $(libutil_modules)
> +	$(call quiet,AR) rcs $@ $^
> diff --git a/util/error_util.c b/util/error_util.c
> new file mode 100644
> index 0000000..630d228
> --- /dev/null
> +++ b/util/error_util.c
> @@ -0,0 +1,41 @@
> +/* error_util.c - internal error utilities for notmuch.
> + *
> + * Copyright © 2009 Carl Worth
> + *
> + * This program is free software: you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation, either version 3 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program.  If not, see http://www.gnu.org/licenses/ .
> + *
> + * Author: Carl Worth <cworth at cworth.org>
> + */
> +
> +#include <stdlib.h>
> +#include <stdarg.h>
> +#include <stdio.h>
> +
> +#include "error_util.h"
> +
> +int
> +_internal_error (const char *format, ...)
> +{
> +    va_list va_args;
> +
> +    va_start (va_args, format);
> +
> +    fprintf (stderr, "Internal error: ");
> +    vfprintf (stderr, format, va_args);
> +
> +    exit (1);
> +
> +    return 1;
> +}
> +
> diff --git a/util/error_util.h b/util/error_util.h
> new file mode 100644
> index 0000000..0f1e5ef
> --- /dev/null
> +++ b/util/error_util.h
> @@ -0,0 +1,45 @@
> +/* error_util.h - Internal interfaces for notmuch.
> + *
> + * Copyright © 2009 Carl Worth
> + *
> + * This program is free software: you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation, either version 3 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program.  If not, see http://www.gnu.org/licenses/ .
> + *
> + * Author: Carl Worth <cworth at cworth.org>
> + */
> +
> +#ifndef ERROR_UTIL_H
> +#define ERROR_UTIL_H
> +
> +#include <talloc.h>
> +
> +/* There's no point in continuing when we've detected that we've done
> + * something wrong internally (as opposed to the user passing in a
> + * bogus value).
> + *
> + * Note that PRINTF_ATTRIBUTE comes from talloc.h
> + */
> +int
> +_internal_error (const char *format, ...) PRINTF_ATTRIBUTE (1, 2);
> +
> +/* There's no point in continuing when we've detected that we've done
> + * something wrong internally (as opposed to the user passing in a
> + * bogus value).
> + *
> + * Note that __location__ comes from talloc.h.
> + */
> +#define INTERNAL_ERROR(format, ...)			\
> +    _internal_error (format " (%s).\n",			\
> +		     ##__VA_ARGS__, __location__)
> +
> +#endif
> diff --git a/util/xutil.c b/util/xutil.c
> new file mode 100644
> index 0000000..15ff765
> --- /dev/null
> +++ b/util/xutil.c
> @@ -0,0 +1,136 @@
> +/* xutil.c - Various wrapper functions to abort on error.
> + *
> + * Copyright © 2009 Carl Worth
> + *
> + * This program is free software: you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation, either version 3 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program.  If not, see http://www.gnu.org/licenses/ .
> + *
> + * Author: Carl Worth <cworth at cworth.org>
> + */
> +
> +#include <stdio.h>
> +#include <string.h>
> +
> +#include "xutil.h"
> +#include "error_util.h"
> +
> +void *
> +xcalloc (size_t nmemb, size_t size)
> +{
> +    void *ret;
> +
> +    ret = calloc (nmemb, size);
> +    if (ret == NULL) {
> +	fprintf (stderr, "Out of memory.\n");
> +	exit (1);
> +    }
> +
> +    return ret;
> +}
> +
> +void *
> +xmalloc (size_t size)
> +{
> +    void *ret;
> +
> +    ret = malloc (size);
> +    if (ret == NULL) {
> +	fprintf (stderr, "Out of memory.\n");
> +	exit (1);
> +    }
> +
> +    return ret;
> +}
> +
> +void *
> +xrealloc (void *ptr, size_t size)
> +{
> +    void *ret;
> +
> +    ret = realloc (ptr, size);
> +    if (ret == NULL) {
> +	fprintf (stderr, "Out of memory.\n");
> +	exit (1);
> +    }
> +
> +    return ret;
> +}
> +
> +char *
> +xstrdup (const char *s)
> +{
> +    char *ret;
> +
> +    ret = strdup (s);
> +    if (ret == NULL) {
> +	fprintf (stderr, "Out of memory.\n");
> +	exit (1);
> +    }
> +
> +    return ret;
> +}
> +
> +char *
> +xstrndup (const char *s, size_t n)
> +{
> +    char *ret;
> +
> +    if (strlen (s) <= n)
> +	n = strlen (s);
> +
> +    ret = malloc (n + 1);
> +    if (ret == NULL) {
> +	fprintf (stderr, "Out of memory.\n");
> +	exit (1);
> +    }
> +    memcpy (ret, s, n);
> +    ret[n] = '\0';
> +
> +    return ret;
> +}
> +
> +void
> +xregcomp (regex_t *preg, const char *regex, int cflags)
> +{
> +    int rerr;
> +
> +    rerr = regcomp (preg, regex, cflags);
> +    if (rerr) {
> +	size_t error_size = regerror (rerr, preg, NULL, 0);
> +	char *error = xmalloc (error_size);
> +
> +	regerror (rerr, preg, error, error_size);
> +	INTERNAL_ERROR ("compiling regex %s: %s\n",
> +			regex, error);
> +    }
> +}
> +
> +int
> +xregexec (const regex_t *preg, const char *string,
> +	  size_t nmatch, regmatch_t pmatch[], int eflags)
> +{
> +    unsigned int i;
> +    int rerr;
> +
> +    rerr = regexec (preg, string, nmatch, pmatch, eflags);
> +    if (rerr)
> +	return rerr;
> +
> +    for (i = 0; i < nmatch; i++) {
> +	if (pmatch[i].rm_so == -1)
> +	    INTERNAL_ERROR ("matching regex against %s: Sub-match %d not found\n",
> +			    string, i);
> +    }
> +
> +    return 0;
> +}
> diff --git a/util/xutil.h b/util/xutil.h
> new file mode 100644
> index 0000000..fd77f73
> --- /dev/null
> +++ b/util/xutil.h
> @@ -0,0 +1,55 @@
> +/* xutil.h - Various wrapper functions to abort on error.
> + *
> + * Copyright © 2009 Carl Worth
> + *
> + * This program is free software: you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation, either version 3 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program.  If not, see http://www.gnu.org/licenses/ .
> + *
> + * Author: Carl Worth <cworth at cworth.org>
> + */
> +
> +#ifndef NOTMUCH_XUTIL_H
> +#define NOTMUCH_XUTIL_H
> +
> +#include <stdlib.h>
> +#include <sys/types.h>
> +#include <regex.h>
> +
> +#pragma GCC visibility push(hidden)
> +
> +/* xutil.c */
> +void *
> +xcalloc (size_t nmemb, size_t size);
> +
> +void *
> +xmalloc (size_t size);
> +
> +void *
> +xrealloc (void *ptrr, size_t size);
> +
> +char *
> +xstrdup (const char *s);
> +
> +char *
> +xstrndup (const char *s, size_t n);
> +
> +void
> +xregcomp (regex_t *preg, const char *regex, int cflags);
> +
> +int
> +xregexec (const regex_t *preg, const char *string,
> +	  size_t nmatch, regmatch_t pmatch[], int eflags);
> +
> +#pragma GCC visibility pop
> +
> +#endif
> diff --git a/xutil.c b/xutil.c
> deleted file mode 100644
> index 5f98f3f..0000000
> -- 
> 1.7.6.3
> 
> _______________________________________________
> notmuch mailing list
> notmuch at notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch


More information about the notmuch mailing list