1 | CC ?= cc |
2 | CFLAGS ?= |
3 | LDFLAGS ?= |
4 | TMPDIR ?= /tmp |
5 | VROOT ?= . |
6 | VC ?= ./vc |
7 | VEXE ?= ./v |
8 | VCREPO ?= https://github.com/vlang/vc |
9 | TCCREPO ?= https://github.com/vlang/tccbin |
10 | LEGACYREPO ?= https://github.com/macports/macports-legacy-support |
11 | |
12 | VCFILE := v.c |
13 | TMPTCC := $(VROOT)/thirdparty/tcc |
14 | LEGACYLIBS := $(VROOT)/thirdparty/legacy |
15 | TMPLEGACY := $(LEGACYLIBS)/source |
16 | TCCOS := unknown |
17 | TCCARCH := unknown |
18 | GITCLEANPULL := git clean -xf && git pull --quiet |
19 | GITFASTCLONE := git clone --filter=blob:none --quiet |
20 | |
21 | #### Platform detections and overrides: |
22 | _SYS := $(shell uname 2>/dev/null || echo Unknown) |
23 | _SYS := $(patsubst MSYS%,MSYS,$(_SYS)) |
24 | _SYS := $(patsubst MINGW%,MinGW,$(_SYS)) |
25 | |
26 | ifneq ($(filter $(_SYS),MSYS MinGW),) |
27 | WIN32 := 1 |
28 | VEXE := ./v.exe |
29 | endif |
30 | |
31 | ifeq ($(_SYS),Linux) |
32 | LINUX := 1 |
33 | TCCOS := linux |
34 | ifneq ($(shell ldd /bin/ls | grep musl),) |
35 | TCCOS := linuxmusl |
36 | endif |
37 | endif |
38 | |
39 | ifeq ($(_SYS),Darwin) |
40 | MAC := 1 |
41 | TCCOS := macos |
42 | ifeq ($(shell expr $(shell uname -r | cut -d. -f1) \<= 15), 1) |
43 | LEGACY := 1 |
44 | endif |
45 | endif |
46 | |
47 | ifeq ($(_SYS),FreeBSD) |
48 | TCCOS := freebsd |
49 | LDFLAGS += -lexecinfo |
50 | endif |
51 | |
52 | ifeq ($(_SYS),NetBSD) |
53 | TCCOS := netbsd |
54 | LDFLAGS += -lexecinfo |
55 | endif |
56 | |
57 | ifeq ($(_SYS),OpenBSD) |
58 | TCCOS := openbsd |
59 | LDFLAGS += -lexecinfo |
60 | endif |
61 | |
62 | ifdef ANDROID_ROOT |
63 | ANDROID := 1 |
64 | undefine LINUX |
65 | TCCOS := android |
66 | endif |
67 | ##### |
68 | |
69 | ifdef WIN32 |
70 | TCCOS := windows |
71 | VCFILE := v_win.c |
72 | endif |
73 | |
74 | TCCARCH := $(shell uname -m 2>/dev/null || echo unknown) |
75 | |
76 | ifeq ($(TCCARCH),x86_64) |
77 | TCCARCH := amd64 |
78 | else |
79 | ifneq ($(filter x86%,$(TCCARCH)),) |
80 | TCCARCH := i386 |
81 | else |
82 | ifeq ($(TCCARCH),arm64) |
83 | TCCARCH := arm64 |
84 | else |
85 | ifneq ($(filter arm%,$(TCCARCH)),) |
86 | TCCARCH := arm |
87 | # otherwise, just use the arch name |
88 | endif |
89 | endif |
90 | endif |
91 | endif |
92 | |
93 | .PHONY: all clean rebuild check fresh_vc fresh_tcc fresh_legacy check_for_working_tcc |
94 | |
95 | ifdef prod |
96 | VFLAGS+=-prod |
97 | endif |
98 | |
99 | all: latest_vc latest_tcc latest_legacy |
100 | ifdef WIN32 |
101 | $(CC) $(CFLAGS) -std=c99 -municode -w -o v1.exe $(VC)/$(VCFILE) $(LDFLAGS) |
102 | v1.exe -no-parallel -o v2.exe $(VFLAGS) cmd/v |
103 | v2.exe -o $(VEXE) $(VFLAGS) cmd/v |
104 | del v1.exe |
105 | del v2.exe |
106 | else |
107 | ifdef LEGACY |
108 | $(MAKE) -C $(TMPLEGACY) |
109 | $(MAKE) -C $(TMPLEGACY) PREFIX=$(realpath $(LEGACYLIBS)) CFLAGS=$(CFLAGS) LDFLAGS=$(LDFLAGS) install |
110 | rm -rf $(TMPLEGACY) |
111 | $(eval override LDFLAGS+=-L$(realpath $(LEGACYLIBS))/lib -lMacportsLegacySupport) |
112 | endif |
113 | $(CC) $(CFLAGS) -std=gnu99 -w -o v1.exe $(VC)/$(VCFILE) -lm -lpthread $(LDFLAGS) |
114 | ./v1.exe -no-parallel -o v2.exe $(VFLAGS) cmd/v |
115 | ./v2.exe -nocache -o $(VEXE) $(VFLAGS) cmd/v |
116 | rm -rf v1.exe v2.exe |
117 | endif |
118 | @$(VEXE) run cmd/tools/detect_tcc.v |
119 | @echo "V has been successfully built" |
120 | @$(VEXE) -version |
121 | |
122 | clean: |
123 | rm -rf $(TMPTCC) |
124 | rm -rf $(LEGACYLIBS) |
125 | rm -rf $(VC) |
126 | |
127 | rebuild: clean all |
128 | |
129 | ifndef local |
130 | latest_vc: $(VC)/.git/config |
131 | cd $(VC) && $(GITCLEANPULL) |
132 | else |
133 | latest_vc: |
134 | @echo "Using local vc" |
135 | endif |
136 | |
137 | check_for_working_tcc: |
138 | @$(TMPTCC)/tcc.exe --version > /dev/null 2> /dev/null || echo "The executable '$(TMPTCC)/tcc.exe' does not work." |
139 | |
140 | fresh_vc: |
141 | rm -rf $(VC) |
142 | $(GITFASTCLONE) $(VCREPO) $(VC) |
143 | |
144 | ifndef local |
145 | latest_tcc: $(TMPTCC)/.git/config |
146 | cd $(TMPTCC) && $(GITCLEANPULL) |
147 | @$(MAKE) --quiet check_for_working_tcc 2> /dev/null |
148 | else |
149 | latest_tcc: |
150 | @echo "Using local tcc" |
151 | @$(MAKE) --quiet check_for_working_tcc 2> /dev/null |
152 | endif |
153 | |
154 | fresh_tcc: |
155 | rm -rf $(TMPTCC) |
156 | ifndef local |
157 | # Check wether a TCC branch exists for the user's system configuration. |
158 | ifneq (,$(findstring thirdparty-$(TCCOS)-$(TCCARCH), $(shell git ls-remote --heads $(TCCREPO) | sed 's/^[a-z0-9]*\trefs.heads.//'))) |
159 | $(GITFASTCLONE) --branch thirdparty-$(TCCOS)-$(TCCARCH) $(TCCREPO) $(TMPTCC) |
160 | @$(MAKE) --quiet check_for_working_tcc 2> /dev/null |
161 | else |
162 | @echo 'Pre-built TCC not available for thirdparty-$(TCCOS)-$(TCCARCH) at $(TCCREPO), will use the system compiler: $(CC)' |
163 | $(GITFASTCLONE) --branch thirdparty-unknown-unknown $(TCCREPO) $(TMPTCC) |
164 | @$(MAKE) --quiet check_for_working_tcc 2> /dev/null |
165 | endif |
166 | else |
167 | @echo "Using local tccbin" |
168 | @$(MAKE) --quiet check_for_working_tcc 2> /dev/null |
169 | endif |
170 | |
171 | ifndef local |
172 | latest_legacy: $(TMPLEGACY)/.git/config |
173 | ifdef LEGACY |
174 | cd $(TMPLEGACY) && $(GITCLEANPULL) |
175 | endif |
176 | else |
177 | latest_legacy: |
178 | ifdef LEGACY |
179 | @echo "Using local legacysupport" |
180 | endif |
181 | endif |
182 | |
183 | fresh_legacy: |
184 | rm -rf $(LEGACYLIBS) |
185 | $(GITFASTCLONE) $(LEGACYREPO) $(TMPLEGACY) |
186 | |
187 | $(TMPTCC)/.git/config: |
188 | $(MAKE) fresh_tcc |
189 | |
190 | $(VC)/.git/config: |
191 | $(MAKE) fresh_vc |
192 | |
193 | $(TMPLEGACY)/.git/config: |
194 | ifdef LEGACY |
195 | $(MAKE) fresh_legacy |
196 | endif |
197 | |
198 | asan: |
199 | $(MAKE) all CFLAGS='-fsanitize=address,undefined' |
200 | |
201 | selfcompile: |
202 | $(VEXE) -cg -o v cmd/v |
203 | |
204 | selfcompile-static: |
205 | $(VEXE) -cg -cflags '--static' -o v-static cmd/v |
206 | |
207 | ### NB: Please keep this Makefile and make.bat simple. |
208 | install: |
209 | @echo 'Please use `sudo ./v symlink` instead.' |
210 | |
211 | check: |
212 | $(VEXE) test-all |