Compare commits

...

6 Commits

Author SHA1 Message Date
Christof Meerwald
13c7a4265a jam: Fix isspace/isalnum/tolower/... usage
The value passed in must be representable as an unsigned char or equal
to the value of the macro EOF. NetBSD 11+ is actually enforcing this.

Change-Id: I9a7eada7c0c1ae206aa6810027a2b02742b72934
Reviewed-on: https://review.haiku-os.org/c/buildtools/+/10127
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
2025-12-18 10:43:27 +00:00
Brendan Shanks
7ab022f6e6 libiberty: Use posix_spawn in pex-unix when available.
Hi,

This patch implements pex_unix_exec_child using posix_spawn when
available.

This should especially benefit recent macOS (where vfork just calls
fork), but should have equivalent or faster performance on all
platforms.
In addition, the implementation is substantially simpler than the
vfork+exec code path.

Tested on x86_64-linux.

v2: Fix error handling (previously the function would be run twice in
case of error), and don't use a macro that changes control flow.

v3: Match file style for error-handling blocks, don't close
in/out/errdes on error, and check close() for errors.

libiberty/
	* configure.ac (AC_CHECK_HEADERS): Add spawn.h.
	(checkfuncs): Add posix_spawn, posix_spawnp.
	(AC_CHECK_FUNCS): Add posix_spawn, posix_spawnp.
	* aclocal.m4, configure, config.in: Rebuild.
	* pex-unix.c [HAVE_POSIX_SPAWN] (pex_unix_exec_child): New function.
2025-01-16 21:32:27 -05:00
Jessica Hamilton
360fe2fd07 jam: mirror Jamfile in Makefile.
Without these changes, `jam0` is different to `bin.*/jam`, a subtle
difference that was triggering errors in CI due to use of `jam0`.
In particular, the omission of `OPT_JAM_TARGETS_VARIABLE_EXT`
results in a `jam0` that cannot build Haiku, as `$(JAM_TARGETS)`
will not be defined, and is required by Haiku's build system.
2025-01-01 09:19:56 +00:00
Alexander von Gluck
58add95cfc jam: Silly build fix 2024-12-27 17:00:48 -06:00
Alexander von Gluck
400880c468 jam: Fill in missing OSPLAT architectures
* These are horrible, but at least consistent and won't break existing
  jam definitions.
* Haiku's jam goes through and adjusts x86 to x86_64, etc.. so do the
  same for other 32 vs 64-bit architectures.

Change-Id: I8b0eee20dd35e7458ef31949cd3fa621265c2f51
Reviewed-on: https://review.haiku-os.org/c/buildtools/+/8719
Reviewed-by: Adrien Destugues <pulkomandy@pulkomandy.tk>
Reviewed-by: X512 X512 <danger_mail@list.ru>
Reviewed-by: Alexander von Gluck <alex@terarocket.io>
2024-12-27 14:15:24 +00:00
PulkoMandy
d86b03dc2b Fix typo from btrev43210
This results in some functions being missing from libgcc, and then
undefined references during Haiku build.
2024-07-21 10:00:58 +02:00
15 changed files with 217 additions and 28 deletions

View File

@@ -1221,7 +1221,7 @@ powerpc*-*-freebsd*)
esac
;;
powerpc-*-haiku*)
tmake_file="$tmake_file rs6000/t-ppccomm rs6000/t-savresfpgr rs6000/t-crtstuff rs6000/t-crtstuff-pic t-fdpbit"
tmake_file="$tmake_file rs6000/t-ppccomm rs6000/t-savresfgpr rs6000/t-crtstuff rs6000/t-crtstuff-pic t-fdpbit"
;;
powerpc-*-netbsd*)
tmake_file="$tmake_file rs6000/t-netbsd rs6000/t-crtstuff"

View File

@@ -1,6 +1,6 @@
# generated automatically by aclocal 1.15.1 -*- Autoconf -*-
# generated automatically by aclocal 1.16.5 -*- Autoconf -*-
# Copyright (C) 1996-2017 Free Software Foundation, Inc.
# Copyright (C) 1996-2021 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,

