diff --git a/package/xenomai/0002-boilerplate-build-obstack-support-conditionally.patch b/package/xenomai/0002-boilerplate-build-obstack-support-conditionally.patch new file mode 100644 index 0000000000..1c61aa1785 --- /dev/null +++ b/package/xenomai/0002-boilerplate-build-obstack-support-conditionally.patch @@ -0,0 +1,283 @@ +From 4c593544d2ff39ba6631cc3fa0b91493973674d4 Mon Sep 17 00:00:00 2001 +From: Philippe Gerum +Date: Fri, 14 Apr 2017 18:28:36 +0200 +Subject: [PATCH] boilerplate: build obstack support conditionally + +If the underlying *libc does not support obstacks, build a private +implementation, otherwise fully rely on the native support. + +This fixes a long-standing issue building replacement code for the +native obstack support, which ended up breaking builds over uClibc +1.0.21 and later. See https://patchwork.ozlabs.org/patch/745792/. + +[Backport from upstream.] +Signed-off-by: Romain Naour +--- + configure.ac | 4 ++ + include/boilerplate/obstack.h | 12 +++-- + lib/boilerplate/Makefile.am | 5 +- + lib/boilerplate/obstack.c | 111 +++++++----------------------------------- + 4 files changed, 34 insertions(+), 98 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 8222e1d..fbfb60f 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -495,6 +495,10 @@ fi + + test x$CONFIG_XENO_VALGRIND_API = xy && AC_DEFINE(CONFIG_XENO_VALGRIND_API,1,[config]) + ++dnl Check for obstack support in *libc ++AC_CHECK_HEADERS(obstack.h,libc_has_obstack=y) ++AM_CONDITIONAL(XENO_PRIVATE_OBSTACK,[test x$libc_has_obstack = x]) ++ + dnl Check for presence of some headers + AC_CHECK_HEADERS(mqueue.h) + +diff --git a/include/boilerplate/obstack.h b/include/boilerplate/obstack.h +index 206fe55..95eb792 100644 +--- a/include/boilerplate/obstack.h ++++ b/include/boilerplate/obstack.h +@@ -103,8 +103,12 @@ Summary: + + /* Don't do the contents of this file more than once. */ + +-#ifndef _OBSTACK_H +-#define _OBSTACK_H 1 ++#ifndef _BOILERPLATE_OBSTACK_H ++#define _BOILERPLATE_OBSTACK_H 1 ++ ++#ifdef HAVE_OBSTACK_H ++#include_next ++#else + + #ifdef __cplusplus + extern "C" { +@@ -506,4 +510,6 @@ __extension__ \ + } /* C++ */ + #endif + +-#endif /* obstack.h */ ++#endif /* !HAVE_OBSTACK_H */ ++ ++#endif /* _BOILERPLATE_OBSTACK_H */ +diff --git a/lib/boilerplate/Makefile.am b/lib/boilerplate/Makefile.am +index 9b8612d..d7e6324 100644 +--- a/lib/boilerplate/Makefile.am ++++ b/lib/boilerplate/Makefile.am +@@ -6,10 +6,13 @@ libboilerplate_la_LIBADD = libversion.la libiniparser.la + libboilerplate_la_SOURCES = \ + ancillaries.c \ + hash.c \ +- obstack.c \ + setup.c \ + time.c + ++if XENO_PRIVATE_OBSTACK ++libboilerplate_la_SOURCES += obstack.c ++endif ++ + if XENO_DEBUG + libboilerplate_la_SOURCES += debug.c + endif +diff --git a/lib/boilerplate/obstack.c b/lib/boilerplate/obstack.c +index 4c645b2..fab62ce 100644 +--- a/lib/boilerplate/obstack.c ++++ b/lib/boilerplate/obstack.c +@@ -22,39 +22,11 @@ + #include + #include + +-/* NOTE BEFORE MODIFYING THIS FILE: This version number must be +- incremented whenever callers compiled using an old obstack.h can no +- longer properly call the functions in this obstack.c. */ +-#define OBSTACK_INTERFACE_VERSION 1 +- +-/* Comment out all this code if we are using the GNU C Library, and are not +- actually compiling the library itself, and the installed library +- supports the same library interface we do. This code is part of the GNU +- C Library, but also included in many other GNU distributions. Compiling +- and linking in this code is a waste when using the GNU C library +- (especially if it is a shared library). Rather than having every GNU +- program understand `configure --with-gnu-libc' and omit the object +- files, it is simpler to just do this in the source for each such file. */ +- +-#include /* Random thing to get __GNU_LIBRARY__. */ +-#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1 +-# include +-# if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION +-# define ELIDE_CODE +-# endif +-#endif ++/* Use this obstack implementation unconditionally. */ + ++#include + #include +- +-#ifndef ELIDE_CODE +- +- +-# if HAVE_INTTYPES_H +-# include +-# endif +-# if HAVE_STDINT_H || defined _LIBC +-# include +-# endif ++#include + + /* Determine default alignment. */ + union fooround +@@ -97,22 +69,7 @@ void (*obstack_alloc_failed_handler) (void) = print_and_abort; + + /* Exit value used when `print_and_abort' is used. */ + # include +-# ifdef _LIBC + int obstack_exit_failure = EXIT_FAILURE; +-# else +-# include "exitfail.h" +-# define obstack_exit_failure exit_failure +-# endif +- +-# ifdef _LIBC +-# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) +-/* A looong time ago (before 1994, anyway; we're not sure) this global variable +- was used by non-GNU-C macros to avoid multiple evaluation. The GNU C +- library still exports it because somebody might use it. */ +-struct obstack *_obstack_compat; +-compat_symbol (libc, _obstack_compat, _obstack, GLIBC_2_0); +-# endif +-# endif + + /* Define a macro that either calls functions with the traditional malloc/free + calling interface, or calls functions with the mmalloc/mfree interface +@@ -148,7 +105,7 @@ _obstack_begin (struct obstack *h, + void *(*chunkfun) (long), + void (*freefun) (void *)) + { +- register struct _obstack_chunk *chunk; /* points to new chunk */ ++ struct _obstack_chunk *chunk; /* points to new chunk */ + + if (alignment == 0) + alignment = DEFAULT_ALIGNMENT; +@@ -195,7 +152,7 @@ _obstack_begin_1 (struct obstack *h, int size, int alignment, + void (*freefun) (void *, void *), + void *arg) + { +- register struct _obstack_chunk *chunk; /* points to new chunk */ ++ struct _obstack_chunk *chunk; /* points to new chunk */ + + if (alignment == 0) + alignment = DEFAULT_ALIGNMENT; +@@ -246,11 +203,11 @@ _obstack_begin_1 (struct obstack *h, int size, int alignment, + void + _obstack_newchunk (struct obstack *h, int length) + { +- register struct _obstack_chunk *old_chunk = h->chunk; +- register struct _obstack_chunk *new_chunk; +- register long new_size; +- register long obj_size = h->next_free - h->object_base; +- register long i; ++ struct _obstack_chunk *old_chunk = h->chunk; ++ struct _obstack_chunk *new_chunk; ++ long new_size; ++ long obj_size = h->next_free - h->object_base; ++ long i; + long already; + char *object_base; + +@@ -308,9 +265,6 @@ _obstack_newchunk (struct obstack *h, int length) + /* The new chunk certainly contains no empty object yet. */ + h->maybe_empty_object = 0; + } +-# ifdef _LIBC +-libc_hidden_def (_obstack_newchunk) +-# endif + + /* Return nonzero if object OBJ has been allocated from obstack H. + This is here for debugging. +@@ -323,8 +277,8 @@ int _obstack_allocated_p (struct obstack *h, void *obj); + int + _obstack_allocated_p (struct obstack *h, void *obj) + { +- register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ +- register struct _obstack_chunk *plp; /* point to previous chunk if any */ ++ struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ ++ struct _obstack_chunk *plp; /* point to previous chunk if any */ + + lp = (h)->chunk; + /* We use >= rather than > since the object cannot be exactly at +@@ -346,8 +300,8 @@ _obstack_allocated_p (struct obstack *h, void *obj) + void + obstack_free (struct obstack *h, void *obj) + { +- register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ +- register struct _obstack_chunk *plp; /* point to previous chunk if any */ ++ struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ ++ struct _obstack_chunk *plp; /* point to previous chunk if any */ + + lp = h->chunk; + /* We use >= because there cannot be an object at the beginning of a chunk. +@@ -373,17 +327,12 @@ obstack_free (struct obstack *h, void *obj) + abort (); + } + +-# ifdef _LIBC +-/* Older versions of libc used a function _obstack_free intended to be +- called by non-GCC compilers. */ +-strong_alias (obstack_free, _obstack_free) +-# endif + + int + _obstack_memory_used (struct obstack *h) + { +- register struct _obstack_chunk* lp; +- register int nbytes = 0; ++ struct _obstack_chunk* lp; ++ int nbytes = 0; + + for (lp = h->chunk; lp != 0; lp = lp->prev) + { +@@ -393,26 +342,6 @@ _obstack_memory_used (struct obstack *h) + } + + /* Define the error handler. */ +-# ifdef _LIBC +-# include +-# else +-# include "gettext.h" +-# endif +-# ifndef _ +-# define _(msgid) gettext (msgid) +-# endif +- +-# ifdef _LIBC +-# include +-# endif +- +-# ifndef __attribute__ +-/* This feature is available in gcc versions 2.5 and later. */ +-# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) +-# define __attribute__(Spec) /* empty */ +-# endif +-# endif +- + static void + __attribute__ ((noreturn)) + print_and_abort (void) +@@ -422,12 +351,6 @@ print_and_abort (void) + happen because the "memory exhausted" message appears in other places + like this and the translation should be reused instead of creating + a very similar string which requires a separate translation. */ +-# ifdef _LIBC +- (void) __fxprintf (NULL, "%s\n", _("memory exhausted")); +-# else +- fprintf (stderr, "%s\n", _("memory exhausted")); +-# endif ++ fprintf (stderr, "memory exhausted\n"); + exit (obstack_exit_failure); + } +- +-#endif /* !ELIDE_CODE */ +-- +2.9.3 + diff --git a/package/xenomai/xenomai.mk b/package/xenomai/xenomai.mk index 8a512acfd2..b7be842a6a 100644 --- a/package/xenomai/xenomai.mk +++ b/package/xenomai/xenomai.mk @@ -17,6 +17,9 @@ XENOMAI_LICENSE = GPL-2.0+ with exception (headers), LGPL-2.1+ (libraries), GPL- # GFDL is not included but refers to gnu.org XENOMAI_LICENSE_FILES = debian/copyright include/COPYING lib/trank/COPYING kernel/cobalt/COPYING +# 0002-boilerplate-build-obstack-support-conditionally.patch +XENOMAI_AUTORECONF = YES + XENOMAI_INSTALL_STAGING = YES XENOMAI_INSTALL_TARGET_OPTS = DESTDIR=$(TARGET_DIR) install-user XENOMAI_INSTALL_STAGING_OPTS = DESTDIR=$(STAGING_DIR) install-user