# uname -ap
OpenBSD 4.9 GENERIC.MP#819 amd64 Intel(R) Xeon(R) CPU E5620 @ 2.40GHz
#
# #From: http://ftp.openbsd.org/pub/OpenBSD/4.9/packages/amd64/m4-1.4.13.tgz
# /usr/bin/gm4 --version
m4 (GNU M4) 1.4.13
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Rene' Seindal.
#
let's inspect a sample:
test.m4:
divert(0)A regexp(`
C', `^C', `B')D
The output of GNU-M4:
# /usr/bin/gm4 test.m4 > test.gnu.c
# cat test.gnu.c
A BD
#
The output of BSD-M4:
# /usr/bin/m4 -g test.m4 > test.bsd.c
# cat test.bsd.c
A D
#
differ:
# diff -u test.gnu.c test.bsd.c
--- test.gnu.c Tue Oct 25 07:48:24 2011
+++ test.bsd.c Tue Oct 25 07:50:06 2011
@@ -1 +1 @@
-A BD
+A D
#
let's fix it:
# git diff old master
diff --git a/usr/src/usr.bin/m4/gnum4.c b/usr/src/usr.bin/m4/gnum4.c
index 5f6568a..b2d6522 100644
--- a/usr/src/usr.bin/m4/gnum4.c
+++ b/usr/src/usr.bin/m4/gnum4.c
@@ -497,7 +497,7 @@ doregexp(const char *argv[], int argc)
pbstr(argv[4]);
}
error = regcomp(&re, mimic_gnu ? twiddle(argv[3]) : argv[3],
- REG_EXTENDED);
+ REG_EXTENDED|REG_NEWLINE);
if (error != 0)
exit_regerror(error, &re);
#
Now they are compatible:
# /usr/src/usr.bin/m4/m4 -g test.m4 > test.bsd.patched.c
# diff -s test.gnu.c test.bsd.patched.c
Files test.gnu.c and test.bsd.patched.c are identical
#
Consequence of imcompatibility:
An error occurs during compiling PostgreSQL:
gmake[4]: Entering directory `/tmp/pgxc/git/src/pl/plpgsql/src'
/usr/bin/bison -d -o pl_gram.c gram.y
gcc -DPGXC -Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels -Wformat-security
-fno-strict-aliasing -fwrapv -fpic -DPIC -I. -I.
-I../../../../src/include -c -o pl_gram.o pl_gram.c
gram.y: In function 'plpgsql_yyparse':
gram.y:875: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
...
gram.y:3379: warning: passing argument 2 of 'tok_is_keyword' from
incompatible pointer type
gmake[4]: *** [pl_gram.o] Error 1
gmake[4]: Leaving directory `/tmp/pgxc/git/src/pl/plpgsql/src'
Further reading:
http://archives.postgresql.org/pgsql-bugs/2011-10/msg00161.php
Thank You!