diff --git a/.github/scripts/LICENCE.txt b/.github/scripts/LICENCE.txt new file mode 100644 index 0000000..153d416 --- /dev/null +++ b/.github/scripts/LICENCE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. \ No newline at end of file diff --git a/.github/scripts/README.md b/.github/scripts/README.md new file mode 100644 index 0000000..0695ab4 --- /dev/null +++ b/.github/scripts/README.md @@ -0,0 +1,3 @@ +# What + +This repository contains some scripts that can be used in [GitHub Actions](https://docs.github.com/en/actions). diff --git a/.github/scripts/check_success_timeout b/.github/scripts/check_success_timeout new file mode 100755 index 0000000..6c1b640 --- /dev/null +++ b/.github/scripts/check_success_timeout @@ -0,0 +1,64 @@ +#!/usr/bin/env bash + +# Set maximum running time of the tests +MAX_RUNTIME_SECONDS=$((330*60)) +#MAX_RUNTIME_SECONDS=$((50)) + +# Install jq +sudo apt update && sudo apt install -y jq + +# Fetch the jobs for the current workflow run using the GitHub API +# $1 = ${{ secrets.GITHUB_TOKEN }} +# $2 = ${{ github.repository }} +# $3 = ${{ github.run_id }} +response=$(curl -s -H "Authorization: token $1" \ + -H "Accept: application/vnd.github+json" \ + "https://api.github.com/repos/$2/actions/runs/$3/jobs?per_page=100") + +echo "Response:" +echo "$response" +echo "Jobs length:" "$(echo "$response" | jq ' .jobs | length')" + +# Loop through all the test jobs +all_success_or_timeout=true +jobs_length=$(echo "$response" | jq ' .jobs | length') +for ((i=0; i> "$GITHUB_ENV" + +# Show the result of the installation. +echo "The AOCC flang installed is:" +aflang --version +echo "The path to AOCC flang is:" +command -v aflang diff --git a/.github/scripts/install_epstopdf b/.github/scripts/install_epstopdf new file mode 100755 index 0000000..1b74068 --- /dev/null +++ b/.github/scripts/install_epstopdf @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# Usage: bash install_epstopdf + +sudo apt update && sudo apt install -y texlive wget +URL="https://tug.org/svn/texlive/trunk/Build/extra/epstopdf/epstopdf.pl?view=co" +sudo wget "$URL" -O /usr/bin/epstopdf +sudo chmod +x /usr/bin/epstopdf +which epstopdf +epstopdf --version +which kpsewhich +kpsewhich --version diff --git a/.github/scripts/install_flang b/.github/scripts/install_flang new file mode 100755 index 0000000..40473d5 --- /dev/null +++ b/.github/scripts/install_flang @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +# Usage: bash install_flang + +REPO_NAME="flang" +TMP_DIR="$(mktemp -d)" + +FLANG_DFT="$HOME/local/flang" + +if [[ ! -d /home/runner/work/ ]] ; then + printf "\nThe runner is not hosted by GitHub. Skip installation of p7zip and ncurses.\n" + if [[ -d $FLANG_DFT && -f $FLANG_DFT/bin/flang && -f $FLANG_DFT/bin/flang ]] ;then + echo "PATH=$PATH:$FLANG_DFT/bin" >> "$GITHUB_ENV" + echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$FLANG_DFT/lib" >> "$GITHUB_ENV" + printf "\nflang is already installed. Skip installation.\n" + exit 0 + fi +else + if [[ "$RUNNER_OS" == "Linux" ]] ; then + sudo apt update && sudo apt install p7zip-full libncurses* # libncurses* needed for libtinfo.so + elif [[ "$RUNNER_OS" == "macOS" ]] ; then + brew install p7zip ncurses + fi +fi + +PI_MODEL_FILE="/sys/firmware/devicetree/base/model" +if [[ -f "$PI_MODEL_FILE" ]] && grep -qi 'Raspberry Pi' < "$PI_MODEL_FILE" ; then # Raspberry Pi + ARCH=aarch64 +elif [[ $(uname -s) == 'Darwin' ]] ; then # macOS + ARCH=macos_86 +else # Linux + ARCH=x86_64 +fi + +cd "$TMP_DIR" || exit 42 +git clone https://github.com/zaikunzhang/"$REPO_NAME".git + +cd "$REPO_NAME/$ARCH" || exit 42 +FLANG_7Z="flang.7z.001" +7za x "$FLANG_7Z" -aoa # -aoa: overwrite all existing files without prompt +rm -f flang.7z* + +# Set environment variable for subsequent steps +# N.B.: The following lines will not work if this script is invoked with sudo. +# Put flang/bin to the beginning of PATH, in case there is another flang in PATH, e.g., from AOCC. +echo "PATH=$TMP_DIR/$REPO_NAME/$ARCH/flang/bin:$PATH" >> "$GITHUB_ENV" +echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TMP_DIR/$REPO_NAME/$ARCH/flang/lib" >> "$GITHUB_ENV" + +# Show the result of the installation. +export PATH=$TMP_DIR/$REPO_NAME/$ARCH/flang/bin:$PATH +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TMP_DIR/$REPO_NAME/$ARCH/flang/lib +echo "The flang installed is:" +flang --version +echo "The path to flang is:" +command -v flang diff --git a/.github/scripts/install_g95 b/.github/scripts/install_g95 new file mode 100755 index 0000000..a2f0221 --- /dev/null +++ b/.github/scripts/install_g95 @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +# Usage: bash install_g95 + +REPO_NAME="g95" +TMP_DIR="$(mktemp -d)" +G95DIR="$TMP_DIR/$REPO_NAME/g95/" + +cd "$TMP_DIR" || exit 42 +git clone https://github.com/zaikunzhang/"$REPO_NAME" +cd "$REPO_NAME" || exit 42 +unzip g95.zip +rm -f g95.zip + +# Make some links +CRT1="$(find /usr/ -type f -name "crt1.o*" -print -quit)" +CRTI="$(find /usr/ -type f -name "crti.o*" -print -quit)" +CRTN="$(find /usr/ -type f -name "crtn.o*" -print -quit)" +ln -s "$CRT1" "$G95DIR/lib/gcc-lib/x86_64-unknown-linux-gnu/4.0.3/" +ln -s "$CRTI" "$G95DIR/lib/gcc-lib/x86_64-unknown-linux-gnu/4.0.3/" +ln -s "$CRTN" "$G95DIR/lib/gcc-lib/x86_64-unknown-linux-gnu/4.0.3/" + +# Set environment variable for subsequent steps +echo "PATH=$PATH:$G95DIR/bin:$G95DIR/lib/gcc-lib/x86_64-unknown-linux-gnu/4.0.3" >> "$GITHUB_ENV" + +# Show the result of the installation. +export PATH=$PATH:$G95DIR/bin:$G95DIR/lib/gcc-lib/x86_64-unknown-linux-gnu/4.0.3 +echo "The g95 installed is:" +g95 --version +echo "The path to g95 is:" +command -v g95 diff --git a/.github/scripts/install_ghostscript b/.github/scripts/install_ghostscript new file mode 100755 index 0000000..f2368b0 --- /dev/null +++ b/.github/scripts/install_ghostscript @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +# Usage: bash install_ghostscript + +# Default version. This is the latest version as of 20220926. This should not matter if the "Find +# out the latest version" part works properly. +VER_DFT=10.0.0 + +# The working directory. +DIR=$(mktemp -d) +cd "$DIR" || exit 42 + +# Find out the latest version. +RELEASE="https://www.ghostscript.com/releases/index.html" +WEBPG=index.html +wget "$RELEASE" -O "$WEBPG" +VER=$(grep "latest release" "$WEBPG" | grep -oE "([0-9]{1,}\.)+[0-9]{1,}") +if [[ -z "$VER" ]] ; then + printf "\n\n******Fail to find the latest version.******\n******Will install the default version: %s******\n\n" "$VER_DFT" + VER=$VER_DFT +fi +printf "\n\n******Version to install: %s******\n\n" "$VER" +VER_NO_DOT=${VER//\./} +VER_DFT_NO_DOT=${VER_DFT//\./} + +# Download URL +URL=https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs"$VER_NO_DOT"/ghostscript-"$VER"-linux-x86_64.tgz +URL_DFT=https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs"$VER_DFT_NO_DOT"/ghostscript-"$VER_DFT"-linux-x86_64.tgz + +TGZ=gs.tgz + +if wget "$URL" -O "$TGZ" > /dev/null 2>&1 ; then + NEWGS="ghostscript-$VER-linux-x86_64/gs-$VER_NO_DOT-linux-x86_64" +else + printf "******Failed to download the latest version.******\n******Will install the default version: %s******\n\n" "$VER_DFT" + wget "$URL_DFT" -O "$TGZ" + NEWGS="ghostscript-$VER_DFT-linux-x86_64/gs-$VER_DFT_NO_DOT-linux-x86_64" +fi + +GS="$(command -v gs)" +if [[ -z "$GS" ]] ; then + GS=/usr/bin/gs +fi + +tar zxvf "$TGZ" +if [[ -f "$GS" ]] ; then + sudo mv "$GS" "$GS".bak +fi +sudo cp "$NEWGS" "$GS" +rm -r "$DIR" + +gs -v +command -v gs diff --git a/.github/scripts/install_nvfortran b/.github/scripts/install_nvfortran new file mode 100755 index 0000000..636c7c2 --- /dev/null +++ b/.github/scripts/install_nvfortran @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +# Usage: bash install_nvfortran + +# ARCH is the architecture of the current system. +if [[ "$(uname -m)" == "aarch64" || "$(uname -m)" == "aarch" ]] ; then + ARCH=arm64 +else + ARCH=amd64 +fi + +echo "deb [trusted=yes] https://developer.download.nvidia.com/hpc-sdk/ubuntu/$ARCH /" | sudo tee /etc/apt/sources.list.d/nvhpc.list +sudo apt update && sudo apt install -y nvhpc && sudo apt clean # clean is to remove the downloaded .deb files + +NVFORTRAN="$(find /opt/*nvidia* -type f -executable -name nvfortran -print | tail -1)" + +sudo ln -s "$NVFORTRAN" /usr/bin + +# Show the result of the installation. +echo "The nvfortran installed is:" +nvfortran --version +echo "The path to nvfortran is:" +command -v nvfortran diff --git a/.github/scripts/install_oneapi_linux.sh b/.github/scripts/install_oneapi_linux.sh new file mode 100755 index 0000000..c1e2e7a --- /dev/null +++ b/.github/scripts/install_oneapi_linux.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +# This script installs the Fortran compilers provided in Intel OneAPI. +# Usage: bash install_oneapi_linux.sh + +# do the job in the temporary directory of the system +cd /tmp || exit 42 + +# download the key to system keyring +wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \ + | gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null + +# add signed entry to apt sources and configure the APT client to use Intel repository: +echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" \ + | sudo tee /etc/apt/sources.list.d/oneAPI.list + +# installation +sudo apt update +#sudo apt install intel-basekit intel-hpckit # Instead of this line, the following line seems to suffice +sudo apt install -y intel-oneapi-common-vars intel-oneapi-compiler-fortran +installer_exit_code=$? +sudo apt clean # Remove the .deb + +# Run the script that sets the necessary environment variables and then damp them to $GITHUB_ENV +# so that they are available in subsequent steps. +if [[ -f /opt/intel/oneapi/setvars.sh ]] ; then + source /opt/intel/oneapi/setvars.sh + env | grep -i 'intel\|oneapi' >> "$GITHUB_ENV" +else + exit 1 +fi + +# Show the result of the installation. +echo "The ifort installed is:" +ifort --version +echo "The path to ifort is:" +command -v ifort +echo "The ifx installed is:" +ifx --version +echo "The path to ifx is:" +command -v ifx + +# Exit with the installer exit code. +exit $installer_exit_code diff --git a/.github/scripts/install_oneapi_macos.sh b/.github/scripts/install_oneapi_macos.sh new file mode 100755 index 0000000..aecfb44 --- /dev/null +++ b/.github/scripts/install_oneapi_macos.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +# This script installs the Fortran compilers provided in Intel OneAPI. +# See https://github.com/oneapi-src/oneapi-ci +# https://github.com/oneapi-src/oneapi-ci/blob/master/scripts/install_macos.sh +# +# Usage: bash install_oneapi_macos.sh +# +# Zaikun Zhang (www.zhangzk.net), January 9, 2023 + +# URL for the offline installer of Intel OneAPI Fortran compiler. To get the latest URL, search for +# "Intel Fortran Compiler Classic for macOS" at +# https://www.intel.com/content/www/us/en/developer/articles/tool/oneapi-standalone-components.html +# and take the URL for the "Offline" installer. +# Default version: 2023.2.0 (updated on 20231015) +URL="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/2fbce033-15f4-4e13-8d14-f5a2016541ce/m_fortran-compiler-classic_p_2023.2.0.49001_offline.dmg" +if [[ $# -ge 1 ]] ; then + if [[ $1 = "2022" ]] ; then + URL="https://registrationcenter-download.intel.com/akdlm/irc_nas/18977/m_HPCKit_p_2022.3.1.15344_offline.dmg" + fi + if [[ $1 = "2021" ]] ; then + URL="https://registrationcenter-download.intel.com/akdlm/irc_nas/18242/m_HPCKit_p_2021.4.0.3389_offline.dmg" + fi +fi + +# Component to install. +COMPONENTS=intel.oneapi.mac.ifort-compiler + +# Download the installer. curl is included by default in macOS. +cd "$TMPDIR" || exit 42 +curl --output webimage.dmg --url "$URL" --retry 5 --retry-delay 5 +hdiutil attach webimage.dmg + +# Install the compiler. +sudo /Volumes/"$(basename "$URL" .dmg)"/bootstrapper.app/Contents/MacOS/bootstrapper -s --action install --components="$COMPONENTS" --eula=accept --log-dir=. +installer_exit_code=$? + +# Run the script that sets the necessary environment variables and then damp them to $GITHUB_ENV +# so that they are available in subsequent steps. +if [[ -f /opt/intel/oneapi/setvars.sh ]] ; then + source /opt/intel/oneapi/setvars.sh + env | grep -i 'intel\|oneapi' >> "$GITHUB_ENV" +else + exit 1 +fi + +# Show the result of the installation. +echo "The ifort installed is:" +ifort --version +echo "The path to ifort is:" +command -v ifort + +# Remove the installer +rm webimage.dmg +hdiutil detach /Volumes/"$(basename "$URL" .dmg)" -quiet + +# Exit with the installer exit code. +exit $installer_exit_code diff --git a/.github/scripts/install_oneapi_windows.bat b/.github/scripts/install_oneapi_windows.bat new file mode 100755 index 0000000..ae768b5 --- /dev/null +++ b/.github/scripts/install_oneapi_windows.bat @@ -0,0 +1,56 @@ +:: This script installs the Fortran compilers provided in Intel OneAPI. +:: See https://github.com/oneapi-src/oneapi-ci +:: https://github.com/oneapi-src/oneapi-ci/blob/master/scripts/install_windows.bat +:: +:: Usage: cmd.exe "/K" '"install_oneapi_windows.bat"' +:: N.B.: This is a cmd script, which may not work in PowerShell. +:: +:: Zaikun Zhang (www.zhangzk.net), January 9, 2023 + +:: URL for the offline installer of Intel OneAPI Fortran compiler. To get the latest URL, search for +:: "Intel Fortran Compiler Classic and Intel Fortran Compiler for Windows" at +:: https://www.intel.com/content/www/us/en/developer/articles/tool/oneapi-standalone-components.html +:: and take the URL for the "Offline" installer. +:: Default version: 2024.0.1 (updated on 20231219) +set URL=https://registrationcenter-download.intel.com/akdlm/IRC_NAS/2e7500af-3097-4424-bd07-5d86c7791ec5/w_fortran-compiler_p_2024.0.1.30_offline.exe +if "%1"=="2023" ( + set URL=https://registrationcenter-download.intel.com/akdlm/IRC_NAS/1720594b-b12c-4aca-b7fb-a7d317bac5cb/w_fortran-compiler_p_2023.2.1.7_offline.exe +) +if "%1"=="2022" ( + set URL=https://registrationcenter-download.intel.com/akdlm/irc_nas/18976/w_HPCKit_p_2022.3.1.19755_offline.exe +) +if "%1"=="2021" ( + set URL=https://registrationcenter-download.intel.com/akdlm/irc_nas/18247/w_HPCKit_p_2021.4.0.3340_offline.exe +) + +:: Component to install. +set COMPONENTS=intel.oneapi.win.ifort-compiler + +:: Download the installer. curl is included by default in Windows since Windows 10, version 1803. +::cd %Temp% :: CD does not work if %Temp% is on a different drive. +curl.exe --output webimage.exe --url %URL% --retry 5 --retry-delay 5 +start /b /wait webimage.exe -s -x -f webimage_extracted --log extract.log + +:: Install the compiler. +webimage_extracted\bootstrapper.exe -s --action install --components=%COMPONENTS% --eula=accept -p=NEED_VS2017_INTEGRATION=0 -p=NEED_VS2019_INTEGRATION=0 -p=NEED_VS2022_INTEGRATION=0 --log-dir=. +set installer_exit_code=%ERRORLEVEL% + +:: Run the script that sets the necessary environment variables and then damp them to $GITHUB_ENV +:: so that they are available in subsequent steps. +:: N.B.: `grep 'intel\|oneapi'` does not work on Windows. +call "C:\Program Files (x86)\Intel\oneAPI\setvars.bat" +set | grep -i "intel" >> %GITHUB_ENV% +set | grep -i "oneapi" >> %GITHUB_ENV% + +:: Show the result of the installation. +echo The path to ifort is: +where ifort.exe +echo The path to ifx is: +where ifx.exe + +:: Remove the installer. +del webimage.exe +rd /s/q "webimage_extracted" + +:: Exit with the installer exit code. +exit /b %installer_exit_code% diff --git a/.github/scripts/install_pycutest b/.github/scripts/install_pycutest new file mode 100644 index 0000000..ff6c701 --- /dev/null +++ b/.github/scripts/install_pycutest @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +# Usage: bash install_pycutest +# Requirements: having Python installed via actions/setup-python. + +set -e +set -x + +if [[ "$RUNNER_OS" == "Windows" ]]; then + echo "PyCUTEst is not available on $RUNNER_OS" 1>&2 + exit 1 +elif [[ "$RUNNER_OS" == "Linux" ]]; then + # Download CUTEst and its dependencies + mkdir "$GITHUB_WORKSPACE/cutest" + git clone --depth 1 --branch v2.1.24 https://github.com/ralna/ARCHDefs.git "$GITHUB_WORKSPACE/cutest/archdefs" + git clone --depth 1 --branch v2.0.6 https://github.com/ralna/SIFDecode.git "$GITHUB_WORKSPACE/cutest/sifdecode" + git clone --depth 1 --branch v2.0.17 https://github.com/ralna/CUTEst.git "$GITHUB_WORKSPACE/cutest/cutest" + git clone --depth 1 --branch v0.5 https://bitbucket.org/optrove/sif.git "$GITHUB_WORKSPACE/cutest/mastsif" + + # Set the environment variables + export ARCHDEFS="$GITHUB_WORKSPACE/cutest/archdefs" + export SIFDECODE="$GITHUB_WORKSPACE/cutest/sifdecode" + export CUTEST="$GITHUB_WORKSPACE/cutest/cutest" + export MASTSIF="$GITHUB_WORKSPACE/cutest/mastsif" + export MYARCH=pc64.lnx.gfo + { + echo "ARCHDEFS=$ARCHDEFS" + echo "SIFDECODE=$SIFDECODE" + echo "CUTEST=$CUTEST" + echo "MASTSIF=$MASTSIF" + echo "MYARCH=$MYARCH" + } >> "$GITHUB_ENV" + + # Build and install CUTEst + /usr/bin/env bash -c "$(curl -fsSL https://raw.githubusercontent.com/jfowkes/pycutest/master/.install_cutest.sh)" +elif [[ "$RUNNER_OS" == "macOS" ]]; then + # Install gfortran + sudo ln -fs /usr/local/bin/gfortran-12 /usr/local/bin/gfortran + sudo ln -fs /usr/local/Cellar/gcc@12/*/lib/gcc/12/*.dylib /usr/local/lib/ + + # Install CUTEst + brew tap optimizers/cutest + brew install cutest --without-single + brew install mastsif + + # Set the environment variables + for f in "archdefs" "sifdecode" "cutest" "mastsif"; do + while IFS= read -r line; do + echo "${line#export }" >> "$GITHUB_ENV" + done <<< "$(cat "$(brew --prefix $f)/$f.bashrc")" + done +fi + +# Install PyCUTEst +echo "PYCUTEST_CACHE=$GITHUB_WORKSPACE" >> "$GITHUB_ENV" +python -m pip install --progress-bar=off pycutest diff --git a/.github/scripts/install_sunf95 b/.github/scripts/install_sunf95 new file mode 100755 index 0000000..e7a1716 --- /dev/null +++ b/.github/scripts/install_sunf95 @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +# Usage: bash install_sunf95 + +REPO_NAME=OracleDevStd +TMP_DIR="$(mktemp -d)" +cd "$TMP_DIR" || exit 42 +git clone https://github.com/zaikunzhang/"$REPO_NAME".git + +cd "$REPO_NAME" || exit 42 +ORACLE_7Z="OracleDevStd.7z.001" +7za x "$ORACLE_7Z" -aoa # -aoa: overwrite all existing files without prompt +rm -f OracleDevStd.7z* + +# Set environment variable for subsequent steps +echo "PATH=$PATH:$TMP_DIR/$REPO_NAME/OracleDevStd/bin" >> "$GITHUB_ENV" +echo "LD_LIBRARY_PATH=$TMP_DIR/$REPO_NAME/OracleDevStd/lib/compilers/sys/amd64:$TMP_DIR/$REPO_NAME/OracleDevStd/lib/compilers/sys/:$LD_LIBRARY_PATH" >> "$GITHUB_ENV" + +# Show the result of the installation. +export PATH=$PATH:$TMP_DIR/$REPO_NAME/OracleDevStd/bin +export LD_LIBRARY_PATH=$TMP_DIR/$REPO_NAME/OracleDevStd/lib/compilers/sys/amd64:$TMP_DIR/$REPO_NAME/OracleDevStd/lib/compilers/sys/:$LD_LIBRARY_PATH +echo "The sunf95 installed is:" +sunf95 --version +echo "The path to sunf95 is:" +command -v sunf95 diff --git a/.github/scripts/link_gfortran b/.github/scripts/link_gfortran new file mode 100755 index 0000000..74692ce --- /dev/null +++ b/.github/scripts/link_gfortran @@ -0,0 +1,32 @@ +#!/usr/usr/bin/env bash +# This script installs the requested version of gfortran and links it to /usr/bin/gfortran +# +# Usage: bash link_gfortran + +if [[ $# -lt 1 ]]; then + printf "\nPlease provide the version of gfortran to link.\n\n" + exit 42 +fi + +REQUESTED_GFORTRAN_VERSION="$1" + +GFORTRAN_PATH="/usr/bin/gfortran" + +REQUESTED_GFORTRAN="gfortran-""$REQUESTED_GFORTRAN_VERSION" + +sudo apt update && sudo apt install "$REQUESTED_GFORTRAN" + +REQUESTED_GFORTRAN_PATH="$(realpath "$(command -v "$REQUESTED_GFORTRAN")")" + +if [[ -f "$GFORTRAN_PATH" ]] ; then + sudo mv "$GFORTRAN_PATH" "$GFORTRAN_PATH".bak +fi + +sudo ln -s "$REQUESTED_GFORTRAN_PATH" "$GFORTRAN_PATH" + +echo "gfortran is linked to" +realpath "$(command -v gfortran)" +echo "The version of gfortran is" +gfortran --version + +exit 0 diff --git a/.github/scripts/misc_app b/.github/scripts/misc_app new file mode 100755 index 0000000..4f68480 --- /dev/null +++ b/.github/scripts/misc_app @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +# This script installs miscellaneous applications for GitHub Actions on ***hosted runners***. +# Usage: bash mist_setup + +# Exist if the runner is not hosted. Is there a better way to decide the runner type? +if [[ ("$RUNNER_OS" == "Linux" && ! -d /home/runner/work/) || ("$RUNNER_OS" == "macOS" && ! -d /Users/runner/work/) ]] ; then + printf "\nThe runner is not hosted by GitHub.\n" + exit 0 +fi + +if [[ "$RUNNER_OS" == "Linux" ]] ; then + sudo apt update + sudo apt install gdb make cmake ninja-build + gdb --version + make --version + cmake --version + ninja --version +elif [[ "$RUNNER_OS" == "macOS" ]] ; then + brew install coreutils make cmake ninja + make --version + cmake --version + ninja --version + # gdb cannot be installed by brew on macOS 14 with Apple Silicon chips as of 20240219 + (brew install gdb &> /dev/null && gbd --version) || echo "!!! WARNING: gdb cannot be installed !!!" +elif [[ "$RUNNER_OS" == "Windows" ]] ; then + choco install wget make cmake ninja --no-progress # gdb cannot be installed by choco + make --version + cmake --version + ninja --version +fi diff --git a/.github/scripts/misc_env b/.github/scripts/misc_env new file mode 100755 index 0000000..ccf8545 --- /dev/null +++ b/.github/scripts/misc_env @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +# This script sets the following environment variables for GitHub Actions: +# ROOT_DIR: the root directory of the current repo +# TEST_DIR: a random directory under /tmp for testing +# SEDI: sed -i "" (mocOS) or sed -i (Linux/Windows) +# +# Usage: bash misc_env + +# Set ROOT_DIR to the root directory of the current repo. +ROOT_DIR="$(pwd -P)" # `realpath` is unavailable on macOS; -P is needed +echo "$ROOT_DIR" +echo "ROOT_DIR=$ROOT_DIR" >> "$GITHUB_ENV" + +# Set TEST_DIR to a random directory. It is needed in the Makefiles for the Fortran tests of PRIM. +TEST_DIR=/tmp/gittest_$(date +%s)_"$((RANDOM*RANDOM))" +echo "$TEST_DIR" +echo "TEST_DIR=$TEST_DIR" >> "$GITHUB_ENV" + +# Set SEDI to either 'sed -i ""' (macOS) or 'sed -i' (Linux/Windows). +# When calling "sed -i" on macOS, it is obligatory to specify a string (e.g., .bak) after -i as the +# extension for saving a backup. If the string is "", then no backup will be saved. If no string is +# specified, then an error will be raised, saying "invalid command code". +if [[ "$RUNNER_OS" = "macOS" ]] ; then + SEDI='sed -i ""' +else + SEDI='sed -i' +fi +echo "$SEDI" +echo "SEDI=$SEDI" >> "$GITHUB_ENV" + +# Set GFORTRAN_VERSION to the version of gfortran used when mexifying and linting Fortran code. +GFORTRAN_VERSION=13 +echo "$GFORTRAN_VERSION" +echo "GFORTRAN_VERSION=$GFORTRAN_VERSION" >> "$GITHUB_ENV" + +# The following does not work. Why? +# Make tools such as grep, make, and git available on Windows. +#if [[ "$RUNNER_OS" = "Windows" ]] ; then +# PATH="$PATH"":/c/Program Files/Git/usr/bin:/c/Program Files/Git/bin:/c/ProgramData/Chocolatey/bin" +# echo "$PATH" +# echo "PATH=$PATH" >> "$GITHUB_ENV" +#fi diff --git a/.github/scripts/misc_setup b/.github/scripts/misc_setup new file mode 100755 index 0000000..7841644 --- /dev/null +++ b/.github/scripts/misc_setup @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# This script sets the miscellanies environment variables and installs miscellaneous applications +# for GitHub Actions: +# +# Usage: bash misc_setup + +# The directory where this scrip resides +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" + +bash "$SCRIPT_DIR"/misc_env +bash "$SCRIPT_DIR"/misc_app