View File

@@ -198,6 +198,12 @@
/* Define to 1 if you have the `pipe2' function. */
#undef HAVE_PIPE2
/* Define to 1 if you have the `posix_spawn' function. */
#undef HAVE_POSIX_SPAWN
/* Define to 1 if you have the `posix_spawnp' function. */
#undef HAVE_POSIX_SPAWNP
/* Define to 1 if you have the <process.h> header file. */
#undef HAVE_PROCESS_H
@@ -249,6 +255,9 @@
/* Define to 1 if you have the `spawnvpe' function. */
#undef HAVE_SPAWNVPE
/* Define to 1 if you have the <spawn.h> header file. */
#undef HAVE_SPAWN_H
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H

View File

@@ -5517,7 +5517,7 @@ host_makefile_frag=${frag}
# It's OK to check for header files. Although the compiler may not be
# able to link anything, it had better be able to at least compile
# something.
for ac_header in sys/file.h sys/param.h limits.h stdlib.h malloc.h string.h unistd.h strings.h sys/time.h time.h sys/resource.h sys/stat.h sys/mman.h fcntl.h alloca.h sys/pstat.h sys/sysmp.h sys/sysinfo.h machine/hal_sysinfo.h sys/table.h sys/sysctl.h sys/systemcfg.h stdint.h stdio_ext.h process.h sys/prctl.h
for ac_header in sys/file.h sys/param.h limits.h stdlib.h malloc.h string.h unistd.h strings.h sys/time.h time.h sys/resource.h sys/stat.h sys/mman.h fcntl.h alloca.h sys/pstat.h sys/sysmp.h sys/sysinfo.h machine/hal_sysinfo.h sys/table.h sys/sysctl.h sys/systemcfg.h stdint.h stdio_ext.h process.h sys/prctl.h spawn.h
do :
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_preproc "$LINENO" "$ac_header" "$as_ac_Header"
@@ -6026,7 +6026,8 @@ funcs="$funcs setproctitle"
vars="sys_errlist sys_nerr sys_siglist"
checkfuncs="__fsetlocking canonicalize_file_name dup3 getrlimit getrusage \
getsysinfo gettimeofday on_exit pipe2 psignal pstat_getdynamic pstat_getstatic \
getsysinfo gettimeofday on_exit pipe2 posix_spawn posix_spawnp psignal \
pstat_getdynamic pstat_getstatic \
realpath setrlimit spawnve spawnvpe strerror strsignal sysconf sysctl \
sysmp table times wait3 wait4"
@@ -6049,7 +6050,8 @@ if test "x" = "y"; then
index insque \
memchr memcmp memcpy memmem memmove memset mkstemps \
on_exit \
pipe2 psignal pstat_getdynamic pstat_getstatic putenv \
pipe2 posix_spawn posix_spawnp psignal \
pstat_getdynamic pstat_getstatic putenv \
random realpath rename rindex \
sbrk setenv setproctitle setrlimit sigsetmask snprintf spawnve spawnvpe \
stpcpy stpncpy strcasecmp strchr strdup \

View File

