はじめに
背景
macOSでGrADSを使う場合、従来はOpenGrADSのmacOSバンドルを入れるなどの方法があった。しかし、OpenGrADSのmacOSバンドルはIntel Mac向けの x86_64 バイナリとして配布されており、Apple Silicon MacではRosetta 2に依存している。一方で、Rosetta 2のサポートはmacOS 27までであり、macOS 28以降では一部の古いゲーム等に限られる(参考:About the Rosetta translation environment)。そのため、今後もApple Silicon MacでGrADSを継続して使うためには、arm64 のネイティブバイナリとして実行できる必要がある。
MacPortsの grads portは arm64 環境向けにもビルドされているため、MacPortsユーザーはこれを使用すれば手っ取り早く対応できる。一方で、記事執筆時点におけるMacPorts上の wgrib2 のバージョンは3.1.1で、3年以上更新されていないなど、パッケージによって管理に差がある。そもそも筆者のようなHomebrewユーザーにとっては、MacPortsとの併用は避けたい。
この記事の目指すところ
実行環境:macOS Tahoe 26.5
この記事では、Apple Silicon MacのHomebrew環境を前提に、GrADS、wgrib、wgrib2、grib2ctl、g2ctl を arm64 ネイティブでソースコードからビルドし、以下のように配置する。
-
/opt/grads:GrADS本体とGrADS固有の補助データ -
/opt/ncep:wgrib、wgrib2、grib2ctl、g2ctl、NCEPLIBS(GrADSとwgrib2が依存)
具体的には、記事執筆時点の最新版である次の組み合わせでインストールする。なお、これ以外のHomebrewでインストールした依存ライブラリは、いずれも記事執筆時点の最新版を使用した。
| 名称 | バージョン | インストール先 |
|---|---|---|
| GrADS | 2.2.3 | /opt/grads/2.2.3 |
| HDF4 | 4.3.1 | /opt/grads/deps/hdf4/4.3.1 |
| NCEPLIBS-ip | 5.4.1 | /opt/ncep/nceplibs/ip/5.4.1 |
| NCEPLIBS-g2c | 2.3.0 | /opt/ncep/nceplibs/g2c/2.3.0 |
| wgrib | N/A | /opt/ncep/wgrib |
| wgrib2 | 3.8.0 | /opt/ncep/wgrib2/3.8.0 |
| grib2ctl | N/A | /opt/ncep/scripts/grib2ctl |
| g2ctl | N/A | /opt/ncep/scripts/g2ctl |
最終的なディレクトリ構成は、次のようにする。
/opt
├── grads
│ ├── 2.2.3
│ │ ├── bin
│ │ ├── lib
│ │ └── share
│ │ └── grads
│ │ ├── sample-datasets # GADSET
│ │ ├── scripts # GASCRP
│ │ └── support-data # GADDIR
│ ├── bin
│ │ ├── bufrscan -> /opt/grads/2.2.3/bin/bufrscan
│ │ ├── grads # /opt/grads/2.2.3/bin/grads.binのwrapper
│ │ ├── grib2scan -> /opt/grads/2.2.3/bin/grib2scan
│ │ ├── gribmap -> /opt/grads/2.2.3/bin/gribmap
│ │ ├── gribscan -> /opt/grads/2.2.3/bin/gribscan
│ │ └── stnmap -> /opt/grads/2.2.3/bin/stnmap
│ └── deps
│ └── hdf4
└── ncep
├── bin
│ ├── g2ctl -> /opt/ncep/scripts/g2ctl/g2ctl
│ ├── grib2ctl -> /opt/ncep/scripts/grib2ctl/grib2ctl.pl
│ ├── grib2ctl.pl -> /opt/ncep/scripts/grib2ctl/grib2ctl.pl
│ ├── wgrib -> /opt/ncep/wgrib/bin/wgrib
│ └── wgrib2 -> /opt/ncep/wgrib2/3.8.0/bin/wgrib2
├── nceplibs
│ ├── g2c
│ │ └── 2.3.0
│ └── ip
│ └── 5.4.1
├── scripts
│ ├── g2ctl
│ └── grib2ctl
├── wgrib
│ └── bin
└── wgrib2
└── 3.8.0
前提
- Apple Silicon Macであること
- Homebrewがインストールされていること
- 各ツールをsystem-wideにインストールする
共通変数の設定
ソースコードは ~/src 以下に置く。以降の手順で使うために、次の変数を定義しておく。
SRC_ROOT="$HOME/src"
HB="$(brew --prefix)"
GRADS_VER="2.2.3"
HDF4_VER="4.3.1"
G2C_VER="2.3.0"
IP_VER="5.4.1"
WGRIB2_VER="3.8.0"
GRADS_PREFIX="/opt/grads/${GRADS_VER}"
HDF4_PREFIX="/opt/grads/deps/hdf4/${HDF4_VER}"
NCEP_PREFIX="/opt/ncep"
IP_PREFIX="${NCEP_PREFIX}/nceplibs/ip/${IP_VER}"
G2C_PREFIX="${NCEP_PREFIX}/nceplibs/g2c/${G2C_VER}"
WGRIB_PREFIX="${NCEP_PREFIX}/wgrib"
WGRIB2_PREFIX="${NCEP_PREFIX}/wgrib2/${WGRIB2_VER}"
GRADS_SRC="${SRC_ROOT}/grads/${GRADS_VER}"
HDF4_SRC="${SRC_ROOT}/hdf4/${HDF4_VER}"
IP_SRC="${SRC_ROOT}/nceplibs-ip/${IP_VER}"
G2C_SRC="${SRC_ROOT}/nceplibs-g2c/${G2C_VER}"
WGRIB_SRC="${SRC_ROOT}/wgrib"
WGRIB2_SRC="${SRC_ROOT}/wgrib2/${WGRIB2_VER}"
GRIB2CTL_SRC="${SRC_ROOT}/grib2ctl"
G2CTL_SRC="${SRC_ROOT}/g2ctl"
HomebrewのGCCとgfortranは実行ファイル名にメジャーバージョンが入るため、以下のようにインストール済みの最大メジャーバージョンを取得する。
GCC_VER="$(python3 - <<'PY'
from pathlib import Path
import re
versions = []
for path in Path("/opt/homebrew/bin").glob("gcc-*"):
match = re.fullmatch(r"gcc-(\d+)", path.name)
if match:
versions.append(int(match.group(1)))
if not versions:
raise SystemExit("Homebrew gcc is not installed.")
print(max(versions))
PY
)"
GCC_CC="${HB}/bin/gcc-${GCC_VER}"
GCC_CXX="${HB}/bin/g++-${GCC_VER}"
GCC_FC="${HB}/bin/gfortran-${GCC_VER}"
Homebrewによる依存ライブラリのインストール
brew update
brew install autoconf automake libtool pkgconf cmake gcc git coreutils gnu-sed
brew install readline netcdf hdf5 udunits expat
brew install libgeotiff libtiff proj shapelib gd cairo
brew install jasper libpng zlib jpeg-turbo libaec libxml2 curl
brew install openblas lapack
brew install libx11 libxext libxmu libxt libxpm libxrender
インストール先の作成
sudo install -d -m 755 /opt/grads
sudo install -d -m 755 /opt/grads/bin
sudo install -d -m 755 /opt/grads/deps
sudo install -d -m 755 /opt/ncep
sudo install -d -m 755 /opt/ncep/bin
sudo install -d -m 755 /opt/ncep/nceplibs
sudo install -d -m 755 /opt/ncep/scripts
NCEPLIBS-ipのインストール
NCEPLIBS-ipは、NCEP Environmental Modeling Center(EMC)が提供している格子補間処理のためのライブラリである。wgrib2 では、USE_IPOLATES=ON を指定した場合に必要となる。
mkdir -p "${SRC_ROOT}/nceplibs-ip"
git clone https://github.com/NOAA-EMC/NCEPLIBS-ip.git "${IP_SRC}"
git -C "${IP_SRC}" checkout "v${IP_VER}"
cmake -S "${IP_SRC}" -B "${IP_SRC}/build" \
-DCMAKE_INSTALL_PREFIX="${IP_PREFIX}" \
-DCMAKE_OSX_ARCHITECTURES=arm64 \
-DCMAKE_Fortran_COMPILER="${GCC_FC}" \
-DBUILD_SHARED_LIBS=ON \
-DBLAS_LIBRARIES="${HB}/opt/openblas/lib/libblas.dylib" \
-DLAPACK_LIBRARIES="${HB}/opt/lapack/lib/liblapack.dylib"
cmake --build "${IP_SRC}/build" --parallel "$(sysctl -n hw.logicalcpu)"
sudo cmake --install "${IP_SRC}/build"
NCEPLIBS-g2cのインストール
NCEPLIBS-g2cは、NCEP EMCが提供しているGRIB2のC decoder/encoderである。GrADSのGRIB2対応と、wgrib2のGRIB2処理で使用される。
mkdir -p "${SRC_ROOT}/nceplibs-g2c"
git clone https://github.com/NOAA-EMC/NCEPLIBS-g2c.git "${G2C_SRC}"
git -C "${G2C_SRC}" checkout "v${G2C_VER}"
cmake -S "${G2C_SRC}" -B "${G2C_SRC}/build" \
-DCMAKE_INSTALL_PREFIX="${G2C_PREFIX}" \
-DCMAKE_OSX_ARCHITECTURES=arm64 \
-DCMAKE_PREFIX_PATH="${HB};${HB}/opt/jasper;${HB}/opt/libpng;${HB}/opt/zlib;${HB}/opt/libaec" \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_STATIC_LIBS=ON \
-DUSE_PNG=ON \
-DUSE_Jasper=ON \
-DUSE_OpenJPEG=OFF \
-DUSE_AEC=ON \
-DBUILD_G2C=ON \
-DUTILS=ON
cmake --build "${G2C_SRC}/build" --parallel "$(sysctl -n hw.logicalcpu)"
sudo cmake --install "${G2C_SRC}/build"
HDF4のインストール
GrADSのHDF4-SDS対応のために、HDF4をインストールする。
HDF4_TAG="hdf${HDF4_VER}"
mkdir -p "${SRC_ROOT}/hdf4"
git clone https://github.com/HDFGroup/hdf4.git "${HDF4_SRC}"
git -C "${HDF4_SRC}" checkout "${HDF4_TAG}"
cd "${HDF4_SRC}"
HDF4は、独自にNetCDF互換APIを含んでいる。しかし本記事では、NetCDFはHomebrewでインストールしたものを使用し、HDF4は単にHDF4-SDS用としてのみ使用するため、configureをする際に --disable-netcdf を指定する。
./configure \
--prefix="${HDF4_PREFIX}" \
--disable-netcdf \
--disable-fortran \
--enable-shared \
--with-zlib="${HB}/opt/zlib" \
--with-jpeg="${HB}/opt/jpeg-turbo" \
--with-szlib="${HB}/opt/libaec"
make -j"$(sysctl -n hw.logicalcpu)"
sudo make install
GrADSのインストール
ソースコードの取得
GrADSを開発していたジョージ・メイソン大学のThe Center for Ocean-Land-Atmosphere Studies(COLA)による公式サイトやFTPサーバー( ftp://cola.gmu.edu )は、記事執筆時点で接続できない。本記事では、GrADSのソースコードをJennifer Miletta Adams氏のGitHubリポジトリから取得した。
mkdir -p "${SRC_ROOT}/grads"
git clone https://github.com/j-m-adams/GrADS.git "${GRADS_SRC}"
git -C "${GRADS_SRC}" checkout "v${GRADS_VER}"
cd "${GRADS_SRC}"
パッチの適用
GrADS 2.2.3の configure は、grib2c という古いライブラリ名を探す。しかし、現在のNCEPLIBS-g2cではライブラリ名が g2c であるため、configure と configure.ac の該当箇所にパッチを当てる必要がある。
同時に、libpngは png15 ではなく通常の png として扱い、src/gacfg.c では G2_VERSION を G2C_VERSION に置き換える。
python3 - <<'PY'
from pathlib import Path
for name in ("configure", "configure.ac"):
path = Path(name)
if path.exists():
text = path.read_text()
text = text.replace("grib2c", "g2c")
text = text.replace("png15", "png")
path.write_text(text)
path = Path("src/gacfg.c")
text = path.read_text()
text = text.replace("G2_VERSION", "G2C_VERSION")
path.write_text(text)
PY
configure
GTIF="$(brew --prefix libgeotiff)"
GTIF_INC="$(dirname "$(find -L "$GTIF" -type f -name 'geotiffio.h' | head -n 1)")"
GTIF_LIB="${GTIF}/lib"
EXPAT="${HB}/opt/expat"
unset SUPPLIBS
unset GEOTIFF_CFLAGS GEOTIFF_LIBS GEOTIFF_LDFLAGS
export PKG_CONFIG="${HB}/bin/pkg-config"
export CPPFLAGS="\
-I${GTIF_INC} \
-I${HB}/opt/libtiff/include \
-I${HB}/opt/proj/include \
-I${HB}/opt/netcdf/include \
-I${HB}/opt/hdf5/include \
-I${HB}/opt/udunits/include \
-I${EXPAT}/include \
-I${G2C_PREFIX}/include \
-I${HB}/opt/jasper/include \
-I${HB}/opt/libpng/include \
-I${HB}/opt/zlib/include \
-I${HB}/opt/jpeg-turbo/include \
-I${HB}/opt/libaec/include \
-I${HDF4_PREFIX}/include \
-I${HB}/include \
-I${HB}/opt/readline/include"
export LDFLAGS="\
-L${GTIF_LIB} \
-L${HB}/opt/libtiff/lib \
-L${HB}/opt/proj/lib \
-L${HB}/opt/netcdf/lib \
-L${HB}/opt/hdf5/lib \
-L${HB}/opt/udunits/lib \
-L${EXPAT}/lib \
-L${G2C_PREFIX}/lib \
-L${HB}/opt/jasper/lib \
-L${HB}/opt/libpng/lib \
-L${HB}/opt/zlib/lib \
-L${HB}/opt/jpeg-turbo/lib \
-L${HB}/opt/libaec/lib \
-L${HDF4_PREFIX}/lib \
-L${HB}/lib \
-L${HB}/opt/readline/lib \
-Wl,-rpath,${GTIF_LIB} \
-Wl,-rpath,${HB}/opt/libtiff/lib \
-Wl,-rpath,${HB}/opt/proj/lib \
-Wl,-rpath,${HB}/opt/netcdf/lib \
-Wl,-rpath,${HB}/opt/hdf5/lib \
-Wl,-rpath,${HB}/opt/udunits/lib \
-Wl,-rpath,${EXPAT}/lib \
-Wl,-rpath,${G2C_PREFIX}/lib \
-Wl,-rpath,${HB}/opt/jasper/lib \
-Wl,-rpath,${HB}/opt/libpng/lib \
-Wl,-rpath,${HB}/opt/zlib/lib \
-Wl,-rpath,${HDF4_PREFIX}/lib \
-Wl,-rpath,${HB}/lib"
export CFLAGS="-O2 -arch arm64 -DH5_USE_110_API -Wno-error=implicit-function-declaration"
export CXXFLAGS="-O2 -arch arm64"
export G2_LIBS="-L${G2C_PREFIX}/lib -lg2c \
-L${HB}/opt/jasper/lib -ljasper \
-L${HB}/opt/libpng/lib -lpng \
-L${HB}/opt/zlib/lib -lz \
-L${HB}/opt/jpeg-turbo/lib -ljpeg \
-L${HB}/opt/libaec/lib -lsz"
export UDUNITS_CFLAGS="-I${HB}/opt/udunits/include -I${EXPAT}/include"
export UDUNITS_LIBS="-L${HB}/opt/udunits/lib -ludunits2 -L${EXPAT}/lib -lexpat"
export HDF4_CFLAGS="-I${HDF4_PREFIX}/include"
export HDF4_LIBS="-L${HDF4_PREFIX}/lib -lmfhdf -ldf \
-L${HB}/opt/jpeg-turbo/lib -ljpeg \
-L${HB}/opt/zlib/lib -lz \
-L${HB}/opt/libaec/lib -lsz"
export LIBS="${G2_LIBS} ${UDUNITS_LIBS}"
./configure \
--prefix="${GRADS_PREFIX}" \
--enable-dyn-supplibs \
--with-geotiff-include="${GTIF_INC}" \
--with-geotiff-libdir="${GTIF_LIB}"
configure のsummaryで、以下のように表示されることを確認する。
+-------------------------------+
| |
| GrADS will be built with: |
| |
| - GUI disabled |
| + READLINE enabled |
| + GEOTIFF enabled |
| + SHAPEFILE enabled |
| + GD enabled |
| + CAIRO enabled |
| + GRIB2 enabled |
| + HDF4 enabled |
| + HDF5 enabled |
| + NETCDF4 enabled |
| + OPeNDAP enabled |
| for grids only |
| |
+-------------------------------+
buildとinstall
mkdir -p lib src/lib # libtoolが、存在しない相対libディレクトリを参照するため、空ディレクトリを作成
make -j"$(sysctl -n hw.logicalcpu)"
sudo make install
GrADSの補助データを配置
補助データ用のディレクトリを、以下のような名前で作成する。
| 環境変数 | ディレクトリ名 |
|---|---|
GADDIR |
support-data |
GASCRP |
scripts |
GADSET |
sample-datasets |
外部から地図データやフォントなどを追加する場合には GADDIR に、スクリプトを追加する場合には GASCRP にそれぞれ配置する。
sudo install -d -m 755 "${GRADS_PREFIX}/share/grads"
sudo install -d -m 755 "${GRADS_PREFIX}/share/grads/support-data"
sudo install -d -m 755 "${GRADS_PREFIX}/share/grads/scripts"
sudo install -d -m 755 "${GRADS_PREFIX}/share/grads/sample-datasets"
sudo install -d -m 755 "${GRADS_PREFIX}/lib/grads"
sudo rsync -a "${GRADS_SRC}/data/" \
"${GRADS_PREFIX}/share/grads/support-data/"
sudo cp -a "${HB}/opt/udunits/share/udunits"/udunits2*.xml \
"${GRADS_PREFIX}/share/grads/support-data/"
plugin tableの作成
GrADSにはuser defined plugin tableがあり、描画や出力のためのpluginをここで指定する。Cairo、GD、X11を、それぞれGrADSから見えるようにする。
sudo tee "${GRADS_PREFIX}/lib/grads/udpt" >/dev/null <<EOF
gxdisplay Cairo ${GRADS_PREFIX}/lib/libgxdCairo.dylib
gxdisplay X11 ${GRADS_PREFIX}/lib/libgxdX11.dylib
gxdisplay gxdummy ${GRADS_PREFIX}/lib/libgxdummy.dylib
*
gxprint Cairo ${GRADS_PREFIX}/lib/libgxpCairo.dylib
gxprint GD ${GRADS_PREFIX}/lib/libgxpGD.dylib
gxprint gxdummy ${GRADS_PREFIX}/lib/libgxdummy.dylib
*
EOF
sudo chmod 644 "${GRADS_PREFIX}/lib/grads/udpt"
/opt/grads/bin にwrapperを作成
GrADSの実行時には、固有の環境変数を設定する必要がある。そこで、GrADS本体は grads.bin として残し、通常利用するための grads というwrapperを作成する。
DYLD_LIBRARY_PATH をシェル全体ではなくwrapperに閉じ込めることで、他のソフトの動的ライブラリ解決への影響を避けることができる。理想的には、各実行ファイルや共有ライブラリに適切なrpathを埋め込み、DYLD_LIBRARY_PATH に頼らない構成が望ましい。しかし、GrADSはAutoconfベースのビルドシステムを使用しており、DYLD_LIBRARY_PATH を使用しないでビルドするのは難しい。
sudo mv "${GRADS_PREFIX}/bin/grads" "${GRADS_PREFIX}/bin/grads.bin"
sudo tee /opt/grads/bin/grads >/dev/null <<'EOF'
#!/bin/zsh
export GRADS_HOME="/opt/grads/2.2.3"
export GADDIR="$GRADS_HOME/share/grads/support-data"
export GASCRP="$GRADS_HOME/share/grads/scripts"
export GADSET="$GRADS_HOME/share/grads/sample-datasets"
export GAUDPT="$GRADS_HOME/lib/grads/udpt"
export UDUNITS2_XML_PATH="$GRADS_HOME/share/grads/support-data/udunits2.xml"
export LANG="${LANG:-en_US.UTF-8}"
export LC_CTYPE="${LC_CTYPE:-en_US.UTF-8}"
export DYLD_LIBRARY_PATH="$GRADS_HOME/lib:/opt/grads/deps/hdf4/4.3.1/lib:/opt/ncep/nceplibs/g2c/2.3.0/lib:/opt/homebrew/lib:/opt/homebrew/opt/netcdf/lib:/opt/homebrew/opt/hdf5/lib:/opt/homebrew/opt/udunits/lib:/opt/homebrew/opt/libgeotiff/lib:/opt/homebrew/opt/libtiff/lib:/opt/homebrew/opt/proj/lib:/opt/homebrew/opt/jasper/lib:/opt/homebrew/opt/libpng/lib:/opt/homebrew/opt/zlib/lib:/opt/homebrew/opt/jpeg-turbo/lib:/opt/homebrew/opt/libaec/lib:/opt/homebrew/opt/expat/lib${DYLD_LIBRARY_PATH:+:$DYLD_LIBRARY_PATH}"
exec "$GRADS_HOME/bin/grads.bin" "$@"
EOF
sudo chmod 755 /opt/grads/bin/grads
gribmap、stnmap などの付属コマンドも /opt/grads/bin から呼べるようにする。
for command in gribmap stnmap gribscan grib2scan bufrscan
do
sudo ln -sf "${GRADS_PREFIX}/bin/${command}" "/opt/grads/bin/${command}"
done
wgribのインストール
wgribは、NCEP Climate Prediction Center(CPC)が提供しているGRIB1用のツールである。wgribはwgrib2のようなversioned releaseではなく、CPCが単一の wgrib.c として配布している。
mkdir -p "${WGRIB_SRC}" && cd $_
curl -fL -o wgrib.c \
"https://ftp.cpc.ncep.noaa.gov/wd51we/wgrib/wgrib.c"
cc -O2 -arch arm64 wgrib.c -lm -o wgrib
sudo install -d -m 755 "${WGRIB_PREFIX}/bin"
sudo install -m 755 wgrib "${WGRIB_PREFIX}/bin/wgrib"
sudo ln -sf "${WGRIB_PREFIX}/bin/wgrib" /opt/ncep/bin/wgrib
なお、コンパイル時に次のwarningが出ることがある。
wgrib.c:11176:55: warning: for loop has empty body [-Wempty-body]
これは、wgribのソース中に意図的な空ループがあるためであり、コンパイルが成功していれば無視して構わない。
wgrib2のインストール
wgrib2は、NCEPのCPCとEMCが提供しているGRIB2ファイルの読み取り、書き込み、操作を行うツールかつライブラリである。
wgrib2は、CMakeによってビルドする。そのため、CMAKE_INSTALL_RPATH を指定し、install後の実行ファイルにrpathを入れることで、DYLD_LIBRARY_PATH に頼らない構成が可能である。
mkdir -p "${SRC_ROOT}/wgrib2"
git clone https://github.com/NOAA-EMC/wgrib2.git "${WGRIB2_SRC}"
git -C "${WGRIB2_SRC}" checkout "v${WGRIB2_VER}"
OpenMPを有効にするため、Homebrew GCCの libgomp の場所を明示する。
LIBGOMP_DIR="${HB}/lib/gcc/${GCC_VER}"
LIBAEC_PREFIX="$(brew --prefix libaec)"
if [ ! -f "${LIBGOMP_DIR}/libgomp.dylib" ] && [ -f "${LIBGOMP_DIR}/libgomp.1.dylib" ]; then
sudo ln -sf "${LIBGOMP_DIR}/libgomp.1.dylib" "${LIBGOMP_DIR}/libgomp.dylib"
fi
CMAKE_INSTALL_RPATH にNCEPLIBS-ip、NCEPLIBS-g2c、libgomp、Homebrew側の主要ライブラリディレクトリを入れる。
cmake -S "${WGRIB2_SRC}" -B "${WGRIB2_SRC}/build" \
-DCMAKE_INSTALL_PREFIX="${WGRIB2_PREFIX}" \
-DCMAKE_PREFIX_PATH="${IP_PREFIX};${G2C_PREFIX};${HB}/opt/lapack;${HB}/opt/openblas;${HB}/opt/netcdf;${HB};${HB}/opt/libaec" \
-DCMAKE_C_COMPILER="${GCC_CC}" \
-DCMAKE_CXX_COMPILER="${GCC_CXX}" \
-DCMAKE_Fortran_COMPILER="${GCC_FC}" \
-DCMAKE_OSX_ARCHITECTURES=arm64 \
-DCMAKE_INSTALL_RPATH="${IP_PREFIX}/lib;${G2C_PREFIX}/lib;${LIBGOMP_DIR};${HB}/opt/netcdf/lib;${HB}/opt/openblas/lib;${HB}/opt/lapack/lib;${HB}/opt/libaec/lib;${HB}/opt/zlib/lib;${HB}/lib" \
-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON \
-DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \
-DUSE_OPENMP=ON \
-DUSE_IPOLATES=ON \
-DUSE_G2CLIB_HIGH=ON \
-DUSE_G2CLIB_LOW=ON \
-DUSE_NETCDF=ON \
-DBUILD_LIB=ON \
-DMAKE_FTN_API=OFF \
-DCMAKE_C_FLAGS="-I${LIBAEC_PREFIX}/include -I${HB}/include -fopenmp" \
-DCMAKE_EXE_LINKER_FLAGS="-L${LIBGOMP_DIR} -Wl,-rpath,${LIBGOMP_DIR} -lgomp -fopenmp" \
-DCMAKE_SHARED_LINKER_FLAGS="-L${LIBGOMP_DIR} -Wl,-rpath,${LIBGOMP_DIR} -lgomp -fopenmp"
cmake --build "${WGRIB2_SRC}/build" --parallel "$(sysctl -n hw.logicalcpu)"
sudo cmake --install "${WGRIB2_SRC}/build"
sudo ln -sf "${WGRIB2_PREFIX}/bin/wgrib2" /opt/ncep/bin/wgrib2
grib2ctlとg2ctlのインストール
grib2ctlは、CPCが提供しているGRIB1からGrADSのctlファイルを作成する補助スクリプトである。
g2ctlも同様に、CPCが提供しているGRIB2からGrADSのctlファイルを作成する補助スクリプトである。
mkdir -p "${GRIB2CTL_SRC}" "${G2CTL_SRC}"
curl -fL -o "${GRIB2CTL_SRC}/grib2ctl.pl" \
"https://ftp.cpc.ncep.noaa.gov/wd51we/wgrib.scripts/grib2ctl.pl"
curl -fL -o "${G2CTL_SRC}/g2ctl" \
"https://ftp.cpc.ncep.noaa.gov/wd51we/g2ctl/g2ctl"
スクリプト内部で呼ぶwgribとwgrib2を、今回のインストール先である /opt/ncep/bin に固定する。
GRIB2CTL_SRC="${GRIB2CTL_SRC}" G2CTL_SRC="${G2CTL_SRC}" python3 - <<'PY'
from os import environ
from pathlib import Path
p = Path(environ["GRIB2CTL_SRC"]) / "grib2ctl.pl"
s = p.read_text()
s = s.replace("$wgrib='wgrib';", "$wgrib='/opt/ncep/bin/wgrib';")
p.write_text(s)
p = Path(environ["G2CTL_SRC"]) / "g2ctl"
s = p.read_text()
s = s.replace("$wgrib2='wgrib2';", "$wgrib2='/opt/ncep/bin/wgrib2';")
p.write_text(s)
PY
インストール先に配置する。
sudo install -d -m 755 /opt/ncep/scripts/grib2ctl
sudo install -d -m 755 /opt/ncep/scripts/g2ctl
sudo install -m 755 "${GRIB2CTL_SRC}/grib2ctl.pl" /opt/ncep/scripts/grib2ctl/grib2ctl.pl
sudo install -m 755 "${G2CTL_SRC}/g2ctl" /opt/ncep/scripts/g2ctl/g2ctl
sudo ln -sf /opt/ncep/scripts/grib2ctl/grib2ctl.pl /opt/ncep/bin/grib2ctl.pl
sudo ln -sf /opt/ncep/scripts/grib2ctl/grib2ctl.pl /opt/ncep/bin/grib2ctl
sudo ln -sf /opt/ncep/scripts/g2ctl/g2ctl /opt/ncep/bin/g2ctl
パスを通す
以下のファイルを作成することによって、system-wideにパスを通す。
echo "/opt/grads/bin" | sudo tee /etc/paths.d/grads >/dev/null
echo "/opt/ncep/bin" | sudo tee /etc/paths.d/ncep >/dev/null
インストール確認
新しいターミナルを開いて、インストールが正常に完了したかを確認する。
まず、実行ファイルの場所を確認する。
which grads
which wgrib
which wgrib2
which g2ctl
which grib2ctl
以下のように表示されれば、問題なくインストールされている。
/opt/grads/bin/grads
/opt/ncep/bin/wgrib
/opt/ncep/bin/wgrib2
/opt/ncep/bin/g2ctl
/opt/ncep/bin/grib2ctl
また、GrADS、wgrib、wgrib2が arm64 バイナリであることを確認する。
lipo -archs /opt/grads/2.2.3/bin/grads.bin # -> arm64
lipo -archs /opt/ncep/bin/wgrib # -> arm64
lipo -archs /opt/ncep/bin/wgrib2 # -> arm64
さらに、GrADSの機能構成を確認する。
echo -e "q config\nquit" | grads -bl
以下のように表示されれば、問題ない。
Config: v2.2.3 little-endian readline grib2 netcdf hdf4-sds hdf5 opendap-grids geotiff shapefile
Grid Analysis and Display System (GrADS) Version 2.2.3
Copyright (C) 1988-2022 by George Mason University
GrADS comes with ABSOLUTELY NO WARRANTY
See file COPYRIGHT for more information
Configured on 05/30/26 for arm-apple-darwin25.5.0
This build of GrADS has the following features:
+ Byte order is LITTLE ENDIAN
+ Command line editing ENABLED
+ GRIB2 interface ENABLED 2.3.0
+ NetCDF interface ENABLED netcdf-4.10.0 of Feb 25 2026 17:25:46 $
+ OPeNDAP gridded data interface ENABLED
+ HDF4 interface ENABLED hdf-4.3r1
+ HDF5 interface ENABLED hdf5-2.1.1
+ KML contour output ENABLED
+ GeoTIFF and KML/TIFF output ENABLED
+ Shapefile interface ENABLED
wgribとwgrib2も確認する。
wgrib
wgrib2 -version
wgrib2 -config
wgrib2本体に、NCEPLIBS-ip、NCEPLIBS-g2c、libgompなどのrpathが入っていることを確認する。
otool -l /opt/ncep/wgrib2/3.8.0/bin/wgrib2 | grep -A2 LC_RPATH
アンインストール
本記事でインストールしたツールを削除する場合は、次のようにする。
sudo rm -rf /opt/grads /opt/ncep
sudo rm -f /etc/paths.d/grads /etc/paths.d/ncep