Blob Blame History Raw
# Generated by go2rpm 1
%bcond_without check

%global __brp_strip_lto %{nil}
%global __brp_strip_static_archive %{nil}

# https://github.com/tinygo-org/tinygo
%global goipath         github.com/tinygo-org/tinygo
Version:                0.30.0

%global CMSIS_commit        9fe411cef1cef5de58e5957b89760759de44e393
%global avr_commit          6624554c02b237b23dc17d53e992bf54033fc228
%global clang_llvm_version  17
%global cmsis_svd_commit    df75ff974c76a911fc2815e29807f5ecaae06fc2
%global compiler_rt_version %{clang_llvm_version}.0.1
%global macos_minsdk_commit ebb736fda2bec7cea38dcda807518b835a539525
%global musl_version        1.2.3
%global nrfx_commit         d779b49fc59c7a165e7da1d7cd7d57b28a059f16
%global picolibc_commit     b92edfda8ac6853772d87cadaeeeaa21b78609b6
%global wasi_libc_commit    30094b6ed05f19cee102115215863d185f2db4f0
%global mingw64_commit      8526cb618269440a94810b94b77f8bd48c5c3396

# No longer matching regular Go's /usr/share/gocode because it also provides
# pre-compiled binaries, and symlinks to arch-specific clang headers.
%global tinygoroot %{_libdir}/tinygo

%gometa

%global common_description %{expand:
Go compiler for small places. Microcontrollers, WebAssembly, and command-line
tools. Based on LLVM.}

#global godocs CHANGELOG.md BUILDING.md CONTRIBUTING.md README.md
#global golicenses LICENSE LICENSE.TXT
#global gosupfiles lib/CMSIS/CMSIS/Include/*.h lib/compiler-rt/lib/builtins/*/*.S lib/nrfx/mdk/*.{ld,S} src/examples/wasm/*/*.js targets/*.{js,json,ld,S}

Name:           tinygo
Release:        %autorelease
Summary:        Go compiler for small places

# Main files: BSD
# CMSIS: BSD (subsetted)
# avr-mcu: ASL 2.0 (packs) and MIT (Rust code, unused by this package)
# cmsis-svd: ASL 2.0 and BSD and ISC and MIT (subsetted)
# compiler-rt: NCSA or MIT
# macos-minimal-sdk: APSL 2.0 and BSD and ISC and Public Domain
# musl: MIT
# nrfx: BSD and ASL 2.0
# picolibc: BSD and ISC and MIT and GPLv2 (testing code only, unused by this package)
# wasi-libc: BSD and CC0 and ISC and MIT and Public Domain
License:        BSD and APSL 2.0 and ASL 2.0 and CC0 and ISC and MIT and (NCSA or MIT) and Public Domain
URL:            %{gourl}
Source0:        %{gosource}
Source1:        clean_tarballs.sh
Source2:        cmsis-%{CMSIS_commit}-clean.tar.xz
Source3:        https://github.com/avr-rust/avr-mcu/archive/%{avr_commit}/avr-%{avr_commit}.tar.gz
Source4:        cmsis_svd-%{cmsis_svd_commit}-clean.tar.xz
Source50:       https://github.com/llvm/llvm-project/releases/download/llvmorg-%{compiler_rt_version}/compiler-rt-%{compiler_rt_version}.src.tar.xz
Source51:       https://github.com/llvm/llvm-project/releases/download/llvmorg-%{compiler_rt_version}/compiler-rt-%{compiler_rt_version}.src.tar.xz.sig
Source52:       https://src.fedoraproject.org/rpms/compiler-rt/raw/f8e98d51f0c3fdbaa9ce5d99816930e4fcbe504b/f/release-keys.asc#/compiler-rt-release-keys.asc
Source60:       https://musl.libc.org/releases/musl-%{musl_version}.tar.gz
Source61:       https://musl.libc.org/releases/musl-%{musl_version}.tar.gz.asc
Source62:       https://musl.libc.org/musl.pub
Source7:        https://github.com/aykevl/macos-minimal-sdk/archive/%{macos_minsdk_commit}/macos-minimal-sdk-%{macos_minsdk_commit}.tar.gz
Source8:        https://github.com/NordicSemiconductor/nrfx/archive/%{nrfx_commit}/nrfx-%{nrfx_commit}.tar.gz
Source9:        https://github.com/keith-packard/picolibc/archive/%{picolibc_commit}/picolibc-%{picolibc_commit}.tar.gz
Source10:       https://github.com/WebAssembly/wasi-libc/archive/%{wasi_libc_commit}/wasi-libc-%{wasi_libc_commit}.tar.gz
Source11:       https://github.com/mingw-w64/mingw-w64/archive/%{mingw64_commit}/mingw64-%{mingw64_commit}.tar.gz
# We don't have wasmtime to run these.
Patch0001:      0001-Skip-WASI-tests.patch
# Unbundling things
# Patch0002:      0002-Use-system-mingw64-headers-and-crt.patch
# Skip testing some things where qemu is broken:
# https://gitlab.com/qemu-project/qemu/-/issues/447
# https://gitlab.com/qemu-project/qemu/-/issues/690
Patch0002:      0002-Skip-some-cross-Linux-tests-where-qemu-is-broken.patch
# Add Fedora specific dnf instructions
Patch0003:      0003-Suggest-optional-packages-to-install-if-missing.patch

