diff mbox

[next,3/3] bc: bump version to 1.07.1

Message ID 20170512142848.13956-3-Vincent.Riera@imgtec.com
State Changes Requested
Headers show

Commit Message

Vicente Olivert Riera May 12, 2017, 2:28 p.m. UTC
- Remove 01 and 02 patches as they are not needed anymore.
- Tweak 03 patch for the new version and rename it to 0001.
- host-flex dependency is not needed anymore.
- Added host-bc dependency: needed to bootstrap libmath.h at build time.
- Added host-ed dependency: used by fix-libmath_h script at build time.
- Swith site to GNU mirror.

Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
---
 ...fo.patch => 0001-use_appropiate_makeinfo.patch} |  13 +-
 package/bc/01_array_initialize.patch               |  20 -
 package/bc/02_notice_read_write_errors.patch       | 708 ---------------------
 package/bc/bc.hash                                 |   2 +-
 package/bc/bc.mk                                   |  25 +-
 5 files changed, 30 insertions(+), 738 deletions(-)
 rename package/bc/{03_use_appropiate_makeinfo.patch => 0001-use_appropiate_makeinfo.patch} (53%)
 delete mode 100644 package/bc/01_array_initialize.patch
 delete mode 100644 package/bc/02_notice_read_write_errors.patch

Comments

Romain Naour July 3, 2017, 4:47 p.m. UTC | #1
Hi Vincente,

Le 12/05/2017 à 16:28, Vicente Olivert Riera a écrit :
> - Remove 01 and 02 patches as they are not needed anymore.

Patch 01 is upstream but not patch 02.
Why it's not needed anymore ?
Maybe add a previous patch to remove it before bumping bc ?

> - Tweak 03 patch for the new version and rename it to 0001.
> - host-flex dependency is not needed anymore.
> - Added host-bc dependency: needed to bootstrap libmath.h at build time.
> - Added host-ed dependency: used by fix-libmath_h script at build time.

bc is in Buildroot mandatory dependency, so why not using bc from the host ?
Have you tried that ?
With that you can remove the dependency on host-ed and host-bc.

> - Swith site to GNU mirror.
> 
> Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
> ---
>  ...fo.patch => 0001-use_appropiate_makeinfo.patch} |  13 +-
>  package/bc/01_array_initialize.patch               |  20 -
>  package/bc/02_notice_read_write_errors.patch       | 708 ---------------------
>  package/bc/bc.hash                                 |   2 +-
>  package/bc/bc.mk                                   |  25 +-
>  5 files changed, 30 insertions(+), 738 deletions(-)
>  rename package/bc/{03_use_appropiate_makeinfo.patch => 0001-use_appropiate_makeinfo.patch} (53%)
>  delete mode 100644 package/bc/01_array_initialize.patch
>  delete mode 100644 package/bc/02_notice_read_write_errors.patch
> 

[...]

> diff --git a/package/bc/bc.mk b/package/bc/bc.mk
> index 4596192..b5853b1 100644
> --- a/package/bc/bc.mk
> +++ b/package/bc/bc.mk
> @@ -4,17 +4,34 @@
>  #
>  ################################################################################
>  
> -BC_VERSION = 1.06.95
> -BC_SOURCE = bc-$(BC_VERSION).tar.bz2
> -BC_SITE = http://alpha.gnu.org/gnu/bc
> -BC_DEPENDENCIES = host-flex
> +BC_VERSION = 1.07.1
> +BC_SITE = $(BR2_GNU_MIRROR)/bc
> +# host-bc needed to bootstrap libmath.h at build time
> +# host-ed needed by the fix-libmath_h script at build time
> +BC_DEPENDENCIES = host-bc host-ed
>  BC_LICENSE = GPL-2.0+, LGPL-2.1+
>  BC_LICENSE_FILES = COPYING COPYING.LIB
> +# host-ed needed by the fix-libmath_h script at build time
> +HOST_BC_DEPENDENCIES = host-ed
>  
>  # Build after busybox so target ends up with bc's "dc" version
>  ifeq ($(BR2_PACKAGE_BUSYBOX),y)
>  BC_DEPENDENCIES += busybox
>  endif
>  
> +# A stripped-down version of bc (fbc) is built for bootstrapping purposes. Then
> +# the bc build system tries to run it in order to generate some header files,
> +# but that breaks cross-compilation because we cannot run in the host machine an
> +# fbc that has been built for the target architecture. We tweak the Makefiles in
> +# order to run the bc that was built for the host. As long as the host bc and
> +# the target one have the same version the result should be fine.

Is there any output format changes between bc version ?

Best regards,
Romain

 And also, note
