nixpkgs/pkgs/development/compilers/tinygo/default.nix
Guillaume Girol 33afbf39f6 treewide: switch to nativeCheckInputs
checkInputs used to be added to nativeBuildInputs. Now we have
nativeCheckInputs to do that instead. Doing this treewide change allows
to keep hashes identical to before the introduction of
nativeCheckInputs.
2023-01-21 12:00:00 +00:00

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
];
nativeCheckInputs = [ 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 ];
};
}