https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103822
Bug ID: 103822 Summary: libbacktrace make check fails with GNU Make 3.81 Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libbacktrace Assignee: unassigned at gcc dot gnu.org Reporter: fxcoudert at gcc dot gnu.org CC: ian at gcc dot gnu.org Target Milestone: --- The failure is observed on macOS (*-apple-darwin21), where the system make is GNU Make 3.81. But I think it would occur on all platforms that are not ELF and use GNU Make 3.81. Running `make check` leads to this failure: elf_32.c:144:26: error: extra tokens at end of #undef directive [-Werror] 144 | #undef BACKTRACE_ELF_SIZE#define BACKTRACE_ELF_SIZE 32 | ^ where the invalid elf_32.c is generated by this command: SEARCH='#error "Unknown BACKTRACE_ELF_SIZE"'; \ REPLACE='#undef BACKTRACE_ELF_SIZE\ #define BACKTRACE_ELF_SIZE'; \ /usr/bin/sed "s/^$SEARCH\$/$REPLACE 32/" \ /tmp/gcc-darwin-arm64/libbacktrace/elf.c \ > elf_32.c.tmp mv elf_32.c.tmp elf_32.c This tries to have a newline inside the REPLACE string, and pass it to sed. This fails with GNU Make < 4. And GCC requires "GNU make version 3.80 (or later)". The portable solution is given in the autoconf manual: https://www.gnu.org/software/autoconf/manual/autoconf-2.69/html_node/Newlines-in-Make-Rules.html The patch to fix it is this: diff --git a/libbacktrace/Makefile.am b/libbacktrace/Makefile.am index 8874f41338a..180a3b1a809 100644 --- a/libbacktrace/Makefile.am +++ b/libbacktrace/Makefile.am @@ -145,18 +145,18 @@ endif HAVE_OBJCOPY_DEBUGLINK endif HAVE_ELF elf_%.c: elf.c + nlinit=`echo 'nl="'; echo '"'`; eval "$$nlinit"; \ SEARCH='#error "Unknown BACKTRACE_ELF_SIZE"'; \ - REPLACE='#undef BACKTRACE_ELF_SIZE\ - #define BACKTRACE_ELF_SIZE'; \ + REPLACE='#undef BACKTRACE_ELF_SIZE\\$${nl}#define BACKTRACE_ELF_SIZE'; \ $(SED) "s/^$$SEARCH\$$/$$REPLACE $*/" \ $< \ > $@.tmp mv $@.tmp $@ xcoff_%.c: xcoff.c + nlinit=`echo 'nl="'; echo '"'`; eval "$$nlinit"; \ SEARCH='#error "Unknown BACKTRACE_XCOFF_SIZE"'; \ - REPLACE='#undef BACKTRACE_XCOFF_SIZE\ - #define BACKTRACE_XCOFF_SIZE'; \ + REPLACE='#undef BACKTRACE_XCOFF_SIZE\\$${nl}#define BACKTRACE_XCOFF_SIZE'; \ $(SED) "s/^$$SEARCH\$$/$$REPLACE $*/" \ $< \ > $@.tmp