.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 '$*=$($*)'