@@ -277,7 +277,7 @@ AC_SUBST_FILE(host_makefile_frag)
# It's OK to check for header files. Although the compiler may not be
# able to link anything, it had better be able to at least compile
# something.
AC_CHECK_HEADERS(sys/file.h sys/param.h limits.h stdlib.h malloc.h string.h unistd.h strings.h sys/time.h time.h sys/resource.h sys/stat.h sys/mman.h fcntl.h alloca.h sys/pstat.h sys/sysmp.h sys/sysinfo.h machine/hal_sysinfo.h sys/table.h sys/sysctl.h sys/systemcfg.h stdint.h stdio_ext.h process.h sys/prctl.h)
AC_CHECK_HEADERS(sys/file.h sys/param.h limits.h stdlib.h malloc.h string.h unistd.h strings.h sys/time.h time.h sys/resource.h sys/stat.h sys/mman.h fcntl.h alloca.h sys/pstat.h sys/sysmp.h sys/sysinfo.h machine/hal_sysinfo.h sys/table.h sys/sysctl.h sys/systemcfg.h stdint.h stdio_ext.h process.h sys/prctl.h spawn.h)
AC_HEADER_SYS_WAIT
AC_HEADER_TIME
@@ -400,7 +400,8 @@ funcs="$funcs setproctitle"
vars="sys_errlist sys_nerr sys_siglist"
checkfuncs="__fsetlocking canonicalize_file_name dup3 getrlimit getrusage \
getsysinfo gettimeofday on_exit pipe2 psignal pstat_getdynamic pstat_getstatic \
getsysinfo gettimeofday on_exit pipe2 posix_spawn posix_spawnp psignal \
pstat_getdynamic pstat_getstatic \
realpath setrlimit spawnve spawnvpe strerror strsignal sysconf sysctl \
sysmp table times wait3 wait4"
@@ -423,7 +424,8 @@ if test "x" = "y"; then
index insque \
memchr memcmp memcpy memmem memmove memset mkstemps \
on_exit \
pipe2 psignal pstat_getdynamic pstat_getstatic putenv \
pipe2 posix_spawn posix_spawnp psignal \
pstat_getdynamic pstat_getstatic putenv \
random realpath rename rindex \
sbrk setenv setproctitle setrlimit sigsetmask snprintf spawnve spawnvpe \
stpcpy stpncpy strcasecmp strchr strdup \

View File

