Skip to content

Commit b4acfe7

Browse files
committed
Build fixes for z/OS
1 parent a0184f5 commit b4acfe7

File tree

4 files changed

+69
-11
lines changed

4 files changed

+69
-11
lines changed

configure.ac

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
7272
# Check for a 64-bit integer type
7373
AC_TYPE_INT64_T
7474

75+
# Check for xlc which has some special (broken/non-standard) behaviour on z/OS.
76+
PCRE2_ZOS_FIXES
77+
7578
AC_PROG_INSTALL
7679
LT_INIT([win32-dll])
7780
AC_PROG_LN_S

m4/pcre2_zos.m4

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
dnl Tests whether the compiler requires an additional flag in order to fail on
2+
dnl undefined headers.
3+
4+
dnl The concept of setting this commandline flag was learned from patches and
5+
dnl mailing list discussions of the gnulib and gawk projects (credit to
6+
dnl Bruno Haible).
7+
8+
AC_DEFUN([PCRE2_ZOS_FIXES],
9+
[
10+
AC_CACHE_CHECK([for OS/390 (z/OS)], [pcre2_cv_os390],
11+
[if test "`uname`" = "OS/390"; then
12+
pcre2_cv_os390=yes
13+
else
14+
pcre2_cv_os390=no
15+
fi])
16+
if test "$pcre2_cv_os390" = "yes"; then
17+
AC_CACHE_CHECK([whether the compiler supports -qhaltonmsg=CCN3296], [pcre2_cv_xlc_qhaltonmsg_support],
18+
[save_CFLAGS="$CFLAGS"
19+
CFLAGS="$CFLAGS -qhaltonmsg=CCN3296"
20+
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])],
21+
[pcre2_cv_xlc_qhaltonmsg_support=yes],
22+
[pcre2_cv_xlc_qhaltonmsg_support=no])
23+
CFLAGS="$save_CFLAGS"
24+
])
25+
26+
AC_CACHE_CHECK([whether non-existent headers fail the compile], [pcre2_cv_xlc_nonexistent_fatal],
27+
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <thereshouldbenoheader.h>]])],
28+
[pcre2_cv_xlc_nonexistent_fatal=no],
29+
[pcre2_cv_xlc_nonexistent_fatal=yes])
30+
])
31+
32+
if test "$pcre2_cv_xlc_nonexistent_fatal" = "no" && test "$pcre2_cv_xlc_qhaltonmsg_support" = "yes"; then
33+
AC_CACHE_CHECK([whether -qhaltonmsg=CCN3296 fixes the non-existent-header issue], [pcre2_cv_xlc_qhaltonmsg_fixes],
34+
[save_CFLAGS="$CFLAGS"
35+
CFLAGS="$CFLAGS -qhaltonmsg=CCN3296"
36+
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <thereshouldbenoheader.h>]])],
37+
[pcre2_cv_xlc_qhaltonmsg_fixes=no],
38+
[pcre2_cv_xlc_qhaltonmsg_fixes=yes])
39+
CFLAGS="$save_CFLAGS"
40+
])
41+
42+
if test "$pcre2_cv_xlc_qhaltonmsg_fixes" = "no"; then
43+
AC_MSG_ERROR([-qhaltonmsg=CCN3296 not effective on non-existent headers])
44+
fi
45+
46+
CFLAGS="$CFLAGS -qhaltonmsg=CCN3296"
47+
fi
48+
49+
fi
50+
])

maint/manifest-tarball

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,7 @@ drwxr-xr-x tarball-dir/pcre2-SNAPSHOT/m4
293293
-rw-r--r-- tarball-dir/pcre2-SNAPSHOT/m4/ltversion.m4
294294
-rw-r--r-- tarball-dir/pcre2-SNAPSHOT/m4/lt~obsolete.m4
295295
-rw-r--r-- tarball-dir/pcre2-SNAPSHOT/m4/pcre2_visibility.m4
296+
-rw-r--r-- tarball-dir/pcre2-SNAPSHOT/m4/pcre2_zos.m4
296297
-rwxr-xr-x tarball-dir/pcre2-SNAPSHOT/missing
297298
-rw-r--r-- tarball-dir/pcre2-SNAPSHOT/pcre2-config.in
298299
-rwxr-xr-x tarball-dir/pcre2-SNAPSHOT/perltest.sh

src/pcre2test.c

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9628,30 +9628,34 @@ while (argc > 1 && argv[op][0] == '-' && argv[op][1] != 0)
96289628
fprintf(stderr, "pcre2test: -S is not supported on this OS\n");
96299629
exit(1);
96309630
#else
9631-
int rc;
9631+
int rc = 0;
96329632
uint32_t stack_size;
9633-
struct rlimit rlim;
9634-
if (U32OVERFLOW(uli))
9633+
struct rlimit rlim, rlim_old;
9634+
if (uli > INT32_MAX / (1024 * 1024))
96359635
{
96369636
fprintf(stderr, "** Argument for -S is too big\n");
96379637
exit(1);
96389638
}
96399639
stack_size = (uint32_t)uli;
9640-
getrlimit(RLIMIT_STACK, &rlim);
9640+
getrlimit(RLIMIT_STACK, &rlim_old);
9641+
rlim = rlim_old;
96419642
rlim.rlim_cur = stack_size * 1024 * 1024;
9642-
if (rlim.rlim_cur > rlim.rlim_max)
9643+
if (rlim.rlim_max != RLIM_INFINITY && rlim.rlim_cur > rlim.rlim_max)
96439644
{
96449645
fprintf(stderr,
96459646
"pcre2test: requested stack size %luMiB is greater than hard limit ",
96469647
(unsigned long int)stack_size);
9647-
if (rlim.rlim_max % (1024*1024) == 0) fprintf(stderr, "%luMiB\n",
9648-
(unsigned long int)(rlim.rlim_max/(1024 * 1024)));
9649-
else if (rlim.rlim_max % 1024 == 0) fprintf(stderr, "%luKiB\n",
9650-
(unsigned long int)(rlim.rlim_max/1024));
9651-
else fprintf(stderr, "%lu bytes\n", (unsigned long int)(rlim.rlim_max));
9648+
if (rlim.rlim_max % (1024*1024) == 0)
9649+
fprintf(stderr, "%luMiB\n", (unsigned long)(rlim.rlim_max/(1024*1024)));
9650+
else if (rlim.rlim_max % 1024 == 0)
9651+
fprintf(stderr, "%luKiB\n", (unsigned long)(rlim.rlim_max/1024));
9652+
else
9653+
fprintf(stderr, "%lu bytes\n", (unsigned long)(rlim.rlim_max));
96529654
exit(1);
96539655
}
9654-
rc = setrlimit(RLIMIT_STACK, &rlim);
9656+
if (rlim_old.rlim_cur != RLIM_INFINITY && rlim_old.rlim_cur <= INT32_MAX &&
9657+
rlim.rlim_cur > rlim_old.rlim_cur)
9658+
rc = setrlimit(RLIMIT_STACK, &rlim);
96559659
if (rc != 0)
96569660
{
96579661
fprintf(stderr, "pcre2test: setting stack size %luMiB failed: %s\n",

0 commit comments

Comments
 (0)