diff --git a/cosmo-kuroko/Dockerfile b/cosmo-kuroko/Dockerfile index 69e31d2..550bb25 100644 --- a/cosmo-kuroko/Dockerfile +++ b/cosmo-kuroko/Dockerfile @@ -26,21 +26,21 @@ WORKDIR /kuroko RUN : \ && sed -i '/bind(gamma)/{N;N;d;}' src/modules/module_math.c \ && sed -i '/MATH_ONE(gamma)/d' src/modules/module_math.c \ - \ +\ && sed -i 's_.*char \*\* environ.*_/* & */_' src/os.c \ - \ +\ && sed -i '/FUNC_SIG(list,append)/d' src/vm.c \ && sed -i '/void _callSetName/i\\extern FUNC_SIG(list,append);' src/vm.c \ - \ +\ && sed -i '/static.*cache/c\\static KrkClassCacheEntry * cache = 0;' src/vm.c \ && sed -i $'/define CACHE_SIZE/,/nextCount/{N;w /temp\nd}' src/vm.c \ && sed -i $'/void krk_initVM/{r /temp\nN}' src/vm.c \ && sed -i '/Reset current thread/i\\cache = calloc(CACHE_SIZE, sizeof(KrkClassCacheEntry));' src/vm.c \ && sed -i '/krk_freeMemoryDebugger/a\\cache = (free(cache), NULL);' src/vm.c \ - \ +\ && sed -i '/define gettid/d' src/threads.c \ && sed -i '/initial-exec/d' src/vm.c \ - \ +\ && sed -i $'/Ensure we don\'t have a macro/{\ni\\\ \#ifdef KRK_DISABLE_DYNAMIC\\\n\ KrkValue krk_module_onload_math(void);\\\n\ @@ -69,6 +69,8 @@ KrkValue krk_module_onload_wcwidth(void);\\\n\ \t\tBUILTIN_MODULE("timeit", krk_module_onload_timeit)\\\n\ \t\tBUILTIN_MODULE("wcwidth", krk_module_onload_wcwidth)\n\ }' src/vm.c \ +\ + && sed -i '/netdb\.h/a\#include ' src/modules/module_socket.c \ && sed -i $'/switch (afval)/{\ni\\\ \tif (afval == AF_INET) return "AF_INET";\\\n\ \tif (afval == AF_INET6) return "AF_INET6";\\\n\ @@ -77,7 +79,7 @@ KrkValue krk_module_onload_wcwidth(void);\\\n\ \treturn tmp;\n\ }\n\ /switch (afval)/,/}/d' src/modules/module_socket.c \ - \ +\ && sed -i $'/strlen(buf)-1/{\n\ s/if .*/if (buf[buflen-1] == \'\\\\n\') {/\n\ i\\\ @@ -86,7 +88,20 @@ a\\\ \t\t\t\t\t\\if (buflen >= 2 && buf[buflen-2] == \'\\\\r\') buf[buflen-2] = \'\\\\n\', buf[buflen-1] = \'\\\\0\';\\\n\ \t\t\t\t} else {\n\ }' src/kuroko.c \ - \ +\ + && sed -i $'/ifdef KRK_DISABLE_THREADS/i\\\ +ifdef KRK_DISABLE_DYNAMIC\\\n\ + BIN_OBJS += src/modules/module_math.o src/modules/module_random.o src/modules/module_socket.o src/modules/module_timeit.o src/modules/module_wcwidth.o\\\n\ + CFLAGS += -DKRK_DISABLE_DYNAMIC -DSTATIC_ONLY\\\n\ +endif\\\n\ +\\\n\ +' Makefile \ + && sed -i $'/CFLAGS += -DKRK_DISABLE_THREADS/a\\\ +else\\\n\ + CFLAGS += -DKRK_MEDIOCRE_TLS\\\n\ +\\\n\ +' Makefile \ +\ && { diff -NrU3 /kuroko.orig/ /kuroko/ > /kuroko.patch; [ $? -le 1 ]; } # diff exit status is normally 0 or 1, anything greater is an error. @@ -95,6 +110,7 @@ RUN : \ && sed -i 's/int main/dontinline int _main/' src/kuroko.c \ && printf %s $'\n\ STATIC_YOINK("__die");\n\ +void ShowCrashReports(void);\n\ int LoadZipArgs(int *, char ***);\n\ int main(int argc, char * argv[]) {\n\ \tShowCrashReports();\n\ @@ -103,27 +119,16 @@ int main(int argc, char * argv[]) {\n\ }\n\ ' >> src/kuroko.c +RUN tar zxf /cosmopolitan/dist/headers.tar.gz -C /cosmopolitan +COPY --chmod=0755 --from=localhost/notwa-util /usr/local/bin/cosmocc /usr/bin/ RUN : \ - && cd /cosmopolitan \ - && . ./env \ - && cd dist/"$flavor" \ - && mkdir -p /kuroko/libcosmo \ - && ln ape-copy-self.o ape.lds cosmopolitan.a crt.o ape-no-modify-self.o ape.o cosmopolitan.h \ - /kuroko/libcosmo/ - -COPY super.mk . -RUN : \ - && CC=x86_64-linux-musl-gcc \ - make.com -f super.mk -j2 \ - KRK_DISABLE_RLINE=1 \ - KRK_DISABLE_DYNAMIC=1 \ -# KRK_DISABLE_THREADS=1 \ -# KRK_DISABLE_DEBUG=1 KRK_NO_DISASSEMBLY=1 KRK_NO_TRACING=1 \ -; - -RUN : \ - && make.com -f super.mk test \ + && CC=cosmocc CFLAGS="-Os -g" AR=ar.com ARFLAGS=rcsD \ + make.com kuroko modules/codecs/sbencs.krk modules/codecs/dbdata.krk \ + -j2 KRK_DISABLE_RLINE=1 KRK_DISABLE_DYNAMIC=1 \ + && cp kuroko kuroko.com.dbg \ + && objcopy -S -O binary kuroko.com.dbg kuroko.com \ ; +RUN make.com test FROM scratch AS runner COPY --chmod=0755 --from=localhost/notwa-util /usr/local/bin/busybox /bin/busybox diff --git a/cosmo-kuroko/super.mk b/cosmo-kuroko/super.mk deleted file mode 100755 index ccb1e9d..0000000 --- a/cosmo-kuroko/super.mk +++ /dev/null @@ -1,102 +0,0 @@ -CC ?= gcc -CFLAGS = -Isrc -Os -fdiagnostics-color=always -fmax-errors=5 -LDFLAGS = -LDLIBS = - -COSMO_LIBDIR = ./libcosmo - -COSMO_PREFLAGS = -g -static -nostdlib -nostdinc -fno-pie -no-pie -mno-red-zone -COSMO_PREFLAGS += -fno-omit-frame-pointer -pg -mnop-mcount -mno-tls-direct-seg-refs -COSMO_PREFLAGS += -include $(COSMO_LIBDIR)/cosmopolitan.h -Idummy - -COSMO_POSTFLAGS += -Wl,--gc-sections -fuse-ld=bfd -Wl,--gc-sections -COSMO_POSTFLAGS += -Wl,-T,$(COSMO_LIBDIR)/ape.lds -COSMO_POSTFLAGS += $(COSMO_LIBDIR)/crt.o $(COSMO_LIBDIR)/ape-no-modify-self.o $(COSMO_LIBDIR)/cosmopolitan.a - -COSMO_FILES = $(COSMO_LIBDIR)/ape-copy-self.o $(COSMO_LIBDIR)/ape-no-modify-self.o -COSMO_FILES += $(COSMO_LIBDIR)/ape.lds $(COSMO_LIBDIR)/ape.o $(COSMO_LIBDIR)/crt.o -COSMO_FILES += $(COSMO_LIBDIR)/cosmopolitan.a $(COSMO_LIBDIR)/cosmopolitan.h - -DUMMY_HEADERS = arpa/inet.h assert.h dirent.h dlfcn.h errno.h fcntl.h inttypes.h limits.h locale.h math.h netdb.h pthread.h sched.h signal.h stdarg.h stddef.h stdint.h stdio.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/stat.h sys/syscall.h sys/time.h sys/types.h sys/utsname.h termios.h time.h unistd.h wchar.h -DUMMY_MISSING = $(foreach header,$(DUMMY_HEADERS),$(if $(wildcard dummy/$(header)),,dummy/$(header))) - -TARGET = kuroko -OBJS = $(patsubst %.c, %.o, $(filter-out src/kuroko.c,$(sort $(wildcard src/*.c)))) -HEADERS = $(wildcard src/kuroko/*.h) -GENMODS = modules/codecs/sbencs.krk modules/codecs/dbdata.krk - -ifdef KRK_DISABLE_DOCS - CFLAGS += -DKRK_NO_DOCUMENTATION -Wno-unused-value -endif - -ifndef KRK_DISABLE_RLINE - BIN_OBJS += src/vendor/rline.o -else - CFLAGS += -DNO_RLINE -endif - -ifdef KRK_DISABLE_DEBUG - CFLAGS += -DKRK_DISABLE_DEBUG -endif - -ifdef KRK_DISABLE_DYNAMIC - BIN_OBJS += src/modules/module_math.o src/modules/module_random.o src/modules/module_socket.o src/modules/module_timeit.o src/modules/module_wcwidth.o - CFLAGS += -DKRK_DISABLE_DYNAMIC -DSTATIC_ONLY -endif - -ifdef KRK_DISABLE_THREADS - CFLAGS += -DKRK_DISABLE_THREADS -else - CFLAGS += -DKRK_MEDIOCRE_TLS -endif - -ifdef KRK_NO_DISASSEMBLY - CFLAGS += -DKRK_NO_DISASSEMBLY=1 -endif - -ifdef KRK_NO_TRACING - CFLAGS += -DKRK_NO_TRACING=1 -endif - -ifdef KRK_NO_STRESS_GC - CFLAGS += -DKRK_NO_STRESS_GC=1 -endif - -HEADERS += $(COSMO_LIBDIR)/cosmopolitan.h -BIN_OBJS += $(OBJS) - -all: $(TARGET).com $(GENMODS) - -dummy/%.h: - mkdir -p dummy && touch $@ - -dummy/arpa/%.h: - mkdir -p dummy/arpa && touch $@ - -dummy/sys/%.h: - mkdir -p dummy/sys && touch $@ - -%.o: %.c $(HEADERS) $(DUMMY_MISSING) - $(CC) $(CFLAGS) $(COSMO_PREFLAGS) -c -o $@ $< - -$(TARGET).com.dbg: src/$(TARGET).c $(BIN_OBJS) $(HEADERS) $(DUMMY_MISSING) - $(CC) $(CFLAGS) $(LDFLAGS) $(COSMO_PREFLAGS) -o $@ $< $(BIN_OBJS) $(LDLIBS) $(COSMO_POSTFLAGS) - -$(TARGET).com: $(TARGET).com.dbg - objcopy -S -O binary $< $@ - -.PHONY: test -test: - @for i in test/*.krk; do echo $$i; KUROKO_TEST_ENV=1 $(TESTWRAPPER) ./$(TARGET).com.dbg $$i > $$i.actual; diff $$i.expect $$i.actual || exit 1; rm $$i.actual; done - -.PHONY: clean -clean: - -rm -f $(OBJS) $(TARGET).com $(TARGET).com.dbg src/*.o src/vendor/*.o - -# special cases: - -modules/codecs/sbencs.krk: tools/codectools/gen_sbencs.krk tools/codectools/encodings.json tools/codectools/indexes.json | $(TARGET).com.dbg - ./$(TARGET).com.dbg tools/codectools/gen_sbencs.krk - -modules/codecs/dbdata.krk: tools/codectools/gen_dbdata.krk tools/codectools/encodings.json tools/codectools/indexes.json | $(TARGET).com.dbg - ./$(TARGET).com.dbg tools/codectools/gen_dbdata.krk diff --git a/notwa-util/cosmocc b/notwa-util/cosmocc index 93b441b..266e289 100755 --- a/notwa-util/cosmocc +++ b/notwa-util/cosmocc @@ -39,8 +39,8 @@ for x in "$@"; do '' exit 0 elif is_in "$x" \ - -fomit-frame-pointer -fPIC -lc -lc_r -lcma -lgcc -lm \ - -lpthread -lpthreads -lresolv -lrt -lunwind -lutil \ + -fomit-frame-pointer -fPIC -lc -lc_r -lcma -ldl -lgcc \ + -lm -lpthread -lpthreads -lresolv -lrt -lunwind -lutil \ -Wl,-Bdynamic -Wl,-Bstatic then continue elif [ "$x" = -c ]; then