BSD portability fixes from Taylor Campbell

This commit is contained in:
Alex Shinn 2018-11-27 23:01:23 +08:00
parent b5331233cb
commit 5bbef040c5
6 changed files with 48 additions and 30 deletions

View file

@ -20,8 +20,6 @@ CHIBI_DEPENDENCIES = ./chibi-scheme$(EXE)
SNOW_CHIBI ?= tools/snow-chibi SNOW_CHIBI ?= tools/snow-chibi
TEMPFILE := $(shell mktemp -t chibi.XXXXXX)
######################################################################## ########################################################################
# Choose compiled library on MSYS # Choose compiled library on MSYS
@ -125,9 +123,10 @@ chibi-scheme-static.bc:
chibi-scheme-emscripten: VERSION chibi-scheme-emscripten: VERSION
$(MAKE) dist-clean $(MAKE) dist-clean
$(MAKE) chibi-scheme-static PLATFORM=emscripten SEXP_USE_DL=0 $(MAKE) chibi-scheme-static PLATFORM=emscripten SEXP_USE_DL=0
mv chibi-scheme-static$(EXE) $(TEMPFILE) (tempfile="`mktemp -t chibi.XXXXXX`" && \
$(MAKE) dist-clean mv chibi-scheme-static$(EXE) "$$tempfile" && \
mv $(TEMPFILE) chibi-scheme-emscripten $(MAKE) dist-clean; \
mv "$$tempfile" chibi-scheme-emscripten)
include/chibi/install.h: Makefile include/chibi/install.h: Makefile
echo '#define sexp_so_extension "'$(SO)'"' > $@ echo '#define sexp_so_extension "'$(SO)'"' > $@
@ -168,7 +167,7 @@ libchibi-scheme.a: $(SEXP_OBJS) $(EVAL_OBJS)
$(AR) rcs $@ $^ $(AR) rcs $@ $^
chibi-scheme$(EXE): main.o libchibi-scheme$(SO) chibi-scheme$(EXE): main.o libchibi-scheme$(SO)
$(CC) $(XCPPFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ $< -L. -lchibi-scheme $(CC) $(XCPPFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ $< -L. $(RLDFLAGS) -lchibi-scheme
chibi-scheme-static$(EXE): main.o $(SEXP_OBJS) $(EVAL_OBJS) chibi-scheme-static$(EXE): main.o $(SEXP_OBJS) $(EVAL_OBJS)
$(CC) $(XCFLAGS) $(STATICFLAGS) -o $@ $^ $(LDFLAGS) $(GCLDFLAGS) -lm $(CC) $(XCFLAGS) $(STATICFLAGS) -o $@ $^ $(LDFLAGS) $(GCLDFLAGS) -lm
@ -192,7 +191,14 @@ chibi-scheme.pc: chibi-scheme.pc.in
# A special case, this needs to be linked with the LDFLAGS in case # A special case, this needs to be linked with the LDFLAGS in case
# we're using Boehm. # we're using Boehm.
lib/chibi/ast$(SO): lib/chibi/ast.c $(INCLUDES) libchibi-scheme$(SO) lib/chibi/ast$(SO): lib/chibi/ast.c $(INCLUDES) libchibi-scheme$(SO)
-$(CC) $(CLIBFLAGS) $(CLINKFLAGS) $(XCPPFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ $< $(GCLDFLAGS) -L. -lchibi-scheme -$(CC) $(CLIBFLAGS) $(CLINKFLAGS) $(XCPPFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ $< $(GCLDFLAGS) -L. $(RLDFLAGS) -lchibi-scheme
lib/chibi/crypto/crypto.c: lib/chibi/crypto/sha2.c
lib/chibi/filesystem.c: lib/chibi/filesystem_win32_shim.c
lib/chibi/io/io.c: lib/chibi/io/port.c
lib/chibi/net.c: lib/chibi/accept.c
lib/chibi/process.c: lib/chibi/signal.c
lib/srfi/144/math.c: lib/srfi/144/lgamma_r.c
lib/chibi.img: $(CHIBI_DEPENDENCIES) all-libs lib/chibi.img: $(CHIBI_DEPENDENCIES) all-libs
$(CHIBI) -d $@ $(CHIBI) -d $@
@ -208,7 +214,7 @@ doc: doc/chibi.html doc-libs
%.html: %.scrbl $(CHIBI_DOC_DEPENDENCIES) %.html: %.scrbl $(CHIBI_DOC_DEPENDENCIES)
$(CHIBI_DOC) --html $< > $@ $(CHIBI_DOC) --html $< > $@
lib/.%.meta: lib/%/ tools/generate-install-meta.scm lib/.%.meta: lib/%/ tools/generate-install-meta.scm $(CHIBI_DEPENDENCIES)
-$(FIND) $< -name \*.sld | \ -$(FIND) $< -name \*.sld | \
$(CHIBI) tools/generate-install-meta.scm $(VERSION) > $@ $(CHIBI) tools/generate-install-meta.scm $(VERSION) > $@
@ -301,6 +307,8 @@ clean: clean-libs
cleaner: clean cleaner: clean
-$(RM) chibi-scheme$(EXE) chibi-scheme-static$(EXE) chibi-scheme-ulimit$(EXE) \ -$(RM) chibi-scheme$(EXE) chibi-scheme-static$(EXE) chibi-scheme-ulimit$(EXE) \
$(IMAGE_FILES) libchibi-scheme*$(SO) *.a *.pc \ $(IMAGE_FILES) libchibi-scheme*$(SO) *.a *.pc \
libchibi-scheme$(SO_VERSIONED_SUFFIX) \
libchibi-scheme$(SO_MAJOR_VERSIONED_SUFFIX) \
include/chibi/install.h lib/.*.meta \ include/chibi/install.h lib/.*.meta \
chibi-scheme-emscripten \ chibi-scheme-emscripten \
js/chibi.* \ js/chibi.* \
@ -400,9 +408,9 @@ install-base: all
install: install-base install: install-base
ifneq "$(IMAGE_FILES)" "" ifneq "$(IMAGE_FILES)" ""
echo "Generating images" echo "Generating images"
-cd / && LD_LIBRARY_PATH="$(DESTDIR)$(SOLIBDIR):$(LD_LIBRARY_PATH)" DYLD_LIBRARY_PATH="$(DESTDIR)$(SOLIBDIR):$(DYLD_LIBRARY_PATH)" $(DESTDIR)$(BINDIR)/chibi-scheme$(EXE) -d $(DESTDIR)$(MODDIR)/chibi.img cd / && LD_LIBRARY_PATH="$(DESTDIR)$(SOLIBDIR):$(LD_LIBRARY_PATH)" DYLD_LIBRARY_PATH="$(DESTDIR)$(SOLIBDIR):$(DYLD_LIBRARY_PATH)" CHIBI_MODULE_PATH="$(DESTDIR)$(MODDIR):$(DESTDIR)$(BINMODDIR)" $(DESTDIR)$(BINDIR)/chibi-scheme$(EXE) -d $(DESTDIR)$(MODDIR)/chibi.img
-cd / && LD_LIBRARY_PATH="$(DESTDIR)$(SOLIBDIR):$(LD_LIBRARY_PATH)" DYLD_LIBRARY_PATH="$(DESTDIR)$(SOLIBDIR):$(DYLD_LIBRARY_PATH)" $(DESTDIR)$(BINDIR)/chibi-scheme$(EXE) -xscheme.red -d $(DESTDIR)$(MODDIR)/red.img cd / && LD_LIBRARY_PATH="$(DESTDIR)$(SOLIBDIR):$(LD_LIBRARY_PATH)" DYLD_LIBRARY_PATH="$(DESTDIR)$(SOLIBDIR):$(DYLD_LIBRARY_PATH)" CHIBI_MODULE_PATH="$(DESTDIR)$(MODDIR):$(DESTDIR)$(BINMODDIR)" $(DESTDIR)$(BINDIR)/chibi-scheme$(EXE) -xscheme.red -d $(DESTDIR)$(MODDIR)/red.img
-cd / && LD_LIBRARY_PATH="$(DESTDIR)$(SOLIBDIR):$(LD_LIBRARY_PATH)" DYLD_LIBRARY_PATH="$(DESTDIR)$(SOLIBDIR):$(DYLD_LIBRARY_PATH)" $(DESTDIR)$(BINDIR)/chibi-scheme$(EXE) -mchibi.snow.commands -mchibi.snow.interface -mchibi.snow.package -mchibi.snow.utils -d $(DESTDIR)$(MODDIR)/snow.img cd / && LD_LIBRARY_PATH="$(DESTDIR)$(SOLIBDIR):$(LD_LIBRARY_PATH)" DYLD_LIBRARY_PATH="$(DESTDIR)$(SOLIBDIR):$(DYLD_LIBRARY_PATH)" CHIBI_MODULE_PATH="$(DESTDIR)$(MODDIR):$(DESTDIR)$(BINMODDIR)" $(DESTDIR)$(BINDIR)/chibi-scheme$(EXE) -mchibi.snow.commands -mchibi.snow.interface -mchibi.snow.package -mchibi.snow.utils -d $(DESTDIR)$(MODDIR)/snow.img
endif endif
uninstall: uninstall:

View file

@ -70,6 +70,7 @@ EXE =
CLIBFLAGS = -fPIC CLIBFLAGS = -fPIC
CLINKFLAGS = -shared CLINKFLAGS = -shared
LIBDL = LIBDL =
RLDFLAGS=-Wl,-R$(LIBDIR)
else else
ifeq ($(PLATFORM),windows) ifeq ($(PLATFORM),windows)
SO = .dll SO = .dll
@ -106,10 +107,6 @@ CLIBFLAGS = -fPIC
CLINKFLAGS = -shared CLINKFLAGS = -shared
STATICFLAGS = -static -DSEXP_USE_DL=0 STATICFLAGS = -static -DSEXP_USE_DL=0
LIBCHIBI_FLAGS = -Wl,-soname,libchibi-scheme$(SO).$(SOVERSION_MAJOR) LIBCHIBI_FLAGS = -Wl,-soname,libchibi-scheme$(SO).$(SOVERSION_MAJOR)
ifeq ($(PLATFORM),BSD)
LIBDL=
RLDFLAGS=-Wl,-R$(DESTDIR)$(LIBDIR)
endif
endif endif
endif endif
endif endif
@ -118,7 +115,7 @@ endif
ifeq ($(PLATFORM),unix) ifeq ($(PLATFORM),unix)
#RLDFLAGS=-rpath $(LIBDIR) #RLDFLAGS=-rpath $(LIBDIR)
RLDFLAGS=-Wl,-R$(DESTDIR)$(LIBDIR) RLDFLAGS=-Wl,-R$(LIBDIR)
endif endif
######################################################################## ########################################################################

View file

@ -52,7 +52,7 @@ lib/%.c: lib/%.stub $(CHIBI_FFI_DEPENDENCIES)
$(CHIBI_FFI) $< $(CHIBI_FFI) $<
lib/%$(SO): lib/%.c $(INCLUDES) libchibi-scheme$(SO) lib/%$(SO): lib/%.c $(INCLUDES) libchibi-scheme$(SO)
$(CC) $(CLIBFLAGS) $(CLINKFLAGS) $(XCPPFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ $< -L. $(XLIBS) -lchibi-scheme $(CC) $(CLIBFLAGS) $(CLINKFLAGS) $(XCPPFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ $< -L. $(RLDFLAGS) $(XLIBS) -lchibi-scheme
doc-libs: $(HTML_LIBS) doc-libs: $(HTML_LIBS)

View file

@ -67,16 +67,28 @@ static sexp sexp_set_signal_action (sexp ctx, sexp self, sexp signum, sexp newac
#include <sys/proc.h> #include <sys/proc.h>
#endif #endif
#include <sys/sysctl.h> #include <sys/sysctl.h>
#ifndef __NetBSD__
#include <sys/user.h> #include <sys/user.h>
#endif
static sexp sexp_pid_cmdline (sexp ctx, int pid) { static sexp sexp_pid_cmdline (sexp ctx, int pid) {
size_t reslen = sizeof(struct kinfo_proc); #ifdef __NetBSD__
/*
* Newer version with defined interface that doesn't expose kernel
* guts and works with 64-bit kernel, 32-bit userland.
*/
struct kinfo_proc2 res;
int id = KERN_PROC2;
#else
struct kinfo_proc res; struct kinfo_proc res;
int name[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid}; int id = KERN_PROC;
#endif
size_t reslen = sizeof(res);
int name[4] = {CTL_KERN, id, KERN_PROC_PID, pid};
if (sysctl(name, 4, &res, &reslen, NULL, 0) >= 0) { if (sysctl(name, 4, &res, &reslen, NULL, 0) >= 0) {
#if defined(__APPLE__) || defined(__NetBSD__) #if defined(__APPLE__)
return sexp_c_string(ctx, res.kp_proc.p_comm, -1); return sexp_c_string(ctx, res.kp_proc.p_comm, -1);
#elif __OpenBSD__ #elif defined(__NetBSD__) || defined(__OpenBSD__)
return sexp_c_string(ctx, res.p_comm, -1); return sexp_c_string(ctx, res.p_comm, -1);
#elif __DragonFly__ #elif __DragonFly__
return sexp_c_string(ctx, res.kp_comm, -1); return sexp_c_string(ctx, res.kp_comm, -1);

View file

@ -34,7 +34,7 @@ sexp sexp_string_hash (sexp ctx, sexp self, sexp_sint_t n, sexp str, sexp bound)
static sexp_uint_t string_ci_hash (char *str, sexp_uint_t bound) { static sexp_uint_t string_ci_hash (char *str, sexp_uint_t bound) {
sexp_uint_t acc = FNV_OFFSET_BASIS; sexp_uint_t acc = FNV_OFFSET_BASIS;
while (*str) {acc *= FNV_PRIME; acc ^= sexp_tolower(*str++);} while (*str) {acc *= FNV_PRIME; acc ^= sexp_tolower((unsigned char)*str++);}
return acc % bound; return acc % bound;
} }

17
sexp.c
View file

@ -1272,7 +1272,7 @@ sexp sexp_intern(sexp ctx, const char *str, sexp_sint_t len) {
#if SEXP_USE_HUFF_SYMS #if SEXP_USE_HUFF_SYMS
res = 0; res = 0;
space = SEXP_IMMEDIATE_BITS; space = SEXP_IMMEDIATE_BITS;
if (len == 0 || sexp_isdigit(p[0]) if (len == 0 || sexp_isdigit((unsigned char)p[0])
|| ((p[0] == '+' || p[0] == '-') && len > 1)) || ((p[0] == '+' || p[0] == '-') && len > 1))
goto normal_intern; goto normal_intern;
for ( ; i<len; i++, p++) { for ( ; i<len; i++, p++) {
@ -2012,14 +2012,15 @@ sexp sexp_write_one (sexp ctx, sexp obj, sexp out) {
str = sexp_lsymbol_data(obj); str = sexp_lsymbol_data(obj);
c = (sexp_lsymbol_length(obj) == 0 || c = (sexp_lsymbol_length(obj) == 0 ||
(sexp_lsymbol_length(obj) == 1 && str[0] == '.') || (sexp_lsymbol_length(obj) == 1 && str[0] == '.') ||
sexp_isdigit(str[0]) || sexp_isdigit((unsigned char)str[0]) ||
(sexp_lsymbol_length(obj) > 1 && (sexp_lsymbol_length(obj) > 1 &&
((str[0] == '+' || str[0] == '-') ((str[0] == '+' || str[0] == '-')
&& (sexp_isdigit(str[1]) || str[1] == '.' || str[1] == 'i' || && (sexp_isdigit((unsigned char)str[1]) ||
str[1] == '.' || str[1] == 'i' ||
((sexp_lsymbol_length(obj) > 3) && ((sexp_lsymbol_length(obj) > 3) &&
sexp_tolower(str[1]) == 'n' && sexp_tolower((unsigned char)str[1]) == 'n' &&
sexp_tolower(str[2]) == 'a' && sexp_tolower((unsigned char)str[2]) == 'a' &&
sexp_tolower(str[3]) == 'n'))))) sexp_tolower((unsigned char)str[3]) == 'n')))))
? '|' : EOF; ? '|' : EOF;
for (i=sexp_lsymbol_length(obj)-1; i>=0; i--) for (i=sexp_lsymbol_length(obj)-1; i>=0; i--)
if (str[i] <= ' ' || str[i] == '\\' || str[i] == '#' || sexp_is_separator(str[i])) if (str[i] <= ' ' || str[i] == '\\' || str[i] == '#' || sexp_is_separator(str[i]))
@ -3363,8 +3364,8 @@ sexp sexp_string_to_number_op (sexp ctx, sexp self, sexp_sint_t n, sexp str, sex
sexp_read_char(ctx, in); sexp_read_char(ctx, in);
} }
in = ((sexp_string_data(str)[0] == '#' && in = ((sexp_string_data(str)[0] == '#' &&
sexp_tolower(sexp_string_data(str)[1]) != 'e' && sexp_tolower((unsigned char)sexp_string_data(str)[1]) != 'e' &&
sexp_tolower(sexp_string_data(str)[1]) != 'i') sexp_tolower((unsigned char)sexp_string_data(str)[1]) != 'i')
|| base == 10 ? sexp_read(ctx, in) : || base == 10 ? sexp_read(ctx, in) :
sexp_read_number(ctx, in, base, 0)); sexp_read_number(ctx, in, base, 0));
sexp_gc_release1(ctx); sexp_gc_release1(ctx);