@@ -58,6 +58,9 @@ extern int errno;
#ifdef HAVE_PROCESS_H
#include <process.h>
#endif
#ifdef HAVE_SPAWN_H
#include <spawn.h>
#endif
#ifdef vfork /* Autoconf may define this to fork for us. */
# define VFORK_STRING "fork"
@@ -559,6 +562,171 @@ pex_unix_exec_child (struct pex_obj *obj ATTRIBUTE_UNUSED,
return (pid_t) -1;
}
#elif defined(HAVE_POSIX_SPAWN) && defined(HAVE_POSIX_SPAWNP)
/* Implementation of pex->exec_child using posix_spawn. */
static pid_t
pex_unix_exec_child (struct pex_obj *obj ATTRIBUTE_UNUSED,
int flags, const char *executable,
char * const * argv, char * const * env,
int in, int out, int errdes,
int toclose, const char **errmsg, int *err)
{
int ret;
pid_t pid = -1;
posix_spawnattr_t attr;
posix_spawn_file_actions_t actions;
int attr_initialized = 0, actions_initialized = 0;
*err = 0;
ret = posix_spawnattr_init (&attr);
if (ret)
{
*err = ret;
*errmsg = "posix_spawnattr_init";
goto exit;
}
attr_initialized = 1;
/* Use vfork() on glibc <=2.24. */
#ifdef POSIX_SPAWN_USEVFORK
ret = posix_spawnattr_setflags (&attr, POSIX_SPAWN_USEVFORK);
if (ret)
{
*err = ret;
*errmsg = "posix_spawnattr_setflags";
goto exit;
}
#endif
ret = posix_spawn_file_actions_init (&actions);
if (ret)
{
*err = ret;
*errmsg = "posix_spawn_file_actions_init";
goto exit;
}
actions_initialized = 1;
if (in != STDIN_FILE_NO)
{
ret = posix_spawn_file_actions_adddup2 (&actions, in, STDIN_FILE_NO);
if (ret)
{
*err = ret;
*errmsg = "posix_spawn_file_actions_adddup2";
goto exit;
}
ret = posix_spawn_file_actions_addclose (&actions, in);
if (ret)
{
*err = ret;
*errmsg = "posix_spawn_file_actions_addclose";
goto exit;
}
}
if (out != STDOUT_FILE_NO)
{
ret = posix_spawn_file_actions_adddup2 (&actions, out, STDOUT_FILE_NO);
if (ret)
{
*err = ret;
*errmsg = "posix_spawn_file_actions_adddup2";
goto exit;
}
ret = posix_spawn_file_actions_addclose (&actions, out);
if (ret)
{
*err = ret;
*errmsg = "posix_spawn_file_actions_addclose";
goto exit;
}
}
if (errdes != STDERR_FILE_NO)
{
ret = posix_spawn_file_actions_adddup2 (&actions, errdes, STDERR_FILE_NO);
if (ret)
{
*err = ret;
*errmsg = "posix_spawn_file_actions_adddup2";
goto exit;
}
ret = posix_spawn_file_actions_addclose (&actions, errdes);
if (ret)
{
*err = ret;
*errmsg = "posix_spawn_file_actions_addclose";
goto exit;
}
}
if (toclose >= 0)
{
ret = posix_spawn_file_actions_addclose (&actions, toclose);
if (ret)
{
*err = ret;
*errmsg = "posix_spawn_file_actions_addclose";
goto exit;
}
}
if ((flags & PEX_STDERR_TO_STDOUT) != 0)
{
ret = posix_spawn_file_actions_adddup2 (&actions, STDOUT_FILE_NO, STDERR_FILE_NO);
if (ret)
{
*err = ret;
*errmsg = "posix_spawn_file_actions_adddup2";
goto exit;
}
}
if ((flags & PEX_SEARCH) != 0)
{
ret = posix_spawnp (&pid, executable, &actions, &attr, argv, env ? env : environ);
if (ret)
{
*err = ret;
*errmsg = "posix_spawnp";
goto exit;
}
}
else
{
ret = posix_spawn (&pid, executable, &actions, &attr, argv, env ? env : environ);
if (ret)
{
*err = ret;
*errmsg = "posix_spawn";
goto exit;
}
}
exit:
if (actions_initialized)
posix_spawn_file_actions_destroy (&actions);
if (attr_initialized)
posix_spawnattr_destroy (&attr);
if (!*err && in != STDIN_FILE_NO)
if (close (in))
*errmsg = "close", *err = errno, pid = -1;
if (!*err && out != STDOUT_FILE_NO)
if (close (out))
*errmsg = "close", *err = errno, pid = -1;
if (!*err && errdes != STDERR_FILE_NO)
if (close (errdes))
*errmsg = "close", *err = errno, pid = -1;
return pid;
}
#else
/* Implementation of pex->exec_child using standard vfork + exec. */

View File

@@ -1,7 +1,7 @@
# Makefile for jam
CC = cc
CFLAGS = -O
CFLAGS = -O -DOPT_HEADER_CACHE_EXT -DOPT_JAMFILE_CACHE_EXT -DOPT_JAM_TARGETS_VARIABLE_EXT
EXENAME = ./jam0
TARGET = -o $(EXENAME)
HOST_SYSTEM=$(shell uname)
@@ -64,7 +64,8 @@ SOURCES = \
filent.c fileos2.c fileunix.c filevms.c glob.c hash.c \
headers.c jam.c jambase.c jamgram.c lists.c make.c make1.c \
newstr.c option.c parse.c pathunix.c pathvms.c regexp.c \
rules.c scan.c search.c timestamp.c variable.c
rules.c scan.c search.c timestamp.c variable.c \
jcache.c hcache.c
all: $(EXENAME)
LINKLIBS=$(LINKLIBS) $(EXENAME)

View File

