M1 Mac で NYAGOS を使ってみる
このスクラップについて
M1 Mac で NYAGOS をビルドして実際に使ってみようと思うのでその記録を残すスクラップです。
やること
- NYAGOS をビルドする
- NYAGOSを実行する
- NYAGOSを普段使いしてみる
NYAGOS をビルドする
とりあえず公式ドキュメントに書いてある内容を実行する
❯ make
git status -s | gawk "/^.M.*\.go/{ system(\"go fmt \" $NF) }"
/bin/sh: gawk: command not found
make: *** [fmt] Error 127
gawk がないと言われた。普通にインストールできるっぽい(MacでGNUブランドのsed & awkを利用する時の備忘録 - Qiita
)
gawk をインストールして再実行
❯ make
git status -s | gawk "/^.M.*\.go/{ system(\"go fmt \" $NF) }"
cd Etc && go generate
sh: versioninfo.json: No such file or directory
version_unix.go:7: running "sh": exit status 1
make: *** [nyagos.syso] Error 1
よくわからんので一旦GNU Makeがない場合の方で試す(最初からこっちでやれ)
❯ CGO_ENABLED=0 go build
go: downloading github.com/go-ole/go-ole v1.2.6
go: downloading github.com/nyaosorg/go-windows-commandline v0.0.0-20210914103131-4bd0300aa022
go: downloading github.com/nyaosorg/go-readline-ny v0.8.1-0.20220429031920-dc04569d86c9
go: downloading github.com/nyaosorg/go-windows-consoleicon v0.0.0-20220221183117-826f40ae390b
go: downloading github.com/nyaosorg/glua-ole v0.0.0-20210914102918-563689ba7584
go: downloading github.com/nyaosorg/go-box/v2 v2.1.3
go: downloading github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64
go: downloading github.com/mitchellh/go-ps v1.0.0
go: downloading github.com/nyaosorg/go-windows-findfile v0.0.0-20210914121648-32cd570b169f
go: downloading golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a
go: downloading github.com/atotto/clipboard v0.1.4
go: downloading github.com/dustin/go-humanize v1.0.0
go: downloading github.com/mattn/go-runewidth v0.0.13
go: downloading github.com/nyaosorg/go-windows-junction v0.1.0
go: downloading github.com/nyaosorg/go-windows-mbcs v0.0.0-20210914102041-eb1f2d0081b2
go: downloading github.com/nyaosorg/go-windows-shortcut v0.0.0-20220529122037-8b0c89bca4c4
go: downloading github.com/nyaosorg/go-windows-su v0.2.1
go: downloading github.com/rivo/uniseg v0.2.0
go: downloading github.com/mattn/go-tty v0.0.4
# github.com/nyaosorg/go-windows-findfile
../../../../go/pkg/mod/github.com/nyaosorg/go-windows-findfile@v0.0.0-20210914121648-32cd570b169f/walk.go:3:17: undefined: _FileInfo
../../../../go/pkg/mod/github.com/nyaosorg/go-windows-findfile@v0.0.0-20210914121648-32cd570b169f/walk.go:5:42: undefined: _FileInfo
../../../../go/pkg/mod/github.com/nyaosorg/go-windows-findfile@v0.0.0-20210914121648-32cd570b169f/walk.go:6:9: undefined: walk
../../../../go/pkg/mod/github.com/nyaosorg/go-windows-findfile@v0.0.0-20210914121648-32cd570b169f/fileattr.go:8:9: undefined: getFileAttributes
全然よくわからんのであとで色々調べる。かなり大変になるかもしれないというか動かせるのか?ググってみる
原因わかりました。
ほとんどのパッケージだと、ソースは「Windows」か「not Windows」で分けていたのですが、go-windows-filefile というサブパッケージに限っては、なぜか「Windows」か「Linux」でやってました。Linux 扱いのところを not Windows 扱いに修正しますね。
なお、Makefile でビルドすると、Windows の実行ファイルにアイコンやらバージョンナンバーを埋め込みできるというメリットがあるだけで、他の OS の場合は CGO_ENABLED=0 go build
で十分だと思います。
go-windows-filefile については修正したので、go get -u で go.mod/go.sum をアップデートしていただければよいかと存じます
こちらで GOOS=darwin go build してみると、UNIX系ではみな同じかと思われていたところでエラーになるようです。が、こちらでいちいち直していると、たぶん楽しみを奪ってしまいそうなので、このあたりにしておきたいと思います(もし、MacOS で動くようになりましたら、ぜひプルリクを…)
ご対応ありがとうございます!
自分でコツコツ直してみてPR送れるとこまでできたら最高だなと思っていたのでご配慮感謝です!
ちょっとずつ試してみます!
Error
❯ CGO_ENABLED=0 go build
# github.com/nyaosorg/nyagos/nodos
nodos/fileattr_unix.go:18:9: cannot use stat.Mode (variable of type uint16) as type uint32 in return statement
ソースコード追った結果
unix.Stat_t.Mode
の基本的な定義はこれ -> pkg.go.dev
上記の定義上は unix.Stat_t.Mode は uint32
だが、このパッケージはOSやアーキテクチャによって細かくファイルが分けられており、M1 Mac 向けでは uint16
として定義されている(amd64の場合もuint16だった)
解決策
対策案
- darwin 向けのファイルを作ってビルドオプションで分ける
- その場合、getFileAttributes を使っている箇所全ての darwin 向け作った方が良い・・・?
- uint16 を uint32 に型キャストする
- 大丈夫かな??
実験
試しに、uint16 を uint32 に型キャストするようにしてみたらビルドに成功し、実行もできた。以下はそのときのコンソールのスクショ
参考
現時点でビルドはできているので一旦PRを作成した
Starshipのプロンプトを使おうと思って、Windowsではうまく動いていた設定を記述して NYAGOS を起動してみたら以下のようなエラーを吐いた
~ on ☁️ (ap-northeast-1) took 8s
❯ cat .nyagos
-- prompt
nyagos.prompt = function(this)
-- path,title,prompt
local prompt = ''
if nyagos.which("starship") then
prompt = prompt .. nyagos.eval('starship prompt 2> nul') .. '$e[37;1m' .. ' '
return nyagos.default_prompt(prompt,"")
end
end
-- vim:set ft=lua: --
~ on ☁️ (ap-northeast-1)
❯ nyagos
Nihongo Yet Another GOing Shell 4.4.12_0-darwin-arm64 by go1.18.3
(c) 2014-2022 NYAOS.ORG <https://github.com/nyaosorg/nyagos>
nyagos.prompt: return-value(length) is not a number
$
現在原因調査を進めているが基本的によくわかっていないので時間かかりそう
Starship を prompt に設定できていない原因調査
デバッグプリントのために以下のように print 文を書いて NYAGOS を起動してみた
nyagos.prompt = function(this)
local prompt = ''
print("hello nyagos.prompt")
if nyagos.which("starship") then
prompt = prompt .. nyagos.eval('starship prompt 2> nul') .. '$e[37;1m' .. ' '
print("starship atta")
return nyagos.default_prompt(prompt,"")
end
print("starship nakatta")
end
すると以下のような実行結果に
❯ ./nyagos
Nihongo Yet Another GOing Shell 4.4.12_0-darwin-arm64 by go1.18.3
(c) 2014-2022 NYAOS.ORG <https://github.com/nyaosorg/nyagos>
hello nyagos.prompt
starship nakatta
nyagos.prompt: return-value(length) is not a number
$
starship がない場合の return を書いてなかったので、そのせいで nyagos.prompt: return-value(length) is not a number
が吐かれている。なので以下のようにすればエラー自体はない
nyagos.prompt = function(this)
local prompt = ''
if nyagos.which("starship") then
prompt = prompt .. nyagos.eval('starship prompt 2> nul') .. '$e[37;1m' .. ' '
return nyagos.default_prompt(prompt,"")
end
return nyagos.default_prompt('$e[40;36;1m'..this..'$e[37;1m',"")
end
nyagos.which("starship")
で starship のPathが確認できないのか
なぜ .nyagos に適当な print 文を仕込んで試してみた
print(nyagos.which("starship"))
print(nyagos.which("git"))
結果
nil starship: Path not found
nil git: Path not found
あ、Windowsだとユーザーの環境変数に追加されていたけど、Macとかだとだいたい .zshrc
とかに書いてるから???
多分だけど nyagos.env.path にないからかなーーと思って確認してみる
print(nyagos.env.path)
nyagos.env.path = nyagos.env.path .. ":/opt/homebrew/bin"
print(nyagos.env.path)
結果:
❯ ./nyagos
Nihongo Yet Another GOing Shell 4.4.12_0-darwin-arm64 by go1.18.3
(c) 2014-2022 NYAOS.ORG <https://github.com/nyaosorg/nyagos>
nil
/Users/ttsuruta/dev/github.com/zztkm/nyagos/.nyagos:12: cannot perform concat operation between nil and string
stack traceback:
/Users/ttsuruta/dev/github.com/zztkm/nyagos/.nyagos:12: in main chunk
[G]: ?
<%NAME%:~/dev/github.com/zztkm/nyagos>
$
またわからなくなった、、
PATH が通っていないことの調査
NYAGOS組み込みコマンドの which
をデバッグしながらパスについて調べる
ソース: https://github.com/nyaosorg/nyagos/blob/master/commands/which.go
<%NAME%:~/dev/github.com/zztkm/nyagos>
$ which -a starship
/opt/homebrew/bin/starship
/opt/homebrew/bin/starship
<%NAME%:~/dev/github.com/zztkm/nyagos>
$ which starship
which starship: not found
exit status 1
<%NAME%:~/dev/github.com/zztkm/nyagos>
$
上記結果からわかること
-
-a
オプションがつくときだけPATH
環境変数を見る - オプションなしの場合は
NYAGOSPATH
のみを見る - PATH には starship (/opt/homebrew/bin) が登録されているが、NYAGOSPATH にはない
次に調べること
NYAGOSPATH に starship が存在しないことが問題なので、NYAGOSPATH の初期設定(NYAGOS起動時)の挙動を調べる。(追加で調べたところ、NYAGOSPATHの値はNoneだった)