OTP 19.1 compilation fails

28 views
Skip to first unread message

Bogdan Andu

unread,
Sep 26, 2016, 5:31:28 AM9/26/16
to Erlang Questions
Hi,

after applying patches from port/lang/erlang/19/patches
otp 19.1 fails to compile on OpenBSD 5.7/amd64 with error:
....................
CC obj/x86_64-unknown-openbsd5.7/opt/smp/sys.o
sys/unix/sys.c: In function 'suspend_signal':
sys/unix/sys.c:718: error: called object '__errno' is not a function
sys/unix/sys.c:721: error: called object '__errno' is not a function
sys/unix/sys.c:724: error: called object '__errno' is not a function
x86_64-unknown-openbsd5.7/Makefile:677: recipe for target 'obj/x86_64-unknown-openbsd5.7/opt/smp/sys.o' failed
gmake[3]: *** [obj/x86_64-unknown-openbsd5.7/opt/smp/sys.o] Error 1
gmake[3]: Leaving directory '/home/andu/otp_src_19.1/erts/emulator'
/home/andu/otp_src_19.1/make/run_make.mk:35: recipe for target 'opt' failed
gmake[2]: *** [opt] Error 2
gmake[2]: Leaving directory '/home/andu/otp_src_19.1/erts/emulator'
Makefile:61: recipe for target 'smp' failed
gmake[1]: *** [smp] Error 2
gmake[1]: Leaving directory '/home/andu/otp_src_19.1/erts'
Makefile:444: recipe for target 'emulator' failed
gmake: *** [emulator] Error 2

becsuse in OpenBSD __errno is a function, see: /usr/include/signal.h
$ gcc -v
Reading specs from /usr/lib/gcc-lib/amd64-unknown-openbsd5.7/4.2.1/specs
Target: amd64-unknown-openbsd5.7
Configured with: OpenBSD/amd64 system compiler
Thread model: posix
gcc version 4.2.1 20070719

$ diff -u /home/andu/otp_src_19.0/erts/emulator/sys/unix/sys.c /home/andu/otp_src_19.1/erts/emulator/sys/unix/sys.c
--- /home/andu/otp_src_19.0/erts/emulator/sys/unix/sys.c        Tue Jun 21 21:55:58 2016
+++ /home/andu/otp_src_19.1/erts/emulator/sys/unix/sys.c        Tue Sep 20 22:11:23 2016
@@ -715,11 +715,13 @@
 static RETSIGTYPE suspend_signal(int signum)
 #endif
 {
-   int res;
-   int buf[1];
-   do {
-     res = read(sig_suspend_fds[0], buf, sizeof(int));
-   } while (res < 0 && errno == EINTR);
+    int res, buf[1], __errno = errno;
+    do {
+        res = read(sig_suspend_fds[0], buf, sizeof(int));
+    } while (res < 0 && errno == EINTR);
+
+    /* restore previous errno in case read changed it */
+    errno = __errno;
 }
 #endif /* #ifdef ERTS_SYS_SUSPEND_SIGNAL */

In opt 19.1 is introduced this variable (__errno) which in OpenBSD is a function.


Regards,
/Bogdan

Bogdan Andu

unread,
Sep 26, 2016, 6:02:46 AM9/26/16
to Erlang Questions
I propose a diff for a clean compilation

$ diff -u /home/andu/otp_src_19.1/erts/emulator/sys/unix/sys.c.orig /home/andu/otp_src_19.1/erts/emulator/sys/unix/sys.c     
--- /home/andu/otp_src_19.1/erts/emulator/sys/unix/sys.c.orig   Mon Sep 26 12:59:49 2016
+++ /home/andu/otp_src_19.1/erts/emulator/sys/unix/sys.c        Mon Sep 26 13:00:19 2016
@@ -715,13 +715,13 @@

 static RETSIGTYPE suspend_signal(int signum)
 #endif
 {
-    int res, buf[1], __errno = errno;
+    int res, buf[1], errno_tmp = errno;
     do {

         res = read(sig_suspend_fds[0], buf, sizeof(int));
     } while (res < 0 && errno == EINTR);
 
     /* restore previous errno in case read changed it */
-    errno = __errno;
+    errno = errno_tmp;

 }
 #endif /* #ifdef ERTS_SYS_SUSPEND_SIGNAL */


Reply all
Reply to author
Forward
0 new messages