Files
v/Makefile
T
8227c28d64 build: fix Termux bootstrap and failure log collection (#30903)
Portable vc snapshots guard android_print with
`defined(__ANDROID__) && !defined(__TERMUX__)`. Termux's compiler
does not predefine __TERMUX__, so the native Termux bootstrap
compiled the snapshot as plain Android and failed to link
android_print, which only the android target provides.

Define __TERMUX__ in the vc bootstrap when building under Termux
(TERMUX_VERSION set or PREFIX under com.termux). The NDK path is
unchanged.

Also run the bootstrap failure handler through `sh`: on Termux the
script's #!/bin/sh shebang is missing, so the handler reported
"not found" (exit 127) instead of running.

termux_ci.yml: the arm64 job copied build.log into /src, the
runner-owned checkout, which the container user cannot write. Mount
a world-writable log directory instead and upload from there.

Co-authored-by: Richard Wheeler <18647491+PythonWillRule@users.noreply.github.com>
Co-authored-by: WOZCODE <contact@withwoz.com>
2026-10-21 06:50:41 +03:00

210 lines
5.4 KiB
Makefile

CC ?= cc
VEXE ?= ./v
VFLAGS ?=
CFLAGS ?=
LDFLAGS ?=
# Portable VC snapshots do not embed V3. Keep their v1 executable on the full
# compatibility compiler path even when the generated C is built on a V3 host.
VC_BOOTSTRAP_DEFINE = -DCUSTOM_DEFINE_v1_fallback
all: download_vc v
.PHONY: all check download_vc install v v1
download_vc:
@set -e; \
if [ -f vc/v.c ]; then \
if command -v git >/dev/null 2>&1; then \
git -C vc/ pull --rebase; \
else \
echo "git not found; using existing vc/v.c"; \
fi; \
else \
if command -v git >/dev/null 2>&1; then \
git clone --filter=blob:none https://github.com/vlang/vc vc/; \
else \
echo "git is required to download vc/. Please install git or provide vc/v.c."; \
exit 1; \
fi; \
fi
v:
@set -e; \
sys=`uname -s 2>/dev/null || echo unknown`; \
arch=`uname -m 2>/dev/null || echo unknown`; \
if [ "`getconf LONG_BIT 2>/dev/null`" = 32 ]; then \
case "$$arch" in \
aarch64|arm64|armv8*) arch=armv7l;; \
x86_64|amd64) arch=i686;; \
esac; \
fi; \
set -- $(CFLAGS); \
ccflags=; \
unsafe_o=0; \
for arg do \
case "$$arg" in \
-O|-O0|-O1) \
ccflags="$$ccflags $$arg"; \
;; \
-O*) \
ccflags="$$ccflags $$arg"; \
unsafe_o=1; \
;; \
*) \
ccflags="$$ccflags $$arg"; \
;; \
esac; \
done; \
ccflags=$${ccflags# }; \
bootstrap_ccflags=$$ccflags; \
set -- $(LDFLAGS); \
ldflags=; \
for arg do \
ldflags="$$ldflags $$arg"; \
done; \
ldflags=$${ldflags# }; \
case "$$sys" in \
Linux) \
case "$$arch" in \
arm*) \
ldflags="$$ldflags -latomic"; \
;; \
esac; \
;; \
FreeBSD|NetBSD|OpenBSD) \
ldflags="$$ldflags -lexecinfo"; \
;; \
esac; \
ccflags=$${ccflags# }; \
ldflags=$${ldflags# }; \
if [ "$$sys" = Linux ]; then \
case "$$arch" in \
arm64|aarch64) \
if [ $$unsafe_o -eq 1 ]; then \
set -- $$ccflags; \
bootstrap_ccflags=; \
for arg do \
case "$$arg" in \
-O|-O0|-O1) \
bootstrap_ccflags="$$bootstrap_ccflags $$arg"; \
;; \
-O*) \
bootstrap_ccflags="$$bootstrap_ccflags -O1"; \
;; \
*) \
bootstrap_ccflags="$$bootstrap_ccflags $$arg"; \
;; \
esac; \
done; \
bootstrap_ccflags=$${bootstrap_ccflags# }; \
fi; \
;; \
esac; \
fi; \
bootstrap_gcflags="-gc none"; \
case " $(VFLAGS) " in \
*" -gc "*|*" -gc="*) bootstrap_gcflags="";; \
esac; \
bootstrap_ccompiler=; \
case " $(VFLAGS) " in \
*" -cc "*|*" -cc="*) ;; \
*) \
case "$$sys" in \
Linux|FreeBSD|NetBSD|OpenBSD|DragonFly) \
case "$$arch" in \
arm*|aarch64) bootstrap_ccompiler="$(CC)";; \
esac; \
;; \
esac; \
;; \
esac; \
sh cmd/tools/vc_compat.sh vc/v.c $(CC) $$bootstrap_ccflags $(VC_BOOTSTRAP_DEFINE) -std=gnu11 -w -o v1 -- -lm -lpthread $$ldflags || sh cmd/tools/cc_compilation_failed_non_windows.sh; \
set -- ./v1 -no-parallel -o v2 $$bootstrap_gcflags $(VFLAGS); \
if [ -n "$$bootstrap_ccompiler" ]; then \
set -- "$$@" -cc "$$bootstrap_ccompiler"; \
fi; \
if [ -n "$$bootstrap_ccflags" ]; then \
set -- "$$@" -cflags "$$bootstrap_ccflags"; \
fi; \
if [ -n "$$ldflags" ]; then \
set -- "$$@" -ldflags "$$ldflags"; \
fi; \
set -- "$$@" cmd/v; \
"$$@"; \
set -- ./v2 -o v $$bootstrap_gcflags $(VFLAGS); \
if [ -n "$$bootstrap_ccompiler" ]; then \
set -- "$$@" -cc "$$bootstrap_ccompiler"; \
fi; \
if [ -n "$$ccflags" ]; then \
set -- "$$@" -cflags "$$ccflags"; \
fi; \
if [ -n "$$ldflags" ]; then \
set -- "$$@" -ldflags "$$ldflags"; \
fi; \
set -- "$$@" cmd/v; \
"$$@"; \
rm -rf v1 v2; \
./v -new-compiler run ./cmd/tools/detect_tcc.v; \
echo "V has been successfully built"; \
./v version; \
./v -new-compiler run .github/problem-matchers/register_all.vsh
v1:
@set -e; \
sys=`uname -s 2>/dev/null || echo unknown`; \
arch=`uname -m 2>/dev/null || echo unknown`; \
if [ "`getconf LONG_BIT 2>/dev/null`" = 32 ]; then \
case "$$arch" in \
aarch64|arm64|armv8*) arch=armv7l;; \
x86_64|amd64) arch=i686;; \
esac; \
fi; \
set -- $(CFLAGS); \
bootstrap_ccflags=; \
unsafe_o=0; \
for arg do \
case "$$arg" in \
-O|-O0|-O1) bootstrap_ccflags="$$bootstrap_ccflags $$arg";; \
-O*) bootstrap_ccflags="$$bootstrap_ccflags $$arg"; unsafe_o=1;; \
*) bootstrap_ccflags="$$bootstrap_ccflags $$arg";; \
esac; \
done; \
bootstrap_ccflags=$${bootstrap_ccflags# }; \
set -- $(LDFLAGS); \
ldflags=; \
for arg do ldflags="$$ldflags $$arg"; done; \
ldflags=$${ldflags# }; \
case "$$sys" in \
Linux) case "$$arch" in arm*) ldflags="$$ldflags -latomic";; esac;; \
FreeBSD|NetBSD|OpenBSD) ldflags="$$ldflags -lexecinfo";; \
esac; \
ldflags=$${ldflags# }; \
if [ "$$sys" = Linux ]; then \
case "$$arch" in \
arm64|aarch64) \
if [ $$unsafe_o -eq 1 ]; then \
set -- $$bootstrap_ccflags; \
bootstrap_ccflags=; \
for arg do \
case "$$arg" in \
-O|-O0|-O1) bootstrap_ccflags="$$bootstrap_ccflags $$arg";; \
-O*) bootstrap_ccflags="$$bootstrap_ccflags -O1";; \
*) bootstrap_ccflags="$$bootstrap_ccflags $$arg";; \
esac; \
done; \
bootstrap_ccflags=$${bootstrap_ccflags# }; \
fi;; \
esac; \
fi; \
CC='$(CC)' OLDV_CCOPTIONS='$(CPPFLAGS) '"$$bootstrap_ccflags" \
OLDV_LDFLAGS="$$ldflags" \
cmd/tools/install_v1_fallback.sh '$(VEXE)' './v1_fallback'; \
echo "Built V1 compatibility compiler: ./v1_fallback"
check:
./v test-all
install:
@echo 'Please use `sudo ./v symlink` instead, or manually add the current directory to your PATH.'