v
Raw file | 212 loc (180 sloc) | 4.54 KB | Latest commit hash 85b4af544
1CC ?= cc
2CFLAGS ?=
3LDFLAGS ?=
4TMPDIR ?= /tmp
5VROOT ?= .
6VC ?= ./vc
7VEXE ?= ./v
8VCREPO ?= https://github.com/vlang/vc
9TCCREPO ?= https://github.com/vlang/tccbin
10LEGACYREPO ?= https://github.com/macports/macports-legacy-support
11
12VCFILE := v.c
13TMPTCC := $(VROOT)/thirdparty/tcc
14LEGACYLIBS := $(VROOT)/thirdparty/legacy
15TMPLEGACY := $(LEGACYLIBS)/source
16TCCOS := unknown
17TCCARCH := unknown
18GITCLEANPULL := git clean -xf && git pull --quiet
19GITFASTCLONE := 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
26ifneq ($(filter $(_SYS),MSYS MinGW),)
27WIN32 := 1
28VEXE := ./v.exe
29endif
30
31ifeq ($(_SYS),Linux)
32LINUX := 1
33TCCOS := linux
34ifneq ($(shell ldd /bin/ls | grep musl),)
35TCCOS := linuxmusl
36endif
37endif
38
39ifeq ($(_SYS),Darwin)
40MAC := 1
41TCCOS := macos
42ifeq ($(shell expr $(shell uname -r | cut -d. -f1) \<= 15), 1)
43LEGACY := 1
44endif
45endif
46
47ifeq ($(_SYS),FreeBSD)
48TCCOS := freebsd
49LDFLAGS += -lexecinfo
50endif
51
52ifeq ($(_SYS),NetBSD)
53TCCOS := netbsd
54LDFLAGS += -lexecinfo
55endif
56
57ifeq ($(_SYS),OpenBSD)
58TCCOS := openbsd
59LDFLAGS += -lexecinfo
60endif
61
62ifdef ANDROID_ROOT
63ANDROID := 1
64undefine LINUX
65TCCOS := android
66endif
67#####
68
69ifdef WIN32
70TCCOS := windows
71VCFILE := v_win.c
72endif
73
74TCCARCH := $(shell uname -m 2>/dev/null || echo unknown)
75
76ifeq ($(TCCARCH),x86_64)
77 TCCARCH := amd64
78else
79ifneq ($(filter x86%,$(TCCARCH)),)
80 TCCARCH := i386
81else
82ifeq ($(TCCARCH),arm64)
83 TCCARCH := arm64
84else
85ifneq ($(filter arm%,$(TCCARCH)),)
86 TCCARCH := arm
87# otherwise, just use the arch name
88endif
89endif
90endif
91endif
92
93.PHONY: all clean rebuild check fresh_vc fresh_tcc fresh_legacy check_for_working_tcc
94
95ifdef prod
96VFLAGS+=-prod
97endif
98
99all: latest_vc latest_tcc latest_legacy
100ifdef 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
106else
107ifdef 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)
112endif
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
117endif
118 @$(VEXE) run cmd/tools/detect_tcc.v
119 @echo "V has been successfully built"
120 @$(VEXE) -version
121
122clean:
123 rm -rf $(TMPTCC)
124 rm -rf $(LEGACYLIBS)
125 rm -rf $(VC)
126
127rebuild: clean all
128
129ifndef local
130latest_vc: $(VC)/.git/config
131 cd $(VC) && $(GITCLEANPULL)
132else
133latest_vc:
134 @echo "Using local vc"
135endif
136
137check_for_working_tcc:
138 @$(TMPTCC)/tcc.exe --version > /dev/null 2> /dev/null || echo "The executable '$(TMPTCC)/tcc.exe' does not work."
139
140fresh_vc:
141 rm -rf $(VC)
142 $(GITFASTCLONE) $(VCREPO) $(VC)
143
144ifndef local
145latest_tcc: $(TMPTCC)/.git/config
146 cd $(TMPTCC) && $(GITCLEANPULL)
147 @$(MAKE) --quiet check_for_working_tcc 2> /dev/null
148else
149latest_tcc:
150 @echo "Using local tcc"
151 @$(MAKE) --quiet check_for_working_tcc 2> /dev/null
152endif
153
154fresh_tcc:
155 rm -rf $(TMPTCC)
156ifndef local
157# Check wether a TCC branch exists for the user's system configuration.
158ifneq (,$(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
161else
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
165endif
166else
167 @echo "Using local tccbin"
168 @$(MAKE) --quiet check_for_working_tcc 2> /dev/null
169endif
170
171ifndef local
172latest_legacy: $(TMPLEGACY)/.git/config
173ifdef LEGACY
174 cd $(TMPLEGACY) && $(GITCLEANPULL)
175endif
176else
177latest_legacy:
178ifdef LEGACY
179 @echo "Using local legacysupport"
180endif
181endif
182
183fresh_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:
194ifdef LEGACY
195 $(MAKE) fresh_legacy
196endif
197
198asan:
199 $(MAKE) all CFLAGS='-fsanitize=address,undefined'
200
201selfcompile:
202 $(VEXE) -cg -o v cmd/v
203
204selfcompile-static:
205 $(VEXE) -cg -cflags '--static' -o v-static cmd/v
206
207### NB: Please keep this Makefile and make.bat simple.
208install:
209 @echo 'Please use `sudo ./v symlink` instead.'
210
211check:
212 $(VEXE) test-all