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