# SPDX-License-Identifier: CC0-1.0 # Fortran(flang-llvm-20.1.7) インストールスクリプト # OS: Ubuntu 24.04.1 # カレントディレクトリ: /judge # 環境変数: HOME=/home/runner # LANG=C.UTF-8 # PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # ATCODER=1 language = 'Fortran' display = 'Fortran2018 (Flang 20.1.7)' # llvm-flang license = [{ name = 'Apache-2.0', exception = 'LLVM-exception', url = 'https://github.com/llvm/llvm-project/blob/main/flang/LICENSE.TXT' }] library.stdlib = { license = [ { name = 'MIT', url = 'https://stdlib.fortran-lang.org/page/License.html' }, ], version = 'v0.7.0' } # このスクリプトではソースコードを一部改変. library.ac-library-fortran = { license = [ { name = 'MIT', url = 'https://github.com/ue1221/ac-library-fortran/blob/main/LICENSE' } ] } filename = 'Main.f90' install = ''' sudo apt update -y sudo apt upgrade -y sudo apt install -y wget git build-essential python3 rsync # fpm をインストール. wget -q -O fpm https://github.com/fortran-lang/fpm/releases/download/v0.10.1/fpm-0.10.1-linux-x86_64 chmod +x fpm mkdir -p $HOME/.local/bin export PATH="$HOME/.local/bin:$PATH" mv fpm $HOME/.local/bin ## Flang-20.1.7 のバイナリとかをダウンロード(ビルドは長いから避ける). cd /tmp VERSION=20.1.7 wget -q https://github.com/llvm/llvm-project/releases/download/llvmorg-$VERSION/LLVM-$VERSION-Linux-X64.tar.xz tar xf LLVM-$VERSION-Linux-X64.tar.xz rsync -ahz LLVM-$VERSION-Linux-X64/ $HOME/.local export FPM_FC="flang-new" # "flang" だと fpm に奇妙なコンパイルフラグがセットされてしまう. export FPM_FFLAGS="-O2 -cpp -std=f2018" ## fpm の実行環境を整える. ## 現状の flang-20.1.7 では stdlib-v0.7.0 を完全にビルドできないため, ## fpm を用いて, 依存しているモジュールのみをビルドする. cd /tmp wget https://github.com/fortran-lang/stdlib/archive/refs/tags/v0.7.0.tar.gz tar xvf v0.7.0.tar.gz cd stdlib-0.7.0 cat << EOF >> fpm.toml [install] library = true EOF sudo apt install -y python3 fypp python3-joblib # flang (v20.1.7) でコンパイルできないものを改変. sed -i -e 's/res(max(n, 0))/res(n)/' src/stdlib_math.fypp sed -i -e 's/res(max(n, 0))/res(n)/' src/stdlib_math_linspace.fypp # quad precision を double precision にしておく. sed -i -e 's/qp => real128/qp => real64/' src/stdlib_specialfunctions_gamma.fypp rm -rf example/ # example/* のビルドを行わない. python3 config/fypp_deployment.py fpm build --profile release fpm install --prefix="$HOME/.local" --profile release export LD_LIBRARY_PATH="$HOME/.local/lib" # ac-library-fortran cd /judge git clone https://github.com/ue1221/ac-library-fortran.git mv ac-library-fortran acl # コンパイルできるか試す. cd /judge cat << EOF > Main.f90 include "acl/atcoder/union_find.f08" program test_stdlib use, intrinsic :: iso_fortran_env use stdlib_version use stdlib_sorting use mod_union_find implicit none integer(int32) :: arr(10) = [10, 2, 1, 5, 7, 8, 3, 9, 6, 4] type(union_find) :: uf write(output_unit, '(a)') stdlib_version_string call sort(arr) write(error_unit, '(*(i0, 1x))') arr(:) if (any(arr(:) /= [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])) & & error stop "Something error" uf = newuf(10) call unite(uf, 1, 2) write(error_unit, '(*(L, 1x))') same(uf, 1, 2), same(uf, 1, 3) end program EOF flang-new -L$HOME/.local/lib -I$HOME/.local/include -O2 -cpp -std=f2018 Main.f90 -lstdlib ./a.out # 要らないものを消す. rm Main.f90 a.out mod_union_find.mod rm -f $HOME/.local/bin/fpm sudo apt purge -y fypp python3-joblib rsync sudo apt autoremove -y ''' compile = ''' export PATH="$HOME/.local/bin:$PATH" export LD_LIBRARY_PATH="$HOME/.local/lib" flang-new -L$HOME/.local/lib -I$HOME/.local/include -O2 -cpp -std=f2018 Main.f90 -lstdlib ''' object = 'a.out' execution = [ './a.out', ]