# aliases
all : tinygo
# Default build and source directories, as created by `make llvm-build`.
LLVM_BUILDDIR ?= llvm-build
LLVM_PROJECTDIR ?= llvm-project
CLANG_SRC ?= $( LLVM_PROJECTDIR) /clang
LLD_SRC ?= $( LLVM_PROJECTDIR) /lld
# Try to autodetect LLVM build tools.
# Versions are listed here in descending priority order.
LLVM_VERSIONS = 14 13 12 11
errifempty = $( if $( 1) ,$( 1) ,$( error $( 2) ) )
detect = $( shell which $( call errifempty,$( firstword $( foreach p,$( 2) ,$( shell command -v $( p) 2> /dev/null && echo $( p) ) ) ) ,failed to locate $( 1) at any of: $( 2) ) )
toolSearchPathsVersion = $( 1) -$( 2)
i f e q ( $( shell uname -s ) , D a r w i n )
# Also explicitly search Brew's copy, which is not in PATH by default.
BREW_PREFIX := $( shell brew --prefix)
toolSearchPathsVersion += $( BREW_PREFIX) /opt/llvm@$( 2) /bin/$( 1) -$( 2) $( BREW_PREFIX) /opt/llvm@$( 2) /bin/$( 1)
e n d i f
# First search for a custom built copy, then move on to explicitly version-tagged binaries, then just see if the tool is in path with its normal name.
findLLVMTool = $( call detect,$( 1) ,$( abspath llvm-build/bin/$( 1) ) $( foreach ver,$( LLVM_VERSIONS) ,$( call toolSearchPathsVersion,$( 1) ,$( ver) ) ) $( 1) )
CLANG ?= $( call findLLVMTool,clang)
LLVM_AR ?= $( call findLLVMTool,llvm-ar)
LLVM_NM ?= $( call findLLVMTool,llvm-nm)
# Go binary and GOROOT to select
GO ?= go
export GOROOT = $( shell $( GO) env GOROOT)
# Flags to pass to go test.
GOTESTFLAGS ?= -v
# md5sum binary
MD5SUM = md5sum
# tinygo binary for tests
TINYGO ?= $( call detect,tinygo,tinygo $( CURDIR) /build/tinygo)
# Use CCACHE for LLVM if possible
i f n e q ( , $( shell command -v ccache 2> /dev /null ) )
LLVM_OPTION += '-DLLVM_CCACHE_BUILD=ON'
e n d i f
# Allow enabling LLVM assertions
i f e q ( 1 , $( ASSERT ) )
LLVM_OPTION += '-DLLVM_ENABLE_ASSERTIONS=ON'
e l s e
LLVM_OPTION += '-DLLVM_ENABLE_ASSERTIONS=OFF'
e n d i f
# Cross compiling support.
i f n e q ( $( CROSS ) , )
CC = $( CROSS) -gcc
CXX = $( CROSS) -g++
LLVM_OPTION += \
-DCMAKE_C_COMPILER= $( CC) \
-DCMAKE_CXX_COMPILER= $( CXX) \
-DLLVM_DEFAULT_TARGET_TRIPLE= $( CROSS) \
-DCROSS_TOOLCHAIN_FLAGS_NATIVE= "-UCMAKE_C_COMPILER;-UCMAKE_CXX_COMPILER"
ifeq ( $( CROSS) , arm-linux-gnueabihf)
# Assume we're building on a Debian-like distro, with QEMU installed.
LLVM_CONFIG_PREFIX = qemu-arm -L /usr/arm-linux-gnueabihf/
# The CMAKE_SYSTEM_NAME flag triggers cross compilation mode.
LLVM_OPTION += \
-DCMAKE_SYSTEM_NAME= Linux \
-DLLVM_TARGET_ARCH= ARM
GOENVFLAGS = GOARCH = arm CC = $( CC) CXX = $( CXX) CGO_ENABLED = 1
BINARYEN_OPTION += -DCMAKE_C_COMPILER= $( CC) -DCMAKE_CXX_COMPILER= $( CXX)
else ifeq ( $( CROSS) , aarch64-linux-gnu)
# Assume we're building on a Debian-like distro, with QEMU installed.
LLVM_CONFIG_PREFIX = qemu-aarch64 -L /usr/aarch64-linux-gnu/
# The CMAKE_SYSTEM_NAME flag triggers cross compilation mode.
LLVM_OPTION += \
-DCMAKE_SYSTEM_NAME= Linux \
-DLLVM_TARGET_ARCH= AArch64
GOENVFLAGS = GOARCH = arm64 CC = $( CC) CXX = $( CXX) CGO_ENABLED = 1
BINARYEN_OPTION += -DCMAKE_C_COMPILER= $( CC) -DCMAKE_CXX_COMPILER= $( CXX)
else
$( error Unknown cross compilation target: $( CROSS) )
endif
e n d i f
.PHONY : all tinygo test $( LLVM_BUILDDIR ) llvm -source clean fmt gen -device gen -device -nrf gen -device -nxp gen -device -avr gen -device -rp
LLVM_COMPONENTS = all-targets analysis asmparser asmprinter bitreader bitwriter codegen core coroutines coverage debuginfodwarf debuginfopdb executionengine frontendopenmp instrumentation interpreter ipo irreader libdriver linker lto mc mcjit objcarcopts option profiledata scalaropts support target windowsmanifest
i f e q ( $( OS ) , W i n d o w s _ N T )
EXE = .exe
START_GROUP = -Wl,--start-group
END_GROUP = -Wl,--end-group
# LLVM compiled using MinGW on Windows appears to have problems with threads.
# Without this flag, linking results in errors like these:
# libLLVMSupport.a(Threading.cpp.obj):Threading.cpp:(.text+0x55): undefined reference to `std::thread::hardware_concurrency()'
LLVM_OPTION += -DLLVM_ENABLE_THREADS= OFF -DLLVM_ENABLE_PIC= OFF
CGO_CPPFLAGS += -DCINDEX_NO_EXPORTS
CGO_LDFLAGS += -static -static-libgcc -static-libstdc++
CGO_LDFLAGS_EXTRA += -lversion
USE_SYSTEM_BINARYEN ?= 1
e l s e i f e q ( $( shell uname -s ) , D a r w i n )
MD5SUM = md5
CGO_LDFLAGS += -lxar
USE_SYSTEM_BINARYEN ?= 1
e l s e i f e q ( $( shell uname -s ) , F r e e B S D )
MD5SUM = md5
START_GROUP = -Wl,--start-group
END_GROUP = -Wl,--end-group
e l s e
START_GROUP = -Wl,--start-group
END_GROUP = -Wl,--end-group
e n d i f
# Libraries that should be linked in for the statically linked Clang.
CLANG_LIB_NAMES = clangAnalysis clangAST clangASTMatchers clangBasic clangCodeGen clangCrossTU clangDriver clangDynamicASTMatchers clangEdit clangFormat clangFrontend clangFrontendTool clangHandleCXX clangHandleLLVM clangIndex clangLex clangParse clangRewrite clangRewriteFrontend clangSema clangSerialization clangTooling clangToolingASTDiff clangToolingCore clangToolingInclusions
CLANG_LIBS = $( START_GROUP) $( addprefix -l,$( CLANG_LIB_NAMES) ) $( END_GROUP) -lstdc++
# Libraries that should be linked in for the statically linked LLD.
LLD_LIB_NAMES = lldCOFF lldCommon lldELF lldMachO lldMinGW lldWasm
LLD_LIBS = $( START_GROUP) $( addprefix -l,$( LLD_LIB_NAMES) ) $( END_GROUP)
# Other libraries that are needed to link TinyGo.
EXTRA_LIB_NAMES = LLVMInterpreter LLVMMCA LLVMX86TargetMCA
# All libraries to be built and linked with the tinygo binary (lib/lib*.a).
LIB_NAMES = clang $( CLANG_LIB_NAMES) $( LLD_LIB_NAMES) $( EXTRA_LIB_NAMES)
# These build targets appear to be the only ones necessary to build all TinyGo
# dependencies. Only building a subset significantly speeds up rebuilding LLVM.
# The Makefile rules convert a name like lldELF to lib/liblldELF.a to match the
# library path (for ninja).
# This list also includes a few tools that are necessary as part of the full
# TinyGo build.
NINJA_BUILD_TARGETS = clang llvm-config llvm-ar llvm-nm $( addprefix lib/lib,$( addsuffix .a,$( LIB_NAMES) ) )
# For static linking.
i f n e q ( "$(wildcard $(LLVM_BUILDDIR)/bin/llvm-config*)" , "" )
CGO_CPPFLAGS += $( shell $( LLVM_CONFIG_PREFIX) $( LLVM_BUILDDIR) /bin/llvm-config --cppflags) -I$( abspath $( LLVM_BUILDDIR) ) /tools/clang/include -I$( abspath $( CLANG_SRC) ) /include -I$( abspath $( LLD_SRC) ) /include
CGO_CXXFLAGS = -std= c++14
CGO_LDFLAGS += -L$( abspath $( LLVM_BUILDDIR) /lib) -lclang $( CLANG_LIBS) $( LLD_LIBS) $( shell $( LLVM_CONFIG_PREFIX) $( LLVM_BUILDDIR) /bin/llvm-config --ldflags --libs --system-libs $( LLVM_COMPONENTS) ) -lstdc++ $( CGO_LDFLAGS_EXTRA)
e n d i f
clean :
@rm -rf build
FMT_PATHS = ./*.go builder cgo compiler interp loader src/device/arm src/examples src/machine src/os src/reflect src/runtime src/sync src/syscall src/testing src/internal/reflectlite transform
fmt :
@gofmt -l -w $( FMT_PATHS)
fmt-check :
@unformatted= $$ ( gofmt -l $( FMT_PATHS) ) ; [ -z " $$ unformatted " ] && exit 0; echo "Unformatted:" ; for fn in $$ unformatted; do echo " $$ fn " ; done ; exit 1
gen-device : gen -device -avr gen -device -esp gen -device -nrf gen -device -sam gen -device -sifive gen -device -kendryte gen -device -nxp gen -device -rp
i f n e q ( $( STM 32) , 0 )
gen-device : gen -device -stm 32
e n d i f
gen-device-avr :
@if [ ! -e lib/avr/README.md ] ; then echo "Submodules have not been downloaded. Please download them using:\n git submodule update --init" ; exit 1; fi
$( GO) build -o ./build/gen-device-avr ./tools/gen-device-avr/
./build/gen-device-avr lib/avr/packs/atmega src/device/avr/
./build/gen-device-avr lib/avr/packs/tiny src/device/avr/
@GO111MODULE= off $( GO) fmt ./src/device/avr
build/gen-device-svd : ./tools /gen -device -svd /*.go
$( GO) build -o $@ ./tools/gen-device-svd/
gen-device-esp : build /gen -device -svd
./build/gen-device-svd -source= https://github.com/posborne/cmsis-svd/tree/master/data/Espressif-Community -interrupts= software lib/cmsis-svd/data/Espressif-Community/ src/device/esp/
./build/gen-device-svd -source= https://github.com/posborne/cmsis-svd/tree/master/data/Espressif -interrupts= software lib/cmsis-svd/data/Espressif/ src/device/esp/
GO111MODULE = off $( GO) fmt ./src/device/esp
gen-device-nrf : build /gen -device -svd
./build/gen-device-svd -source= https://github.com/NordicSemiconductor/nrfx/tree/master/mdk lib/nrfx/mdk/ src/device/nrf/
GO111MODULE = off $( GO) fmt ./src/device/nrf
gen-device-nxp : build /gen -device -svd
./build/gen-device-svd -source= https://github.com/posborne/cmsis-svd/tree/master/data/NXP lib/cmsis-svd/data/NXP/ src/device/nxp/
GO111MODULE = off $( GO) fmt ./src/device/nxp
gen-device-sam : build /gen -device -svd
./build/gen-device-svd -source= https://github.com/posborne/cmsis-svd/tree/master/data/Atmel lib/cmsis-svd/data/Atmel/ src/device/sam/
GO111MODULE = off $( GO) fmt ./src/device/sam
gen-device-sifive : build /gen -device -svd
./build/gen-device-svd -source= https://github.com/posborne/cmsis-svd/tree/master/data/SiFive-Community -interrupts= software lib/cmsis-svd/data/SiFive-Community/ src/device/sifive/
GO111MODULE = off $( GO) fmt ./src/device/sifive
gen-device-kendryte : build /gen -device -svd
./build/gen-device-svd -source= https://github.com/posborne/cmsis-svd/tree/master/data/Kendryte-Community -interrupts= software lib/cmsis-svd/data/Kendryte-Community/ src/device/kendryte/
GO111MODULE = off $( GO) fmt ./src/device/kendryte
gen-device-stm32 : build /gen -device -svd
./build/gen-device-svd -source= https://github.com/tinygo-org/stm32-svd lib/stm32-svd/svd src/device/stm32/
GO111MODULE = off $( GO) fmt ./src/device/stm32
gen-device-rp : build /gen -device -svd
./build/gen-device-svd -source= https://github.com/posborne/cmsis-svd/tree/master/data/RaspberryPi lib/cmsis-svd/data/RaspberryPi/ src/device/rp/
GO111MODULE = off $( GO) fmt ./src/device/rp
# Get LLVM sources.
$(LLVM_PROJECTDIR)/llvm :
git clone -b xtensa_release_14.0.0-patched --depth= 1 https://github.com/tinygo-org/llvm-project $( LLVM_PROJECTDIR)
llvm-source : $( LLVM_PROJECTDIR ) /llvm
# Configure LLVM.
TINYGO_SOURCE_DIR = $( shell pwd )
$(LLVM_BUILDDIR)/build.ninja :
mkdir -p $( LLVM_BUILDDIR) && cd $( LLVM_BUILDDIR) && cmake -G Ninja $( TINYGO_SOURCE_DIR) /$( LLVM_PROJECTDIR) /llvm "-DLLVM_TARGETS_TO_BUILD=X86;ARM;AArch64;RISCV;WebAssembly" "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=AVR;Xtensa" -DCMAKE_BUILD_TYPE= Release -DLIBCLANG_BUILD_STATIC= ON -DLLVM_ENABLE_TERMINFO= OFF -DLLVM_ENABLE_ZLIB= OFF -DLLVM_ENABLE_LIBEDIT= OFF -DLLVM_ENABLE_Z3_SOLVER= OFF -DLLVM_ENABLE_OCAMLDOC= OFF -DLLVM_ENABLE_LIBXML2= OFF -DLLVM_ENABLE_PROJECTS= "clang;lld" -DLLVM_TOOL_CLANG_TOOLS_EXTRA_BUILD= OFF -DCLANG_ENABLE_STATIC_ANALYZER= OFF -DCLANG_ENABLE_ARCMT= OFF $( LLVM_OPTION)
# Build LLVM.
$(LLVM_BUILDDIR) : $( LLVM_BUILDDIR ) /build .ninja
cd $( LLVM_BUILDDIR) && ninja $( NINJA_BUILD_TARGETS)
i f n e q ( $( USE_SYSTEM_BINARYEN ) , 1 )
# Build Binaryen
.PHONY : binaryen
binaryen : build /wasm -opt $( EXE )
build/wasm-opt$(EXE) :
mkdir -p build
cd lib/binaryen && cmake -G Ninja . -DBUILD_STATIC_LIB= ON $( BINARYEN_OPTION) && ninja bin/wasm-opt$( EXE)
cp lib/binaryen/bin/wasm-opt$( EXE) build/wasm-opt$( EXE)
e n d i f
# Build wasi-libc sysroot
.PHONY : wasi -libc
wasi-libc : lib /wasi -libc /sysroot /lib /wasm 32-wasi /libc .a
lib/wasi-libc/sysroot/lib/wasm32-wasi/libc.a :
@if [ ! -e lib/wasi-libc/Makefile ] ; then echo "Submodules have not been downloaded. Please download them using:\n git submodule update --init" ; exit 1; fi
cd lib/wasi-libc && make -j4 WASM_CFLAGS = "-O2 -g -DNDEBUG" MALLOC_IMPL = none WASM_CC = $( CLANG) WASM_AR = $( LLVM_AR) WASM_NM = $( LLVM_NM)
# Build the Go compiler.
tinygo :
@if [ ! -f " $( LLVM_BUILDDIR) /bin/llvm-config " ] ; then echo "Fetch and build LLVM first by running:" ; echo " make llvm-source" ; echo " make $( LLVM_BUILDDIR) " ; exit 1; fi
CGO_CPPFLAGS = " $( CGO_CPPFLAGS) " CGO_CXXFLAGS = " $( CGO_CXXFLAGS) " CGO_LDFLAGS = " $( CGO_LDFLAGS) " $( GOENVFLAGS) $( GO) build -buildmode exe -o build/tinygo$( EXE) -tags byollvm -ldflags= "-X github.com/tinygo-org/tinygo/goenv.GitSha1=`git rev-parse --short HEAD`" .
test : wasi -libc
CGO_CPPFLAGS = " $( CGO_CPPFLAGS) " CGO_CXXFLAGS = " $( CGO_CXXFLAGS) " CGO_LDFLAGS = " $( CGO_LDFLAGS) " $( GO) test $( GOTESTFLAGS) -timeout= 20m -buildmode exe -tags byollvm ./builder ./cgo ./compileopts ./compiler ./interp ./transform .
# Standard library packages that pass tests on darwin, linux, wasi, and windows, but take over a minute in wasi
TEST_PACKAGES_SLOW = \
compress/bzip2 \
crypto/dsa \
index/suffixarray \
# Standard library packages that pass tests quickly on darwin, linux, wasi, and windows
TEST_PACKAGES_FAST = \
compress/zlib \
container/heap \
container/list \
container/ring \
crypto/des \
crypto/elliptic/internal/fiat \
crypto/internal/subtle \
crypto/md5 \
crypto/rc4 \
crypto/sha1 \
crypto/sha256 \
crypto/sha512 \
debug/macho \
embed/internal/embedtest \
encoding \
encoding/ascii85 \
encoding/base32 \
encoding/csv \
encoding/hex \
go/scanner \
hash \
hash/adler32 \
hash/crc64 \
hash/fnv \
html \
internal/itoa \
internal/profile \
math \
math/cmplx \
net \
net/http/internal/ascii \
net/mail \
os \
path \
reflect \
sync \
testing \
testing/iotest \
text/scanner \
unicode \
unicode/utf16 \
unicode/utf8 \
# archive/zip requires os.ReadAt, which is not yet supported on windows
# debug/plan9obj requires os.ReadAt, which is not yet supported on windows
# io/fs requires os.ReadDir, which is not yet supported on windows or wasi
# testing/fstest requires os.ReadDir, which is not yet supported on windows or wasi
# compress/flate fails windows go 1.18, https://github.com/tinygo-org/tinygo/issues/2762
# compress/lzw fails windows go 1.18 wasi, https://github.com/tinygo-org/tinygo/issues/2762
# Additional standard library packages that pass tests on individual platforms
TEST_PACKAGES_LINUX := \
archive/zip \
compress/flate \
compress/lzw \
crypto/hmac \
debug/dwarf \
debug/plan9obj \
io/fs \
io/ioutil \
strconv \
testing/fstest \
text/template/parse
TEST_PACKAGES_DARWIN := $( TEST_PACKAGES_LINUX)
TEST_PACKAGES_WINDOWS := \
compress/lzw
# Report platforms on which each standard library package is known to pass tests
jointmp := $( shell echo /tmp/join.$$ $$ )
report-stdlib-tests-pass :
@for t in $( TEST_PACKAGES_DARWIN) ; do echo " $$ t darwin " ; done | sort > $( jointmp) .darwin
@for t in $( TEST_PACKAGES_LINUX) ; do echo " $$ t linux " ; done | sort > $( jointmp) .linux
@for t in $( TEST_PACKAGES_FAST) $( TEST_PACKAGES_SLOW) ; do echo " $$ t darwin linux wasi windows " ; done | sort > $( jointmp) .portable
@join -a1 -a2 $( jointmp) .darwin $( jointmp) .linux | \
join -a1 -a2 - $( jointmp) .portable
@rm $( jointmp) .*
# Standard library packages that pass tests quickly on the current platform
i f e q ( $( shell uname ) , D a r w i n )
TEST_PACKAGES_HOST := $( TEST_PACKAGES_FAST) $( TEST_PACKAGES_DARWIN)
e n d i f
i f e q ( $( shell uname ) , L i n u x )
TEST_PACKAGES_HOST := $( TEST_PACKAGES_FAST) $( TEST_PACKAGES_LINUX)
e n d i f
i f e q ( $( OS ) , W i n d o w s _ N T )
TEST_PACKAGES_HOST := $( TEST_PACKAGES_FAST) $( TEST_PACKAGES_WINDOWS)
e n d i f
# Test known-working standard library packages.
# TODO: parallelize, and only show failing tests (no implied -v flag).
.PHONY : tinygo -test
tinygo-test :
$( TINYGO) test $( TEST_PACKAGES_HOST) $( TEST_PACKAGES_SLOW)
tinygo-test-fast :
$( TINYGO) test $( TEST_PACKAGES_HOST)
tinygo-bench :
$( TINYGO) test -bench . $( TEST_PACKAGES_HOST) $( TEST_PACKAGES_SLOW)
tinygo-bench-fast :
$( TINYGO) test -bench . $( TEST_PACKAGES_HOST)
# Same thing, except for wasi rather than the current platform.
tinygo-test-wasi :
$( TINYGO) test -target wasi $( TEST_PACKAGES_FAST) $( TEST_PACKAGES_SLOW)
tinygo-test-wasi-fast :
$( TINYGO) test -target wasi $( TEST_PACKAGES_FAST)
tinygo-bench-wasi :
$( TINYGO) test -target wasi -bench . $( TEST_PACKAGES_FAST) $( TEST_PACKAGES_SLOW)
tinygo-bench-wasi-fast :
$( TINYGO) test -target wasi -bench . $( TEST_PACKAGES_FAST)
# Test external packages in a large corpus.
test-corpus :
CGO_CPPFLAGS = " $( CGO_CPPFLAGS) " CGO_CXXFLAGS = " $( CGO_CXXFLAGS) " CGO_LDFLAGS = " $( CGO_LDFLAGS) " $( GO) test $( GOTESTFLAGS) -timeout= 1h -buildmode exe -tags byollvm -run TestCorpus . -corpus= testdata/corpus.yaml
test-corpus-fast :
CGO_CPPFLAGS = " $( CGO_CPPFLAGS) " CGO_CXXFLAGS = " $( CGO_CXXFLAGS) " CGO_LDFLAGS = " $( CGO_LDFLAGS) " $( GO) test $( GOTESTFLAGS) -timeout= 1h -buildmode exe -tags byollvm -run TestCorpus -short . -corpus= testdata/corpus.yaml
test-corpus-wasi : wasi -libc
CGO_CPPFLAGS = " $( CGO_CPPFLAGS) " CGO_CXXFLAGS = " $( CGO_CXXFLAGS) " CGO_LDFLAGS = " $( CGO_LDFLAGS) " $( GO) test $( GOTESTFLAGS) -timeout= 1h -buildmode exe -tags byollvm -run TestCorpus . -corpus= testdata/corpus.yaml -target= wasi
tinygo-baremetal :
# Regression tests that run on a baremetal target and don't fit in either main_test.go or smoketest.
# regression test for #2666: e.g. encoding/hex must pass on baremetal
$( TINYGO) test -target cortex-m-qemu encoding/hex
.PHONY : smoketest
smoketest :
$( TINYGO) version
# regression test for #2892
cd tests/testing/recurse && ( $( TINYGO) test ./... > recurse.log && cat recurse.log && test $$ ( wc -l < recurse.log) = 2 && rm recurse.log)
# compile-only platform-independent examples
cd tests/text/template/smoke && $( TINYGO) test -c && rm -f smoke.test
# regression test for #2563
cd tests/os/smoke && $( TINYGO) test -c -target= pybadge && rm smoke.test
# test all examples (except pwm)
$( TINYGO) build -size short -o test.hex -target= pca10040 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10040 examples/adc
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10040 examples/blinkm
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10040 examples/blinky2
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10040 examples/button
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10040 examples/button2
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10040 examples/echo
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10040 examples/echo2
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= circuitplay-express examples/i2s
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10040 examples/mcp3008
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10040 examples/memstats
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= microbit examples/microbit-blink
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10040 examples/pininterrupt
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10040 examples/serial
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10040 examples/systick
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10040 examples/test
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= wioterminal examples/hid-mouse
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= wioterminal examples/hid-keyboard
@$( MD5SUM) test.hex
# test simulated boards on play.tinygo.org
i f n e q ( $( WASM ) , 0 )
$( TINYGO) build -size short -o test.wasm -tags= arduino examples/blinky1
@$( MD5SUM) test.wasm
$( TINYGO) build -size short -o test.wasm -tags= hifive1b examples/blinky1
@$( MD5SUM) test.wasm
$( TINYGO) build -size short -o test.wasm -tags= reelboard examples/blinky1
@$( MD5SUM) test.wasm
$( TINYGO) build -size short -o test.wasm -tags= pca10040 examples/blinky2
@$( MD5SUM) test.wasm
$( TINYGO) build -size short -o test.wasm -tags= pca10056 examples/blinky2
@$( MD5SUM) test.wasm
$( TINYGO) build -size short -o test.wasm -tags= circuitplay_express examples/blinky1
@$( MD5SUM) test.wasm
$( TINYGO) build -size short -o test.wasm -tags= circuitplay_bluefruit examples/blinky1
@$( MD5SUM) test.wasm
e n d i f
# test all targets/boards
$( TINYGO) build -size short -o test.hex -target= pca10040-s132v6 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= microbit examples/echo
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= microbit-s110v8 examples/echo
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= microbit-v2 examples/microbit-blink
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= microbit-v2-s113v7 examples/microbit-blink
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= nrf52840-mdk examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10031 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= reelboard examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= reelboard examples/blinky2
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10056 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10056 examples/blinky2
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10059 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10059 examples/blinky2
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= itsybitsy-m0 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= feather-m0 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= trinket-m0 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= circuitplay-express examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= circuitplay-bluefruit examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= circuitplay-express examples/i2s
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= clue-alpha examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.gba -target= gameboy-advance examples/gba-display
@$( MD5SUM) test.gba
$( TINYGO) build -size short -o test.hex -target= grandcentral-m4 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= itsybitsy-m4 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= feather-m4 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pybadge examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= metro-m4-airlift examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pyportal examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= particle-argon examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= particle-boron examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= particle-xenon examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pinetime-devkit0 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= x9pro examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10056-s140v7 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= reelboard-s140v7 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= wioterminal examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pygamer examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= xiao examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= circuitplay-express examples/dac
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pyportal examples/dac
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= feather-nrf52840 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= feather-nrf52840-sense examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= itsybitsy-nrf52840 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= qtpy examples/serial
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= teensy41 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= teensy40 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= teensy36 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= p1am-100 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= atsame54-xpro examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= atsame54-xpro examples/can
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= feather-m4-can examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= feather-m4-can examples/caninterrupt
@$( MD5SUM) test.hex
machine: define Serial as the default output
Previously, the machine.UART0 object had two meanings:
- it was the first UART on the chip
- it was the default output for println
These two meanings conflict, and resulted in workarounds like:
- Defining UART0 to refer to the USB-CDC interface (atsamd21,
atsamd51, nrf52840), even though that clearly isn't an UART.
- Defining NRF_UART0 to avoid a conflict with UART0 (which was
redefined as a USB-CDC interface).
- Defining aliases like UART0 = UART1, which refer to the same
hardware peripheral (stm32).
This commit changes this to use a new machine.Serial object for the
default serial port. It might refer to the first or second UART
depending on the board, or even to the USB-CDC interface. Also, UART0
now really refers to the first UART on the chip, no longer to a USB-CDC
interface.
The changes in the runtime package are all just search+replace. The
changes in the machine package are a mixture of search+replace and
manual modifications.
This commit does not affect binary size, in fact it doesn't affect the
resulting binary at all.
4 years ago
$( TINYGO) build -size short -o test.hex -target= arduino-nano33 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= arduino-mkrwifi1010 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pico examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= nano-33-ble examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= nano-rp2040 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= feather-rp2040 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= macropad-rp2040 examples/blinky1
@$( MD5SUM) test.hex
# test pwm
$( TINYGO) build -size short -o test.hex -target= itsybitsy-m0 examples/pwm
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= itsybitsy-m4 examples/pwm
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= feather-m4 examples/pwm
@$( MD5SUM) test.hex
# test usbhid
$( TINYGO) build -size short -o test.hex -target= feather-nrf52840 examples/hid-keyboard
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= circuitplay-express examples/hid-keyboard
@$( MD5SUM) test.hex
i f n e q ( $( STM 32) , 0 )
$( TINYGO) build -size short -o test.hex -target= bluepill examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= feather-stm32f405 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= lgt92 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= nucleo-f103rb examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= nucleo-f722ze examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= nucleo-l031k6 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= nucleo-l432kc examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= nucleo-l552ze examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= nucleo-wl55jc examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= stm32f4disco examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= stm32f4disco examples/blinky2
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= stm32f4disco-1 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= stm32f4disco-1 examples/pwm
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= stm32f469disco examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= lorae5 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= swan examples/blinky1
@$( MD5SUM) test.hex
e n d i f
i f n e q ( $( AVR ) , 0 )
$( TINYGO) build -size short -o test.hex -target= atmega1284p examples/serial
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= arduino examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= arduino examples/pwm
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= arduino -scheduler= tasks examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= arduino-mega1280 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= arduino-mega1280 examples/pwm
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= arduino-nano examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= digispark examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= digispark -gc= leaking examples/blinky1
@$( MD5SUM) test.hex
e n d i f
i f n e q ( $( XTENSA ) , 0 )
$( TINYGO) build -size short -o test.bin -target= esp32-mini32 examples/blinky1
@$( MD5SUM) test.bin
$( TINYGO) build -size short -o test.bin -target= nodemcu examples/blinky1
@$( MD5SUM) test.bin
$( TINYGO) build -size short -o test.bin -target m5stack-core2 examples/serial
@$( MD5SUM) test.bin
$( TINYGO) build -size short -o test.bin -target m5stack examples/serial
@$( MD5SUM) test.bin
e n d i f
$( TINYGO) build -size short -o test.bin -target= esp32c3 examples/serial
@$( MD5SUM) test.bin
$( TINYGO) build -size short -o test.bin -target= m5stamp-c3 examples/serial
@$( MD5SUM) test.bin
$( TINYGO) build -size short -o test.hex -target= hifive1b examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= hifive1-qemu examples/serial
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= maixbit examples/blinky1
@$( MD5SUM) test.hex
i f n e q ( $( WASM ) , 0 )
$( TINYGO) build -size short -o wasm.wasm -target= wasm examples/wasm/export
$( TINYGO) build -size short -o wasm.wasm -target= wasm examples/wasm/main
e n d i f
# test various compiler flags
$( TINYGO) build -size short -o test.hex -target= pca10040 -gc= none -scheduler= none examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10040 -opt= 1 examples/blinky1
@$( MD5SUM) test.hex
$( TINYGO) build -size short -o test.hex -target= pca10040 -serial= none examples/echo
@$( MD5SUM) test.hex
$( TINYGO) build -o test.nro -target= nintendoswitch examples/serial
@$( MD5SUM) test.nro
$( TINYGO) build -size short -o test.hex -target= pca10040 -opt= 0 ./testdata/stdlib.go
@$( MD5SUM) test.hex
GOOS = linux GOARCH = arm $( TINYGO) build -size short -o test.elf ./testdata/cgo
GOOS = windows GOARCH = amd64 $( TINYGO) build -size short -o test.exe ./testdata/cgo
GOOS = darwin GOARCH = amd64 $( TINYGO) build -size short -o test ./testdata/cgo
GOOS = darwin GOARCH = arm64 $( TINYGO) build -size short -o test ./testdata/cgo
i f n e q ( $( OS ) , W i n d o w s _ N T )
# TODO: this does not yet work on Windows. Somehow, unused functions are
# not garbage collected.
$( TINYGO) build -o test.elf -gc= leaking -scheduler= none examples/serial
e n d i f
wasmtest :
$( GO) test ./tests/wasm
build/release : tinygo gen -device wasi -libc $( if $ ( filter 1,$ ( USE_SYSTEM_BINARYEN ) ) ,,binaryen )
@mkdir -p build/release/tinygo/bin
@mkdir -p build/release/tinygo/lib/clang/include
@mkdir -p build/release/tinygo/lib/CMSIS/CMSIS
@mkdir -p build/release/tinygo/lib/macos-minimal-sdk
@mkdir -p build/release/tinygo/lib/mingw-w64/mingw-w64-crt/lib-common
@mkdir -p build/release/tinygo/lib/mingw-w64/mingw-w64-headers/defaults
@mkdir -p build/release/tinygo/lib/musl/arch
@mkdir -p build/release/tinygo/lib/musl/crt
@mkdir -p build/release/tinygo/lib/musl/src
@mkdir -p build/release/tinygo/lib/nrfx
@mkdir -p build/release/tinygo/lib/picolibc/newlib/libc
@mkdir -p build/release/tinygo/lib/picolibc/newlib/libm
@mkdir -p build/release/tinygo/lib/wasi-libc
@mkdir -p build/release/tinygo/pkg/thumbv6m-unknown-unknown-eabi-cortex-m0
@mkdir -p build/release/tinygo/pkg/thumbv6m-unknown-unknown-eabi-cortex-m0plus
@mkdir -p build/release/tinygo/pkg/thumbv7em-unknown-unknown-eabi-cortex-m4
@echo copying source files
@cp -p build/tinygo$( EXE) build/release/tinygo/bin
i f n e q ( $( USE_SYSTEM_BINARYEN ) , 1 )
@cp -p build/wasm-opt$( EXE) build/release/tinygo/bin
e n d i f
@cp -p $( abspath $( CLANG_SRC) ) /lib/Headers/*.h build/release/tinygo/lib/clang/include
@cp -rp lib/CMSIS/CMSIS/Include build/release/tinygo/lib/CMSIS/CMSIS
@cp -rp lib/CMSIS/README.md build/release/tinygo/lib/CMSIS
@cp -rp lib/macos-minimal-sdk/* build/release/tinygo/lib/macos-minimal-sdk
@cp -rp lib/musl/arch/aarch64 build/release/tinygo/lib/musl/arch
@cp -rp lib/musl/arch/arm build/release/tinygo/lib/musl/arch
@cp -rp lib/musl/arch/generic build/release/tinygo/lib/musl/arch
@cp -rp lib/musl/arch/i386 build/release/tinygo/lib/musl/arch
@cp -rp lib/musl/arch/x86_64 build/release/tinygo/lib/musl/arch
@cp -rp lib/musl/crt/crt1.c build/release/tinygo/lib/musl/crt
@cp -rp lib/musl/COPYRIGHT build/release/tinygo/lib/musl
@cp -rp lib/musl/include build/release/tinygo/lib/musl
@cp -rp lib/musl/src/env build/release/tinygo/lib/musl/src
@cp -rp lib/musl/src/errno build/release/tinygo/lib/musl/src
@cp -rp lib/musl/src/exit build/release/tinygo/lib/musl/src
@cp -rp lib/musl/src/include build/release/tinygo/lib/musl/src
@cp -rp lib/musl/src/internal build/release/tinygo/lib/musl/src
@cp -rp lib/musl/src/malloc build/release/tinygo/lib/musl/src
@cp -rp lib/musl/src/mman build/release/tinygo/lib/musl/src
@cp -rp lib/musl/src/signal build/release/tinygo/lib/musl/src
@cp -rp lib/musl/src/stdio build/release/tinygo/lib/musl/src
@cp -rp lib/musl/src/string build/release/tinygo/lib/musl/src
@cp -rp lib/musl/src/thread build/release/tinygo/lib/musl/src
@cp -rp lib/musl/src/time build/release/tinygo/lib/musl/src
@cp -rp lib/musl/src/unistd build/release/tinygo/lib/musl/src
@cp -rp lib/mingw-w64/mingw-w64-crt/def-include build/release/tinygo/lib/mingw-w64/mingw-w64-crt
@cp -rp lib/mingw-w64/mingw-w64-crt/lib-common/api-ms-win-crt-* build/release/tinygo/lib/mingw-w64/mingw-w64-crt/lib-common
@cp -rp lib/mingw-w64/mingw-w64-crt/lib-common/kernel32.def.in build/release/tinygo/lib/mingw-w64/mingw-w64-crt/lib-common
@cp -rp lib/mingw-w64/mingw-w64-headers/crt/ build/release/tinygo/lib/mingw-w64/mingw-w64-headers
@cp -rp lib/mingw-w64/mingw-w64-headers/defaults/include build/release/tinygo/lib/mingw-w64/mingw-w64-headers/defaults
@cp -rp lib/nrfx/* build/release/tinygo/lib/nrfx
@cp -rp lib/picolibc/newlib/libc/ctype build/release/tinygo/lib/picolibc/newlib/libc
@cp -rp lib/picolibc/newlib/libc/include build/release/tinygo/lib/picolibc/newlib/libc
@cp -rp lib/picolibc/newlib/libc/locale build/release/tinygo/lib/picolibc/newlib/libc
@cp -rp lib/picolibc/newlib/libc/string build/release/tinygo/lib/picolibc/newlib/libc
@cp -rp lib/picolibc/newlib/libc/tinystdio build/release/tinygo/lib/picolibc/newlib/libc
@cp -rp lib/picolibc/newlib/libm/common build/release/tinygo/lib/picolibc/newlib/libm
@cp -rp lib/picolibc-stdio.c build/release/tinygo/lib
@cp -rp lib/wasi-libc/sysroot build/release/tinygo/lib/wasi-libc/sysroot
@cp -rp llvm-project/compiler-rt/lib/builtins build/release/tinygo/lib/compiler-rt-builtins
@cp -rp llvm-project/compiler-rt/LICENSE.TXT build/release/tinygo/lib/compiler-rt-builtins
@cp -rp src build/release/tinygo/src
@cp -rp targets build/release/tinygo/targets
./build/release/tinygo/bin/tinygo build-library -target= cortex-m0 -o build/release/tinygo/pkg/thumbv6m-unknown-unknown-eabi-cortex-m0/compiler-rt compiler-rt
./build/release/tinygo/bin/tinygo build-library -target= cortex-m0plus -o build/release/tinygo/pkg/thumbv6m-unknown-unknown-eabi-cortex-m0plus/compiler-rt compiler-rt
./build/release/tinygo/bin/tinygo build-library -target= cortex-m4 -o build/release/tinygo/pkg/thumbv7em-unknown-unknown-eabi-cortex-m4/compiler-rt compiler-rt
./build/release/tinygo/bin/tinygo build-library -target= cortex-m0 -o build/release/tinygo/pkg/thumbv6m-unknown-unknown-eabi-cortex-m0/picolibc picolibc
./build/release/tinygo/bin/tinygo build-library -target= cortex-m0plus -o build/release/tinygo/pkg/thumbv6m-unknown-unknown-eabi-cortex-m0plus/picolibc picolibc
./build/release/tinygo/bin/tinygo build-library -target= cortex-m4 -o build/release/tinygo/pkg/thumbv7em-unknown-unknown-eabi-cortex-m4/picolibc picolibc
release :
tar -czf build/release.tar.gz -C build/release tinygo
DEB_ARCH ?= native
deb :
@mkdir -p build/release-deb/usr/local/bin
@mkdir -p build/release-deb/usr/local/lib
cp -ar build/release/tinygo build/release-deb/usr/local/lib/tinygo
ln -sf ../lib/tinygo/bin/tinygo build/release-deb/usr/local/bin/tinygo
fpm -f -s dir -t deb -n tinygo -a $( DEB_ARCH) -v $( shell grep "const Version = " goenv/version.go | awk '{print $$NF}' ) -m '@tinygo-org' --description= 'TinyGo is a Go compiler for small places.' --license= 'BSD 3-Clause' --url= https://tinygo.org/ --deb-changelog CHANGELOG.md -p build/release.deb -C ./build/release-deb
i f n e q ( $( RELEASEONLY ) , 1 )
release : build /release
deb : build /release
e n d i f