v
Зеркало из https://github.com/vlang/v
/
GNUmakefile
214 строк · 4.5 Кб
1CC ?= cc2CFLAGS ?=3LDFLAGS ?=4TMPDIR ?= /tmp5VROOT ?= .6VC ?= ./vc7VEXE ?= ./v8VCREPO ?= https://github.com/vlang/vc9TCCREPO ?= https://github.com/vlang/tccbin10LEGACYREPO ?= https://github.com/macports/macports-legacy-support11
12VCFILE := v.c13TMPTCC := $(VROOT)/thirdparty/tcc14LEGACYLIBS := $(VROOT)/thirdparty/legacy15TMPLEGACY := $(LEGACYLIBS)/source16TCCOS := unknown17TCCARCH := unknown18GITCLEANPULL := git clean -xf && git pull --quiet19GITFASTCLONE := git clone --filter=blob:none --quiet20
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 := 128VEXE := ./v.exe29endif
30
31ifeq ($(_SYS),Linux)32LINUX := 133TCCOS := linux34ifneq ($(shell ldd /bin/ls | grep musl),)35TCCOS := linuxmusl36endif
37endif
38
39ifeq ($(_SYS),Darwin)40MAC := 141TCCOS := macos42ifeq ($(shell expr $(shell uname -r | cut -d. -f1) \<= 15), 1)43LEGACY := 144endif
45endif
46
47ifeq ($(_SYS),FreeBSD)48TCCOS := freebsd49LDFLAGS += -lexecinfo50endif
51
52ifeq ($(_SYS),NetBSD)53TCCOS := netbsd54LDFLAGS += -lexecinfo55endif
56
57ifeq ($(_SYS),OpenBSD)58TCCOS := openbsd59LDFLAGS += -lexecinfo60endif
61
62ifdef ANDROID_ROOT63ANDROID := 164undefine LINUX65TCCOS := android66endif
67#####
68
69ifdef WIN3270TCCOS := windows71VCFILE := v_win.c72endif
73
74TCCARCH := $(shell uname -m 2>/dev/null || echo unknown)75
76ifeq ($(TCCARCH),x86_64)77TCCARCH := amd6478else
79ifneq ($(filter x86%,$(TCCARCH)),)80TCCARCH := i38681else
82ifeq ($(TCCARCH),arm64)83TCCARCH := arm6484else
85ifneq ($(filter arm%,$(TCCARCH)),)86TCCARCH := arm87# 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_tcc94
95ifdef prod96VFLAGS+=-prod97endif
98
99all: latest_vc latest_tcc latest_legacy100ifdef WIN32101$(CC) $(CFLAGS) -std=c99 -municode -w -o v1.exe $(VC)/$(VCFILE) $(LDFLAGS) -lws2_32102v1.exe -no-parallel -o v2.exe $(VFLAGS) cmd/v103v2.exe -o $(VEXE) $(VFLAGS) cmd/v104$(RM) v1.exe105$(RM) v2.exe106else
107ifdef LEGACY108$(MAKE) -C $(TMPLEGACY)109$(MAKE) -C $(TMPLEGACY) PREFIX=$(realpath $(LEGACYLIBS)) CFLAGS=$(CFLAGS) LDFLAGS=$(LDFLAGS) install110rm -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/v115./v2.exe -nocache -o $(VEXE) $(VFLAGS) cmd/v116rm -rf v1.exe v2.exe
117endif
118@$(VEXE) run cmd/tools/detect_tcc.v119@echo "V has been successfully built"120@$(VEXE) -version121
122clean:123rm -rf $(TMPTCC)124rm -rf $(LEGACYLIBS)125rm -rf $(VC)126
127rebuild: clean all128
129ifndef local130latest_vc: $(VC)/.git/config131cd $(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:141rm -rf $(VC)142$(GITFASTCLONE) $(VCREPO) $(VC)143
144ifndef local145latest_tcc: $(TMPTCC)/.git/config146cd $(TMPTCC) && $(GITCLEANPULL)147ifneq (,$(wildcard ./tcc.exe))148@$(MAKE) --quiet check_for_working_tcc 2> /dev/null149endif
150
151else
152latest_tcc:153@echo "Using local tcc"154@$(MAKE) --quiet check_for_working_tcc 2> /dev/null155endif
156
157fresh_tcc:158rm -rf $(TMPTCC)159ifndef local160# Check whether a TCC branch exists for the user's system configuration.
161ifneq (,$(findstring thirdparty-$(TCCOS)-$(TCCARCH), $(shell git ls-remote --heads $(TCCREPO) | sed 's/^[a-z0-9]*\trefs.heads.//')))162$(GITFASTCLONE) --branch thirdparty-$(TCCOS)-$(TCCARCH) $(TCCREPO) $(TMPTCC)163@$(MAKE) --quiet check_for_working_tcc 2> /dev/null164else
165@echo 'Pre-built TCC not available for thirdparty-$(TCCOS)-$(TCCARCH) at $(TCCREPO), will use the system compiler: $(CC)'166$(GITFASTCLONE) --branch thirdparty-unknown-unknown $(TCCREPO) $(TMPTCC)167endif
168else
169@echo "Using local tccbin"170@$(MAKE) --quiet check_for_working_tcc 2> /dev/null171endif
172
173ifndef local174latest_legacy: $(TMPLEGACY)/.git/config175ifdef LEGACY176cd $(TMPLEGACY) && $(GITCLEANPULL)177endif
178else
179latest_legacy:180ifdef LEGACY181@echo "Using local legacysupport"182endif
183endif
184
185fresh_legacy:186rm -rf $(LEGACYLIBS)187$(GITFASTCLONE) $(LEGACYREPO) $(TMPLEGACY)188
189$(TMPTCC)/.git/config:190$(MAKE) fresh_tcc191
192$(VC)/.git/config:193$(MAKE) fresh_vc194
195$(TMPLEGACY)/.git/config:196ifdef LEGACY197$(MAKE) fresh_legacy198endif
199
200asan:201$(MAKE) all CFLAGS='-fsanitize=address,undefined'202
203selfcompile:204$(VEXE) -cg -o v cmd/v205
206selfcompile-static:207$(VEXE) -cg -cflags '--static' -o v-static cmd/v208
209### NB: Please keep this Makefile and make.bat simple.
210install:211@echo 'Please use `sudo ./v symlink` instead.'212
213check:214$(VEXE) test-all215