diff --git a/Makefile b/Makefile index 9e020d3..8bc3665 100644 --- a/Makefile +++ b/Makefile @@ -1,110 +1,116 @@ +M := $(or $(MAKES_REPO_DIR),.cache/makes) +C := ca8c2c25e66cf6bfcf8c993502de5b98da5beaf5 +$(shell [ -d $M ] || git clone -q https://github.com/makeplus/makes $M) +$(shell [ -d $M ] || ( \ + git clone -depth=1 -q https://github.com/makeplus/makes $M && \ + git -C $M reset -q --hard $C)) +include $M/init.mk +MAKES-NO-RULES := true +GO-VERSION ?= 1.19.3 +include $M/go.mk +CLOJURE-VERSION := 1.12.1.1550 +include $M/clojure.mk +include $M/clean.mk +include $M/shell.mk + +MAKES-CLEAN := bin/ +MAKES-DISTCLEAN := .cache/ .clj-kondo/ .lsp/ .vscode/ + +CLOJURE-STDLIB-VERSION := clojure-1.12.1 +STDLIB-ORIGINALS-DIR := scripts/rewrite-core/originals +STDLIB-ORIGINALS := $(shell find $(STDLIB-ORIGINALS-DIR) -name '*.clj') +STDLIB := $(STDLIB-ORIGINALS:scripts/rewrite-core/originals/%=%) +STDLIB-ORIGINALS := $(addprefix scripts/rewrite-core/originals/,$(STDLIB)) +STDLIB-TARGETS := $(addprefix pkg/stdlib/glojure/,$(STDLIB:.clj=.glj)) + +GOPLATFORMS := \ + darwin_arm64 \ + darwin_amd64 \ + linux_arm64 \ + linux_amd64 \ + windows_amd64 \ + windows_arm \ + js_wasm \ + +# Set PATH so that glj is in the PATH after 'make shell' +override PATH := $(subst $(space),:,$(GOPLATFORMS:%=bin/%)):$(PATH) -CLOJURE_STDLIB_VERSION := clojure-1.12.1 -STDLIB_ORIGINALS_DIR := scripts/rewrite-core/originals -STDLIB_ORIGINALS := $(shell find $(STDLIB_ORIGINALS_DIR) -name '*.clj') -STDLIB := $(STDLIB_ORIGINALS:scripts/rewrite-core/originals/%=%) -STDLIB_ORIGINALS := $(addprefix scripts/rewrite-core/originals/,$(STDLIB)) -STDLIB_TARGETS := $(addprefix pkg/stdlib/clojure/,$(STDLIB:.clj=.glj)) - -OS-TYPE := $(shell bash -c 'echo $$OSTYPE') -OS-NAME := \ - $(if $(findstring darwin,$(OS-TYPE))\ - ,macos,$(if $(findstring linux,$(OS-TYPE)),linux,)) -ARCH-TYPE := $(shell bash -c 'echo $$MACHTYPE') -ARCH-NAME := \ - $(if $(or $(findstring arm64,$(ARCH-TYPE)),\ - $(findstring aarch64,$(ARCH-TYPE)))\ - ,arm64,$(if $(findstring x86_64,$(ARCH-TYPE)),int64,)) - -ifdef OS-NAME -ifdef ARCH-NAME -OS-ARCH := $(OS-NAME)-$(ARCH-NAME) -OA-linux-arm64 := linux_arm64 -OA-linux-int64 := linux_amd64 -OA-macos-arm64 := darwin_arm64 -OA-macos-int64 := darwin_amd64 -OA := $(OA-$(OS-ARCH)) -GLJ := bin/$(OA)/glj -endif -endif - -TEST_FILES := $(shell find ./test -name '*.glj' | sort) -TEST_TARGETS := $(addsuffix .test,$(TEST_FILES)) - -GOPLATFORMS := darwin_arm64 darwin_amd64 linux_arm64 linux_amd64 windows_amd64 windows_arm js_wasm GLJIMPORTS=$(foreach platform,$(GOPLATFORMS),pkg/gen/gljimports/gljimports_$(platform).go) # wasm should have .wasm suffix; others should not BINS=$(foreach platform,$(GOPLATFORMS),bin/$(platform)/glj$(if $(findstring wasm,$(platform)),.wasm,)) -# eventually, support multiple minor versions -GO_VERSION := 1.19.3 -GO_CMD := go$(GO_VERSION) +GLJ-DEPS := \ + $(GO) \ + $(wildcard ./cmd/glj/*.go) \ + $(wildcard ./pkg/**/*.go) \ + $(wildcard ./internal/**/*.go) \ -.PHONY: all -all: gocmd $(STDLIB_TARGETS) go-generate aot $(GLJIMPORTS) $(BINS) +all: $(STDLIB-TARGETS) generate $(GLJIMPORTS) $(BINS) -.PHONY: gocmd -gocmd: - @$(GO_CMD) version 2>&1 > /dev/null || \ - (go install "golang.org/dl/$(GO_CMD)@latest" && \ - $(GO_CMD) download > /dev/null && $(GO_CMD) version > /dev/null) +OA-linux-arm64 := linux_arm64 +OA-linux-int64 := linux_amd64 +OA-macos-arm64 := darwin_arm64 +OA-macos-int64 := darwin_amd64 +OA := $(OA-$(OS-ARCH)) -.PHONY: go-generate -generate: - @go generate ./... +GLJ := bin/$(OA)/glj + +TEST-FILES := $(shell find ./test -name '*.glj' | sort) +TEST-TARGETS := $(addsuffix .test,$(TEST-FILES)) -.PHONY: aot -aot: gocmd $(STDLIB_TARGETS) - @echo "(map compile '[clojure.core clojure.core.async clojure.walk clojure.template clojure.uuid glojure.go.types glojure.go.io])" | \ - GLOJURE_USE_AOT=false GLOJURE_STDLIB_PATH=./pkg/stdlib $(GO_CMD) run -tags glj_no_aot_stdlib ./cmd/glj -.PHONY: build +ifdef OA build: $(GLJ) +endif -.PHONY: clean -clean: - $(RM) -r bin/ +generate: $(GO) + go generate ./... -pkg/gen/gljimports/gljimports_%.go: ./scripts/gen-gljimports.sh ./cmd/gen-import-interop/main.go ./internal/genpkg/genpkg.go \ - $(wildcard ./pkg/lang/*.go) $(wildcard ./pkg/runtime/*.go) +pkg/gen/gljimports/gljimports_%.go: $(GO) \ + ./scripts/gen-gljimports.sh \ + ./cmd/gen-import-interop/main.go \ + ./internal/genpkg/genpkg.go \ + $(wildcard ./pkg/lang/*.go) \ + $(wildcard ./pkg/runtime/*.go) @echo "Generating $@" - @./scripts/gen-gljimports.sh $@ $* $(GO_CMD) + @./scripts/gen-gljimports.sh $@ $* go -pkg/stdlib/clojure/%.glj: scripts/rewrite-core/originals/%.clj scripts/rewrite-core/run.sh scripts/rewrite-core/rewrite.clj +pkg/stdlib/glojure/%.glj: $(CLOJURE) \ + scripts/rewrite-core/originals/%.clj \ + scripts/rewrite-core/run.sh \ + scripts/rewrite-core/rewrite.clj @echo "Rewriting $< to $@" @mkdir -p $(dir $@) @scripts/rewrite-core/run.sh $< > $@ -bin/%/glj: generate $(wildcard ./cmd/glj/*.go) $(wildcard ./pkg/**/*.go) $(wildcard ./internal/**/*.go) +bin/%/glj: $(GLJ-DEPS) @echo "Building $@" @mkdir -p $(dir $@) @scripts/build-glj.sh $@ $* -bin/%/glj.wasm: $(wildcard ./cmd/glj/*.go) $(wildcard ./pkg/**/*.go) $(wildcard ./internal/**/*.go) +bin/%/glj.wasm: $(GLJ-DEPS) @echo "Building $@" @mkdir -p $(dir $@) @scripts/build-glj.sh $@ $* -.PHONY: vet -vet: - @go vet ./... +vet: $(GO) + go vet ./... -.PHONY: $(TEST_TARGETS) -$(TEST_TARGETS): gocmd $(GLJ) - @$(GLJ) $(basename $@) +$(TEST-TARGETS): $(GO) $(GLJ) + go run ./cmd/glj/main.go $(basename $@) .PHONY: test -test: $(TEST_TARGETS) # vet - vet is disabled until we fix errors in generated code - @cd test/clojure-test-suite && \ - ../../$(GLJ) test-glojure.glj --expect-failures 38 --expect-errors 151 2>/dev/null +test: $(TEST-TARGETS) -.PHONY: format -format: +format: $(GO) @if go fmt ./... | grep -q ''; then \ echo "Files were formatted. Please commit the changes."; \ exit 1; \ fi -.PHONY: update-clojure-sources update-clojure-sources: - @scripts/rewrite-core/update-clojure-sources.sh $(CLOJURE_STDLIB_VERSION) + @scripts/rewrite-core/update-clojure-sources.sh $(CLOJURE-STDLIB-VERSION) + +test-bug: $(GLJ) + -glj <(echo '(throw (Exception. "foo"))') + -glj <(echo '(throw (new Exception "foo"))')