Mojave で Fink によるビルドで readline8 に対処した例

Fink では、**すべてのリンクを確認してパッケージを作成しています**。

Fink は、**複数バージョンの併用が可能です**。たとえば、readline6 にリンクしてビルドしたい場合、一時的に readline7 のヘッダファイルを削除し、readline6 のヘッダファイルをインクルードしてビルドします。

---

Fink の R (r-base35-3.5.3-1) に、ビルド時のエラーが報告された。

```
making gramLatex.d from gramLatex.c
flag-sort -r gcc -ffor-scope -I"../../../../include" -DNDEBUG -I../../../include -I../../../../src/include -DHAVE_CONFIG_H -I../../../../src/main  -I/sw64/include   -fPIC  -g -O3  -c text.c -o text.o
flag-sort -r gcc -ffor-scope -I"../../../../include" -DNDEBUG -I../../../include -I../../../../src/include -DHAVE_CONFIG_H -I../../../../src/main  -I/sw64/include   -fPIC  -g -O3  -c init.c -o init.o
making gramRd.d from gramRd.c
flag-sort -r gcc -ffor-scope -I"../../../../include" -DNDEBUG -I../../../include -I../../../../src/include -DHAVE_CONFIG_H -I../../../../src/main  -I/sw64/include   -fPIC  -g -O3  -c Rmd5.c -o Rmd5.o
flag-sort -r gcc -ffor-scope -I"../../../../include" -DNDEBUG -I../../../include -I../../../../src/include -DHAVE_CONFIG_H -I../../../../src/main  -I/sw64/include   -fPIC  -g -O3  -c md5.c -o md5.o
flag-sort -r gcc -ffor-scope -I"../../../../include" -DNDEBUG -I../../../include -I../../../../src/include -DHAVE_CONFIG_H -I../../../../src/main  -I/sw64/include   -fPIC  -g -O3  -c signals.c -o signals.o
flag-sort -r gcc -ffor-scope -I"../../../../include" -DNDEBUG -I../../../include -I../../../../src/include -DHAVE_CONFIG_H -I../../../../src/main  -I/sw64/include   -fPIC  -g -O3  -c install.c -o install.o
flag-sort -r gcc -ffor-scope -I"../../../../include" -DNDEBUG -I../../../include -I../../../../src/include -DHAVE_CONFIG_H -I../../../../src/main  -I/sw64/include   -fPIC  -g -O3  -c getfmts.c -o getfmts.o
flag-sort -r gcc -ffor-scope -I"../../../../include" -DNDEBUG -I../../../include -I../../../../src/include -DHAVE_CONFIG_H -I../../../../src/main  -I/sw64/include   -fPIC  -g -O3  -c http.c -o http.o
flag-sort -r gcc -ffor-scope -I"../../../../include" -DNDEBUG -I../../../include -I../../../../src/include -DHAVE_CONFIG_H -I../../../../src/main  -I/sw64/include   -fPIC  -g -O3  -c gramLatex.c -o gramLatex.o
flag-sort -r gcc -ffor-scope -I"../../../../include" -DNDEBUG -I../../../include -I../../../../src/include -DHAVE_CONFIG_H -I../../../../src/main  -I/sw64/include   -fPIC  -g -O3  -c gramRd.c -o gramRd.o
flag-sort -r gcc -ffor-scope -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress ../../../../lib/libR.dylib -L/sw64/lib -o tools.so text.o init.o Rmd5.o md5.o signals.o install.o getfmts.o http.o gramLatex.o gramRd.o ../../../../lib/libR.dylib -lintl -Wl,-framework -Wl,CoreFoundation
mkdir ../../../../library/tools/libs
installing 'sysdata.rda'
dyld: Symbol not found: _rl_done
  Referenced from: /sw64/src/fink.build/r-base35-3.5.3-1/R-3.5.3/lib/libR.dylib
  Expected in: flat namespace
 in /sw64/src/fink.build/r-base35-3.5.3-1/R-3.5.3/lib/libR.dylib
/bin/sh: line 1: 26893 Done                    echo "tools:::sysdata2LazyLoadDB(\"./R/sysdata.rda\",\"../../../library/tools/R\")"
     26894 Abort trap: 6           | R_DEFAULT_PACKAGES=NULL LC_ALL=C R_ENABLE_JIT=0 TZ=UTC ../../../bin/R --vanilla --slave
make[4]: *** [sysdata] Error 134
```

エラーは、 _rl_done というシンボルがないというもので、見ているライブラリは libR.dylib。

```
$ cd /sw/src/fink.build/r-base35-3.5.3-2/R-3.5.3/src/library/tools/
$ grep -r readline *
```

tools というライブラリ自体は readline を使っていない。

R の configure では、readline を自動的に探す。この際、パス指定などはできない。このことから、readline が適切にリンクされていない可能性がある。そこで、readline8 を /usr/local にインストールしてみる。

```
$ cd ~/Download
$ curl -O ftp://ftp.cwru.edu/pub/bash/readline-8.0.tar.gz
$ tar -zxvf readline-8.0.tar.gz
$ cd readline-8.0
$ ./configure
$ make
$ sudo make install
$ ls /usr/local/lib/
```

readline8 がインストールされている。

では、あらためて r-base35 をビルドしてみる。たしかに、同じエラーが出た。

```
$ otool -L /sw/src/fink.build/r-base-3.5.3-1/R-3.5.3/lib/libR.dylib
/sw/src/fink.build/r-base-3.5.3-1/R-3.5.3/lib/libR.dylib
	libR.dylib (compatibility version 3.5.0, current version 3.5.3)
	/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
	/sw/lib/gcc5/lib/libgfortran.3.dylib (compatibility version 4.0.0, current version 4.0.0)
	/sw/lib/gcc5/lib/libquadmath.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2)
	/sw/lib/libintl.8.dylib (compatibility version 10.0.0, current version 10.5.0)
	/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1349.95.0)
	/usr/lib/libedit.3.dylib (compatibility version 2.0.0, current version 3.0.0)
	/sw/lib/libpcre2-8.0.dylib (compatibility version 8.0.0, current version 8.1.0)
	/usr/lib/libpcre.0.dylib (compatibility version 1.0.0, current version 1.1.0)
	/sw/lib/liblzma.5.dylib (compatibility version 8.0.0, current version 8.3.0)
	/sw/lib/libbz2.1.dylib (compatibility version 1.0.1, current version 1.0.6)
	/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.8)
	/sw/lib/libiconv.2.dylib (compatibility version 9.0.0, current version 9.0.0)
	/sw/lib/libicuuc.55.1.dylib (compatibility version 55.0.0, current version 55.1.0)
	/sw/lib/libicui18n.55.1.dylib (compatibility version 55.0.0, current version 55.1.0)
```

readline は、pcre2 の上あたりにあるはずだが、リンクされていない。

Fink では、リンクが適切にされるよう、フラグの並び方を調整している。この flag-sort が、Mojave の SDK を認識していなかったことが原因であった。

Fink 本体の開発者が、flag-sort の修正をして対応した。

現状、r-base35 は readline6 にリンクしています。 Fink には、 readline7 があるので、問題がなければ今後は readline7 に移行します。

---

今後、Mojave ユーザの方が /usr/local に readline8 などを入れいても、**Fink でインストールするものは Fink の readline に適切にリンクされます**。