# Copyright (c) 2018 Simon Hudon. All rights reserved. # Released under Apache 2.0 license as described in the file LICENSE. # Authors: Simon Hudon, Sebastian Ullrich, Leonardo de Moura OUT = build OLEAN_OUT = $(OUT) TEMP_OUT = $(OUT)/temp BIN_OUT = $(OUT)/bin LIB_OUT = $(OUT)/lib BIN_NAME = $(PKG) STATIC_LIB_NAME = lib$(PKG).a LEAN_OPTS = @LEAN_EXTRA_MAKE_OPTS@ LEANC_OPTS = -O3 -DNDEBUG SRCS = $(shell find $(PKG) -name '*.lean' 2> /dev/null || true; find $(PKG).lean 2> /dev/null) DEPS = $(addprefix $(TEMP_OUT)/,$(SRCS:.lean=.depend)) export LEAN_PATH += :$(OLEAN_OUT) OBJS = $(addprefix $(OLEAN_OUT)/, $(SRCS:.lean=.olean)) SHELL = /usr/bin/env bash -eo pipefail .PHONY: all bin lib depends clean all: $(OBJS) bin: $(BIN_OUT)/$(PKG) lib: $(LIB_OUT)/$(STATIC_LIB_NAME) depends: $(DEPS) $(OLEAN_OUT)/$(PKG) $(LIB_OUT) $(BIN_OUT): @mkdir -p "$@" # Make sure the .olean output directory exists so that `lean --deps` knows where this package's # .olean files will be located even before any of them are actually built. $(TEMP_OUT)/%.depend: %.lean | $(OLEAN_OUT)/$(PKG) @mkdir -p "$(TEMP_OUT)/$(*D)" # use separate assignment to ensure failure propagation # convert path separators and newlines on Windows @deps=`lean --deps $< | tr '\\\\' / | tr -d '\\r'`; echo $(OLEAN_OUT)/$(<:.lean=.olean): $$deps > $@ $(OLEAN_OUT)/%.olean: %.lean $(TEMP_OUT)/%.depend $(MORE_DEPS) @echo "[ ] Building $<" @mkdir -p $(OLEAN_OUT)/$(*D) lean $(LEAN_OPTS) -o "$@" --c="$(TEMP_OUT)/$*.c.tmp" $< # create the .c file atomically mv "$(TEMP_OUT)/$*.c.tmp" "$(TEMP_OUT)/$*.c" # make sure the .olean file is newer than the .depend file to prevent infinite make cycles @touch $@ $(TEMP_OUT)/%.c: $(OLEAN_OUT)/%.olean @ $(TEMP_OUT)/%.o: $(TEMP_OUT)/%.c @echo "[ ] Building $<" @mkdir -p "$(@D)" leanc -c -o $@ $< $(LEANC_OPTS) $(BIN_OUT)/$(BIN_NAME): $(addprefix $(TEMP_OUT)/,$(SRCS:.lean=.o)) | $(BIN_OUT) @echo "[ ] Linking $@" leanc -o "$@" -x none $^ $(LIB_OUT)/$(STATIC_LIB_NAME): $(addprefix $(TEMP_OUT)/,$(SRCS:.lean=.o)) | $(LIB_OUT) @rm -f $@ @ar rcs $@ $^ clean: rm -rf $(OUT) .PRECIOUS: $(TEMP_OUT)/%.c include $(DEPS)