V Cross-compilation Example
This example shows how to build statically linked binaries for different OS and platforms for V programs.
The build is performed by the make.vsh script in V. I think it could be simplified further, but the current version LGTM. Please read the comments inside make.vsh for details.
The build is done inside a docker container with Debian 13 Trixie. Host is
x86_64 Linux.
Produced binaries:
- Linux:
amd64,arm64,arm32(armhf),ppc64le,s390x,riscv64 - Windows:
amd64 - FreeBSD:
amd64
The example programm is just Hello World!. For complex programs you may need
to add more dependencies in build container.
I relied on Debian's excellent cross-compilation support (see the Dockerfile), but with some elbow grease, you can compile the program for other architectures and operating systems.
Build:
docker build . -t vlang-cross:latest-trixie
The container image is large (a little over 2GiB) due to the number of libraries
required for cross-compilation. The size could actually be reduced, but that's
what Debian provides by default in the crossbuild-essential-* packages. For
the same reason, building the image isn't very fast (up to ~3 minutes for me).
Start cross-compilation:
docker run --rm -v .:/app vlang-cross:latest-trixie env DEBUG=1 ./make.vsh
then look inside release/ dir (:
Synopsis
You can run the make.vsh script in two ways:
./make.vsh
# or
v run make.vsh
Build script options:
-tasks List available tasks.
-help Print this help message and exit. Aliases: help, --help.
Build can be configured throught environment variables:
BUILD_PROG_NAME Name of the compiled program. By default the name is
parsed from v.mod.
BUILD_PROG_VERSION Version of the compiled program. By default the name
is parsed from v.mod.
BUILD_PROG_ENTRYPOINT The program entrypoint. Defaults to '.' (current dir).
BUILD_OUTPUT_DIR The directory where the build artifacts will be placed.
Defaults to './release'.
BUILD_SKIP_TARGETS List of build targets to skip. Expects comma-separated
list without whitespaces e.g. 'windows-amd64,linux-armhf'
BUILD_COMMON_VFLAGS The list of V flags is common for all targets. Expects
comma-separated list. Default is '-prod,-cross'.
BUILD_COMMON_CFLAGS Same as BUILD_COMMON_VFLAGS, but passed to underlying
C compiler. Default is '-static'.
DEBUG If set enables the verbose output as dimmed text.