1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
|
#
# Makefile expects to run at the project root, and not nested inside anywhere
#
# cd $DESK/Simple/chapterXX; make
#
#
# first time only - this is the only thing that hits the Interwebs
#
# make lib
#
# any time you want to nuke everything from space:
#
# make clean tags
#
# run the tests
#
# make tests
#######################################################
#
# Boilerplate because make syntax isn't the best
#
# Use bash for recipes
SHELL := /bin/bash
# Remove target on error (no broken leftover files)
.DELETE_ON_ERROR:
# Keep partial builds but not partial recipes; keeping them speeds up the next `make`
.NOTINTERMEDIATE:
# for printing variable values
# usage: make print-VARIABLE
# > VARIABLE = value_of_variable
print-% : ; @echo $* = $($*)
# literal space
space := $() $()
# Decide OS-specific questions
# jar-file seperator
ifeq ($(OS),Windows_NT)
SEP = ;
else
SEP = :
endif
# Find a reasonable ctags.
CTAGS = $(shell which ctags)
# Hack for MacOS: /usr/bin/ctags is unfriendly, so look for ctags from brew
ifeq ($(UNAME),Darwin)
CTAGS = $(shell brew list ctags 2> /dev/null | grep bin/ctags)
endif
# Fun Args to javac. Mostly limit to java8 source definitions, and fairly
# aggressive lint warnings.
JAVAC_ARGS = -g
# Source code
SIMPLE := com/seaofnodes/simple
SRC := src/main/java
TST := src/test/java
CLZDIR:= build/classes
main_javas := $(wildcard $(SRC)/$(SIMPLE)/*java $(SRC)/$(SIMPLE)/*/*java $(SRC)/$(SIMPLE)/node/cpus/*/*java)
test_javas := $(wildcard $(TST)/$(SIMPLE)/*java $(TST)/$(SIMPLE)/*/*java)
main_classes := $(patsubst $(SRC)/%java,$(CLZDIR)/main/%class,$(main_javas))
include $(firstword $(wildcard ../graph/graph.mk graph/graph.mk))
include $(firstword $(wildcard ../print/print.mk print/print.mk))
include $(firstword $(wildcard ../isa/isa.mk isa/isa.mk))
test_classes := $(patsubst $(TST)/%java,$(CLZDIR)/test/%class,$(test_javas))
test_cp := $(patsubst $(TST)/$(SIMPLE)/%.java,com.seaofnodes.simple.%,$(wildcard $(TST)/$(SIMPLE)/*Test.java)) com.seaofnodes.simple.codegen.X86EncodingTest
classes = $(main_classes) $(test_classes)
# All the libraries
libs = $(wildcard lib/*jar)
jars = $(subst $(space),$(SEP),$(libs))
default_targets := $(CLZDIR)/main/.mtag $(CLZDIR)/test/.ttag
# Optionally add ctags to the default target if a reasonable one was found.
ifneq ($(CTAGS),)
default_targets += tags
endif
default: $(default_targets)
#######################################################
# Compile the chapter and shared viewer sources together
$(CLZDIR)/main/.mtag: $(main_javas) Makefile
@[ -d $(CLZDIR)/main ] || mkdir -p $(CLZDIR)/main
@# This crap is really just "javac", but with a beautiful error message.
@# The very very long list of java files is suppressed and counted.
@# The required output "Note: blah blah deprecated blah" is suppressed.
$(file >.argsM.txt,$(main_javas))
@if [ ! -z "$(main_javas)" ] ; then \
echo "compiling main because " $< " and " `wc -w < .argsM.txt` " more files" ; \
if ! javac $(JAVAC_ARGS) -cp "$(CLZDIR)/main$(SEP)$(jars)" -sourcepath $(SRC) -d $(CLZDIR)/main $(main_javas) >& .out.txt ; then \
cat .out.txt ; \
exit 1; \
fi ; \
rm -rf .out.txt ; \
fi
@touch $(CLZDIR)/main/.mtag
@rm -f .argsM.txt
$(main_classes): $(CLZDIR)/main/.mtag
#######################################################
OODT := $(isa_test_javas)
$(CLZDIR)/test/.ttag: $(test_classes) $(test_javas) $(isa_test_javas) $(CLZDIR)/main/.mtag
@[ -d $(CLZDIR)/test ] || mkdir -p $(CLZDIR)/test
$(file >.argsT.txt,$(OODT))
@if [ ! -z "$(OODT)" ] ; then \
echo "compiling test because " $< " and " `wc -w < .argsT.txt` " more files" ; \
if ! javac $(JAVAC_ARGS) -cp "$(CLZDIR)/test$(SEP)$(CLZDIR)/main$(SEP)$(jars)" -sourcepath $(TST) -d $(CLZDIR)/test $(OODT) >& .out.txt ; then \
cat .out.txt ; \
exit 1; \
fi ; \
rm -rf .out.txt ; \
fi
@touch $(CLZDIR)/test/.ttag
@rm -f .argsT.txt
# Collect just the out-of-date files
$(test_classes): $(CLZDIR)/test/%class: $(TST)/%java
$(eval OODT += $$<)
#######################################################
# Base launch line for JVM tests
JVM=nice java -ea -cp "$(CLZDIR)/main${SEP}${jars}${SEP}$(CLZDIR)/test"
tests: $(CLZDIR)/main/.mtag $(CLZDIR)/test/.ttag
@echo "testing " $(test_cp)
@[ -d build/objs ] || mkdir -p build/objs
@$(JVM) org.junit.runner.JUnitCore $(test_cp)
@$(JVM) org.junit.runner.JUnitCore com.seaofnodes.simple.FuzzerWrap
fuzzer: $(CLZDIR)/main/.mtag $(CLZDIR)/test/.ttag
@echo "fuzzing " $(test_cp)
@$(JVM) org.junit.runner.JUnitCore com.seaofnodes.simple.FuzzerWrap
# Build a Simple jar
release: build/release/simple.jar
# Build a Simple jar
build/release/simple.jar: $(CLZDIR)/main/.mtag $(CLZDIR)/test/.ttag
@echo "jarring " $@ " because " $?
@[ -d $(dir $@) ] || mkdir -p $(dir $@)
@jar cf build/release/simple.jar -C $(CLZDIR)/main . -C $(CLZDIR)/test . -C $(SRC)/$(SIMPLE) . -C $(TST)/$(SIMPLE) .
.PHONY: clean
clean:
rm -rf build
rm -f TAGS
(find . -name "*~" -exec rm {} \; 2>/dev/null; exit 0)
# Download libs from maven
lib: lib/junit-4.12.jar lib/hamcrest-core-1.3.jar
# Jars
lib/junit-4.12.jar:
@[ -d lib ] || mkdir -p lib
@(cd lib; wget https://repo1.maven.org/maven2/junit/junit/4.12/junit-4.12.jar)
lib/hamcrest-core-1.3.jar:
@[ -d lib ] || mkdir -p lib
@(cd lib; wget https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar)
# Build emacs tags (part of a tasty emacs ide experience)
tags: $(main_javas) $(test_javas)
@rm -f TAGS
@$(CTAGS) -e --recurse=yes --extra=+q --fields=+fksaiS $(SRC) $(TST)
spill-stats: $(CLZDIR)/main/.mtag $(CLZDIR)/test/.ttag
@[ -d build/objs ] || mkdir -p build/objs
@$(JVM) com.seaofnodes.simple.SpillStats
.PHONY: spill-stats
.PHONY: build
build: $(CLZDIR)/main/.mtag
|