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 に適切にリンクされます。