coreutilsをMac+wasi-sdkでコンパイル
macOSでcoreutilsをソースからビルドする手順をご説明します。
前提条件
Xcode Command Line Toolsのインストール
Homebrewのインストール(推奨)
手順
1. 必要なツールのインストール
code:bash
# Xcode Command Line Toolsをインストール(未インストールの場合)
xcode-select --install
# Homebrewで必要なパッケージをインストール
brew install autoconf automake gettext
2. ソースコードの取得
code:bash
# 公式リポジトリからクローン
git clone https://github.com/coreutils/coreutils.git
cd coreutils
# または最新の安定版をダウンロード
wget https://ftp.gnu.org/gnu/coreutils/coreutils-9.4.tar.xz
tar -xf coreutils-9.4.tar.xz
cd coreutils-9.4
.gitsubmoduleをこう変えるといいかもしれない
code:kou.toml
submodule "gnulib"
path = gnulib
url = https://github.com/coreutils/gnulib.git
いや... それでも重いかな...
memo
texinfo が必要
bootstrap に死ぬほど時間かかる
そしてなんかエラー出てるけど成功... 大丈夫?
./configure もクソ時間かかる
code:error
clang: error: no such file or directory: './lib/parse-datetime.c'
clang: error: no input files
make2: *** lib/libcoreutils_a-parse-datetime.o Error 1
make2: *** Waiting for unfinished jobs....
うっ
cpのミスのせいだな...
Macのcpだと cp --help はそもそも死ぬらしい。なんで...
byacc を入れたら一応ビルドが通った。
code:koreha
$ make -j12 src/rm
$ touch hoge
$ ./src/rm hoge
$ ls hoge
ls: hoge: No such file or directory
動いたらしい
なおビルドが通らないコマンドもあった模様
何もわからないが、これを次はwasmでビルドするよっと........
code:err
In file included from lib/gai_strerror.c:24:
./lib/netdb.h:33:16: fatal error: 'netdb.h' file not found
# include_next <netdb.h>
^~~~~~~~~
2 errors generated.
make: *** lib/libcoreutils_a-gai_strerror.o Error 1
根が深そう
https://github.com/WebAssembly/wasi-sdk/issues/112
gethostbyaddr() などが定義されている
wasm32-wasip2...
でビルドすればいいんだけど...
流石に情報全然なくて厳しい...
code:errrrr
configure:7303: checking whether the C compiler works
configure:7325: /Users/udzura/wasi-sdk/bin/clang -O2 --target=wasm32-wasip2 -I/Users/udzura/wasi-sdk/share/wasi-sysroot/include --target=wasm32-wasip2 conftest.c >&5
[parse exception: this looks like a wasm component, which Binaryen does not support yet (see https://github.com/WebAssembly/binaryen/issues/6728) (at 0:8)]
Fatal: error parsing wasm (try --debug for more info)
clang: error: linker command failed with exit code 1 (use -v to see invocation)
動かないのはwasm-optだけなので
-O0 で動いた
code:ooo
call to undeclared function 'getrlimit'
これもか...
なんかあらゆる関数が動かない...
glibcだと必要な関数が多すぎて死? 諦めるか...
https://github.com/DiegoMagdaleno/BSDCoreUtils
こういうのも見つけた。これを使う手もあるのかもしれない
YACC lib/parse-datetime.c で
3. ビルド準備
code:bash
# autotoolsでconfigureスクリプトを生成(gitからクローンした場合)
./bootstrap
# configureスクリプトを実行
./configure --prefix=/usr/local/coreutils
4. ビルドとインストール
code:bash
# ビルド(並列ビルドで高速化)
make -j$(nproc)
# テスト実行(オプション)
make check
# インストール
sudo make install
5. PATHの設定
code:bash
# ~/.zshrc または ~/.bash_profileに追加
echo 'export PATH="/usr/local/coreutils/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
注意点
既存コマンドとの競合: GNU coreutilsのコマンドはmacOSの標準コマンドと名前が同じです。PATHの順序に注意してください
依存関係: 一部の機能でlibintlやその他のライブラリが必要な場合があります
M1/M2 Mac: Apple Siliconでも問題なくビルドできますが、Rosettaは不要です
トラブルシューティング
configure エラーが出る場合:
code:bash
export CPPFLAGS="-I$(brew --prefix)/include"
export LDFLAGS="-L$(brew --prefix)/lib"
./configure --prefix=/usr/local/coreutils
gettext関連のエラー:
code:bash
brew link --force gettext
これでGNU coreutilsがmacOSで利用できるようになります。何か特定のエラーや問題が発生した場合は、詳細をお聞かせください。
rustのuutilsでよくね?となったので:
uutilsをWASI preview 1で試す
preview2 を正式に検証してなさそうだが。でも動くだろうな普通に。
動かなかった笑
例えばFreeBSDのrm何も入れなくてもいきなりコンパイルできそうに見えるけど
https://github.com/freebsd/freebsd-src/blob/main/bin/rm/rm.c
シグナルの扱いぐらいか
無理だな...
wasi-sdkは普通のUNIXに必要なAPIを半分ぐらいしか実装してないなこれは。
#webassembly