# Support LLVM 17.
# https://github.com/tinygo-org/tinygo/pull/3923
Patch0004:      0004-transform-fix-bug-in-StringToBytes-optimization-pass.patch
# https://github.com/tinygo-org/tinygo/pull/3918
Patch0005:      0005-all-use-the-new-LLVM-pass-manager.patch
# https://github.com/tinygo-org/tinygo/pull/3913
Patch0006:      0006-avr-don-t-compile-large-parts-of-picolibc-math-stdio.patch
Patch0007:      0007-all-add-initial-LLVM-17-support.patch

# Not supported upstream yet.
ExcludeArch:    ppc64le s390x
# https://fedoraproject.org/wiki/Changes/EncourageI686LeafRemoval
ExcludeArch:    %{ix86}

BuildRequires:  (clang-devel >= %{clang_llvm_version} with clang-devel < %{lua: print(tonumber(rpm.expand('%{clang_llvm_version}')) + 1)})
BuildRequires:  golang(github.com/aykevl/go-wasm)
BuildRequires:  golang(github.com/blakesmith/ar)
BuildRequires:  chromium
BuildRequires:  golang(github.com/chromedp/chromedp) >= 0.7.6
BuildRequires:  golang(github.com/chromedp/cdproto/cdp)
BuildRequires:  golang(github.com/gofrs/flock) >= 0.8.1
BuildRequires:  golang(github.com/google/shlex)
BuildRequires:  golang(github.com/inhies/go-bytesize)
BuildRequires:  golang(github.com/marcinbor85/gohex)
BuildRequires:  golang(github.com/mattn/go-colorable) >= 0.1.8
BuildRequires:  golang(github.com/mattn/go-tty) >= 0.0.4
BuildRequires:  golang(github.com/sigurn/crc16)
BuildRequires:  golang(go.bug.st/serial) >= 1.6.0
BuildRequires:  golang(golang.org/x/tools/go/ast/astutil)
BuildRequires:  golang(golang.org/x/tools/go/ssa) >= 0.11
BuildRequires:  golang(gopkg.in/yaml.v2) >= 2.4.0
BuildRequires:  golang(tinygo.org/x/go-llvm)
BuildRequires:  golang-tests
BuildRequires:  llvm-devel(major) = %{clang_llvm_version}
BuildRequires:  make

BuildRequires:  binaryen >= 102
# We don't have glibc for arm, so skip these.
#BuildRequires:  gcc-arm-linux-gnu
#BuildRequires:  gcc-aarch64-linux-gnu
BuildRequires:  lld
# BuildRequires:  mingw64-crt
# BuildRequires:  mingw64-headers
BuildRequires:  nodejs
BuildRequires:  qemu-system-arm-core
BuildRequires:  qemu-system-riscv-core
BuildRequires:  qemu-user

# For GPG signature verification
BuildRequires:  gnupg2

Requires:       clang
Requires:       golang
Requires:       lld
# Add this when LLVM supports ESP natively.
# Recommends:     esptool
# Recommends:     mingw64-crt
# Recommends:     mingw64-headers
Recommends:     qemu-system-arm-core
Recommends:     qemu-system-riscv-core
Recommends:     qemu-user

