166 lines
4.7 KiB
Nix
166 lines
4.7 KiB
Nix
{ stdenv
|
|
, lib
|
|
, buildPackages
|
|
, buildGoModule
|
|
, fetchFromGitHub
|
|
, makeWrapper
|
|
, substituteAll
|
|
, llvmPackages
|
|
, go
|
|
, libffi
|
|
, zlib
|
|
, ncurses
|
|
, libxml2
|
|
, xar
|
|
, wasi-libc
|
|
, avrgcc
|
|
, binaryen
|
|
, avrdude
|
|
, gdb
|
|
, openocd
|
|
, tinygoTests ? [ "smoketest" ]
|
|
}:
|
|
|
|
let
|
|
llvmMajor = lib.versions.major llvm.version;
|
|
inherit (llvmPackages) llvm clang compiler-rt lld;
|
|
in
|
|
|
|
buildGoModule rec {
|
|
pname = "tinygo";
|
|
version = "0.26.0";
|
|
|
|
src = fetchFromGitHub {
|
|
owner = "tinygo-org";
|
|
repo = "tinygo";
|
|
rev = "v${version}";
|
|
sha256 = "rI8CADPWKdNvfknEsrpp2pCeZobf9fAp0GDIWjupzZA=";
|
|
fetchSubmodules = true;
|
|
};
|
|
|
|
vendorSha256 = "sha256-ihQd/RAjAQhgQZHbNiWmAD0eOo1MvqAR/OwIOUWtdAM=";
|
|
|
|
patches = [
|
|
./0001-Makefile.patch
|
|
|
|
(substituteAll {
|
|
src = ./0002-Add-clang-header-path.patch;
|
|
clang_include = "${clang.cc.lib}/lib/clang/${clang.cc.version}/include";
|
|
})
|
|
|
|
#TODO(muscaln): Find a better way to fix build ID on darwin
|
|
./0003-Use-out-path-as-build-id-on-darwin.patch
|
|
];
|
|
|
|
checkInputs = [ avrgcc binaryen ];
|
|
nativeBuildInputs = [ makeWrapper ];
|
|
buildInputs = [ llvm clang.cc ]
|
|
++ lib.optionals stdenv.isDarwin [ zlib ncurses libffi libxml2 xar ];
|
|
|
|
doCheck = (stdenv.buildPlatform.canExecute stdenv.hostPlatform);
|
|
inherit tinygoTests;
|
|
|
|
allowGoReference = true;
|
|
tags = [ "llvm${llvmMajor}" ];
|
|
ldflags = [ "-X github.com/tinygo-org/tinygo/goenv.TINYGOROOT=${placeholder "out"}/share/tinygo" ];
|
|
subPackages = [ "." ];
|
|
|
|
# Output contains static libraries for different arm cpus
|
|
# and stripping could mess up these so only strip the compiler
|
|
stripDebugList = [ "bin" ];
|
|
|
|
postConfigure = lib.optionalString stdenv.isDarwin ''
|
|
for i in vendor/tinygo.org/x/go-llvm/llvm_config_darwin*; do
|
|
substituteInPlace $i --replace "curses" "ncurses"
|
|
done
|
|
'';
|
|
|
|
postPatch = ''
|
|
# Copy wasi-libc, symlink seems not working
|
|
rm -rf lib/wasi-libc/*
|
|
mkdir -p lib/wasi-libc/sysroot/lib/wasm32-wasi lib/wasi-libc/sysroot/include
|
|
cp -a ${wasi-libc}/lib/* lib/wasi-libc/sysroot/lib/wasm32-wasi/
|
|
cp -a ${wasi-libc.dev}/include/* lib/wasi-libc/sysroot/include/
|
|
|
|
# Borrow compiler-rt builtins from our source
|
|
# See https://github.com/tinygo-org/tinygo/pull/2471
|
|
mkdir -p lib/compiler-rt-builtins
|
|
cp -a ${compiler-rt.src}/compiler-rt/lib/builtins/* lib/compiler-rt-builtins/
|
|
|
|
substituteInPlace Makefile \
|
|
--replace "\$(TINYGO)" "$(pwd)/build/tinygo" \
|
|
--replace "@\$(MD5SUM)" "md5sum" \
|
|
--replace "build/release/tinygo/bin" "$out/bin" \
|
|
--replace "build/release/" "$out/share/"
|
|
|
|
substituteInPlace builder/buildid.go \
|
|
--replace "OUT_PATH" "$out"
|
|
|
|
# TODO: Fix mingw and darwin
|
|
# Disable windows and darwin cross-compile tests
|
|
sed -i "/GOOS=windows/d" Makefile
|
|
sed -i "/GOOS=darwin/d" Makefile
|
|
|
|
# tinygo needs versioned binaries
|
|
mkdir -p $out/libexec/tinygo
|
|
ln -s ${lib.getBin clang.cc}/bin/clang $out/libexec/tinygo/clang-${llvmMajor}
|
|
ln -s ${lib.getBin lld}/bin/ld.lld $out/libexec/tinygo/ld.lld-${llvmMajor}
|
|
ln -s ${lib.getBin lld}/bin/wasm-ld $out/libexec/tinygo/wasm-ld-${llvmMajor}
|
|
ln -s ${gdb}/bin/gdb $out/libexec/tinygo/gdb-multiarch
|
|
'' + lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform) ''
|
|
substituteInPlace Makefile \
|
|
--replace "./build/tinygo" "${buildPackages.tinygo}/bin/tinygo"
|
|
'';
|
|
|
|
preBuild = ''
|
|
export PATH=$out/libexec/tinygo:$PATH
|
|
export HOME=$TMPDIR
|
|
'';
|
|
|
|
postBuild = let
|
|
tinygoForBuild = if (stdenv.buildPlatform.canExecute stdenv.hostPlatform)
|
|
then "build/tinygo"
|
|
else "${buildPackages.tinygo}/bin/tinygo";
|
|
in ''
|
|
# Move binary
|
|
mkdir -p build
|
|
mv $GOPATH/bin/tinygo build/tinygo
|
|
|
|
make gen-device
|
|
|
|
export TINYGOROOT=$(pwd)
|
|
finalRoot=$out/share/tinygo
|
|
|
|
for target in thumbv6m-unknown-unknown-eabi-cortex-m0 thumbv6m-unknown-unknown-eabi-cortex-m0plus thumbv7em-unknown-unknown-eabi-cortex-m4; do
|
|
mkdir -p $finalRoot/pkg/$target
|
|
for lib in compiler-rt picolibc; do
|
|
${tinygoForBuild} build-library -target=''${target#*eabi-} -o $finalRoot/pkg/$target/$lib $lib
|
|
done
|
|
done
|
|
'';
|
|
|
|
checkPhase = lib.optionalString (tinygoTests != [ ] && tinygoTests != null) ''
|
|
make ''${tinygoTests[@]} XTENSA=0 ${lib.optionalString stdenv.isDarwin "AVR=0"}
|
|
'';
|
|
|
|
installPhase = ''
|
|
runHook preInstall
|
|
|
|
make build/release
|
|
|
|
wrapProgram $out/bin/tinygo \
|
|
--prefix PATH : ${lib.makeBinPath [ go avrdude openocd avrgcc binaryen ]}:$out/libexec/tinygo
|
|
|
|
runHook postInstall
|
|
'';
|
|
|
|
disallowedReferences = [ wasi-libc ];
|
|
|
|
meta = with lib; {
|
|
homepage = "https://tinygo.org/";
|
|
description = "Go compiler for small places";
|
|
license = licenses.bsd3;
|
|
maintainers = with maintainers; [ Madouura muscaln ];
|
|
};
|
|
}
|