From 7920ba29a7fa70d44a93b44546ba8c72f2fbb7fd Mon Sep 17 00:00:00 2001 From: Maxim Reznik Date: Mon, 27 Dec 2021 17:53:48 +0200 Subject: [PATCH] Use gcc/bb-runtimes sources. Replace CircleCI with GitHub Action. --- .circleci/config.yml | 39 -------- .circleci/images/Dockerfile | 20 ----- .copr/Makefile | 21 +---- .copr/adawebpack.spec | 36 +++----- .github/workflows/build.yml | 124 +++++++++++++++++++++++++ README.md | 175 +++++++++++++++++++++++++----------- packages/msys2/PKGBUILD | 58 ++++++++++++ 7 files changed, 322 insertions(+), 151 deletions(-) delete mode 100644 .circleci/config.yml delete mode 100644 .circleci/images/Dockerfile create mode 100644 .github/workflows/build.yml create mode 100644 packages/msys2/PKGBUILD diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 4894f4f..0000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,39 +0,0 @@ -version: 2 -jobs: - build: - docker: - - image: reznik/gnat:wasm - steps: - - run: rm -rf /gnat-llvm/llvm-interface/adawebpack_src - - checkout: - path: /gnat-llvm/llvm-interface/adawebpack_src - - run: cd /gnat-llvm ; echo git pull # gnat-llvm HEAD doesn't work - - run: svn up /gnat-llvm/llvm-interface/gnat_src/ - - run: cd /gnat-llvm ; patch -p0 < llvm-interface/adawebpack_src/packages/Fedora/gnat-adafinal_conv.patch - - run: make wasm -C /gnat-llvm/llvm-interface/ - - run: make -C /gnat-llvm/llvm-interface/adawebpack_src - rpm: - docker: - - image: reznik/gnat:adawebpack - steps: - - checkout: - path: adawebpack - - run: | - rpmdev-setuptree - cp adawebpack/packages/Fedora/adawebpack.spec ~/rpmbuild/SPECS/ - cp adawebpack/packages/Fedora/gnat-adafinal_conv.patch ~/rpmbuild/SOURCES/ - tar czf ~/rpmbuild/SOURCES/adawebpack.tar.gz --exclude-vcs adawebpack - git clone https://github.com/AdaCore/gnat-llvm.git gnat-llvm - pushd gnat-llvm; git checkout 5db6ab8; popd - tar czf ~/rpmbuild/SOURCES/gnat-llvm.tar.gz --exclude-vcs gnat-llvm - svn export --force svn://gcc.gnu.org/svn/gcc/trunk/gcc/ada gnat_src - tar czf ~/rpmbuild/SOURCES/gnat_src.tar.gz --exclude-vcs gnat_src - curl -L -o ~/rpmbuild/SOURCES/gnat-2020-20200818-19951-src.tar.gz https://community.download.adacore.com/v1/f51b6c0b5591edc6eff2928e8510a467bc8ce1e4?filename=gnat-2020-20200818-19951-src.tar.gz - rpmbuild -ba ~/rpmbuild/SPECS/adawebpack.spec - -workflows: - version: 2 - workflow: - jobs: - - build - - rpm diff --git a/.circleci/images/Dockerfile b/.circleci/images/Dockerfile deleted file mode 100644 index 4ae731e..0000000 --- a/.circleci/images/Dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -FROM registry.fedoraproject.org/fedora-minimal:31 -RUN microdnf install \ - make \ - rpmdevtools \ - gcc-gnat \ - gcc-c++ \ - libstdc++-static \ - clang \ - llvm-devel \ - lld \ - gprbuild \ - gdb \ - git \ - subversion \ - openssh-server \ - tar \ - gzip \ - chrpath \ - ca-certificates && \ - microdnf clean all \ No newline at end of file diff --git a/.copr/Makefile b/.copr/Makefile index 29cb323..265f4b1 100644 --- a/.copr/Makefile +++ b/.copr/Makefile @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021 Max Reznik +# SPDX-FileCopyrightText: 2021-2022 Max Reznik # # SPDX-License-Identifier: MIT # @@ -10,20 +10,7 @@ srpm: mkdir /tmp/.copr tar cavf /tmp/.copr/`grep ^Source0: $(spec)| sed -e 's/^.* //'` \ --exclude-vcs -C .. `basename $(realpath .)` - dnf --assumeyes install git - git clone https://github.com/AdaCore/gnat-llvm.git gnat-llvm - git -C gnat-llvm checkout 1d76aa3a057a8fa8d267fc1c5a75d0c729c48840 - tar czf /tmp/.copr/gnat-llvm.tar.gz --exclude-vcs gnat-llvm - - #git init gcc - #git -C gcc remote add origin https://github.com/gcc-mirror/gcc.git - #git -C gcc fetch --depth=1 origin acf190b208ae6883e94bcaa13adf9e3439bee63d - #git -C gcc reset --hard FETCH_HEAD - #git clone --depth=1 git://gcc.gnu.org/git/gcc.git - #mv gcc/gcc/ada gnat_src - #svn export --force svn://gcc.gnu.org/svn/gcc/trunk/gcc/ada gnat_src - #tar czf /tmp/.copr/gnat_src.tar.gz --exclude-vcs gnat_src - - curl -L -o /tmp/.copr/gnat-2021-20210519-19A70-src.tar.gz \ - https://community.download.adacore.com/v1/005d2b2eff627177986d2517eb31e1959bec6f3a?filename=gnat-2021-20210519-19A70-src.tar.gz + curl -L -o /tmp/.copr/gnat-llvm.zip https://github.com/AdaCore/gnat-llvm/archive/e3f56dce0df148c5f27e97d973cfbdc1bd72248f.zip + curl -L -o /tmp/.copr/bb-runtimes.zip https://github.com/Fabien-Chouteau/bb-runtimes/archive/7a4674ae9221d2fa046bed20fbaf9de9caa09d41.zip + curl -L -o /tmp/.copr/gcc.zip https://github.com/gcc-mirror/gcc/archive/e078de24eae8253fd4f24342f65166b525dd99c6.zip rpmbuild -bs $(spec) --define="_sourcedir /tmp/.copr" --define="_srcrpmdir $(outdir)" diff --git a/.copr/adawebpack.spec b/.copr/adawebpack.spec index 0012e53..8663612 100644 --- a/.copr/adawebpack.spec +++ b/.copr/adawebpack.spec @@ -6,25 +6,24 @@ %define __os_install_post %{nil} Name: adawebpack -Version: 0.1.0 +Version: 22.0.1 Release: git%{?dist} Summary: Ada WASM Runtime and Bindings for Web API Group: Development/Libraries License: MIT URL: https://github.com/godunko/adawebpack -### Direct download is not availeble Source0: adawebpack.tar.gz -Source1: gnat-llvm.tar.gz -# https://community.download.adacore.com/v1/005d2b2eff627177986d2517eb31e1959bec6f3a?filename=gnat-2021-20210519-19A70-src.tar.gz -Source2: gnat-2021-20210519-19A70-src.tar.gz -#Source3: gnat_src.tar.gz +Source1: gnat-llvm.zip +Source2: bb-runtimes.zip +Source3: gcc.zip +BuildRequires: bsdtar BuildRequires: gcc-gnat -BuildRequires: fedora-gnat-project-common >= 3 +BuildRequires: fedora-gnat-project-common >= 3 BuildRequires: gprbuild BuildRequires: gcc-c++ BuildRequires: libstdc++-static BuildRequires: lld -BuildRequires: llvm-devel +BuildRequires: llvm-devel >= 13 BuildRequires: clang BuildRequires: chrpath @@ -35,22 +34,13 @@ ExclusiveArch: %GPRbuild_arches Ada WASM Runtime and Bindings for Web API %prep -%setup -q -b 1 -b 2 -n gnat-llvm -cp -r ../gnat-2021-20210519-19A70-src/src/ada llvm-interface/gnat_src -mv ../%{name} llvm-interface/%{name}_src -mv ../gnat-2021-20210519-19A70-src/src/ada/hie llvm-interface/rts-sources -#cp -v ../gnat-2021-20210519-19A70-src/src/ada/libgnat/s-{stratt,statxd}.ad[sb] llvm-interface/gnat_src/libgnat/ +%setup -T -b1 -a 0 -a 2 -n gnat-llvm-e3f56dce0df148c5f27e97d973cfbdc1bd72248f/ +#export LANG=C.utf8 +LANG=C.utf8 bsdtar -x -f %{S:3} gcc-*/gcc/ada +mv -v gcc-*/gcc/ada llvm-interface/gnat_src +mv %{name} llvm-interface/%{name}_src +mv -v bb-runtimes-*/gnat_rts_sources/include/rts-sources llvm-interface/ ln -s %{name}_src/source/rtl/Makefile.target llvm-interface/ -cd llvm-interface/rts-sources -mkdir {math,mem,zfp,full,math/hardsp,math/harddp} -mv a-elchha__zfp.ads zfp/a-elchha.ads -mv s-assert__xi.adb zfp/s-assert.adb -mv s-init.ads full/ -for J in a-ngelfu a-nlelfu a-nuelfu s-gcmain s-lidosq s-libdou s-libm s-libpre s-libsin s-lisisq ; do mv -v ${J}__ada.ads math/$J.ads; done -for J in s-gcmain s-libdou s-libm s-libsin a-ngelfu; do mv -v ${J}__ada.adb math/$J.adb; done -mv -v s-lisisq__fpu.adb math/hardsp/s-lisisq.adb -mv -v s-lidosq__fpu.adb math/harddp/s-lidosq.adb -mv -v s-memcom.ad[sb] s-memcop.ad[sb] s-memmov.ad[sb] s-memset.ad[sb] s-memtyp.ads mem/ %build make -C llvm-interface/ wasm diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..7be8c7f --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,124 @@ +on: + push: + branches: + - master + pull_request: +name: Build binaries +jobs: + build: + name: Build + strategy: + fail-fast: false + matrix: # Build debug and production + os: [ubuntu-18.04, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - name: 'git config' + run: git config --global core.autocrlf input + shell: bash + + - name: Get gnat-llvm + uses: actions/checkout@v2 + if: ${{ runner.os != 'Windows' }} + with: + repository: AdaCore/gnat-llvm + ref: 'e3f56dce0df148c5f27e97d973cfbdc1bd72248f' + path: gnat-llvm + + - name: Get bb-runtimes + uses: actions/checkout@v2 + if: ${{ runner.os != 'Windows' }} + with: + repository: Fabien-Chouteau/bb-runtimes + path: gnat-llvm/llvm-interface/bb-runtimes + ref: 'gnat-fsf-11' + + - name: Get gcc + uses: actions/checkout@v2 + if: ${{ runner.os != 'Windows' }} + with: + repository: gcc-mirror/gcc + path: gnat-llvm/llvm-interface/gcc + ref: 'e078de24eae8253fd4f24342f65166b525dd99c6' + + - name: Get AdaWebPack + uses: actions/checkout@v2 + with: + path: gnat-llvm/llvm-interface/adawebpack_src + + - name: Get GNAT toolchain with alire + uses: alire-project/setup-alire@v1 + if: ${{ runner.os != 'Windows' }} + with: + toolchain: gnat_native^11 gprbuild^21 + toolchain_dir: ./cached_gnat + + - name: Fetch LLVM + if: ${{ runner.os != 'Windows' }} + run: | + URL=https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.0 + curl -L $URL/clang+llvm-13.0.0-x86_64-linux-gnu-ubuntu-16.04.tar.xz \ + | tar xJf - + + - name: Build (Linux) + if: ${{ runner.os != 'Windows' }} + run: | + export PREFIX=$PWD/adawebpack + export PATH=$PWD/gnat-llvm/llvm-interface/bin:$PATH + export PATH=`ls -d $PWD/cached_gnat/*/bin |tr '\n' ':'`$PATH + export PATH=$PWD/clang+llvm-13.0.0-x86_64-linux-gnu-ubuntu-16.04/bin:$PATH + echo PATH=$PATH + pwd + ls -l + ls -l gnat-llvm/llvm-interface/ + cd gnat-llvm/llvm-interface + ln -sv gcc/gcc/ada gnat_src + ln -sv adawebpack_src/source/rtl/Makefile.target + ln -sv bb-runtimes/gnat_rts_sources/include/rts-sources + make wasm + make -C adawebpack_src build_examples + set -x + chrpath -d bin/* + mkdir -p ${PREFIX}/share/gprconfig + mkdir -p ${PREFIX}/lib/gnat + mkdir -p ${PREFIX}/share/adawebpack + cp adawebpack_src/packages/Fedora/llvm.xml ${PREFIX}/share/gprconfig/ + cp adawebpack_src/gnat/adawebpack_config.gpr ${PREFIX}/lib/gnat/ + cp -r bin lib ${PREFIX} + cp -v adawebpack_src/source/adawebpack.mjs ${PREFIX}/share/adawebpack/ + gprconfig --batch -o /tmp/llvm.cgpr --db `pwd`/adawebpack_src/packages/Fedora --target=llvm --config=ada,, + gprbuild --target=llvm -P adawebpack_src/gnat/adawebpack.gpr -p --config=/tmp/llvm.cgpr + gprinstall --target=llvm --prefix=${PREFIX} --project-subdir=${PREFIX}/lib/gnat -P adawebpack_src/gnat/adawebpack.gpr -p --config=/tmp/llvm.cgpr + cd `dirname ${PREFIX}` + tar czf ${PREFIX}.tar.gz `basename ${PREFIX}` + + - name: Setup MSYS2 + if: ${{ runner.os == 'Windows' }} + uses: msys2/setup-msys2@v2 + with: + msystem: mingw64 + install: | + base-devel + mingw-w64-x86_64-toolchain + mingw-w64-x86_64-gcc-ada + mingw-w64-x86_64-gprbuild + mingw-w64-x86_64-clang + mingw-w64-x86_64-lld + + - name: Build MSYS2 package + if: ${{ runner.os == 'Windows' }} + shell: msys2 {0} + run: | + mv gnat-llvm/llvm-interface/adawebpack_src adawebpack + cp -r adawebpack/packages/msys2 . + tar czf msys2/adawebpack.tar.gz adawebpack + cd msys2 + makepkg-mingw --noconfirm --noprogressbar -sCLf + mv -v *.tar.zst .. + + - name: Keep archive in artifacts + uses: actions/upload-artifact@v2 + with: + name: ${{ runner.os }} + path: "*.tar.*" + diff --git a/README.md b/README.md index 6f3bb8b..c67fd1d 100644 --- a/README.md +++ b/README.md @@ -1,62 +1,133 @@ -[![CircleCI](https://circleci.com/gh/godunko/adawebpack.svg?style=svg)](https://circleci.com/gh/godunko/adawebpack) -[![Copr build status](https://copr.fedorainfracloud.org/coprs/reznik/adawebpack/package/adawebpack/status_image/last_build.png)](https://copr.fedorainfracloud.org/coprs/reznik/adawebpack/package/adawebpack/) +[![Build binaries](https://github.com/godunko/adawebpack/actions/workflows/build.yml/badge.svg)](https://github.com/godunko/adawebpack/actions/workflows/build.yml) # AdaWebPack -Ada WASM Runtime and Bindings for Web API +AdaWebPack includes GNAT-LLVM compiler for WebAssembly target, GNAT Run Time Library and AdaWebPack bindings for Web API. ## How to install -Prebuild package is available for Fedora Linux, see https://copr.fedorainfracloud.org/coprs/reznik/adawebpack/ -It includes GNAT-LLVM compiler for WebAssembly target, GNAT Run Time Library and AdaWebPack bindings for Web API. +Prebuild packages are available on [Release page](https://github.com/godunko/adawebpack/releases). ## How to build -Setup some GNAT compiler and gprbuild tool (GNAT CE and GNAT FSF 11 is know to work fine). + * Setup GNAT using [Alire](https://alire.ada.dev/) or GNAT Community 2021. + + * Clone [GNAT-LLVM](https://github.com/AdaCore/gnat-llvm). Latest known good revision of GNAT-LLVM compatible with GNAT FSF is `e3f56dce`. + ``` + git clone https://github.com/AdaCore/gnat-llvm + git -C gnat-llvm checkout e3f56dce + ``` + + * Clone [bb-runtimes](https://github.com/Fabien-Chouteau/bb-runtimes). Use `gnat-fsf-11` branch. + ``` + git clone -b gnat-fsf-11 https://github.com/Fabien-Chouteau/bb-runtimes gnat-llvm/llvm-interface/bb-runtimes + ``` + + * Clone [GCC](https://github.com/gcc-mirror/gcc) sources. Use, for instance, `e078de24` commit. + ``` + git clone --single-branch --shallow-since=01-12-2021 https://github.com/gcc-mirror/gcc gnat-llvm/llvm-interface/gcc + git -C gnat-llvm/gcc checkout e078de24 + ``` + + * Setup GNAT-LLVM development environment, see details in + [GNAT-LLVM README](https://github.com/AdaCore/gnat-llvm). Note, you need to use + externally build LLVM with enabled 'lld' project and 'WebAssembly' target, + so, if you build it your-self, `cmake` command line should contain among other switches: + + ``` + cmake ... -DLLVM_ENABLE_PROJECTS='...;clang;lld' -DLLVM_TARGETS_TO_BUILD="...;WebAssembly" + ``` + + On Ubuntu it is possible to install prebuild LLVM/CLang packages (use LLVM/CLang 13). However, + alternatives need to be updated using the provided script: + + ``` + sudo utilities/update-alternatives-clang.sh 13 100 + ``` + + Or install a [LLVM 13 binary release](https://github.com/llvm/llvm-project/releases). + + * Checkout AdaWebPack repository into `gnat-llvm/llvm-interface` as + `adawebpack_src` and create link for Makefile.target. + + ``` + cd gnat-llvm/llvm-interface + git clone https://github.com/godunko/adawebpack.git adawebpack_src + ln -s adawebpack_src/source/rtl/Makefile.target + cd - + ``` + + * Create a link to RTS source code + ``` + cd gnat-llvm/llvm-interface + ln -s bb-runtimes/gnat_rts_sources/include/rts-sources/ + cd - + ``` + + * Create a link to GNAT source code (or copy it) + ``` + cd gnat-llvm/llvm-interface + ln -s gcc/gcc/ada gnat_src + cd - + ``` + + * Use `make wasm` to build compiler and Run Time Library + ``` + cd gnat-llvm/llvm-interface + make wasm + cd - + ``` + + * When `make` finishes, you will find toolchain in `gnat-llvm/llvm-interface/bin`. + ``` + cd gnat-llvm/llvm-interface + export PATH=$PWD/bin:$PATH + cd - + ``` + + * Now you can build examples: + ``` + cd gnat-llvm/llvm-interface/adawebpack_src + make build_examples + cd - + ``` + +## Usage with Docker + +It could be handy to use docker. +* Find latest build on our [Fedora COPR](https://copr.fedorainfracloud.org/coprs/reznik/adawebpack/) repository. +* Build a container image (make sure to replace `curl` argument with latest RPM URL) + ``` + docker build --tag wgprbuild - </gnat_rts_sources/include/rts-sources -``` - -Use `make wasm` to build compiler and Run Time Library - -``` -cd gnat-llvm/llvm-interface -make wasm -``` ## Unsupported features @@ -65,10 +136,10 @@ make wasm - exceptions support is limited to local exceptions propagation and last chance handler - - protected objects and tasks are not supported + - tasks and protected objects are not supported ## License Web API bindings is licensed under BSD3 license. -GNAT Runtime Library is licensed under GPL3 license with GCC Runtime Library Exception +GNAT Runtime Library is licensed under GPL3 license with GCC Runtime Library Exception. diff --git a/packages/msys2/PKGBUILD b/packages/msys2/PKGBUILD new file mode 100644 index 0000000..984fa9b --- /dev/null +++ b/packages/msys2/PKGBUILD @@ -0,0 +1,58 @@ +_realname=adawebpack +pkgbase=mingw-w64-${_realname} +pkgname=${MINGW_PACKAGE_PREFIX}-${_realname} +pkgver=22.0.0 +pkgrel=1 +pkgdesc="AdaWebPack is a toolchain, RTL and WebAPI binding for Ada on WebAssembly" +arch=('any') +mingw_arch=('mingw32' 'mingw64' 'ucrt64' 'clang64') +url="https://github.com/godunko/adawebpack" +license=('GPL3' 'BSD3') +makedepends=("${MINGW_PACKAGE_PREFIX}-gcc-ada" + "${MINGW_PACKAGE_PREFIX}-gprbuild" + "${MINGW_PACKAGE_PREFIX}-clang" + "${MINGW_PACKAGE_PREFIX}-lld" + "${MINGW_PACKAGE_PREFIX}-llvm") +depends=("${MINGW_PACKAGE_PREFIX}-llvm") +source=("gnat-llvm.zip::https://github.com/AdaCore/gnat-llvm/archive/e3f56dce0df148c5f27e97d973cfbdc1bd72248f.zip" + "bb-runtimes.zip::https://github.com/Fabien-Chouteau/bb-runtimes/archive/7a4674ae9221d2fa046bed20fbaf9de9caa09d41.zip" + "gcc.zip::https://github.com/gcc-mirror/gcc/archive/e078de24eae8253fd4f24342f65166b525dd99c6.zip" + "${_realname}.tar.gz") +md5sums=( SKIP SKIP SKIP SKIP ) +noextract=( "gcc.zip" ) + +prepare() { + cd ${srcdir}/ + bsdtar -x -f gcc.zip gcc-*/gcc/ada + mv -v gnat-llvm-* gnat-llvm + mv -v gcc-*/gcc/ada gnat-llvm/llvm-interface/gnat_src + mv -v bb-runtimes-*/gnat_rts_sources/include/rts-sources gnat-llvm/llvm-interface/ + mv -v adawebpack gnat-llvm/llvm-interface/adawebpack_src + cd gnat-llvm/llvm-interface/ + cp -v adawebpack_src/source/rtl/Makefile.target . + rm -rf gcc-* + rm -rf bb-runtimes-* +} + + +build() { + cd ${srcdir}/gnat-llvm/llvm-interface/ + make wasm + export PATH=$PWD/bin:$PATH + gprconfig --batch -o /tmp/llvm.cgpr --db `pwd`/adawebpack_src/packages/Fedora --target=llvm --config=ada,, + gprbuild --target=llvm -P adawebpack_src/gnat/adawebpack.gpr -p --config=/tmp/llvm.cgpr +} + +package() { + cd ${srcdir}/gnat-llvm/llvm-interface/ + export PATH=$PWD/bin:$PATH + PREFIX=${pkgdir} + mkdir -p ${PREFIX}/share/gprconfig + mkdir -p ${PREFIX}/lib/gnat + mkdir -p ${PREFIX}/share/adawebpack + cp adawebpack_src/packages/Fedora/llvm.xml ${PREFIX}/share/gprconfig/ + cp adawebpack_src/gnat/adawebpack_config.gpr ${PREFIX}/lib/gnat/ + cp -r bin lib ${PREFIX} + cp -v adawebpack_src/source/adawebpack.mjs ${PREFIX}/share/adawebpack/ + gprinstall --target=llvm --prefix=${PREFIX} --project-subdir=${PREFIX}/lib/gnat -P adawebpack_src/gnat/adawebpack.gpr -p --config=/tmp/llvm.cgpr +} \ No newline at end of file