-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathMakefile
More file actions
234 lines (187 loc) · 5.22 KB
/
Makefile
File metadata and controls
234 lines (187 loc) · 5.22 KB
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
CFLAGS += -std=c2x
CFLAGS += -Wall
CFLAGS += -Iinclude
CFLAGS += -Ilibco
CFLAGS += -Idtoa
CFLAGS += -Ilibmd/include
CFLAGS += -isystem/usr/local/include
CFLAGS += $(shell pkg-config --cflags libffi)
CFLAGS += $(shell pcre2-config --cflags)
CFLAGS += -Wno-switch
CFLAGS += -Wno-unused-value
CFLAGS += -Wno-unused-function
CFLAGS += -Wno-empty-body
CFLAGS += -D_GNU_SOURCE
CFLAGS += -DPCRE2_CODE_UNIT_WIDTH=8
CFLAGS += -DCURL_STATICLIB -DPCRE2_CODE_UNIT_WIDTH=8 -DPCRE2_STATIC -DUTF8PROC_STATIC -D_GNU_SOURCE
CFLAGS += -fno-omit-frame-pointer
ifeq ($(shell uname -m),arm64)
CFLAGS += -isystem/opt/homebrew/include
LDFLAGS += -L/opt/homebrew/lib
LDFLAGS += -Wl,-rpath,/opt/homebrew/lib
endif
ifeq ($(shell uname -s),Darwin)
LDFLAGS += -framework Accelerate
endif
LDFLAGS += -lm
LDFLAGS += -lcurses
LDFLAGS += -L/usr/local/lib
LDFLAGS += -lpthread
LDFLAGS += -lutf8proc
LDFLAGS += -lsqlite3
LDFLAGS += -lxxhash
LDFLAGS += -ldl
LDFLAGS += -lffi
LDFLAGS += $(shell pcre2-config --libs8)
ifndef DEBUG
LDFLAGS += -lmimalloc
endif
ifdef JEMALLOC
LDFLAGS += -L$(shell jemalloc-config --libdir)
LDFLAGS += -Wl,-rpath,$(shell jemalloc-config --libdir)
LDFLAGS += -ljemalloc $(shell jemalloc-config --libs)
endif
ifdef DEBUG_NAMES
CFLAGS += -DTY_DEBUG_NAMES
endif
ifdef PROFILE_TYPES
CFLAGS += -DTY_PROFILE_TYPES
endif
ifdef NO_JIT
CFLAGS += -DTY_NO_JIT
endif
TEST_FILTER ?= "."
PROG := ty
PREFIX ?= /usr/local
bindir := /bin
ifndef LOG
CFLAGS += -DTY_NO_LOG
endif
ifdef UNSAFE
CFLAGS += -DTY_UNSAFE
endif
ifdef RELEASE
CFLAGS += -O3
CFLAGS += -DTY_RELEASE
CFLAGS += -mcpu=native
CFLAGS += -mtune=native
CFLAGS += -flto
else ifdef DEBUG
CFLAGS += -O0
CFLAGS += -fno-omit-frame-pointer
CFLAGS += -fno-sanitize=nonnull-attribute
CFLAGS += -fsanitize=address
CFLAGS += -mllvm --asan-stack=0
CFLAGS += -fno-sanitize-address-use-after-scope
CFLAGS += -g3
else ifdef TDEBUG
CFLAGS += -O0
CFLAGS += -fsanitize=thread
CFLAGS += -ggdb3
else ifndef LOG
CFLAGS += -O0
CFLAGS += -g
CFLAGS += -DTY_RELEASE
else
CFLAGS += -O1
endif
ifdef GENPROF
CFLAGS += -fprofile-generate
endif
ifdef USEPROF
CFLAGS += -fprofile-use
endif
ifdef LTO
CFLAGS += -flto
CFLAGS += -fomit-frame-pointer
CFLAGS += -fwhole-program
endif
ifdef WITHOUT_OS
CFLAGS += -DTY_WITHOUT_OS
endif
ifndef NO_NSYNC
CFLAGS += -DTY_USE_NSYNC
CFLAGS += -Insync/public
endif
# --- Default to ncpu parallel jobs ---
NPROC := $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)
MAKEFLAGS += -j$(NPROC)
# --- Auto-rebuild on config change ---
BUILD_SIG := DEBUG=$(DEBUG)|LOG=$(LOG)|NO_JIT=$(NO_JIT)|RELEASE=$(RELEASE)|TDEBUG=$(TDEBUG)|UNSAFE=$(UNSAFE)|LTO=$(LTO)|JEMALLOC=$(JEMALLOC)|TY_PROFILER=$(TY_PROFILER)|DEBUG_NAMES=$(DEBUG_NAMES)|PROFILE_TYPES=$(PROFILE_TYPES)|WITHOUT_OS=$(WITHOUT_OS)|GENPROF=$(GENPROF)|USEPROF=$(USEPROF)|NO_NSYNC=$(NO_NSYNC)
BUILD_SIG_FILE := obj/.build_sig
PREV_SIG := $(shell cat $(BUILD_SIG_FILE) 2>/dev/null)
ifneq ($(BUILD_SIG),$(PREV_SIG))
$(shell rm -f obj/*.o obj/tyls/*.o $(PROG))
$(shell mkdir -p obj obj/tyls)
$(shell echo '$(BUILD_SIG)' > $(BUILD_SIG_FILE))
endif
# DynASM configuration
LUAJIT := luajit
DYNASM := $(LUAJIT) dynasm/dynasm.lua
ifeq ($(shell uname -m),arm64)
DYNASM_ARCH := arm64
JIT_DASC := src/jit_arm64.dasc
JIT_HDR := src/jit_arm64.h
else
DYNASM_ARCH := x64
JIT_DASC := src/jit_x64.dasc
JIT_HDR := src/jit_x64.h
endif
SOURCES := $(wildcard src/*.c)
OBJECTS := $(patsubst src/%.c,obj/%.o,$(SOURCES))
TYLS_OBJECTS := $(patsubst src/%.c,obj/tyls/%.o,$(SOURCES))
TYPROF_OBJECTS := $(patsubst src/%.c,obj/typrof/%.o,$(SOURCES))
EXTERNAL := libco/libco.o dtoa/dtoa.o libmd/libmd.a
ifndef NO_NSYNC
EXTERNAL += nsync/out/libnsync.a
endif
ASSEMBLY := $(patsubst %.c,%.s,$(SOURCES))
all: $(PROG)
# DynASM pre-build step: generate JIT code emission header
$(JIT_HDR): $(JIT_DASC)
@echo dynasm $<
@$(DYNASM) -o $@ $<
include/keywords.h: src/keywords.gperf
@echo gperf $<
@gperf $< > $@
obj/token.o: include/keywords.h
obj/tyls/token.o: include/keywords.h
# jit.c depends on the generated DynASM header
obj/jit.o: $(JIT_HDR)
obj/tyls/jit.o: $(JIT_HDR)
ty: ty.c $(OBJECTS) $(EXTERNAL)
@echo cc $<
@$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
tyls: tyls.c $(TYLS_OBJECTS) $(EXTERNAL)
@echo cc $<
@$(CC) $(CFLAGS) -DTY_LS -o $@ $^ $(LDFLAGS)
typrof: ty.c $(TYPROF_OBJECTS) $(EXTERNAL)
@echo cc $<
@$(CC) $(CFLAGS) -DTY_PROFILER -o $@ $^ $(LDFLAGS)
asm: $(ASSEMBLY)
%.s: src/%.c
@echo cc $<
$(CC) $(CFLAGS) -S -o asm/$@ -DFILENAME=$(patsubst %.c,%,$<) $<
libco/libco.o: libco/libco.c
$(CC) $(CFLAGS) -c -o $@ -DLIBCO_MP $<
dtoa/dtoa.o: dtoa/SwiftDtoa.c
$(CC) $(CFLAGS) -c -o $@ $<
obj/%.o: src/%.c
@echo cc $<
@$(CC) $(CFLAGS) -c -o $@ -DFILENAME=$(patsubst src/%.c,%,$<) $<
obj/tyls/%.o: src/%.c
@echo cc $<
@$(CC) $(CFLAGS) -c -o $@ -DTY_LS -DFILENAME=$(patsubst src/%.c,%,$<) $<
obj/typrof/%.o: src/%.c
@echo cc $<
@$(CC) $(CFLAGS) -c -o $@ -DTY_PROFILER -DFILENAME=$(patsubst src/%.c,%,$<) $<
clean:
rm -rf $(PROG) *.gcda $(OBJECTS) $(TYLS_OBJECTS) $(TYPROF_OBJECTS) libco/libco.o dtoa/dtoa.o include/keywords.h $(BUILD_SIG_FILE)
test:
./ty test.ty
install: $(PROG)
sudo install -m755 -s $(PROG) $(DESTDIR)$(PREFIX)$(bindir)
install -d $(HOME)/.ty
install -m644 lib/* $(HOME)/.ty
based: $(SOURCES)
cat $^ | gcc-13 $(CFLAGS) -c -x c -o $@ -