.PHONY: all clean TAGS tags targets
all: targets tags
TARGET=sbcl
SBCL_PAXCTL ?= :
LINKFLAGS += -g
DEPEND_FLAGS = -MM
GREP = grep
LD = ld
LIBSBCL = $(OBJS)
USE_LIBSBCL = $(OBJS)
__LDFLAGS__ =
include ../../output/prefix.def
CFLAGS += -g -Wall -Wundef -Wsign-compare -Wpointer-arith -O3
ASFLAGS += $(CFLAGS)
CPPFLAGS += -I.
include genesis/Makefile.features
DISABLE_PIE=yes
include Config
ifeq ($(DISABLE_PIE),yes)
ifneq ($(shell $(CC) -dumpspecs 2>/dev/null | grep -e '[^f]no-pie'),)
CFLAGS += -fno-pie
LINKFLAGS += -no-pie
LDFLAGS += -no-pie
__LDFLAGS__ += -no-pie
endif
ifneq ($(shell $(CC) -dumpspecs 2>/dev/null | grep -e '[^f]nopie'),)
CFLAGS += -fno-pie
LINKFLAGS += -nopie
LDFLAGS += -nopie
__LDFLAGS__ += -nopie
endif
endif
COMMON_SRC = alloc.c backtrace.c breakpoint.c coalesce.c coreparse.c \
dynbind.c funcall.c gc-common.c globals.c hopscotch.c \
interr.c interrupt.c largefile.c main.c \
monitor.c murmur_hash.c os-common.c parse.c print.c \
purify.c regnames.c runtime.c \
safepoint.c save.c sc-offset.c search.c thread.c time.c \
validate.c var-io.c vars.c wrap.c
ifndef LISP_FEATURE_WIN32
COMMON_SRC += run-program.c sprof.c
endif
C_SRC = $(COMMON_SRC) ${ARCH_SRC} ${OS_SRC} ${GC_SRC}
SRCS = $(C_SRC) ${ASSEM_SRC}
OBJS = $(C_SRC:.c=.o) $(ASSEM_SRC:.S=.o)
LIBS = ${OS_LIBS} $(LDLIBS) -lm
targets: $(TARGET) $(OBJTARGET) sbcl.mk
$(TARGET): $(LIBSBCL)
$(CC) ${LINKFLAGS} -o $@ $(USE_LIBSBCL) $(LIBS)
$(SBCL_PAXCTL) $@
heap-reloc-test: ../../tests/heap-reloc/fake-mman.c $(OBJS)
$(CC) ${LINKFLAGS} -o $@ ../../tests/heap-reloc/fake-mman.c $(filter-out linux-mman.o,$(OBJS)) $(LIBS)
gc-unit-tests.o: CFLAGS=-DCOMPILING_TESTS
unit-tests: gc-unit-tests.o libsbcl.a
cc -g -no-pie -o $@ $^ -ldl -lpthread -lm
sbcl.o: $(OBJS)
$(LD) $(__LDFLAGS__) -r -o $@ $^
libsbcl.a: $(OBJS)
rm -f $@ ; ar rcs $@ $^
PIC_OBJS = $(subst .o,.pic.o,$(OBJS))
libsbcl.so: $(PIC_OBJS)
cc -shared -o $@ $^ $(LIBS)
%.pic.o: %.c
$(CC) -fPIC -c $(CPPFLAGS) -DSHARED_LIBRARY=1 $(filter-out -fno-pie,$(CFLAGS)) $< -o $@
%.pic.o: %.S # (-fPIC doesn't affect hand-written assembly source)
$(CC) -c $(CPPFLAGS) -DSHARED_LIBRARY=1 $(CFLAGS) $< -o $@
SHRINKWRAP_DEPS = ../../output/sbcl.core ../../tools-for-build/editcore.lisp
shrinkwrap-sbcl.s shrinkwrap-sbcl-core.o: $(SHRINKWRAP_DEPS)
../../run-sbcl.sh --script ../../tools-for-build/editcore.lisp split \
../../output/sbcl.core shrinkwrap-sbcl.s
pie-shrinkwrap-sbcl.s pie-shrinkwrap-sbcl-core.o: $(SHRINKWRAP_DEPS)
../../run-sbcl.sh --script ../../tools-for-build/editcore.lisp split --pie \
../../output/sbcl.core pie-shrinkwrap-sbcl.s
comma := ,
shrinkwrap-sbcl: shrinkwrap-sbcl.s shrinkwrap-sbcl-core.o $(LIBSBCL)
$(CC) -no-pie $(filter-out -Wl$(comma)--export-dynamic, $(LINKFLAGS)) \
$(CFLAGS) -o $@ $^ $(LIBS)
pie-shrinkwrap-sbcl: pie-shrinkwrap-sbcl.s pie-shrinkwrap-sbcl-core.o $(PIC_OBJS)
$(CC) -pie -o $@ $^ $(LIBS)
semiwrap-sbcl: shrinkwrap-sbcl.s $(LIBSBCL)
$(CC) $(LINKFLAGS) $(CFLAGS) -o $@ $^ $(LIBS)
sbcl.mk: Config
( echo 'CC=$(CC)' ; \
echo 'LD=$(LD)' ; \
echo 'CFLAGS=$(CFLAGS)' ; \
echo 'ASFLAGS=$(ASFLAGS)' ; \
echo 'LINKFLAGS=$(LINKFLAGS)' ; \
echo 'LDFLAGS=$(LDFLAGS)' ; \
echo '__LDFLAGS__=$(__LDFLAGS__)' ; \
echo 'LIBS=$(LIBS)' ; \
if [ -n '$(LISP_FEATURE_SB_LINKABLE_RUNTIME)' ] ; then \
echo 'LIBSBCL=$(LIBSBCL)' ; \
echo 'USE_LIBSBCL=$(USE_LIBSBCL)' ; \
fi ; \
: ) > $@
sbcl.h: $(wildcard genesis/*.h)
echo '
echo '
HEADERS=$(wildcard *.h genesis/*.h)
TAGS tags: $(SRCS) $(HEADERS)
@etags $(SRCS) $(HEADERS) || true
clean:
-rm -f *.[do] $(TARGET) sbcl.h core *.tmp $(OS_CLEAN_FILES) libsbcl.a shrinkwrap-sbcl* sbcl.mk
%.d: %.c sbcl.h
@$(CC) $(DEPEND_FLAGS) $(CPPFLAGS) $< > $@.tmp; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.tmp > $@; \
rm -f $@.tmp
%.d: %.S sbcl.h
@$(CC) $(DEPEND_FLAGS) $(CPPFLAGS) $< > $@.tmp; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.tmp > $@; \
rm -f $@.tmp
ifneq ($(MAKECMDGOALS),clean)
-include $(C_SRC:.c=.d) $(ASSEM_SRC:.S=.d)
endif