From df2d5cb3d3e2d847329b464ef779bcbfa507eba9 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Thu, 2 Nov 2023 08:51:42 -0500 Subject: [PATCH] Add ipv6, shared, and cryptorand options to meosn. Allows for builting with cosmopolitan, both with meson and Makefile. Use: CC=comsocc meson setup -Dipv6=false -Ddynamic_modules=false -Dshared=false -Dos_name=cosmopolitan to configure for cosmopolitan build. --- Makefile | 14 ++++++++--- meson.build | 60 ++++++++++++++++++++++++++------------------ meson_options.txt | 3 +++ src/conf/janetconf.h | 2 ++ src/core/ffi.c | 8 +++--- src/core/net.c | 6 +++++ src/core/util.c | 12 +++++---- 7 files changed, 69 insertions(+), 36 deletions(-) diff --git a/Makefile b/Makefile index abee818d..1265a35c 100644 --- a/Makefile +++ b/Makefile @@ -42,6 +42,7 @@ JANET_DIST_DIR?=janet-dist JANET_BOOT_FLAGS:=. JANET_PATH '$(JANET_PATH)' JANET_TARGET_OBJECTS=build/janet.o build/shell.o JPM_TAG?=master +HAS_SHARED?=1 DEBUGGER=gdb SONAME_SETTER=-Wl,-soname, @@ -98,7 +99,10 @@ ifeq ($(findstring MINGW,$(UNAME)), MINGW) endif $(shell mkdir -p build/core build/c build/boot build/mainclient) -all: $(JANET_TARGET) $(JANET_LIBRARY) $(JANET_STATIC_LIBRARY) build/janet.h +all: $(JANET_TARGET) $(JANET_STATIC_LIBRARY) build/janet.h +ifeq ($(HAS_SHARED), 1) +all: $(JANET_LIBRARY) +endif ###################### ##### Name Files ##### @@ -263,7 +267,7 @@ dist: build/janet-dist.tar.gz build/janet-%.tar.gz: $(JANET_TARGET) \ build/janet.h \ - janet.1 LICENSE CONTRIBUTING.md $(JANET_LIBRARY) $(JANET_STATIC_LIBRARY) \ + janet.1 LICENSE CONTRIBUTING.md $(JANET_STATIC_LIBRARY) \ README.md build/c/janet.c build/c/shell.c mkdir -p build/$(JANET_DIST_DIR)/bin cp $(JANET_TARGET) build/$(JANET_DIST_DIR)/bin/ @@ -271,13 +275,17 @@ build/janet-%.tar.gz: $(JANET_TARGET) \ mkdir -p build/$(JANET_DIST_DIR)/include cp build/janet.h build/$(JANET_DIST_DIR)/include/ mkdir -p build/$(JANET_DIST_DIR)/lib/ - cp $(JANET_LIBRARY) $(JANET_STATIC_LIBRARY) build/$(JANET_DIST_DIR)/lib/ + cp $(JANET_STATIC_LIBRARY) build/$(JANET_DIST_DIR)/lib/ + cp $(JANET_LIBRARY) build/$(JANET_DIST_DIR)/lib/ || true mkdir -p build/$(JANET_DIST_DIR)/man/man1/ cp janet.1 build/$(JANET_DIST_DIR)/man/man1/janet.1 mkdir -p build/$(JANET_DIST_DIR)/src/ cp build/c/janet.c build/c/shell.c build/$(JANET_DIST_DIR)/src/ cp CONTRIBUTING.md LICENSE README.md build/$(JANET_DIST_DIR)/ cd build && tar -czvf ../$@ ./$(JANET_DIST_DIR) +ifeq ($(HAS_SHARED), 1) +build/janet-%.tar.gz: $(JANET_LIBRARY) +endif ######################### ##### Documentation ##### diff --git a/meson.build b/meson.build index aa31eba7..9d3617b4 100644 --- a/meson.build +++ b/meson.build @@ -61,6 +61,7 @@ conf.set('JANET_NO_SOURCEMAPS', not get_option('sourcemaps')) conf.set('JANET_NO_ASSEMBLER', not get_option('assembler')) conf.set('JANET_NO_PEG', not get_option('peg')) conf.set('JANET_NO_NET', not get_option('net')) +conf.set('JANET_NO_IPV6', not get_option('ipv6')) conf.set('JANET_NO_EV', not get_option('ev') or get_option('single_threaded')) conf.set('JANET_REDUCED_OS', get_option('reduced_os')) conf.set('JANET_NO_INT_TYPES', not get_option('int_types')) @@ -78,6 +79,7 @@ conf.set('JANET_EV_NO_KQUEUE', not get_option('kqueue')) conf.set('JANET_NO_INTERPRETER_INTERRUPT', not get_option('interpreter_interrupt')) conf.set('JANET_NO_FFI', not get_option('ffi')) conf.set('JANET_NO_FFI_JIT', not get_option('ffi_jit')) +conf.set('JANET_NO_CRYPTORAND', not get_option('cryptorand')) if get_option('os_name') != '' conf.set('JANET_OS_NAME', get_option('os_name')) endif @@ -182,32 +184,41 @@ if not get_option('single_threaded') janet_dependencies += thread_dep endif +# Allow building with no shared library if cc.has_argument('-fvisibility=hidden') lib_cflags = ['-fvisibility=hidden'] else lib_cflags = [] endif -libjanet = library('janet', janetc, - include_directories : incdir, - dependencies : janet_dependencies, - version: meson.project_version(), - soversion: version_parts[0] + '.' + version_parts[1], - c_args : lib_cflags, - install : true) - +if get_option('shared') + libjanet = library('janet', janetc, + include_directories : incdir, + dependencies : janet_dependencies, + version: meson.project_version(), + soversion: version_parts[0] + '.' + version_parts[1], + c_args : lib_cflags, + install : true) # Extra c flags - adding -fvisibility=hidden matches the Makefile and # shaves off about 10k on linux x64, likely similar on other platforms. -if cc.has_argument('-fvisibility=hidden') - extra_cflags = ['-fvisibility=hidden', '-DJANET_DLL_IMPORT'] + if cc.has_argument('-fvisibility=hidden') + extra_cflags = ['-fvisibility=hidden', '-DJANET_DLL_IMPORT'] + else + extra_cflags = ['-DJANET_DLL_IMPORT'] + endif + janet_mainclient = executable('janet', mainclient_src, + include_directories : incdir, + dependencies : janet_dependencies, + link_with: [libjanet], + c_args : extra_cflags, + install : true) else - extra_cflags = ['-DJANET_DLL_IMPORT'] + # No shared library + janet_mainclient = executable('janet', mainclient_src, janetc, + include_directories : incdir, + dependencies : janet_dependencies, + c_args : lib_cflags, + install : true) endif -janet_mainclient = executable('janet', mainclient_src, - include_directories : incdir, - dependencies : janet_dependencies, - link_with: [libjanet], - c_args : extra_cflags, - install : true) if meson.is_cross_build() native_cc = meson.get_compiler('c', native: true) @@ -271,14 +282,15 @@ endforeach run_target('repl', command : [janet_nativeclient]) # For use as meson subproject (wrap) -janet_dep = declare_dependency(include_directories : incdir, - link_with : libjanet) - +if get_option('shared') + janet_dep = declare_dependency(include_directories : incdir, + link_with : libjanet) # pkgconfig -pkg = import('pkgconfig') -pkg.generate(libjanet, - subdirs: 'janet', - description: 'Library for the Janet programming language.') + pkg = import('pkgconfig') + pkg.generate(libjanet, + subdirs: 'janet', + description: 'Library for the Janet programming language.') +endif # Installation install_man('janet.1') diff --git a/meson_options.txt b/meson_options.txt index 91293fa2..a78d8264 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -11,6 +11,7 @@ option('peg', type : 'boolean', value : true) option('int_types', type : 'boolean', value : true) option('prf', type : 'boolean', value : false) option('net', type : 'boolean', value : true) +option('ipv6', type : 'boolean', value : true) option('ev', type : 'boolean', value : true) option('processes', type : 'boolean', value : true) option('umask', type : 'boolean', value : true) @@ -29,3 +30,5 @@ option('stack_max', type : 'integer', min : 8096, max : 0x7fffffff, value : 0x7f option('arch_name', type : 'string', value: '') option('os_name', type : 'string', value: '') +option('shared', type : 'boolean', value: true) +option('cryptorand', type : 'boolean', value: true) diff --git a/src/conf/janetconf.h b/src/conf/janetconf.h index 4bc6046d..4b97667a 100644 --- a/src/conf/janetconf.h +++ b/src/conf/janetconf.h @@ -52,6 +52,8 @@ /* #define JANET_EV_NO_EPOLL */ /* #define JANET_EV_NO_KQUEUE */ /* #define JANET_NO_INTERPRETER_INTERRUPT */ +/* #define JANET_NO_IPV6 */ +/* #define JANET_NO_CRYPTORAND */ /* Custom vm allocator support */ /* #include */ diff --git a/src/core/ffi.c b/src/core/ffi.c index 6aed7e32..03fccfd1 100644 --- a/src/core/ffi.c +++ b/src/core/ffi.c @@ -999,13 +999,13 @@ typedef struct { uint64_t x; } sysv64_sseint_return; typedef sysv64_int_return janet_sysv64_variant_1(uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e, uint64_t f, - double r1, double r2, double r3, double r4, double r5, double r6, double r7, double r8); + double r1, double r2, double r3, double r4, double r5, double r6, double r7, double r8); typedef sysv64_sse_return janet_sysv64_variant_2(uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e, uint64_t f, - double r1, double r2, double r3, double r4, double r5, double r6, double r7, double r8); + double r1, double r2, double r3, double r4, double r5, double r6, double r7, double r8); typedef sysv64_intsse_return janet_sysv64_variant_3(uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e, uint64_t f, - double r1, double r2, double r3, double r4, double r5, double r6, double r7, double r8); + double r1, double r2, double r3, double r4, double r5, double r6, double r7, double r8); typedef sysv64_sseint_return janet_sysv64_variant_4(uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e, uint64_t f, - double r1, double r2, double r3, double r4, double r5, double r6, double r7, double r8); + double r1, double r2, double r3, double r4, double r5, double r6, double r7, double r8); static Janet janet_ffi_sysv64(JanetFFISignature *signature, void *function_pointer, const Janet *argv) { union { diff --git a/src/core/net.c b/src/core/net.c index 97e6418b..768bcb69 100644 --- a/src/core/net.c +++ b/src/core/net.c @@ -955,8 +955,10 @@ static const struct sockopt_type sockopt_type_list[] = { { "ip-multicast-ttl", IPPROTO_IP, IP_MULTICAST_TTL, JANET_NUMBER }, { "ip-add-membership", IPPROTO_IP, IP_ADD_MEMBERSHIP, JANET_POINTER }, { "ip-drop-membership", IPPROTO_IP, IP_DROP_MEMBERSHIP, JANET_POINTER }, +#ifndef JANET_NO_IPV6 { "ipv6-join-group", IPPROTO_IPV6, IPV6_JOIN_GROUP, JANET_POINTER }, { "ipv6-leave-group", IPPROTO_IPV6, IPV6_LEAVE_GROUP, JANET_POINTER }, +#endif { NULL, 0, 0, JANET_POINTER } }; @@ -993,7 +995,9 @@ JANET_CORE_FN(cfun_net_setsockopt, union { int v_int; struct ip_mreq v_mreq; +#ifndef JANET_NO_IPV6 struct ipv6_mreq v_mreq6; +#endif } val; void *optval = (void *)&val; @@ -1011,12 +1015,14 @@ JANET_CORE_FN(cfun_net_setsockopt, val.v_mreq.imr_interface.s_addr = htonl(INADDR_ANY); inet_pton(AF_INET, addr, &val.v_mreq.imr_multiaddr.s_addr); optlen = sizeof(val.v_mreq); +#ifndef JANET_NO_IPV6 } else if (st->optname == IPV6_JOIN_GROUP || st->optname == IPV6_LEAVE_GROUP) { const char *addr = janet_getcstring(argv, 2); memset(&val.v_mreq6, 0, sizeof val.v_mreq6); val.v_mreq6.ipv6mr_interface = 0; inet_pton(AF_INET6, addr, &val.v_mreq6.ipv6mr_multiaddr); optlen = sizeof(val.v_mreq6); +#endif } else { janet_panicf("invalid socket option type"); } diff --git a/src/core/util.c b/src/core/util.c index 2dfd11e3..235d4394 100644 --- a/src/core/util.c +++ b/src/core/util.c @@ -960,6 +960,7 @@ void arc4random_buf(void *buf, size_t nbytes); #endif int janet_cryptorand(uint8_t *out, size_t n) { +#ifndef JANET_NO_CRYPTORAND #ifdef JANET_WINDOWS for (size_t i = 0; i < n; i += sizeof(unsigned int)) { unsigned int v; @@ -971,7 +972,10 @@ int janet_cryptorand(uint8_t *out, size_t n) { } } return 0; -#elif defined(JANET_LINUX) || defined(JANET_CYGWIN) || ( defined(JANET_APPLE) && !defined(MAC_OS_X_VERSION_10_7) ) +#elif defined(JANET_BSD) || defined(MAC_OS_X_VERSION_10_7) + arc4random_buf(out, n); + return 0; +#else /* We should be able to call getrandom on linux, but it doesn't seem to be uniformly supported on linux distros. On Mac, arc4random_buf wasn't available on until 10.7. @@ -993,12 +997,10 @@ int janet_cryptorand(uint8_t *out, size_t n) { } RETRY_EINTR(rc, close(randfd)); return 0; -#elif defined(JANET_BSD) || defined(MAC_OS_X_VERSION_10_7) - arc4random_buf(out, n); - return 0; +#endif #else - (void) n; (void) out; + (void) n; return -1; #endif }