NumPyのインストール: /usr/include/xlocale.h:27:16: エラー: ‘struct __locale_struct’ の再定義です

元々はOptunaをインストールしようとしていたのですが,よく分からないエラーでインストールできない.調べているとNumPyのインストールが失敗しているらしいということで,NumPy単独でインストールしてみようとしていました.

$ pip3 install numpy==1.21
(中略)
  In file included from numpy/core/src/common/numpyos.c:23:
  /usr/include/xlocale.h:27:16: error: redefinition of ‘struct __locale_struct’

numpyos.cのコンパイルに失敗している.
よく分からないので,ソースからのビルドに挑戦する.

$ git clone https://github.com/numpy/numpy.git
$ cd numpy/
$ python3 setup.py build -j 16 install --user
(中略)
gcc: numpy/core/src/common/numpyos.c
In file included from numpy/core/src/common/numpyos.c:23:
/usr/include/xlocale.h:27:16: error: redefinition of ‘struct __locale_struct’
   27 | typedef struct __locale_struct

pip経由でインストールしようとした時と同じエラーが出るので,現象は同じ.
よく分からないので検索してみると,同じエラーでチケットが上がっている模様.
xlocale.h definition conflicts with IBM advanced toolchain · Issue #17347 · numpy/numpy · GitHub
実はIBM Power8で作業していたので,このチケットがビンゴ.このチケット自体は現在もクローズされいないが,チケットの内容を読んでいると気付くことは,「/usr/local/bin/gccを使っているのに,なぜ/usr/include/xlocal.hのエラーでコンパイルが失敗する?」ということ.もちろん/usr/local/bin/gccはあとからインストールしたものなので,/usr/bin/gccに依存しているところが無いわけではないが,よく考えたらxlocal.hは新しいgccでは使われていない
Release/2.26 - glibc wiki

The nonstandard header xlocale.h has been removed in this release.

スタンダードじゃないヘッダファイルxlocale.hは,このリリースで削除された

では,なぜ削除されたはずのxlocale.hがビルドで使われようとしているのか?
それは,エラーを出しているnumpyos.cの中でxlocale.hを読み込もうとしているから.

#ifdef HAVE_STRTOLD_L
#include <stdlib.h>
#ifdef HAVE_XLOCALE_H
    /*
     * the defines from xlocale.h are included in locale.h on some systems;
     * see gh-8367
     */
    #include <xlocale.h>
#endif
#endif

マクロHAVE_XLOCALE_Hが定義されている場合に限り,このコードが実行されて,xlocale.hを読み込もうとする.

従って解決方法としては,マクロHAVE_XLOCALE_Hを定義しない,というのが正しい.この余計なことをするマクロHAVE_XLOCALE_Hは,setup.pyを実行すると作成されるnumpy/core/include/numpy/config.hの中に書かれている.

#define HAVE_XLOCALE_H 1

なので,この行を消してしまうというのが解決法になる.このファイルは

build/src.linux/numpy/core/include/numpy/config.h

みたいな場所にあるはずなので,適当なテキストエディタで該当の行を探し,削除し保存すれば良い.
改めてインストールを試みると,無事成功します.

python3 setup.py build -j 16 install --user
(中略)
Finished processing dependencies for numpy==1.22.0.dev0+377.gf128be6c6