はじめに
wgrib2 は、GRIB2 ファイルを操作するプログラムで、アメリカ海洋大気庁(NOAA)を構成するアメリカ国立気象局(NWS)の国立環境予測センター(NCEP)が配布している。
この記事は、以前公開した以下の記事の更新版である。
実行環境のバージョン
バージョン | |
---|---|
アーキテクチャ | ARM64 |
OS | macOS Sequoia 15.5 |
GCC | Homebrew GCC 15.1.0 |
依存ライブラリをインストール
$ brew install gcc cmake netcdf zlib libpng openblas lapack jasper libaec pkg-config
作業用ディレクトリの用意
$ mkdir -p ~/tmp/wgrib2 && cd ~/tmp/wgrib2
ソースコードの取得
$ for repo in ip g2c wgrib2; do \
git clone "https://github.com/NOAA-EMC/NCEPLIBS-${repo}.git"; \
cd "NCEPLIBS-${repo}"; \
git switch --detach "v$(grep -m1 -o '[0-9]\+\.[0-9]\+\.[0-9]\+' VERSION 2>/dev/null)"; \
cd ..; \
done
パッチの適用
オリジナルのバックアップを作成
$ for d in NCEPLIBS-{g2c,wgrib2}; do cp -R "$d" "$d.orig"; done
NCEPLIBS-g2c
へのパッチ
まず、 NCEPLIBS-g2c
の CMakeLists.txt
にパッチを当てるために、以下のようなパッチファイル( ~/tmp/wgrib2/g2c.diff
)を作成する。
diff -ur NCEPLIBS-g2c.orig/CMakeLists.txt NCEPLIBS-g2c/CMakeLists.txt
--- NCEPLIBS-g2c.orig/CMakeLists.txt
+++ NCEPLIBS-g2c/CMakeLists.txt
@@ -18,15 +18,15 @@
# Handle user options.
option(ENABLE_DOCS "Enable generation of doxygen-based documentation." OFF)
option(USE_PNG "Use PNG library" ON)
option(USE_Jasper "Use Jasper library" ON)
option(USE_OpenJPEG "Use OpenJPEG library" OFF)
-option(USE_AEC "Use LibAEC library" OFF)
+option(USE_AEC "Use LibAEC library" ON)
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
option(BUILD_STATIC_LIBS "Build static libraries" ON)
option(FTP_TEST_FILES "Fetch and test with files on FTP site." OFF)
option(FTP_LARGE_TEST_FILES "Fetch and test with very large files on FTP site." OFF)
option(FTP_EXTRA_TEST_FILES "Test with more large files fetched via FTP." OFF)
option(LOGGING "Turn on internal logging messages. Only useful to g2c developers." OFF)
option(PTHREADS "Turn on thread-safty with pthreads." OFF)
option(UTILS "Build and install some utility programs." ON)
option(BUILD_G2C "Build the g2c file-based API." ON)
作成したら、パッチを適用する。
$ patch -p0 < g2c.diff
NCEPLIBS-wgrib2
へのパッチ
次に、NCEPLIBS-wgrib2 の CMakeLists.txt
にもパッチを当てるために、以下のようなパッチファイル( ~/tmp/wgrib2/wgrib2.diff
)を作成する。
diff -ur NCEPLIBS-wgrib2.orig/CMakeLists.txt NCEPLIBS-wgrib2/CMakeLists.txt
--- NCEPLIBS-wgrib2.orig/CMakeLists.txt
+++ NCEPLIBS-wgrib2/CMakeLists.txt
@@ -18,21 +18,21 @@
# Handle user build options.
option(ENABLE_DOCS "Enable generation of doxygen-based documentation." OFF)
-option(USE_NETCDF "Use NetCDF" off)
+option(USE_NETCDF "Use NetCDF" on)
option(USE_REGEX "Use Regex?" on)
option(USE_TIGGE "Use tigge?" on)
option(USE_MYSQL "Use MySQL?" off)
-option(USE_IPOLATES "Use Ipolates" off)
+option(USE_IPOLATES "Use Ipolates" on)
option(USE_UDF "Use UDF?" off)
-option(USE_OPENMP "Use OpenMP?" off)
+option(USE_OPENMP "Use OpenMP?" on)
option(USE_PROJ4 "Use Proj4?" off)
option(USE_WMO_VALIDATION "Use WMO Validation?" off)
option(DISABLE_TIMEZONE "Disable posix Timezone?" off)
option(DISABLE_ALARM "Disable Alarm?" off)
set(USE_NAMES "NCEP")
-option(USE_G2CLIB_HIGH "Use g2c high-level decoder (-g2clib 2)?" off)
+option(USE_G2CLIB_HIGH "Use g2c high-level decoder (-g2clib 2)?" on)
-option(USE_G2CLIB_LOW "Use g2c low-level decoders (png,jpeg2000)?" off)
+option(USE_G2CLIB_LOW "Use g2c low-level decoders (png,jpeg2000)?" on)
-option(USE_AEC "Use AEC to enable encoding/decoding of GRIB2 data with CCSDS packing (packing type 42)." off)
+option(USE_AEC "Use AEC to enable encoding/decoding of GRIB2 data with CCSDS packing (packing type 42)." on)
option(BUILD_EXTRA "Build user-contributed code" OFF)
option(FTP_TEST_FILES "Fetch and test with files on FTP site." OFF)
option(FTP_LARGE_TEST_FILES "Fetch and test with very large files on FTP site." OFF)
option(FTP_EXTRA_TEST_FILES "Fetch even more large files from FTP and test them." OFF)
USE_OPENMP
を on
にすることで、マルチコアを用いた並列処理が可能になる。
作成したら、パッチを適用する。
$ patch -p0 < wgrib2.diff
ライブラリの配置
ソースを /opt
にコピーする
$ sudo cp -R NCEPLIBS-{g2c,wgrib2,ip} /opt/
rpath のための環境変数を準備
$ RP_IP="/opt/homebrew/opt/NCEPLIBS-ip/lib"
RP_G2C="/opt/homebrew/opt/NCEPLIBS-g2c/lib"
RP_W2="/opt/homebrew/opt/NCEPLIBS-wgrib2/lib"
RP_ALL="${RP_IP};${RP_G2C};${RP_W2}"
export RP_IP RP_G2C RP_W2 RP_ALL
ビルドとインストール
ip
$ cd /opt/NCEPLIBS-ip
$ sudo mkdir build && cd build
$ sudo cmake .. \
-DCMAKE_INSTALL_PREFIX=/opt/homebrew/opt/NCEPLIBS-ip \
-DCMAKE_INSTALL_RPATH="${RP_ALL}" \
-DCMAKE_INSTALL_NAME_DIR="@rpath" \
-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON \
-DBUILD_SHARED_LIBS=ON \
-DBLAS_LIBRARIES=/opt/homebrew/opt/openblas/lib/libblas.dylib \
-DLAPACK_LIBRARIES=/opt/homebrew/opt/lapack/lib/liblapack.dylib
$ sudo make -j$(sysctl -n hw.logicalcpu)
$ sudo make install
g2c
$ cd /opt/NCEPLIBS-g2c
$ sudo mkdir build && cd build
$ JASPER_INCLUDE_DIR="/opt/homebrew/opt/include/jasper"
JASPER_LIBRARIES="/opt/homebrew/opt/lib/libjasper.dylib"
JPEG_INCLUDE_DIR="/opt/homebrew/opt/include"
JPEG_LIBRARY="/opt/homebrew/opt/lib/libjpeg.dylib"
export JASPER_INCLUDE_DIR JASPER_LIBRARIES JPEG_INCLUDE_DIR JPEG_LIBRARY
$ sudo cmake .. \
-DCMAKE_INSTALL_PREFIX=/opt/homebrew/opt/NCEPLIBS-g2c \
-DCMAKE_INSTALL_RPATH="${RP_ALL}" \
-DCMAKE_INSTALL_NAME_DIR="@rpath" \
-DCMAKE_OSX_DEPLOYMENT_TARGET=15.0 \
-DCMAKE_OSX_ARCHITECTURES=arm64
$ sudo make -j$(sysctl -n hw.logicalcpu)
$ sudo make install
wgrib2
Homebrew でインストールされている gcc・g++・gfortran のバージョンを確認しておく。ここでは、 gcc-15
、 g++-15
、 gfortran-15
を前提とする。また、OpenMP による並列処理を有効にしている。
$ cd /opt/NCEPLIBS-wgrib2
$ sudo mkdir build && cd build
$ if [ ! -f /opt/homebrew/lib/gcc/15/libgomp.dylib ]; then \
sudo ln -sf /opt/homebrew/lib/gcc/15/libgomp.1.dylib /opt/homebrew/lib/gcc/15/libgomp.dylib; \
fi
$ LDFLAGS="-L/opt/homebrew/opt/zlib/lib"
CPPFLAGS="-I/opt/homebrew/opt/zlib/include" \
PKG_CONFIG_PATH="/opt/homebrew/opt/zlib/lib/pkgconfig"
export LDFLAGS CPPFLAGS PKG_CONFIG_PATH
$ sudo cmake .. \
-DCMAKE_INSTALL_PREFIX=/opt/homebrew/opt/NCEPLIBS-wgrib2 \
-DCMAKE_PREFIX_PATH="/opt/homebrew/opt/NCEPLIBS-ip;/opt/homebrew/opt/NCEPLIBS-g2c" \
-DCMAKE_C_COMPILER=/opt/homebrew/bin/gcc-15 \
-DCMAKE_CXX_COMPILER=/opt/homebrew/bin/g++-15 \
-DCMAKE_Fortran_COMPILER=/opt/homebrew/bin/gfortran-15 \
-DCMAKE_INSTALL_RPATH="${RP_ALL}" \
-DCMAKE_INSTALL_NAME_DIR="@rpath" \
-DCMAKE_EXE_LINKER_FLAGS="-L/opt/homebrew/lib/gcc/15 -lgomp" \
-DUSE_OPENMP=ON \
-DOpenMP_C_FLAGS="-fopenmp" \
-DOpenMP_C_LIB_NAMES="gomp" \
-DOpenMP_C_LIBRARIES="/opt/homebrew/lib/gcc/15/libgomp.dylib" \
-DOpenMP_gomp_LIBRARY="/opt/homebrew/lib/gcc/15/libgomp.dylib"
$ sudo make -j$(sysctl -n hw.logicalcpu)
$ sudo make install
$ sudo ln -sf /opt/homebrew/opt/NCEPLIBS-wgrib2/bin/wgrib2 /opt/homebrew/bin
インストールの確認
以下のように表示されれば、正常にインストールできている。
$ wgrib2 -version # → 3.7.0
不要な作業用ディレクトリの削除
$ sudo rm -rf ~/tmp/wgrib2
アップデートの手順
wgrib2 のみ更新する場合
まず、最新版のソースコードを取得する。
$ cd /opt/NCEPLIBS-wgrib2
$ git fetch --tags origin
$ git switch [新しいタグ] # 例:新しいタグが v3.8.0 の場合には、git switch v3.8.0
必要があれば、NCEPLIBS-wgrib2
へのパッチを参考に、 /opt/NCEPLIBS-wgrib2/CMakeLists.txt
に対するパッチを適用する。
既存の build
ディレクトリを削除して、再度作成する。wgrib2 のビルド・インストール手順と同様に、ビルドとインストールを行う。
$ sudo rm -rf build && sudo mkdir build && cd build
$ if [ ! -f /opt/homebrew/lib/gcc/15/libgomp.dylib ]; then \
sudo ln -sf /opt/homebrew/lib/gcc/15/libgomp.1.dylib /opt/homebrew/lib/gcc/15/libgomp.dylib; \
fi
$ LDFLAGS="-L/opt/homebrew/opt/zlib/lib"
CPPFLAGS="-I/opt/homebrew/opt/zlib/include" \
PKG_CONFIG_PATH="/opt/homebrew/opt/zlib/lib/pkgconfig"
export LDFLAGS CPPFLAGS PKG_CONFIG_PATH
$ sudo cmake .. \
-DCMAKE_INSTALL_PREFIX=/opt/homebrew/opt/NCEPLIBS-wgrib2 \
-DCMAKE_PREFIX_PATH="/opt/homebrew/opt/NCEPLIBS-ip;/opt/homebrew/opt/NCEPLIBS-g2c" \
-DCMAKE_C_COMPILER=/opt/homebrew/bin/gcc-15 \
-DCMAKE_CXX_COMPILER=/opt/homebrew/bin/g++-15 \
-DCMAKE_Fortran_COMPILER=/opt/homebrew/bin/gfortran-15 \
-DCMAKE_INSTALL_RPATH="${RP_ALL}" \
-DCMAKE_INSTALL_NAME_DIR="@rpath" \
-DCMAKE_EXE_LINKER_FLAGS="-L/opt/homebrew/lib/gcc/15 -lgomp" \
-DUSE_OPENMP=ON \
-DOpenMP_C_FLAGS="-fopenmp" \
-DOpenMP_C_LIB_NAMES="gomp" \
-DOpenMP_C_LIBRARIES="/opt/homebrew/lib/gcc/15/libgomp.dylib" \
-DOpenMP_gomp_LIBRARY="/opt/homebrew/lib/gcc/15/libgomp.dylib"
$ sudo make -j$(sysctl -n hw.logicalcpu)
$ sudo make install
$ sudo ln -sf /opt/homebrew/opt/NCEPLIBS-wgrib2/bin/wgrib2 /opt/homebrew/bin
以下のように表示されれば、正常にアップデートされている。
$ wgrib2 -version # → [新しいタグ](例:v3.8.0)
新しいバージョンに問題があり、ロールバックする際には、 git switch [前のタグまたはコミット]
を実行して、同様にビルドとインストールを行う。
ip と g2c も併せて更新する場合
ip の更新
$ cd /opt/NCEPLIBS-ip
$ git fetch --tags origin
$ git switch [新しいタグ] # 例:新しいタグが v5.5.0 の場合には、git switch v5.5.0
$ sudo rm -rf build && sudo mkdir build && cd build
$ RP_IP="/opt/homebrew/opt/NCEPLIBS-ip/lib"
RP_G2C="/opt/homebrew/opt/NCEPLIBS-g2c/lib"
RP_W2="/opt/homebrew/opt/NCEPLIBS-wgrib2/lib"
RP_ALL="${RP_IP};${RP_G2C};${RP_W2}"
export RP_IP RP_G2C RP_W2 RP_ALL
$ sudo cmake .. \
-DCMAKE_INSTALL_PREFIX=/opt/homebrew/opt/NCEPLIBS-ip \
-DCMAKE_INSTALL_RPATH="${RP_ALL}" \
-DCMAKE_INSTALL_NAME_DIR="@rpath" \
-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON \
-DBUILD_SHARED_LIBS=ON \
-DBLAS_LIBRARIES=/opt/homebrew/opt/openblas/lib/libblas.dylib \
-DLAPACK_LIBRARIES=/opt/homebrew/opt/lapack/lib/liblapack.dylib
$ sudo make -j$(sysctl -n hw.logicalcpu)
$ sudo make install
g2c の更新
$ cd /opt/NCEPLIBS-g2c
$ git fetch --tags origin
$ git switch [新しいタグ] # 例:新しいタグが v2.3.0 の場合には、git switch v2.3.0
必要があれば、NCEPLIBS-g2c
へのパッチを参考に、 /opt/NCEPLIBS-g2c/CMakeLists.txt
に対するパッチを適用する。
$ sudo rm -rf build && sudo mkdir build && cd build
$ JASPER_INCLUDE_DIR="/opt/homebrew/opt/include/jasper"
JASPER_LIBRARIES="/opt/homebrew/opt/lib/libjasper.dylib"
JPEG_INCLUDE_DIR="/opt/homebrew/opt/include"
JPEG_LIBRARY="/opt/homebrew/opt/lib/libjpeg.dylib"
export JASPER_INCLUDE_DIR JASPER_LIBRARIES JPEG_INCLUDE_DIR JPEG_LIBRARY
$ sudo cmake .. \
-DCMAKE_INSTALL_PREFIX=/opt/homebrew/opt/NCEPLIBS-g2c \
-DCMAKE_INSTALL_RPATH="${RP_ALL}" \
-DCMAKE_INSTALL_NAME_DIR="@rpath" \
-DCMAKE_OSX_DEPLOYMENT_TARGET=15.0 \
-DCMAKE_OSX_ARCHITECTURES=arm64
$ sudo make -j$(sysctl -n hw.logicalcpu)
$ sudo make install
wgrib2 の更新
wgrib2 のみ更新する場合 と同様。
アンインストール
$ sudo rm -rf /opt/homebrew/bin/wgrib2 /opt/homebrew/opt/NCEPLIBS-{wgrib2,g2c,ip} /opt/NCEPLIBS-{wgrib2,g2c,ip}
他のプロセスなどが使用していなければ、 libgomp
のシンボリックリンクも消す。
$ sudo rm -f /opt/homebrew/lib/gcc/15/libgomp.dylib
参考文献