kuroko/Makefile
K. Lange 6f95124bcd Threading
Don't be deceived by its size: this commit is mostly a bunch of
sed replacements to move thread state out of "vm" and introduce
a thread-local "KrkThreadState" object to hold stack pointers and
call frames for individual threads.

Threading support is incomplete and there's almost definitely a
bunch of really easy ways to break everything just by allocating
objects, but really simple stuff like carefully modifying a
a list of ints should work okay.

The README has been rewritten to remove code samples, which have
moved to the Wiki (as has the section on integrating with C).

Some other stuff has also moved around because the threading changes
necessitated a major API break anyway, so I also took the time to
fix some ABI issues.
2021-02-09 18:51:09 +09:00

191 lines
7.2 KiB
Makefile

CFLAGS ?= -g -O3 -Wall -Wextra -pedantic -Wno-unused-parameter
TARGET = kuroko
OBJS = $(patsubst %.c, %.o, $(filter-out src/module_% src/rline.c src/kuroko.c,$(sort $(wildcard src/*.c))))
MODULES = $(patsubst src/module_%.c, modules/%.so, $(sort $(wildcard src/module_*.c)))
HEADERS = $(wildcard src/*.h)
# These are used by the install target. We call the local kuroko to get the
# version string to use for the final library, so, uh, probably don't
# try to do that in a cross-compile environment...
VERSION = $(shell ./kuroko --version | sed 's/.* //')
SONAME = libkuroko-$(VERSION).so
KRKMODS = $(wildcard modules/*.krk modules/*/*.krk modules/*/*/*.krk)
ifndef KRK_ENABLE_STATIC
# The normal build configuration is as a shared library or DLL (on Windows)
CFLAGS += -fPIC
ifeq (,$(findstring mingw,$(CC)))
# We set rpath here mostly so you can run the locally-built interpreter
# with the correct library; it shouldn't be needed in a real installation.
LDFLAGS += -Wl,-rpath -Wl,'$$ORIGIN' -L.
# On POSIX-like platforms, link with libdl and assume -lkuroko gives us
# our own library.
LDLIBS += -ldl -lkuroko
else
# For Windows, disable format string warnings because gcc will get mad
# about non-portable Windows format specifiers...
CFLAGS += -Wno-format
# And we need to link this by name with extension because I don't want
# to actually rename it to kuroko.dll or whatever.
LDLIBS += libkuroko.so
endif
all: ${TARGET} ${MODULES}
KUROKO_LIBS = libkuroko.so
else
# Static builds are a little different...
CFLAGS +=-DSTATIC_ONLY
LDFLAGS += -static
all: ${TARGET}
OBJS += src/kuroko.o
KUROKO_LIBS = ${OBJS}
endif
ifeq ($(shell uname -s),Linux)
ifeq (,$(findstring mingw,$(CC)))
# Enable threading by default on Linux,
# but make sure we're not cross-building
# with ming first...
KRK_ENABLE_THREAD ?= 1
endif
endif
ifeq (1,$(KRK_ENABLE_THREAD))
# Thread support is EXPERIMENTAL
# and downright known to be broken
# (but only if you actually use it)
CFLAGS += -DENABLE_THREADING
LDLIBS += -lpthread
endif
ifndef KRK_DISABLE_RLINE
# Normally, we link the rich line editor into the
# interpreter (and not the main library!)
KUROKO_LIBS += src/rline.o
else
# ... but it can be disabled if you want a more "pure" build,
# or if you don't have solid support for the escape sequences
# it requires on your target platform.
CFLAGS += -DNO_RLINE
endif
ifndef KRK_DISABLE_DEBUG
# Disabling debug functions doesn't really do much; it may result in a smaller
# library when stripped as there's a lot of debug text, but no performance
# difference has ever been noted from disabling, eg., instruction tracing.
CFLAGS += -DDEBUG
endif
ifdef KRK_ENABLE_BUNDLE
# When bundling, disable shared object modules.
MODULES =
# Add the sources from the shared object modules as regular sources.
KUROKO_LIBS += $(patsubst %.c,%.o,$(sort $(wildcard src/module_*.c)))
# Enable the build flag so the interpreter binary knows to run startup functions
CFLAGS += -DBUNDLE_LIBS=1
# And link anything our core modules would have needed
LDLIBS += -lm
endif
.PHONY: help
help:
@echo "Configuration options available:"
@echo " KRK_DISABLE_RLINE=1 Do not build with the rich line editing library enabled."
@echo " KRK_DISABLE_DEBUG=1 Disable debugging features (might be faster)."
@echo " KRK_ENABLE_STATIC=1 Build a single static binary."
@echo " KRK_ENABLE_BUNDLE=1 Link C modules directly into the interpreter."
@echo " KRK_ENABLE_THREAD=1 Enable EXPERIMENTAL threading support. (* enabled by default on Linux)"
kuroko: src/kuroko.o ${KUROKO_LIBS}
${CC} ${CFLAGS} ${LDFLAGS} -o $@ src/kuroko.o ${KUROKO_LIBS} ${LDLIBS}
libkuroko.so: ${OBJS}
${CC} ${CFLAGS} ${LDFLAGS} -shared -o $@ ${OBJS}
# Make sure we rebuild things when headers change as we have a lot of
# headers that define build flags...
%.o: ${HEADERS}
# Modules are built as shared objects. We link them with LDLIBS
# as well, but this probably isn't necessary?
modules/%.so: src/module_%.c libkuroko.so
${CC} ${CFLAGS} ${LDFLAGS} -shared -o $@ $< ${LDLIBS}
# A module can have dependencies that didn't exist in the main lib,
# like how the math library pulls in libm but we kept references
# to that out of the main interpreter.
modules/math.so: src/module_math.c libkuroko.so
${CC} ${CFLAGS} ${LDFLAGS} -shared -o $@ $< -lm ${LDLIBS}
.PHONY: clean
clean:
@rm -f ${OBJS} ${TARGET} ${MODULES} libkuroko.so src/*.o kuroko.exe
tags: $(wildcard src/*.c) $(wildcard src/*.h)
@ctags --c-kinds=+lx src/*.c src/*.h
# Test targets run against all .krk files in the test/ directory, writing
# stdout to `.expect` files, and then comparing with `git`.
# To update the tests if changes are expected, run `make test` and commit the result.
.PHONY: test stress-test
test:
@for i in test/*.krk; do echo $$i; KUROKO_TEST_ENV=1 $(TESTWRAPPER) ./kuroko $$i > $$i.expect; done
@git diff --exit-code test/*.expect
# You can also set TESTWRAPPER to other things to run the tests in other tools.
stress-test:
$(MAKE) TESTWRAPPER='valgrind' test
# The install target is set up for modern multiarch Linux environments,
# and you may need to do extra work for it to make sense on other targets.
LIBCARCH ?= $(shell gcc -print-multiarch)
prefix ?= /usr/local
exec_prefix ?= $(prefix)
includedir ?= $(prefix)/include
bindir ?= $(exec_prefix)/bin
libdir ?= $(exec_prefix)/lib/$(LIBCARCH)
INSTALL = install
INSTALL_PROGRAM=$(INSTALL)
INSTALL_DATA=$(INSTALL) -m 644
.PHONY: install
install: kuroko libkuroko.so ${HEADERS} $(KRKMODS) $(MODULES)
$(INSTALL) -d $(DESTDIR)$(includedir)/kuroko
$(INSTALL) -d $(DESTDIR)$(bindir)
$(INSTALL) -d $(DESTDIR)$(libdir)
$(INSTALL) -d $(DESTDIR)$(bindir)/../lib/kuroko
$(INSTALL) -d $(DESTDIR)$(bindir)/../lib/kuroko/syntax
$(INSTALL) -d $(DESTDIR)$(bindir)/../lib/kuroko/foo/bar
$(INSTALL_DATA) ${HEADERS} $(DESTDIR)$(includedir)/kuroko/
$(INSTALL_PROGRAM) kuroko $(DESTDIR)$(bindir)/kuroko
$(INSTALL_PROGRAM) libkuroko.so $(DESTDIR)$(libdir)/$(SONAME)
ln -s -f $(SONAME) $(DESTDIR)$(libdir)/libkuroko.so
$(INSTALL_DATA) modules/*.krk $(DESTDIR)$(bindir)/../lib/kuroko/
$(INSTALL_DATA) modules/foo/*.krk $(DESTDIR)$(bindir)/../lib/kuroko/foo/
$(INSTALL_DATA) modules/foo/bar/*.krk $(DESTDIR)$(bindir)/../lib/kuroko/foo/bar/
$(INSTALL_DATA) modules/syntax/*.krk $(DESTDIR)$(bindir)/../lib/kuroko/syntax/
$(INSTALL_PROGRAM) $(MODULES) $(DESTDIR)$(bindir)/../lib/kuroko/
install-strip: all
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
# The deb target piggybacks off the install target, creating a temporary DESTDIR
# to install into with 'prefix' as /usr, packages that with fpm, and removes DESTDIR
.PHONY: deb
deb: kuroko libkuroko.so
$(eval DESTDIR := $(shell mktemp -d))
$(MAKE) prefix=/usr DESTDIR='$(DESTDIR)' install-strip
fpm -s dir -C $(DESTDIR) -t deb \
-n "kuroko" \
-m "K. Lange <klange@toaruos.org>" \
--description "Bytecode-compiled interpreted dynamic programming language." \
--url "https://kuroko-lang.github.io/" \
--license "ISC" \
--category "devel" \
-d "libc6 (>= 2.29)" \
--version $(VERSION) \
--iteration 0 \
--directories $(libdir)/kuroko
rm -r $(DESTDIR)