macOSへのwgrib2 v3.1.3のインストール

# はじめに

**[wgrib2](https://www.cpc.ncep.noaa.gov/products/wesley/wgrib2/)** は、GRIB2ファイルを操作するプログラムで、アメリカ海洋大気庁（NOAA）を構成するアメリカ国立気象局（NWS）の国立環境予測センター（NCEP）が配布しています。

wgrib2をmacOSにインストールする場合、ダウンロードしたファイルをそのままコンパイルしてもうまくいきません。本記事では、2024年11月現在の最新版である `v3.1.3` をインストールする方法をまとめます。

:::note info
実行環境：macOS Sequoia 15.1.1
:::

なお、本記事は [**wgrib2 v3 系の macOS 上でのコンパイルエラーをパッチで解決する**](https://qiita.com/noritada/items/8c6d62d6a1e658524f74) を参考にし、そのままでは実行時にエラーとなる箇所などを修正しました。

# 準備

Homebrew経由で、GCCをインストールする。

```bash
~
❯ brew install gcc
```

インストールが完了したら、

```bash
~
❯ gfortran -v
```

と入力すると、一番下の行に

```bash
gcc version x.y.z (Homebrew GCC x.y.z)
```

と表示されるので、メジャーバージョン（上の例では `x` ）を確認する。

# NCEPからwgrib2をダウンロードする

```bash
~
❯ mkdir tmp

~
❯ cd tmp

~/tmp
❯ wget https://www.ftp.cpc.ncep.noaa.gov/wd51we/wgrib2/wgrib2.tgz

~/tmp
❯ tar xfz wgrib2.tgz

~/tmp
❯ cp -R grib2/ grib2.orig/
```

# パッチを当てる

## makefileに対するパッチ

```bash
~/tmp
❯ vi grib2.diff
```

以下のファイルを作成する。

:::note warn
 `export CC=gcc-x` と `export FC=gfortran-x` の `x` には、先ほど確認したメジャーバージョンを入力する。
:::

```diff:~/tmp/grib2.diff
diff -ur grib2.orig/makefile grib2/makefile
--- grib2.orig/makefile
+++ grib2/makefile
@@ -153,7 +153,7 @@
 # Main development platform: linux with gcc/gfortran
 #
-# export CC=gcc
+export CC=gcc-x
-# export FC=gfortran
+export FC=gfortran-x
 #
-SHELL=/bin/sh
+SHELL=/bin/bash
 # SHELL=/bin/ksh
@@ -194,5 +194,5 @@
 USE_G2CLIB=0
-USE_PNG=1
+USE_PNG=0
 USE_JASPER=0
-USE_OPENJPEG=1
+USE_OPENJPEG=0
 USE_AEC=1
@@ -421,7 +421,7 @@
    netcdf4CPPFLAGS+=-Wall -Wmissing-prototypes -Wold-style-definition -Werror=format-security -O3
    hdf5CFLAGS+=-Wall -Wmissing-prototypes -Wold-style-definition -O1
    ifeq ($(need_ftn),1)
-      wLDFLAGS+=-lgfortran
+      wLDFLAGS+=-L$(shell gfortran -print-search-dirs | grep libraries | sed 's/^.*=//;s/:/ -L/g') -lgfortran
       wCPPFLAGS+=-DGFORTRAN
       wFFLAGS+=-c -O3
       FTN_REAL8:="-fdefault-real-8 -fdefault-double-8"
@@ -1006,9 +1006,9 @@
 ${pnglib}:	${zlib} ${pngdir}
 #       for OSX
-#	export LDFLAGS="-L${lib}" && cd "${pngdir}" && export CPPFLAGS="${wCPPFLAGS}" && ${MAKE} -f scripts/makefile.darwin
+	export LDFLAGS="-L${lib}" && cd "${pngdir}" && export CPPFLAGS="${wCPPFLAGS}" && ${MAKE} -f scripts/makefile.darwin
 #	for everybody else
 #	export LDFLAGS="-L${lib}" && cd "${pngdir}" && export CFLAGS="-DPNG_USER_WIDTH_MAX=200000000L -I${cwd}/include" ${PIC_option}" && ./configure --disable-shared --prefix=${cwd} --exec-prefix=${cwd} && ${MAKE} check install
-	export LDFLAGS="-L${lib}" && cd "${pngdir}" && export CPPFLAGS="-DPNG_USER_WIDTH_MAX=200000000L -I${cwd}/include  ${PIC_option}" && ./configure --disable-shared --prefix=${cwd} --exec-prefix=${cwd} && ${MAKE} check install
+#	export LDFLAGS="-L${lib}" && cd "${pngdir}" && export CPPFLAGS="-DPNG_USER_WIDTH_MAX=200000000L -I${cwd}/include  ${PIC_option}" && ./configure --disable-shared --prefix=${cwd} --exec-prefix=${cwd} && ${MAKE} check install

```

作成したら、パッチを当てる。

```bash
~/tmp
❯ patch -p0 < grib2.diff
```

## Jasperに対するパッチ

```bash
~/tmp
❯ cd grib2

~/tmp/grib2
❯ tar xfz jasper-1.900.1-14ubuntu3.2.debian.tgz

~/tmp/grib2
❯ cp -R grib2/ grib2.orig/

~/tmp/grib2
❯ vi ../jasper.diff
```

以下のファイルを作成する。

```diff:~/tmp/jasper.diff
diff -ur jasper-1.900.1.orig/src/libjasper/base/jas_getopt.c jasper-1.900.1/src/libjasper/base/jas_getopt.c
--- jasper-1.900.1.orig/src/libjasper/base/jas_getopt.c
+++ jasper-1.900.1/src/libjasper/base/jas_getopt.c
@@ -77,6 +77,7 @@

 #include "jasper/jas_getopt.h"
 #include "jasper/jas_math.h"
+#include "jasper/jas_debug.h"

 /******************************************************************************\
 * Global data.
diff -ur jasper-1.900.1.orig/src/libjasper/bmp/bmp_dec.c jasper-1.900.1/src/libjasper/bmp/bmp_dec.c
--- jasper-1.900.1.orig/src/libjasper/bmp/bmp_dec.c
+++ jasper-1.900.1/src/libjasper/bmp/bmp_dec.c
@@ -77,6 +77,7 @@
 #include "jasper/jas_stream.h"
 #include "jasper/jas_image.h"
 #include "jasper/jas_malloc.h"
+#include "jasper/jas_debug.h"

 #include "bmp_cod.h"

diff -ur jasper-1.900.1.orig/src/libjasper/jpc/jpc_t1dec.c jasper-1.900.1/src/libjasper/jpc/jpc_t1dec.c
--- jasper-1.900.1.orig/src/libjasper/jpc/jpc_t1dec.c
+++ jasper-1.900.1/src/libjasper/jpc/jpc_t1dec.c
@@ -78,6 +78,7 @@
 #include "jasper/jas_fix.h"
 #include "jasper/jas_stream.h"
 #include "jasper/jas_math.h"
+#include "jasper/jas_debug.h"

 #include "jpc_bs.h"
 #include "jpc_mqdec.h"
diff -ur jasper-1.900.1.orig/src/libjasper/jpc/jpc_tsfb.c jasper-1.900.1/src/libjasper/jpc/jpc_tsfb.c
--- jasper-1.900.1.orig/src/libjasper/jpc/jpc_tsfb.c
+++ jasper-1.900.1/src/libjasper/jpc/jpc_tsfb.c
@@ -119,6 +119,9 @@
 	free(tsfb);
 }

+int jpc_tsfb_analyze2(jpc_tsfb_t *tsfb, int *a, int xstart, int ystart,
+  int width, int height, int stride, int numlvls);
+
 int jpc_tsfb_analyze(jpc_tsfb_t *tsfb, jas_seq2d_t *a)
 {
 	return (tsfb->numlvls > 0) ? jpc_tsfb_analyze2(tsfb, jas_seq2d_getref(a,
@@ -146,6 +149,9 @@
 	return 0;
 }

+int jpc_tsfb_synthesize2(jpc_tsfb_t *tsfb, int *a, int xstart, int ystart,
+  int width, int height, int stride, int numlvls);
+
 int jpc_tsfb_synthesize(jpc_tsfb_t *tsfb, jas_seq2d_t *a)
 {
 	return (tsfb->numlvls > 0) ? jpc_tsfb_synthesize2(tsfb,
diff -ur jasper-1.900.1.orig/src/libjasper/jpg/jpg_dummy.c jasper-1.900.1/src/libjasper/jpg/jpg_dummy.c
--- jasper-1.900.1.orig/src/libjasper/jpg/jpg_dummy.c
+++ jasper-1.900.1/src/libjasper/jpg/jpg_dummy.c
@@ -69,6 +69,7 @@
 #include "jasper/jas_stream.h"
 #include "jasper/jas_image.h"
 #include "jasper/jas_string.h"
+#include "jasper/jas_debug.h"

 #include "jpg_cod.h"

diff -ur jasper-1.900.1.orig/src/libjasper/mif/mif_cod.c jasper-1.900.1/src/libjasper/mif/mif_cod.c
--- jasper-1.900.1.orig/src/libjasper/mif/mif_cod.c
+++ jasper-1.900.1/src/libjasper/mif/mif_cod.c
@@ -70,6 +70,7 @@
 #include "jasper/jas_image.h"
 #include "jasper/jas_string.h"
 #include "jasper/jas_malloc.h"
+#include "jasper/jas_debug.h"

 #include "mif_cod.h"

diff -ur jasper-1.900.1.orig/src/libjasper/pnm/pnm_dec.c jasper-1.900.1/src/libjasper/pnm/pnm_dec.c
--- jasper-1.900.1.orig/src/libjasper/pnm/pnm_dec.c
+++ jasper-1.900.1/src/libjasper/pnm/pnm_dec.c
@@ -79,6 +79,7 @@
 #include "jasper/jas_types.h"
 #include "jasper/jas_stream.h"
 #include "jasper/jas_image.h"
+#include "jasper/jas_debug.h"

 #include "pnm_cod.h"

```

作成したら、パッチを当てる。

```bash
~/tmp/grib2
❯ patch -p0 < ../jasper.diff
```

# コンパイルする

```bash
~/tmp/grib2
❯ make
```

# インストールする

```bash
~/tmp/grib2
❯ sudo install wgrib2/wgrib2 /opt/local/bin
```

# インストールされたことを確認する

```bash
~
❯ wgrib2 -version
v3.1.3 10/2023  Wesley Ebisuzaki, Reinoud Bokhorst, John Howard, Jaakko Hyvätti, Dusan Jovic, Daniel Lee, Kristian Nilssen, Karl Pfeiffer, Pablo Romero, Manfred Schwarb, Gregor Schee, Arlindo da Silva, Niklas Sondell, Sam Trahan, George Trojan, Sergey Varlamov
```

# 参考文献
https://qiita.com/noritada/items/8c6d62d6a1e658524f74