arctic/Makefile

92 lines
2.6 KiB
Makefile

.PHONY: default
.SUFFIXES:
MAKEFLAGS+=--no-builtin-rules
NODEPS=clean
OBJECT_DIR=obj
SOURCE_DIR=src
EMPTY:=
SPACE:=$(EMPTY) $(EMPTY)
COMMA:=,
default: all
all: docs arctic
DOCUMENTS=$(shell find doc/ -name '*.md')
HTMLDOCS=$(patsubst doc/%.md,%.html,$(DOCUMENTS))
PDFDOCS=$(patsubst doc/%.md,%.pdf,$(DOCUMENTS)) cheatsheet.pdf
docs: $(HTMLDOCS) $(PDFDOCS)
%.html: doc/%.md
multimarkdown -t html $^ -o $@
%.tex: %.md
multimarkdown -t latex $^ | sed 's/^\[/{[}/g' > $@
%.pdf: doc/%.tex doc/arctic-leader.tex doc/arctic-begin.tex doc/arctic-footer.tex
# cd doc && latexmk -pdf -xelatex -use-make $*.tex && mv $*.pdf ../
cd $$(dirname $<) && xelatex -interaction=batchmode $*.tex && mv $*.pdf ../
GENERATED_M4=$(shell find $(SOURCE_DIR)/ -name '*.m4')
GENERATED_FS=$(patsubst %.m4,%,$(GENERATED_M4))
%: %.m4 misc/utils.m4
m4 $< > $@
# TODO: fix the structure so this is easier. the JIT libs should become ASM
# libs, while the actual JIT sources only get included on whatever the native
# arch is (tunable with ARCH=... in make)
MAIN_SOURCES=$(shell find $(SOURCE_DIR)/ -name '*.c' -not -path '$(SOURCE_DIR)/jit/*')
MAIN_OBJECTS=$(patsubst $(SOURCE_DIR)/%.c,$(OBJECT_DIR)/%.o,$(MAIN_SOURCES))
MAIN_DEPENDS=$(patsubst $(SOURCE_DIR)/%.c,$(OBJECT_DIR)/%.d,$(MAIN_SOURCES))
ifeq (0, $(words $(findstring $(MAKECMDGOALS), $(NODEPS))))
ifeq (,$(findstring print-,$(MAKECMDGOALS)))
$(info Including depends files: $(MAIN_DEPENDS))
include $(MAIN_DEPENDS)
endif
endif
$(OBJECT_DIR):
mkdir $@
$(OBJECT_DIR)/%.d: $(SOURCE_DIR)/%.c | $(OBJECT_DIR) $(GENERATED_FS)
$(CC) $(CFLAGS) -MM -MT '$(patsubst $(SOURCE_DIR)/%.c,$(OBJECT_DIR)/%.o,$<)' $< -MF $@
$(OBJECT_DIR)/%.o: $(SOURCE_DIR)/%.c | $(OBJECT_DIR)
$(CC) $(CFLAGS) -c $< -o $@
arctic: $(MAIN_OBJECTS)
$(CC) $(LDFLAGS) $^ -o $@
X86_64_BIT_REGISTERS=RAX RBX RCX RDX RSI RDI RBP RSP R8 R9 R10 R11 R12 R13 R14 R15
src/jit/x86_64_mov_opcodes.h:
echo '#ifndef X86_64_MOV_OPCODES_H' > $@
echo '#define X86_64_MOV_OPCODES_H' >> $@
echo >> $@
for dstreg in {$(subst $(SPACE),$(COMMA),$(X86_64_BIT_REGISTERS))}; do \
for srcreg in {$(subst $(SPACE),$(COMMA),$(X86_64_BIT_REGISTERS))}; do \
echo "mov $$srcreg,$$dstreg" | ./tools/x86_64dump | \
sed 's/../ X(0x&)/g' | \
sed "s/.*/#define MOV_$${srcreg}_$${dstreg}&/" >> $@; \
done; \
done
echo >> $@
echo '#endif /* X86_64_MOV_OPCODES_H */' >> $@
clean:
-rm $(patsubst doc/%.md,doc/%.aux,$(DOCUMENTS))
-rm $(patsubst doc/%.md,doc/%.xdv,$(DOCUMENTS))
-rm $(patsubst doc/%.md,doc/%.out,$(DOCUMENTS))
-rm $(MAIN_OBJECTS)
-rm $(MAIN_DEPENDS)
-rm arctic
print-%:
@echo '$*=$($*)'