# Make note of bundled libc's
Provides:       bundled(compiler-rt) = %{compiler_rt_version}
Provides:       bundled(musl) = %{musl_version}
Provides:       bundled(picolibc) = %{picolibc_commit}
Provides:       bundled(wasi-libc) = %{wasi_libc_commit}

%description
%{common_description}

#gopkg


%prep
%goprep
%autopatch -p1

tar -C lib -xf %{SOURCE2}
rmdir lib/CMSIS
mv lib/CMSIS-%{CMSIS_commit} lib/CMSIS

tar -C lib -xf %{SOURCE3}
rmdir lib/avr
mv lib/avr-mcu-%{avr_commit} lib/avr

tar -C lib -xf %{SOURCE4}
rmdir lib/cmsis-svd
mv lib/cmsis-svd-%{cmsis_svd_commit} lib/cmsis-svd

# Verify *before* actually unpacking!
%{gpgverify} --keyring='%{SOURCE52}' --signature='%{SOURCE51}' --data='%{SOURCE50}'
tar -C lib -xf %{SOURCE50}
mv lib/compiler-rt-%{compiler_rt_version}.src/lib/builtins lib/compiler-rt-builtins
mv lib/compiler-rt-%{compiler_rt_version}.src/README.txt lib/compiler-rt-builtins/
mv lib/compiler-rt-%{compiler_rt_version}.src/LICENSE.TXT lib/compiler-rt-builtins/

# Verify *before* actually unpacking!
%{gpgverify} --keyring='%{SOURCE62}' --signature='%{SOURCE61}' --data='%{SOURCE60}'
tar -C lib -xf %{SOURCE60}
rmdir lib/musl
mv lib/musl-%{musl_version} lib/musl

tar -C lib -xf %{SOURCE7}
rmdir lib/macos-minimal-sdk
mv lib/macos-minimal-sdk-%{macos_minsdk_commit} lib/macos-minimal-sdk

tar -C lib -xf %{SOURCE8}
rmdir lib/nrfx
mv lib/nrfx-%{nrfx_commit} lib/nrfx
rm lib/nrfx/.gitignore
chmod -x lib/nrfx/doc/generate_html_doc.sh

tar -C lib -xf %{SOURCE9}
rmdir lib/picolibc
mv lib/picolibc-%{picolibc_commit} lib/picolibc

tar -C lib -xf %{SOURCE10}
rmdir lib/wasi-libc
mv lib/wasi-libc-%{wasi_libc_commit} lib/wasi-libc

tar -C lib -xf %{SOURCE11}
rmdir lib/mingw-w64
mv lib/mingw-w64-%{mingw64_commit} lib/mingw-w64