> +# we don't need to run the host fbc (which doesn't exist by the way, because
> +# it was deleted after its use by the host-bc Makefile) and we can just run the
> +# full bc program (remember the fbc was just a tripped-down version of bc).
> +define BC_USE_HOST_FBC
> +	$(SED) "s:\./fbc -c:$(HOST_DIR)/usr/bin/bc -c:" $(@D)/bc/Makefile.in
> +endef
> +BC_POST_PATCH_HOOKS += BC_USE_HOST_FBC
> +
>  $(eval $(autotools-package))
>  $(eval $(host-autotools-package))
>
diff mbox

Patch

diff --git a/package/bc/03_use_appropiate_makeinfo.patch b/package/bc/0001-use_appropiate_makeinfo.patch
similarity index 53%
rename from package/bc/03_use_appropiate_makeinfo.patch
rename to package/bc/0001-use_appropiate_makeinfo.patch
index e6f9262..f6d89a3 100644
--- a/package/bc/03_use_appropiate_makeinfo.patch
+++ b/package/bc/0001-use_appropiate_makeinfo.patch
@@ -1,17 +1,20 @@ 
 Use the appropiate MAKEINFO variable rather than the hardcoded makeinfo
 command directly, otherwise missing logic never works.
 
+[Vincent: tweak the patch for 1.07.1]
+
 Signed-off-by: Gustavo Zacarias <gustavo@zacarias.com.ar>
+Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
 
-diff -Nura bc-1.06.95.orig/doc/Makefile.in bc-1.06.95/doc/Makefile.in
---- bc-1.06.95.orig/doc/Makefile.in	2015-06-13 09:39:46.946620294 -0300
-+++ bc-1.06.95/doc/Makefile.in	2015-06-13 09:40:10.019407630 -0300
-@@ -96,7 +96,7 @@
+diff -Nura a/doc/Makefile.in b/doc/Makefile.in
+--- a/doc/Makefile.in	2017-04-07 23:20:02.000000000 +0100
++++ b/doc/Makefile.in	2017-05-10 17:29:19.126687266 +0100
+@@ -214,7 +214,7 @@
  LIBOBJS = @LIBOBJS@
  LIBS = @LIBS@
  LTLIBOBJS = @LTLIBOBJS@
 -MAKEINFO = makeinfo --no-split
 +MAKEINFO = @MAKEINFO@ --no-split
+ MKDIR_P = @MKDIR_P@
  OBJEXT = @OBJEXT@
  PACKAGE = @PACKAGE@
- PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
diff --git a/package/bc/01_array_initialize.patch b/package/bc/01_array_initialize.patch
deleted file mode 100644
index 9520d82..0000000
--- a/package/bc/01_array_initialize.patch
+++ /dev/null
@@ -1,20 +0,0 @@ 
-Description: Fix array initialization bug
-Author: Phil Nelson
-Origin: upstream
-Bug-Debian: http://bugs.debian.org/586969
-Bug-Debian: http://bugs.debian.org/671513
----
-This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
-Index: bc/bc/storage.c
-===================================================================
---- bc.orig/bc/storage.c	2013-06-02 20:34:09.401273864 -0400
-+++ bc/bc/storage.c	2013-06-02 20:34:11.000000000 -0400
-@@ -179,7 +179,7 @@
- 
- 
-   /* Initialize the new elements. */
--  for (; indx < v_count; indx++)
-+  for (; indx < a_count; indx++)
-     arrays[indx] = NULL;
- 
-   /* Free the old elements. */
diff --git a/package/bc/02_notice_read_write_errors.patch b/package/bc/02_notice_read_write_errors.patch
deleted file mode 100644
index 73e6ec9..0000000
--- a/package/bc/02_notice_read_write_errors.patch
+++ /dev/null
@@ -1,708 +0,0 @@ 
-Description: notice read and write errors on input and output
- Quoting from the bug report:
-    +bc (1.06-19ubuntu1) dapper; urgency=low
-    +
-    +  * Make dc notice read and write errors on its input and output.
-    +    I grepped for mentions of the strings `putc', `print', `getc', `FILE',
-    +    `stdin', `stdout' and `stderr' and added calls to new error-checking
-    +    functions unless it was clear from the immediately-surrounding code
-    +    that the program was exiting nonzero, or would exit nonzero if the
-    +    call failed.  I ignored hits in lib/getopt*, which seems to
-    +    pervasively ignore write errors when printing usage messages, in the
-    +    hope that these were correct.  I _think_ I got them all.  -iwj.
-    +
-    + -- Ian Jackson <iwj@ubuntu.com>  Tue,  4 Apr 2006 17:21:02 +0100
-Author: Ian Jackson <iwj@ubuntu.com>
-Origin: other
-Bug-Debian: http://bugs.debian.org/488735
----
-This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
-diff --git a/bc/execute.c b/bc/execute.c
-index e4e8ef7..8787048 100644
---- a/bc/execute.c
-+++ b/bc/execute.c
-@@ -108,6 +108,7 @@ execute ()
- 	      }
- 	    out_char ('\n');
- 	  }
-+	checkferror_output(stdout);
-       }
- #endif
- 
-@@ -222,6 +223,7 @@ execute ()
- 		}
- 	    }
- 	fflush (stdout);
-+	checkferror_output(stdout);
- 	break;
- 
-       case 'R' : /* Return from function */
-@@ -257,6 +259,7 @@ execute ()
- 	if (inst == 'W') out_char ('\n');
- 	store_var (4);  /* Special variable "last". */
- 	fflush (stdout);
-+	checkferror_output(stdout);
- 	pop ();
- 	break;
- 
-@@ -338,6 +341,7 @@ execute ()
-       case 'w' : /* Write a string to the output. */
- 	while ((ch = byte(&pc)) != '"') out_schar (ch);
- 	fflush (stdout);
-+	checkferror_output(stdout);
- 	break;
- 		   
-       case 'x' : /* Exchange Top of Stack with the one under the tos. */
-@@ -545,7 +549,10 @@ execute ()
-     {
-       signal (SIGINT, use_quit);
-       if (had_sigint)
--	printf ("\ninterrupted execution.\n");
-+	{
-+	  printf ("\ninterrupted execution.\n");
-+	  checkferror_output(stdout);
-+	}
-     }
- }
- 
-@@ -580,6 +587,7 @@ input_char ()
- 	  out_col = 0;  /* Saw a new line */
- 	}
-     }
-+  checkferror_input(stdin);
- 
-   /* Classify and preprocess the input character. */
-   if (isdigit(in_ch))
-diff --git a/bc/load.c b/bc/load.c
-index 1035198..4039e86 100644
---- a/bc/load.c
-+++ b/bc/load.c
-@@ -217,6 +217,7 @@ load_code (code)
- 		if (label_no > 65535L)
- 		  {  /* Better message? */
- 		    fprintf (stderr,"Program too big.\n");
-+		    checkferror_output(stderr);
- 		    exit(1);
- 		  }
- 		addbyte ( (char) (label_no & 0xFF));
-diff --git a/bc/main.c b/bc/main.c
-index 9a2461e..3ae427d 100644
---- a/bc/main.c
-+++ b/bc/main.c
-@@ -358,6 +358,9 @@ use_quit (sig)
-   errno = save;
- #else
-   write (1, "\n(interrupt) Exiting bc.\n", 26);
-+#ifdef READLINE
-+  rl_initialize (); /* Clear readline buffer */
-+#endif
- #if defined(LIBEDIT)
-   if (edit != NULL)
-     el_end(edit);
-diff --git a/bc/sbc.y b/bc/sbc.y
-index 0ded29e..6fcc1fa 100644
---- a/bc/sbc.y
-+++ b/bc/sbc.y
-@@ -86,7 +86,9 @@ program			: /* empty */
- 			      if (interactive && !quiet)
- 				{
- 				  show_bc_version ();
-+				  checkferror_output(stdout);
- 				  welcome ();
-+				  checkferror_output(stdout);
- 				}
- 			    }
- 			| program input_item
-diff --git a/bc/scan.c b/bc/scan.c
-index 1f78ec2..2b5eeb4 100644
---- a/bc/scan.c
-+++ b/bc/scan.c
-@@ -799,6 +799,7 @@ bcel_input (buf, result, max)
-       if (bcel_len != 0)
- 	history (hist, &histev, H_ENTER, bcel_line); 
-       fflush (stdout);
-+      checkferror_output(stdout);
-     }
- 
-   if (bcel_len <= max)
-@@ -874,6 +875,7 @@ rl_input (buf, result, max)
- 	add_history (rl_line); 
-       rl_line[rl_len-1] = '\n';
-       fflush (stdout);
-+      checkferror_output(stdout);
-     }
- 
-   if (rl_len <= max)
-diff --git a/bc/scan.l b/bc/scan.l
-index 841c3df..16cd62e 100644
---- a/bc/scan.l
-+++ b/bc/scan.l
-@@ -111,6 +111,7 @@ bcel_input (buf, result, max)
-       if (bcel_len != 0)
- 	history (hist, &histev, H_ENTER, bcel_line); 
-       fflush (stdout);
-+      checkferror_output(stdout);
-     }
- 
-   if (bcel_len <= max)
-@@ -186,6 +187,7 @@ rl_input (buf, result, max)
- 	add_history (rl_line); 
-       rl_line[rl_len-1] = '\n';
-       fflush (stdout);
-+      checkferror_output(stdout);
-     }
- 
-   if (rl_len <= max)
-@@ -310,6 +312,7 @@ limits return(Limits);
- 	    if (c == EOF)
- 	      {
- 		fprintf (stderr,"EOF encountered in a comment.\n");
-+                checkferror_output(stderr);
- 		break;
- 	      }
- 	  }
-diff --git a/bc/storage.c b/bc/storage.c
-index 699729a..37b4c6c 100644
---- a/bc/storage.c
-+++ b/bc/storage.c
-@@ -99,6 +99,7 @@ more_functions (VOID)
-     {
-       f = &functions[indx];
-       f->f_defined = FALSE;
-+      f->f_void = FALSE;
-       f->f_body = (char *) bc_malloc (BC_START_SIZE);
-       f->f_body_size = BC_START_SIZE;
-       f->f_code_size = 0;
-diff --git a/bc/util.c b/bc/util.c
-index 30beaf9..669235f 100644
---- a/bc/util.c
-+++ b/bc/util.c
-@@ -260,9 +260,10 @@ init_gen ()
-   continue_label = 0;
-   next_label  = 1;
-   out_count = 2;
--  if (compile_only) 
-+  if (compile_only) {
-     printf ("@i");
--  else
-+    checkferror_output(stdout);
-+  } else
-     init_load ();
-   had_error = FALSE;
-   did_gen = FALSE;
-@@ -286,6 +287,7 @@ generate (str)
- 	  printf ("\n");
- 	  out_count = 0;
- 	}
-+      checkferror_output(stdout);
-     }
-   else
-     load_code (str);
-@@ -303,6 +305,7 @@ run_code()
-       if (compile_only)
- 	{
- 	  printf ("@r\n"); 
-+	  checkferror_output(stdout);
- 	  out_count = 0;
- 	}
-       else
-@@ -341,6 +344,7 @@ out_char (ch)
- 	}
-       putchar (ch);
-     }
-+  checkferror_output(stdout);
- }
- 
- /* Output routines: Write a character CH to the standard output.
-@@ -371,6 +375,7 @@ out_schar (ch)
- 	}
-       putchar (ch);
-     }
-+  checkferror_output(stdout);
- }
- 
- 
-@@ -657,6 +662,7 @@ limits()
- #ifdef OLD_EQ_OP
-   printf ("Old assignment operatiors are valid. (=-, =+, ...)\n");
- #endif 
-+  checkferror_output(stdout);
- }
- 
- /* bc_malloc will check the return value so all other places do not
-@@ -721,6 +727,7 @@ yyerror (str, va_alist)
-   fprintf (stderr,"%s %d: ",name,line_no);
-   vfprintf (stderr, str, args);
-   fprintf (stderr, "\n");
-+  checkferror_output(stderr);
-   had_error = TRUE;
-   va_end (args);
- }
-@@ -761,6 +768,7 @@ warn (mesg, va_alist)
-       fprintf (stderr,"%s %d: Error: ",name,line_no);
-       vfprintf (stderr, mesg, args);
-       fprintf (stderr, "\n");
-+      checkferror_output(stderr);
-       had_error = TRUE;
-     }
-   else
-@@ -773,6 +781,7 @@ warn (mesg, va_alist)
- 	fprintf (stderr,"%s %d: (Warning) ",name,line_no);
- 	vfprintf (stderr, mesg, args);
- 	fprintf (stderr, "\n");
-+	checkferror_output(stderr);
-       }
-   va_end (args);
- }
-@@ -807,6 +816,7 @@ rt_error (mesg, va_alist)
-   va_end (args);
-   
-   fprintf (stderr, "\n");
-+  checkferror_output(stderr);
-   runtime_error = TRUE;
- }
- 
-@@ -843,4 +853,5 @@ rt_warn (mesg, va_alist)
-   va_end (args);
- 
-   fprintf (stderr, "\n");
-+  checkferror_output(stderr);
- }
-diff --git a/dc/dc.c b/dc/dc.c
-index e03f094..0faf03a 100644
---- a/dc/dc.c
-+++ b/dc/dc.c
-@@ -61,6 +61,7 @@ static void
- bug_report_info DC_DECLVOID()
- {
- 	printf("Email bug reports to:  bug-dc@gnu.org .\n");
-+	checkferror_output(stdout);
- }
- 
- static void
-@@ -71,6 +72,7 @@ show_version DC_DECLVOID()
- This is free software; see the source for copying conditions.  There is NO\n\
- warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n\
- to the extent permitted by law.\n", DC_COPYRIGHT);
-+	checkferror_output(stdout);
- }
- 
- /* your generic usage function */
-@@ -87,6 +89,7 @@ Usage: %s [OPTION] [file ...]\n\
- \n\
- ", progname);
- 	bug_report_info();
-+	checkferror_output(f);
- }
- 
- /* returns a pointer to one past the last occurance of c in s,
-diff --git a/dc/eval.c b/dc/eval.c
-index 4af7200..153d331 100644
---- a/dc/eval.c
-+++ b/dc/eval.c
-@@ -94,12 +94,15 @@ static int input_pushback;
- static int
- input_fil DC_DECLVOID()
- {
-+        int c;
- 	if (input_pushback != EOF){
--		int c = input_pushback;
-+		c = input_pushback;
- 		input_pushback = EOF;
- 		return c;
- 	}
--	return getc(input_fil_fp);
-+	c = getc(input_fil_fp);
-+	checkferror_input(input_fil_fp);
-+	return c;
- }
- 
- /* passed as an argument to dc_getnum */
-@@ -298,11 +301,13 @@ dc_func DC_DECLARG((c, peekc, negcmp))
- 				tmpint = dc_num2int(datum.v.number, DC_TOSS);
- 			if (2 <= tmpint  &&  tmpint <= DC_IBASE_MAX)
- 				dc_ibase = tmpint;
--			else
-+			else {
- 				fprintf(stderr,
- 						"%s: input base must be a number \
- between 2 and %d (inclusive)\n",
- 						progname, DC_IBASE_MAX);
-+				checkferror_output(stderr);
-+			}
- 		}
- 		break;
- 	case 'k':	/* set scale to value on top of stack */
-@@ -310,11 +315,12 @@ between 2 and %d (inclusive)\n",
- 			tmpint = -1;
- 			if (datum.dc_type == DC_NUMBER)
- 				tmpint = dc_num2int(datum.v.number, DC_TOSS);
--			if ( ! (tmpint >= 0) )
-+			if ( ! (tmpint >= 0) ) {
- 				fprintf(stderr,
- 						"%s: scale must be a nonnegative number\n",
- 						progname);
--			else
-+				checkferror_output(stderr);
-+			} else
- 				dc_scale = tmpint;
- 		}
- 		break;
-@@ -338,11 +344,12 @@ between 2 and %d (inclusive)\n",
- 			tmpint = 0;
- 			if (datum.dc_type == DC_NUMBER)
- 				tmpint = dc_num2int(datum.v.number, DC_TOSS);
--			if ( ! (tmpint > 1) )
-+			if ( ! (tmpint > 1) ) {
- 				fprintf(stderr,
- 						"%s: output base must be a number greater than 1\n",
- 						progname);
--			else
-+				checkferror_output(stderr);
-+			} else
- 				dc_obase = tmpint;
- 		}
- 		break;
-@@ -383,6 +390,7 @@ between 2 and %d (inclusive)\n",
- 				fprintf(stderr,
- 						"%s: square root of nonnumeric attempted\n",
- 						progname);
-+				checkferror_output(stderr);
- 			}else if (dc_sqrt(datum.v.number, dc_scale, &tmpnum) == DC_SUCCESS){
- 				dc_free_num(&datum.v.number);
- 				datum.v.number = tmpnum;
-@@ -444,6 +452,7 @@ between 2 and %d (inclusive)\n",
- 			fprintf(stderr,
- 					"%s: Q command requires a number >= 1\n",
- 					progname);
-+			checkferror_output(stderr);
- 		}
- 		break;
- #if 0
-@@ -489,11 +498,12 @@ between 2 and %d (inclusive)\n",
- 			if (datum.dc_type == DC_NUMBER)
- 				tmpint = dc_num2int(datum.v.number, DC_TOSS);
- 			if (dc_pop(&datum) == DC_SUCCESS){
--				if (tmpint < 0)
-+				if (tmpint < 0) {
- 					fprintf(stderr,
- 							"%s: array index must be a nonnegative integer\n",
- 							progname);
--				else
-+					checkferror_output(stderr);
-+				} else
- 					dc_array_set(peekc, tmpint, datum);
- 			}
- 		}
-@@ -505,17 +515,19 @@ between 2 and %d (inclusive)\n",
- 			tmpint = -1;
- 			if (datum.dc_type == DC_NUMBER)
- 				tmpint = dc_num2int(datum.v.number, DC_TOSS);
--			if (tmpint < 0)
-+			if (tmpint < 0) {
- 				fprintf(stderr,
- 						"%s: array index must be a nonnegative integer\n",
- 						progname);
--			else
-+				checkferror_output(stderr);
-+			} else
- 				dc_push(dc_array_get(peekc, tmpint));
- 		}
- 		return DC_EATONE;
- 
- 	default:	/* What did that user mean? */
- 		fprintf(stderr, "%s: ", progname);
-+		checkferror_output(stderr);
- 		dc_show_id(stdout, c, " unimplemented\n");
- 		break;
- 	}
-@@ -544,6 +556,7 @@ dc_evalstr DC_DECLARG((string))
- 		fprintf(stderr,
- 				"%s: eval called with non-string argument\n",
- 				progname);
-+		checkferror_output(stderr);
- 		return DC_OKAY;
- 	}
- 	interrupt_seen = 0;
-@@ -640,6 +653,7 @@ dc_evalstr DC_DECLARG((string))
- 				return DC_FAIL;
- 			}
- 			fprintf(stderr, "%s: unexpected EOS\n", progname);
-+			checkferror_output(stderr);
- 			return DC_OKAY;
- 		}
- 	}
-@@ -665,6 +679,7 @@ dc_evalfile DC_DECLARG((fp))
- 	stdin_lookahead = EOF;
- 	for (c=getc(fp); c!=EOF; c=peekc){
- 		peekc = getc(fp);
-+		checkferror_input(stdin);
- 		/*
- 		 * The following if() is the only place where ``stdin_lookahead''
- 		 * might be set to other than EOF:
-@@ -716,6 +731,7 @@ dc_evalfile DC_DECLARG((fp))
- 							return DC_SUCCESS;
- 						fprintf(stderr, "%s: Q command argument exceeded \
- string execution depth\n", progname);
-+						checkferror_output(stderr);
- 					}
- 				}else{
- 					dc_garbage("at top of stack", -1);
-@@ -728,8 +744,11 @@ string execution depth\n", progname);
- 			fprintf(stderr,
- 					"%s: Q command argument exceeded string execution depth\n",
- 					progname);
--			if (stdin_lookahead != peekc  &&  fp == stdin)
-+			checkferror_output(stderr);
-+			if (stdin_lookahead != peekc  &&  fp == stdin) {
- 				peekc = getc(fp);
-+				checkferror_input(stdin);
-+			}
- 			break;
- 
- 		case DC_INT:
-@@ -771,6 +790,7 @@ string execution depth\n", progname);
- 			if (ferror(fp))
- 				goto error_fail;
- 			fprintf(stderr, "%s: unexpected EOF\n", progname);
-+			checkferror_output(stderr);
- 			return DC_FAIL;
- 		}
- 	}
-diff --git a/dc/misc.c b/dc/misc.c
-index f2388b0..1be56fe 100644
---- a/dc/misc.c
-+++ b/dc/misc.c
-@@ -91,6 +91,7 @@ dc_show_id DC_DECLARG((fp, id, suffix))
- 		fprintf(fp, "'%c' (%#o)%s", (unsigned int) id, id, suffix);
- 	else
- 		fprintf(fp, "%#o%s", (unsigned int) id, suffix);
-+	checkferror_output(fp);
- }
- 
- 
-diff --git a/dc/numeric.c b/dc/numeric.c
-index 8e5e70f..c875eba 100644
---- a/dc/numeric.c
-+++ b/dc/numeric.c
-@@ -134,6 +134,7 @@ dc_div DC_DECLARG((a, b, kscale, result))
- 	bc_init_num(CastNumPtr(result));
- 	if (bc_divide(CastNum(a), CastNum(b), CastNumPtr(result), kscale)){
- 		fprintf(stderr, "%s: divide by zero\n", progname);
-+		checkferror_output(stderr);
- 		return DC_DOMAIN_ERROR;
- 	}
- 	return DC_SUCCESS;
-@@ -156,6 +157,7 @@ dc_divrem DC_DECLARG((a, b, kscale, quotient, remainder))
- 	if (bc_divmod(CastNum(a), CastNum(b),
- 						CastNumPtr(quotient), CastNumPtr(remainder), kscale)){
- 		fprintf(stderr, "%s: divide by zero\n", progname);
-+		checkferror_output(stderr);
- 		return DC_DOMAIN_ERROR;
- 	}
- 	return DC_SUCCESS;
-@@ -174,6 +176,7 @@ dc_rem DC_DECLARG((a, b, kscale, result))
- 	bc_init_num(CastNumPtr(result));
- 	if (bc_modulo(CastNum(a), CastNum(b), CastNumPtr(result), kscale)){
- 		fprintf(stderr, "%s: remainder by zero\n", progname);
-+		checkferror_output(stderr);
- 		return DC_DOMAIN_ERROR;
- 	}
- 	return DC_SUCCESS;
-@@ -226,6 +229,7 @@ dc_sqrt DC_DECLARG((value, kscale, result))
- 	tmp = bc_copy_num(CastNum(value));
- 	if (!bc_sqrt(&tmp, kscale)){
- 		fprintf(stderr, "%s: square root of negative number\n", progname);
-+		checkferror_output(stderr);
- 		bc_free_num(&tmp);
- 		return DC_DOMAIN_ERROR;
- 	}
-@@ -429,8 +433,10 @@ dc_out_num DC_DECLARG((value, obase, newline_p, discard_p))
- {
- 	out_char('\0'); /* clear the column counter */
- 	bc_out_num(CastNum(value), obase, out_char, 0);
--	if (newline_p == DC_WITHNL)
-+	if (newline_p == DC_WITHNL) {
- 		putchar ('\n');
-+		checkferror_output(stdout);
-+	}
- 	if (discard_p == DC_TOSS)
- 		dc_free_num(&value);
- }
-@@ -475,6 +481,7 @@ dc_dump_num DC_DECLARG((dcvalue, discard_p))
- 
- 	for (cur=top_of_stack; cur; cur=next) {
- 		putchar(cur->digit);
-+		checkferror_output(stdout);
- 		next = cur->link;
- 		free(cur);
- 	}
-@@ -592,6 +599,7 @@ out_char (ch)
- 			out_col = 1;
- 		}
- 		putchar(ch);
-+		checkferror_output(stderr);
- 	}
- }
- 
-@@ -631,6 +639,7 @@ rt_error (mesg, va_alist)
- 	vfprintf (stderr, mesg, args);
- 	va_end (args);
- 	fprintf (stderr, "\n");
-+	checkferror_output(stderr);
- }
- 
- 
-@@ -664,6 +673,7 @@ rt_warn (mesg, va_alist)
- 	vfprintf (stderr, mesg, args);
- 	va_end (args);
- 	fprintf (stderr, "\n");
-+	checkferror_output(stderr);
- }
- 
- 
-diff --git a/dc/stack.c b/dc/stack.c
-index 0730e9c..5db3975 100644
---- a/dc/stack.c
-+++ b/dc/stack.c
-@@ -38,7 +38,10 @@
- #include "dc-regdef.h"
- 
- /* an oft-used error message: */
--#define Empty_Stack	fprintf(stderr, "%s: stack empty\n", progname)
-+#define Empty_Stack do{					\
-+    fprintf(stderr, "%s: stack empty\n", progname);	\
-+    checkferror_output(stderr);				\
-+  }while(0)
- 
- 
- /* simple linked-list implementation suffices: */
-@@ -94,6 +97,7 @@ dc_binop DC_DECLARG((op, kscale))
- 	if (dc_stack->value.dc_type!=DC_NUMBER
- 			|| dc_stack->link->value.dc_type!=DC_NUMBER){
- 		fprintf(stderr, "%s: non-numeric value\n", progname);
-+		checkferror_output(stderr);
- 		return;
- 	}
- 	(void)dc_pop(&b);
-@@ -134,6 +138,7 @@ dc_binop2 DC_DECLARG((op, kscale))
- 	if (dc_stack->value.dc_type!=DC_NUMBER
- 			|| dc_stack->link->value.dc_type!=DC_NUMBER){
- 		fprintf(stderr, "%s: non-numeric value\n", progname);
-+		checkferror_output(stderr);
- 		return;
- 	}
- 	(void)dc_pop(&b);
-@@ -172,6 +177,7 @@ dc_cmpop DC_DECLVOID()
- 	if (dc_stack->value.dc_type!=DC_NUMBER
- 			|| dc_stack->link->value.dc_type!=DC_NUMBER){
- 		fprintf(stderr, "%s: non-numeric value\n", progname);
-+		checkferror_output(stderr);
- 		return 0;
- 	}
- 	(void)dc_pop(&b);
-@@ -209,6 +215,7 @@ dc_triop DC_DECLARG((op, kscale))
- 			|| dc_stack->link->value.dc_type!=DC_NUMBER
- 			|| dc_stack->link->link->value.dc_type!=DC_NUMBER){
- 		fprintf(stderr, "%s: non-numeric value\n", progname);
-+		checkferror_output(stderr);
- 		return;
- 	}
- 	(void)dc_pop(&c);
-@@ -327,6 +334,7 @@ dc_register_get DC_DECLARG((regid, result))
- 	r = dc_register[regid];
- 	if (r==NULL || r->value.dc_type==DC_UNINITIALIZED){
- 		fprintf(stderr, "%s: register ", progname);
-+		checkferror_output(stderr);
- 		dc_show_id(stderr, regid, " is empty\n");
- 		return DC_FAIL;
- 	}
-@@ -401,6 +409,7 @@ dc_register_pop DC_DECLARG((stackid, result))
- 	r = dc_register[stackid];
- 	if (r == NULL){
- 		fprintf(stderr, "%s: stack register ", progname);
-+		checkferror_output(stderr);
- 		dc_show_id(stderr, stackid, " is empty\n");
- 		return DC_FAIL;
- 	}
-diff --git a/dc/string.c b/dc/string.c
-index ff1e7f1..e24092d 100644
---- a/dc/string.c
-+++ b/dc/string.c
-@@ -101,6 +101,7 @@ dc_out_str DC_DECLARG((value, newline, discard_flag))
- 	fwrite(value->s_ptr, value->s_len, sizeof *value->s_ptr, stdout);
- 	if (newline == DC_WITHNL)
- 		putchar('\n');
-+	checkferror_output(stdout);
- 	if (discard_flag == DC_TOSS)
- 		dc_free_str(&value);
- }
-@@ -176,6 +177,7 @@ dc_readstring DC_DECLARG((fp, ldelim, rdelim))
- 		}
- 		*p++ = c;
- 	}
-+	checkferror_input(fp);
- 	return dc_makestring(line_buf, (size_t)(p-line_buf));
- }
- 
-diff --git a/h/number.h b/h/number.h
-index 9b034b6..3a00a92 100644
---- a/h/number.h
-+++ b/h/number.h
-@@ -150,4 +150,7 @@ _PROTOTYPE(int bc_sqrt, (bc_num *num, int scale));
- _PROTOTYPE(void bc_out_num, (bc_num num, int o_base, void (* out_char)(int),
- 			     int leading_zero));
- 
-+_PROTOTYPE(void checkferror_input, (FILE*));
-+_PROTOTYPE(void checkferror_output, (FILE*));
-+
- #endif
-diff --git a/lib/number.c b/lib/number.c
-index e211840..4d3ce46 100644
---- a/lib/number.c
-+++ b/lib/number.c
-@@ -1776,6 +1776,7 @@ static void
- out_char (int c)
- {
-   putchar(c);
-+  checkferror_output(stdout);
- }
- 
- 
-@@ -1785,6 +1786,7 @@ pn (num)
- {
-   bc_out_num (num, 10, out_char, 0);
-   out_char ('\n');
-+  checkferror_output(stdout);
- }
- 
- 
-@@ -1799,6 +1801,28 @@ pv (name, num, len)
-   printf ("%s=", name);
-   for (i=0; i<len; i++) printf ("%c",BCD_CHAR(num[i]));
-   printf ("\n");
-+  checkferror_output(stdout);
- }
- 
- #endif
-+
-+/* check ferror() status and if so die */
-+void
-+checkferror_input (fp)
-+	FILE *fp;
-+{
-+	if (ferror(fp)) {
-+		perror("dc: could not read input file");
-+		exit(EXIT_FAILURE);
-+	}
-+}
-+
-+void
-+checkferror_output (fp)
-+	FILE *fp;
-+{
-+	if (ferror(fp)) {
-+		perror("dc: could not write output file");
-+		exit(EXIT_FAILURE);
-+	}
-+}
diff --git a/package/bc/bc.hash b/package/bc/bc.hash
index 5f1ed63..61beb49 100644
--- a/package/bc/bc.hash
+++ b/package/bc/bc.hash
@@ -1,2 +1,2 @@ 
 # Locally calculated
-sha256 7ee4abbcfac03d8a6e1a8a3440558a3d239d6b858585063e745c760957725ecc  bc-1.06.95.tar.bz2
+sha256 62adfca89b0a1c0164c2cdca59ca210c1d44c3ffc46daf9931cf4942664cb02a  bc-1.07.1.tar.gz
diff --git a/package/bc/bc.mk b/package/bc/bc.mk
index 4596192..b5853b1 100644
--- a/package/bc/bc.mk
+++ b/package/bc/bc.mk
@@ -4,17 +4,34 @@ 
 #
 ################################################################################
 
-BC_VERSION = 1.06.95
-BC_SOURCE = bc-$(BC_VERSION).tar.bz2
-BC_SITE = http://alpha.gnu.org/gnu/bc
-BC_DEPENDENCIES = host-flex
+BC_VERSION = 1.07.1
+BC_SITE = $(BR2_GNU_MIRROR)/bc
+# host-bc needed to bootstrap libmath.h at build time
+# host-ed needed by the fix-libmath_h script at build time
+BC_DEPENDENCIES = host-bc host-ed
 BC_LICENSE = GPL-2.0+, LGPL-2.1+
 BC_LICENSE_FILES = COPYING COPYING.LIB
+# host-ed needed by the fix-libmath_h script at build time
+HOST_BC_DEPENDENCIES = host-ed
 
 # Build after busybox so target ends up with bc's "dc" version
 ifeq ($(BR2_PACKAGE_BUSYBOX),y)
 BC_DEPENDENCIES += busybox
 endif
 
+# A stripped-down version of bc (fbc) is built for bootstrapping purposes. Then
+# the bc build system tries to run it in order to generate some header files,
+# but that breaks cross-compilation because we cannot run in the host machine an
+# fbc that has been built for the target architecture. We tweak the Makefiles in
+# order to run the bc that was built for the host. As long as the host bc and
+# the target one have the same version the result should be fine. And also, note
+# we don't need to run the host fbc (which doesn't exist by the way, because
+# it was deleted after its use by the host-bc Makefile) and we can just run the
+# full bc program (remember the fbc was just a tripped-down version of bc).
+define BC_USE_HOST_FBC
+	$(SED) "s:\./fbc -c:$(HOST_DIR)/usr/bin/bc -c:" $(@D)/bc/Makefile.in
+endef
+BC_POST_PATCH_HOOKS += BC_USE_HOST_FBC
+
 $(eval $(autotools-package))
 $(eval $(host-autotools-package))