1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Apple Silicon】macOSにGrADS・wgrib・wgrib2・grib2ctl・g2ctlをネイティブインストールする

1
Last updated at Posted at 2026-05-29

はじめに

背景

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 portarm64 環境向けにもビルドされているため、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 であるため、configureconfigure.ac の該当箇所にパッチを当てる必要がある。

同時に、libpngは png15 ではなく通常の png として扱い、src/gacfg.c では G2_VERSIONG2C_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

gribmapstnmap などの付属コマンドも /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
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?