Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
152 changes: 79 additions & 73 deletions Makefile
Original file line number Diff line number Diff line change
@@ -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"))')