| 1 | CC ?= cc |
| 2 | CPPFLAGS ?= |
| 3 | CFLAGS ?= |
| 4 | LDFLAGS ?= |
| 5 | TMPDIR ?= /tmp |
| 6 | VROOT ?= . |
| 7 | VC ?= ./vc |
| 8 | VEXE ?= ./v |
| 9 | VCREPO ?= https://github.com/vlang/vc |
| 10 | TCCREPO ?= https://github.com/vlang/tccbin |
| 11 | LEGACYREPO ?= https://github.com/macports/macports-legacy-support |
| 12 | GIT ?= git |
| 13 | |
| 14 | VCFILE := v.c |
| 15 | TMPTCC := $(VROOT)/thirdparty/tcc |
| 16 | LEGACYLIBS := $(VROOT)/thirdparty/legacy |
| 17 | TMPLEGACY := $(LEGACYLIBS)/source |
| 18 | TCCOS := unknown |
| 19 | TCCARCH := unknown |
| 20 | HAS_GIT := $(shell command -v $(GIT) >/dev/null 2>&1 && echo 1 || echo 0) |
| 21 | GITCLEANPULL := $(GIT) clean -xf && $(GIT) pull --rebase --quiet |
| 22 | GITFASTCLONE := $(GIT) clone --filter=blob:none --quiet |
| 23 | |
| 24 | #### Platform detections and overrides: |
| 25 | _SYS := $(shell uname 2>/dev/null || echo Unknown) |
| 26 | _SYS := $(patsubst MSYS%,MSYS,$(_SYS)) |
| 27 | _SYS := $(patsubst MINGW%,MinGW,$(_SYS)) |
| 28 | |
| 29 | ifneq ($(filter $(_SYS),MSYS MinGW),) |
| 30 | WIN32 := 1 |
| 31 | EXE_EXT := .exe |
| 32 | # GNU make defaults CC to `cc`, but mingw32-make installations often only |
| 33 | # provide `gcc`. Switch only the implicit default and preserve explicit CC=... |
| 34 | ifneq ($(filter $(origin CC),default file),) |
| 35 | ifeq ($(CC),cc) |
| 36 | CC := gcc |
| 37 | endif |
| 38 | endif |
| 39 | endif |
| 40 | |
| 41 | ifeq ($(_SYS),Linux) |
| 42 | LINUX := 1 |
| 43 | TCCOS := linux |
| 44 | ifneq ($(shell ldd --version 2>&1 | grep -i musl),) |
| 45 | TCCOS := linuxmusl |
| 46 | endif |
| 47 | endif |
| 48 | |
| 49 | ifeq ($(_SYS),Darwin) |
| 50 | MAC := 1 |
| 51 | TCCOS := macos |
| 52 | ifeq ($(shell expr $(shell uname -r | cut -d. -f1) \<= 16), 1) |
| 53 | LEGACY := 1 |
| 54 | CPPFLAGS += -I$(LEGACYLIBS)/include/LegacySupport |
| 55 | LDFLAGS += -L$(LEGACYLIBS)/lib |
| 56 | LDFLAGS += -lMacportsLegacySupport |
| 57 | VFLAGS += -cc $(CC) |
| 58 | VFLAGS += -cflags "$(strip $(CPPFLAGS) $(CFLAGS))" |
| 59 | VFLAGS += -ldflags -L$(LEGACYLIBS)/lib |
| 60 | VFLAGS += -cflags $(LEGACYLIBS)/lib/libMacportsLegacySupport.a |
| 61 | endif |
| 62 | endif |
| 63 | |
| 64 | ifeq ($(_SYS),FreeBSD) |
| 65 | TCCOS := freebsd |
| 66 | LDFLAGS += -lexecinfo |
| 67 | endif |
| 68 | |
| 69 | ifeq ($(_SYS),NetBSD) |
| 70 | NETBSD := 1 |
| 71 | TCCOS := netbsd |
| 72 | LDFLAGS += -lexecinfo |
| 73 | endif |
| 74 | |
| 75 | ifeq ($(_SYS),OpenBSD) |
| 76 | TCCOS := openbsd |
| 77 | LDFLAGS += -lexecinfo |
| 78 | endif |
| 79 | |
| 80 | ifdef ANDROID_ROOT |
| 81 | ANDROID := 1 |
| 82 | undefine LINUX |
| 83 | TCCOS := android |
| 84 | ifneq ($(wildcard $(PREFIX)/lib/libexecinfo.*),) |
| 85 | LDFLAGS += -lexecinfo |
| 86 | endif |
| 87 | endif |
| 88 | ##### |
| 89 | |
| 90 | ifdef WIN32 |
| 91 | TCCOS := windows |
| 92 | endif |
| 93 | |
| 94 | TCCARCH := $(shell uname -m 2>/dev/null || echo unknown) |
| 95 | |
| 96 | ifeq ($(TCCARCH),x86_64) |
| 97 | TCCARCH := amd64 |
| 98 | else |
| 99 | ifneq ($(filter x86%,$(TCCARCH)),) |
| 100 | TCCARCH := i386 |
| 101 | else |
| 102 | ifeq ($(TCCARCH),arm64) |
| 103 | TCCARCH := arm64 |
| 104 | else |
| 105 | ifneq ($(filter arm%,$(TCCARCH)),) |
| 106 | TCCARCH := arm |
| 107 | # otherwise, just use the arch name |
| 108 | endif |
| 109 | endif |
| 110 | endif |
| 111 | endif |
| 112 | |
| 113 | TCCBUILDSCRIPT = $(VROOT)/thirdparty/build_scripts/thirdparty-$(TCCOS)-$(TCCARCH)_tcc.sh |
| 114 | |
| 115 | .PHONY: all clean rebuild check fresh_vc fresh_tcc fresh_legacy latest_tcc_source check_for_working_tcc etags ctags |
| 116 | |
| 117 | ifdef prod |
| 118 | VFLAGS+=-prod |
| 119 | endif |
| 120 | |
| 121 | # Keep bootstrap C compiler/linker flags aligned with the initial `v1` build. |
| 122 | BOOTSTRAP_CC_CFLAGS := $(strip $(CFLAGS)) |
| 123 | BOOTSTRAP_CFLAGS := $(strip $(CPPFLAGS) $(CFLAGS)) |
| 124 | BOOTSTRAP_VC_CC_CFLAGS := $(BOOTSTRAP_CC_CFLAGS) |
| 125 | BOOTSTRAP_VC_CFLAGS := $(BOOTSTRAP_CFLAGS) |
| 126 | BOOTSTRAP_LDFLAGS := $(strip $(LDFLAGS)) |
| 127 | ifeq ($(LINUX),1) |
| 128 | ifeq ($(TCCARCH),arm) |
| 129 | BOOTSTRAP_LDFLAGS := $(strip $(BOOTSTRAP_LDFLAGS) -latomic) |
| 130 | endif |
| 131 | ifneq ($(filter $(TCCARCH),arm64 aarch64),) |
| 132 | BOOTSTRAP_VC_UNSAFE_OPTFLAGS := $(filter-out -O -O0 -O1,$(filter -O%,$(BOOTSTRAP_CC_CFLAGS))) |
| 133 | ifneq ($(BOOTSTRAP_VC_UNSAFE_OPTFLAGS),) |
| 134 | # Some Linux ARM64 system compilers miscompile the external vc bootstrap |
| 135 | # snapshot at -O2/-O3, making `v1` segfault before it can build `v2`. |
| 136 | # Keep the bootstrap stages at -O1, but preserve the requested flags for |
| 137 | # the final `v` build. |
| 138 | BOOTSTRAP_VC_SAFE_CFLAGS := $(strip $(filter-out -O%,$(BOOTSTRAP_CC_CFLAGS)) -O1) |
| 139 | BOOTSTRAP_VC_CC_CFLAGS := $(BOOTSTRAP_VC_SAFE_CFLAGS) |
| 140 | BOOTSTRAP_VC_CFLAGS := $(strip $(CPPFLAGS) $(BOOTSTRAP_VC_SAFE_CFLAGS)) |
| 141 | endif |
| 142 | endif |
| 143 | endif |
| 144 | BOOTSTRAP_TCC_REQUESTED := $(or $(findstring -cc tcc,$(strip $(VFLAGS))),$(findstring -cc=tcc,$(strip $(VFLAGS)))) |
| 145 | BOOTSTRAP_CCOMPILER_VFLAG := |
| 146 | BOOTSTRAP_VC_CCOMPILER_VFLAG := |
| 147 | BOOTSTRAP_GC_VFLAG := |
| 148 | ifeq ($(filter -gc -gc=%,$(VFLAGS)),) |
| 149 | BOOTSTRAP_GC_VFLAG := -gc none |
| 150 | endif |
| 151 | ifeq ($(LINUX),1) |
| 152 | ifneq ($(filter $(TCCARCH),arm64 aarch64),) |
| 153 | ifeq ($(filter -cc,$(VFLAGS)),) |
| 154 | ifeq ($(findstring -cc=,$(VFLAGS)),) |
| 155 | # Bundled TCC can hang or miscompile V while bootstrapping on Linux ARM64, |
| 156 | # so keep both `v1 -> v2` and `v2 -> v` on the same system compiler |
| 157 | # unless the user overrode it explicitly. |
| 158 | BOOTSTRAP_CCOMPILER_VFLAG := -cc "$(CC)" |
| 159 | BOOTSTRAP_VC_CCOMPILER_VFLAG := $(BOOTSTRAP_CCOMPILER_VFLAG) |
| 160 | endif |
| 161 | endif |
| 162 | endif |
| 163 | ifneq ($(BOOTSTRAP_TCC_REQUESTED),) |
| 164 | ifneq ($(CC),tcc) |
| 165 | # The external vc bootstrap snapshot may still emit Windows-only stdio |
| 166 | # declarations for non-Windows TCC. Use the system compiler just for v1 -> v2. |
| 167 | BOOTSTRAP_VC_CCOMPILER_VFLAG := -cc "$(CC)" |
| 168 | endif |
| 169 | endif |
| 170 | endif |
| 171 | BOOTSTRAP_VC_VFLAGS := $(BOOTSTRAP_VC_CCOMPILER_VFLAG) $(if $(strip $(BOOTSTRAP_VC_CFLAGS)),-cflags "$(BOOTSTRAP_VC_CFLAGS)") $(if $(strip $(BOOTSTRAP_LDFLAGS)),-ldflags "$(BOOTSTRAP_LDFLAGS)") |
| 172 | BOOTSTRAP_VFLAGS := $(BOOTSTRAP_CCOMPILER_VFLAG) $(if $(strip $(BOOTSTRAP_CFLAGS)),-cflags "$(BOOTSTRAP_CFLAGS)") $(if $(strip $(BOOTSTRAP_LDFLAGS)),-ldflags "$(BOOTSTRAP_LDFLAGS)") |
| 173 | |
| 174 | all: latest_vc latest_tcc latest_legacy |
| 175 | ifdef WIN32 |
| 176 | $(CC) $(CPPFLAGS) $(BOOTSTRAP_VC_CC_CFLAGS) -std=c99 -municode -w -o v1$(EXE_EXT) $(VC)/$(VCFILE) $(LDFLAGS) -lws2_32 || cmd/tools/cc_compilation_failed_windows.sh |
| 177 | ./v1$(EXE_EXT) -no-parallel -o v2$(EXE_EXT) $(BOOTSTRAP_GC_VFLAG) $(VFLAGS) $(BOOTSTRAP_VC_VFLAGS) cmd/v |
| 178 | ./v2$(EXE_EXT) -o $(VEXE)$(EXE_EXT) $(BOOTSTRAP_GC_VFLAG) $(VFLAGS) $(BOOTSTRAP_VFLAGS) cmd/v |
| 179 | $(RM) v1$(EXE_EXT) |
| 180 | $(RM) v2$(EXE_EXT) |
| 181 | else |
| 182 | ifdef LEGACY |
| 183 | $(MAKE) -C $(TMPLEGACY) CPPFLAGS='$(CPPFLAGS)' CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' |
| 184 | $(MAKE) -C $(TMPLEGACY) PREFIX=$(realpath $(LEGACYLIBS)) CPPFLAGS='$(CPPFLAGS)' CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' install |
| 185 | rm -rf $(TMPLEGACY) |
| 186 | $(eval override LDFLAGS+=-L$(realpath $(LEGACYLIBS))/lib -lMacportsLegacySupport) |
| 187 | endif |
| 188 | $(CC) $(CPPFLAGS) $(BOOTSTRAP_VC_CC_CFLAGS) -std=c99 -w -o v1$(EXE_EXT) $(VC)/$(VCFILE) -lm -lpthread $(BOOTSTRAP_LDFLAGS) || cmd/tools/cc_compilation_failed_non_windows.sh |
| 189 | ifdef NETBSD |
| 190 | paxctl +m v1$(EXE_EXT) |
| 191 | endif |
| 192 | ./v1$(EXE_EXT) -no-parallel -o v2$(EXE_EXT) $(BOOTSTRAP_GC_VFLAG) $(VFLAGS) $(BOOTSTRAP_VC_VFLAGS) cmd/v |
| 193 | ifdef NETBSD |
| 194 | paxctl +m v2$(EXE_EXT) |
| 195 | endif |
| 196 | ./v2$(EXE_EXT) -nocache -o $(VEXE)$(EXE_EXT) $(BOOTSTRAP_GC_VFLAG) $(VFLAGS) $(BOOTSTRAP_VFLAGS) cmd/v |
| 197 | ifdef NETBSD |
| 198 | paxctl +m $(VEXE)$(EXE_EXT) |
| 199 | endif |
| 200 | rm -rf v1$(EXE_EXT) v2$(EXE_EXT) |
| 201 | endif |
| 202 | @$(VEXE)$(EXE_EXT) run cmd/tools/detect_tcc.v |
| 203 | @echo "V has been successfully built" |
| 204 | @$(VEXE)$(EXE_EXT) -version |
| 205 | @$(VEXE)$(EXE_EXT) run .github/problem-matchers/register_all.vsh |
| 206 | |
| 207 | clean: |
| 208 | rm -rf $(TMPTCC) |
| 209 | rm -rf $(LEGACYLIBS) |
| 210 | rm -rf $(VC) |
| 211 | |
| 212 | rebuild: clean all |
| 213 | |
| 214 | ifndef local |
| 215 | latest_vc: $(VC)/.git/config |
| 216 | ifeq ($(HAS_GIT),1) |
| 217 | cd $(VC) && $(GITCLEANPULL) |
| 218 | else |
| 219 | @echo "git not found; using existing $(VC)/$(VCFILE)" |
| 220 | endif |
| 221 | else |
| 222 | latest_vc: |
| 223 | @echo "Using local vc" |
| 224 | endif |
| 225 | |
| 226 | check_for_working_tcc: |
| 227 | @$(TMPTCC)/tcc.exe --version > /dev/null 2> /dev/null || echo "The executable '$(TMPTCC)/tcc.exe' does not work." |
| 228 | |
| 229 | fresh_vc: |
| 230 | rm -rf $(VC) |
| 231 | ifeq ($(HAS_GIT),1) |
| 232 | $(GITFASTCLONE) $(VCREPO) $(VC) |
| 233 | else |
| 234 | @echo "git is required to clone $(VCREPO) into $(VC)" |
| 235 | @exit 1 |
| 236 | endif |
| 237 | |
| 238 | ifndef local |
| 239 | latest_tcc: $(TMPTCC)/.git/config |
| 240 | ifeq ($(HAS_GIT),1) |
| 241 | ifdef WIN32 |
| 242 | @if [ -f "$(TMPTCC)/lib/advapi32.def" ]; then \ |
| 243 | cd "$(TMPTCC)" && $(GIT) checkout -- lib/advapi32.def > /dev/null 2> /dev/null || true; \ |
| 244 | fi |
| 245 | endif |
| 246 | cd $(TMPTCC) && $(GITCLEANPULL) |
| 247 | ifdef WIN32 |
| 248 | @if [ -f "$(TMPTCC)/lib/advapi32.def" ]; then \ |
| 249 | for sym in RegEnumKeyExW RegEnumValueW RegQueryInfoKeyW; do \ |
| 250 | grep -qx "$$sym" "$(TMPTCC)/lib/advapi32.def" || printf '%s\n' "$$sym" >> "$(TMPTCC)/lib/advapi32.def"; \ |
| 251 | done; \ |
| 252 | fi |
| 253 | endif |
| 254 | else |
| 255 | @echo "git not found; skipping update of $(TMPTCC)" |
| 256 | endif |
| 257 | ifneq (,$(wildcard ./tcc.exe)) |
| 258 | @$(MAKE) --quiet check_for_working_tcc 2> /dev/null |
| 259 | endif |
| 260 | |
| 261 | else |
| 262 | latest_tcc: |
| 263 | @echo "Using local tcc" |
| 264 | @$(MAKE) --quiet check_for_working_tcc 2> /dev/null |
| 265 | endif |
| 266 | |
| 267 | # Rebuild the bundled TCC in-place from upstream tinycc, while preserving the |
| 268 | # V-specific libgc/openlibm files already stored in $(TMPTCC). |
| 269 | latest_tcc_source: $(TMPTCC)/.git/config |
| 270 | ifeq ($(HAS_GIT),1) |
| 271 | ifneq (,$(wildcard $(TCCBUILDSCRIPT))) |
| 272 | @TCC_FOLDER='$(TMPTCC)' $(if $(strip $(TCC_COMMIT)),TCC_COMMIT='$(TCC_COMMIT)') CC='$(CC)' bash '$(TCCBUILDSCRIPT)' |
| 273 | @$(MAKE) --quiet check_for_working_tcc 2> /dev/null |
| 274 | else |
| 275 | @echo 'No upstream TinyCC build script is available for thirdparty-$(TCCOS)-$(TCCARCH).' |
| 276 | @echo 'Use `make latest_tcc` to refresh the prebuilt bundle from $(TCCREPO).' |
| 277 | @exit 1 |
| 278 | endif |
| 279 | else |
| 280 | @echo "git is required to bootstrap $(TMPTCC) before rebuilding it from source" |
| 281 | @exit 1 |
| 282 | endif |
| 283 | |
| 284 | fresh_tcc: |
| 285 | rm -rf $(TMPTCC) |
| 286 | ifndef local |
| 287 | ifeq ($(HAS_GIT),1) |
| 288 | @set -e; \ |
| 289 | branches="$$( $(GIT) ls-remote --heads $(TCCREPO) 2> /dev/null | awk '{sub("refs/heads/","",$$2); print $$2}' || true )"; \ |
| 290 | preferred_branch='thirdparty-$(TCCOS)-$(TCCARCH)'; \ |
| 291 | fallback_branch=''; \ |
| 292 | if [ "$(LINUX)" = "1" ]; then \ |
| 293 | fallback_branch='thirdparty-linuxmusl-$(TCCARCH)'; \ |
| 294 | fi; \ |
| 295 | selected_branch=''; \ |
| 296 | if printf '%s\n' "$$branches" | grep -Fx "$$preferred_branch" > /dev/null; then \ |
| 297 | selected_branch="$$preferred_branch"; \ |
| 298 | elif [ "$$fallback_branch" != '' ] && [ "$$fallback_branch" != "$$preferred_branch" ] \ |
| 299 | && printf '%s\n' "$$branches" | grep -Fx "$$fallback_branch" > /dev/null; then \ |
| 300 | selected_branch="$$fallback_branch"; \ |
| 301 | fi; \ |
| 302 | if [ "$$selected_branch" = '' ]; then \ |
| 303 | echo "Pre-built TCC not available for $$preferred_branch at $(TCCREPO), will use the system compiler: $(CC)"; \ |
| 304 | $(GITFASTCLONE) --branch thirdparty-unknown-unknown $(TCCREPO) "$(TMPTCC)"; \ |
| 305 | else \ |
| 306 | $(GITFASTCLONE) --branch "$$selected_branch" $(TCCREPO) "$(TMPTCC)"; \ |
| 307 | if [ -f "$(TMPTCC)/lib/advapi32.def" ]; then \ |
| 308 | for sym in RegEnumKeyExW RegEnumValueW RegQueryInfoKeyW; do \ |
| 309 | grep -qx "$$sym" "$(TMPTCC)/lib/advapi32.def" || printf '%s\n' "$$sym" >> "$(TMPTCC)/lib/advapi32.def"; \ |
| 310 | done; \ |
| 311 | fi; \ |
| 312 | if ! "$(TMPTCC)/tcc.exe" --version > /dev/null 2> /dev/null; then \ |
| 313 | if [ "$$fallback_branch" != '' ] && [ "$$fallback_branch" != "$$selected_branch" ] \ |
| 314 | && printf '%s\n' "$$branches" | grep -Fx "$$fallback_branch" > /dev/null; then \ |
| 315 | echo "Pre-built TCC bundle $$selected_branch did not run; retrying with $$fallback_branch."; \ |
| 316 | rm -rf "$(TMPTCC)"; \ |
| 317 | $(GITFASTCLONE) --branch "$$fallback_branch" $(TCCREPO) "$(TMPTCC)"; \ |
| 318 | fi; \ |
| 319 | $(MAKE) --quiet check_for_working_tcc 2> /dev/null; \ |
| 320 | else \ |
| 321 | $(MAKE) --quiet check_for_working_tcc 2> /dev/null; \ |
| 322 | fi; \ |
| 323 | fi |
| 324 | else |
| 325 | @echo "git is required to clone $(TCCREPO)" |
| 326 | @exit 1 |
| 327 | endif |
| 328 | else |
| 329 | @echo "Using local tccbin" |
| 330 | @$(MAKE) --quiet check_for_working_tcc 2> /dev/null |
| 331 | endif |
| 332 | |
| 333 | ifndef local |
| 334 | latest_legacy: $(TMPLEGACY)/.git/config |
| 335 | ifdef LEGACY |
| 336 | ifeq ($(HAS_GIT),1) |
| 337 | cd $(TMPLEGACY) && $(GITCLEANPULL) |
| 338 | else |
| 339 | @echo "git not found; using existing $(TMPLEGACY)" |
| 340 | endif |
| 341 | endif |
| 342 | else |
| 343 | latest_legacy: |
| 344 | ifdef LEGACY |
| 345 | @echo "Using local legacysupport" |
| 346 | endif |
| 347 | endif |
| 348 | |
| 349 | fresh_legacy: |
| 350 | rm -rf $(LEGACYLIBS) |
| 351 | ifeq ($(HAS_GIT),1) |
| 352 | $(GITFASTCLONE) $(LEGACYREPO) $(TMPLEGACY) |
| 353 | else |
| 354 | @echo "git is required to clone $(LEGACYREPO)" |
| 355 | @exit 1 |
| 356 | endif |
| 357 | |
| 358 | $(TMPTCC)/.git/config: |
| 359 | ifeq ($(HAS_GIT),1) |
| 360 | $(MAKE) fresh_tcc |
| 361 | else |
| 362 | @echo "git not found; skipping bootstrap of $(TMPTCC), system compiler $(CC) will be used" |
| 363 | endif |
| 364 | |
| 365 | $(VC)/.git/config: |
| 366 | ifeq ($(HAS_GIT),1) |
| 367 | $(MAKE) fresh_vc |
| 368 | else |
| 369 | @if [ -f "$(VC)/$(VCFILE)" ]; then \ |
| 370 | echo "git not found; using existing $(VC)/$(VCFILE)"; \ |
| 371 | else \ |
| 372 | echo "git is required to download $(VC)/$(VCFILE). Install git or provide the file manually."; \ |
| 373 | exit 1; \ |
| 374 | fi |
| 375 | endif |
| 376 | |
| 377 | $(TMPLEGACY)/.git/config: |
| 378 | ifdef LEGACY |
| 379 | ifeq ($(HAS_GIT),1) |
| 380 | $(MAKE) fresh_legacy |
| 381 | else |
| 382 | @if [ -d "$(TMPLEGACY)" ]; then \ |
| 383 | echo "git not found; using existing $(TMPLEGACY)"; \ |
| 384 | else \ |
| 385 | echo "git is required to download legacy support sources ($(LEGACYREPO))"; \ |
| 386 | exit 1; \ |
| 387 | fi |
| 388 | endif |
| 389 | endif |
| 390 | |
| 391 | asan: |
| 392 | $(MAKE) all CFLAGS='-fsanitize=address,undefined' |
| 393 | |
| 394 | selfcompile: |
| 395 | $(VEXE)$(EXE_EXT) -cg -o v cmd/v |
| 396 | |
| 397 | selfcompile-static: |
| 398 | $(VEXE)$(EXE_EXT) -cg -cflags '--static' -o v-static cmd/v |
| 399 | |
| 400 | ### NB: Please keep this Makefile and makev.bat simple. |
| 401 | install: |
| 402 | @echo 'Please use `sudo ./v symlink` instead, or manually add the current directory to your PATH.' |
| 403 | |
| 404 | check: |
| 405 | $(VEXE)$(EXE_EXT) test-all |
| 406 | |
| 407 | etags: |
| 408 | ./v$(EXE_EXT) -print-v-files cmd/v | grep -v :parse_text| etags -L - |
| 409 | |
| 410 | ctags: |
| 411 | ./v$(EXE_EXT) -print-v-files cmd/v | grep -v :parse_text| ctags -L - |
| 412 | |