%build
# Use only GOBUILDTAGS when https://pagure.io/go-rpm-macros/pull-request/34 is
# merged and released.
export BUILDTAGS="llvm%{clang_llvm_version}" LDFLAGS="-X github.com/tinygo-org/tinygo/goenv.TINYGOROOT=%{tinygoroot} "
%gobuild -o %{gobuilddir}/bin/tinygo %{goipath}
GO111MODULE=off %make_build gen-device STM32=0
for target in thumbv6m-unknown-unknown-eabi-cortex-m0 thumbv6m-unknown-unknown-eabi-cortex-m0plus thumbv7em-unknown-unknown-eabi-cortex-m4; do
    mkdir -p ${target}
    for libc in compiler-rt picolibc; do
        TINYGOROOT=$PWD \
            %{gobuilddir}/bin/tinygo \
                build-library -target=${target#*eabi-} -o ${target}/${libc} ${libc}
        chmod -R a+rX ${target}/${libc}
    done
done
%make_build wasi-libc CLANG=clang-%{clang_llvm_version} LLVM_AR=llvm-ar LLVM_NM=llvm-nm


%install
#gopkginstall
install -vdm 0755                     %{buildroot}%{_bindir}
install -vpm 0755 %{gobuilddir}/bin/* %{buildroot}%{_bindir}/

install -vdm 0755 %{buildroot}%{tinygoroot}
install -vdm 0755 %{buildroot}%{tinygoroot}/lib
install -vdm 0755 %{buildroot}%{tinygoroot}/lib/CMSIS
install -vpm 0644 lib/CMSIS/README.md %{buildroot}%{tinygoroot}/lib/CMSIS/
install -vdm 0755 %{buildroot}%{tinygoroot}/lib/CMSIS/CMSIS/Include
install -vpm 0644 lib/CMSIS/CMSIS/Include/* %{buildroot}%{tinygoroot}/lib/CMSIS/CMSIS/Include/
cp -rp lib/compiler-rt-builtins %{buildroot}%{tinygoroot}/lib
install -vdm 0755 %{buildroot}%{tinygoroot}/lib/macos-minimal-sdk
cp -rp lib/macos-minimal-sdk/* %{buildroot}%{tinygoroot}/lib/macos-minimal-sdk
install -vdm 0755 %{buildroot}%{tinygoroot}/lib/mingw-w64/mingw-w64-crt/lib-common
cp -rp lib/mingw-w64/mingw-w64-crt/def-include %{buildroot}%{tinygoroot}/lib/mingw-w64/mingw-w64-crt
cp -rp lib/mingw-w64/mingw-w64-crt/lib-common/api-ms-win-crt-* %{buildroot}%{tinygoroot}/lib/mingw-w64/mingw-w64-crt/lib-common
cp -rp lib/mingw-w64/mingw-w64-crt/lib-common/kernel32.def.in %{buildroot}%{tinygoroot}/lib/mingw-w64/mingw-w64-crt/lib-common
install -vdm 0755 %{buildroot}%{tinygoroot}/lib/mingw-w64/mingw-w64-headers/defaults
cp -rp lib/mingw-w64/mingw-w64-headers/crt/ %{buildroot}%{tinygoroot}/lib/mingw-w64/mingw-w64-headers
cp -rp lib/mingw-w64/mingw-w64-headers/defaults/include %{buildroot}%{tinygoroot}/lib/mingw-w64/mingw-w64-headers/defaults
install -vdm 0755 %{buildroot}%{tinygoroot}/lib/musl
cp -rp lib/musl/COPYRIGHT %{buildroot}%{tinygoroot}/lib/musl
cp -rp lib/musl/include %{buildroot}%{tinygoroot}/lib/musl
install -vdm 0755 %{buildroot}%{tinygoroot}/lib/musl/arch
cp -rp lib/musl/arch/aarch64 %{buildroot}%{tinygoroot}/lib/musl/arch
cp -rp lib/musl/arch/arm %{buildroot}%{tinygoroot}/lib/musl/arch
cp -rp lib/musl/arch/generic %{buildroot}%{tinygoroot}/lib/musl/arch
cp -rp lib/musl/arch/i386 %{buildroot}%{tinygoroot}/lib/musl/arch
cp -rp lib/musl/arch/x86_64 %{buildroot}%{tinygoroot}/lib/musl/arch
install -vdm 0755 %{buildroot}%{tinygoroot}/lib/musl/crt
cp -rp lib/musl/crt/crt1.c %{buildroot}%{tinygoroot}/lib/musl/crt
install -vdm 0755 %{buildroot}%{tinygoroot}/lib/musl/src
cp -rp lib/musl/src/env %{buildroot}%{tinygoroot}/lib/musl/src
cp -rp lib/musl/src/errno %{buildroot}%{tinygoroot}/lib/musl/src
cp -rp lib/musl/src/exit %{buildroot}%{tinygoroot}/lib/musl/src
cp -rp lib/musl/src/include %{buildroot}%{tinygoroot}/lib/musl/src
cp -rp lib/musl/src/internal %{buildroot}%{tinygoroot}/lib/musl/src
cp -rp lib/musl/src/legacy %{buildroot}%{tinygoroot}/lib/musl/src
cp -rp lib/musl/src/malloc %{buildroot}%{tinygoroot}/lib/musl/src
cp -rp lib/musl/src/mman %{buildroot}%{tinygoroot}/lib/musl/src
cp -rp lib/musl/src/math %{buildroot}%{tinygoroot}/lib/musl/src
cp -rp lib/musl/src/signal %{buildroot}%{tinygoroot}/lib/musl/src
cp -rp lib/musl/src/stdio %{buildroot}%{tinygoroot}/lib/musl/src
cp -rp lib/musl/src/string %{buildroot}%{tinygoroot}/lib/musl/src
cp -rp lib/musl/src/thread %{buildroot}%{tinygoroot}/lib/musl/src
cp -rp lib/musl/src/time %{buildroot}%{tinygoroot}/lib/musl/src
cp -rp lib/musl/src/unistd %{buildroot}%{tinygoroot}/lib/musl/src
cp -rp lib/nrfx %{buildroot}%{tinygoroot}/lib/
install -vdm 0755 %{buildroot}%{tinygoroot}/lib/wasi-libc
cp -rp lib/wasi-libc/sysroot %{buildroot}%{tinygoroot}/lib/wasi-libc/
install -vdm 0755 %{buildroot}%{tinygoroot}/lib/picolibc/newlib/libc
cp -rp lib/picolibc/newlib/libc/ctype %{buildroot}%{tinygoroot}/lib/picolibc/newlib/libc
chmod -x %{buildroot}%{tinygoroot}/lib/picolibc/newlib/libc/ctype/{mkcaseconv,mkcategories,mkunidata}
cp -rp lib/picolibc/newlib/libc/include %{buildroot}%{tinygoroot}/lib/picolibc/newlib/libc
cp -rp lib/picolibc/newlib/libc/locale %{buildroot}%{tinygoroot}/lib/picolibc/newlib/libc
cp -rp lib/picolibc/newlib/libc/string %{buildroot}%{tinygoroot}/lib/picolibc/newlib/libc
chmod -x %{buildroot}%{tinygoroot}/lib/picolibc/newlib/libc/string/{mkunidata,mkwide,mkwidthA,uniset}
cp -rp lib/picolibc/newlib/libc/tinystdio %{buildroot}%{tinygoroot}/lib/picolibc/newlib/libc
chmod -x %{buildroot}%{tinygoroot}/lib/picolibc/newlib/libc/tinystdio/make-dtoa-data
install -vdm 0755 %{buildroot}%{tinygoroot}/lib/picolibc/newlib/libm
cp -rp lib/picolibc/newlib/libm/common %{buildroot}%{tinygoroot}/lib/picolibc/newlib/libm
cp -rp lib/picolibc/newlib/libm/math %{buildroot}%{tinygoroot}/lib/picolibc/newlib/libm
cp -rp lib/picolibc-stdio.c %{buildroot}%{tinygoroot}/lib
install -vdm 0755 %{buildroot}%{tinygoroot}/pkg
for target in thumbv6m-unknown-unknown-eabi-cortex-m0 thumbv6m-unknown-unknown-eabi-cortex-m0plus thumbv7em-unknown-unknown-eabi-cortex-m4; do
    install -vdm 0755 %{buildroot}%{tinygoroot}/pkg/${target}
    for libc in compiler-rt picolibc; do
        cp -rp ${target}/${libc} %{buildroot}%{tinygoroot}/pkg/${target}/
    done
done
cp -rp src %{buildroot}%{tinygoroot}/
rm %{buildroot}%{tinygoroot}/src/examples/wasm/.gitignore
cp -rp targets %{buildroot}%{tinygoroot}/


%if %{with check}
%global gotestflags %gocompilerflags -v -tags="llvm%{clang_llvm_version}"
%check
export TINYGOROOT=%{buildroot}%{tinygoroot}
export GOPATH=%{buildroot}%{tinygoroot}:%{gopath}
export PATH=%{buildroot}%{_bindir}:$PATH
export GO111MODULE=off
export XDG_CACHE_HOME="${PWD}/$(mktemp -d tinygo.XXXXXX)"
%gocheck -v -t src -t tests
( cd _build/src/%{goipath} && GOPATH=%{currentgosourcedir}/_build:$GOPATH make smoketest STM32=0 XTENSA=0 )
%ifnarch aarch64
make wasmtest
%endif
make tinygo-test
%endif


%files
%doc README.md CHANGELOG.md CONTRIBUTING.md
%license LICENSE
%{_bindir}/tinygo
%{tinygoroot}
%doc %{tinygoroot}/lib/CMSIS/README.md
%license %{tinygoroot}/lib/compiler-rt-builtins/LICENSE.TXT
%doc %{tinygoroot}/lib/compiler-rt-builtins/README.txt
%license %{tinygoroot}/lib/nrfx/LICENSE
%doc %{tinygoroot}/lib/nrfx/README.md
%license %{tinygoroot}/lib/musl/COPYRIGHT

#gopkgfiles


%changelog
%autochangelog