@@ -154,12 +154,12 @@ execcmd(
/* Trim leading, ending white space */
while( isspace( *string ) )
while( isspace( (unsigned char)*string ) )
++string;
p = strchr( string, '\n' );
while( p && isspace( *p ) )
while( p && isspace( (unsigned char)*p ) )
++p;
/* If multi line, or too long, or JAMSHELL is set, write to bat file. */

View File

@@ -538,11 +538,11 @@ var_edit_shift(
if( edits->upshift )
{
for( ; *out; ++out )
*out = toupper( *out );
*out = toupper( (unsigned char)*out );
}
else if( edits->downshift )
{
for( ; *out; ++out )
*out = tolower( *out );
*out = tolower( (unsigned char)*out );
}
}

View File

@@ -429,7 +429,8 @@
# endif
# endif
# ifdef __sparc__
# if defined( __sparc__ ) || \
defined( __sparc64__)
# if !defined( OS_SUNOS )
# define OSPLAT "OSPLAT=SPARC"
# endif
@@ -441,7 +442,8 @@
# endif
# endif
# ifdef __arm__
# if defined( __arm__ ) || \
defined(__aarch64__)
# define OSPLAT "OSPLAT=ARM"
# endif
@@ -455,6 +457,10 @@
# define OSPLAT "OSPLAT=390"
# endif
# ifdef __riscv
# define OSPLAT "OSPLAT=RISCV"
# endif
# ifndef OSPLAT
# define OSPLAT ""
# endif

View File

@@ -35,7 +35,7 @@ getoptions(
{
char *arg;
if( argv[i][0] != '-' || !isalpha( argv[i][1] ) )
if( argv[i][0] != '-' || !isalpha( (unsigned char)argv[i][1] ) )
break;
if( !optc-- )

View File

@@ -917,16 +917,16 @@ regmatch( char *prog )
break;
case WORDA:
/* Must be looking at a letter, digit, or _ */
if ((!isalnum(*reginput)) && *reginput != '_')
if ((!isalnum((unsigned char)*reginput)) && *reginput != '_')
return(0);
/* Prev must be BOL or nonword */
if (reginput > regbol &&
(isalnum(reginput[-1]) || reginput[-1] == '_'))
(isalnum((unsigned char)reginput[-1]) || reginput[-1] == '_'))
return(0);
break;
case WORDZ:
/* Must be looking at non letter, digit, or _ */
if (isalnum(*reginput) || *reginput == '_')
if (isalnum((unsigned char)*reginput) || *reginput == '_')
return(0);
/* We don't care what the previous char was */
break;

View File

@@ -287,7 +287,7 @@ yylex()
{
/* Skip past white space */
while( c != EOF && isspace( c ) )
while( c != EOF && isspace( (unsigned char)c ) )
c = yychar();
/* Not a comment? Swallow up comment line. */
@@ -315,7 +315,7 @@ yylex()
while(
c != EOF &&
b < buf + sizeof( buf ) &&
( inquote || !isspace( c ) ) )
( inquote || !isspace( (unsigned char)c ) ) )
{
if( c == '"' )
{
@@ -369,7 +369,8 @@ yylex()
*b = 0;
yylval.type = ARG;
if( !notkeyword && !( isalpha( *buf ) && scanmode == SCAN_PUNCT ) )
if( !notkeyword &&
!( isalpha( (unsigned char)*buf ) && scanmode == SCAN_PUNCT ) )
{
for( k = keywords; k->word; k++ )
if( *buf == *k->word && !strcmp( k->word, buf ) )

View File

@@ -72,7 +72,7 @@ timestamp(
char path[ MAXJPATH ];
char *p = path;
do *p++ = tolower( *target );
do *p++ = tolower( (unsigned char)*target );
while( *target++ );
target = path;
@@ -175,7 +175,7 @@ time_enter(
char path[ MAXJPATH ];
char *p = path;
do *p++ = tolower( *target );
do *p++ = tolower( (unsigned char)*target );
while( *target++ );
target = path;

View File

@@ -152,7 +152,7 @@ var_string(
/* Copy white space */
while( isspace( *in ) )
while( isspace( (unsigned char)*in ) )
{
if( out >= oute )
return -1;
@@ -164,7 +164,7 @@ var_string(
/* Copy non-white space, watching for variables */
while( *in && !isspace( *in ) )
while( *in && !isspace( (unsigned char)*in ) )
{
if( out >= oute )
return -1;