Open13

M1 Mac で NYAGOS を使ってみる

zztkmzztkm

このスクラップについて

M1 Mac で NYAGOS をビルドして実際に使ってみようと思うのでその記録を残すスクラップです。

https://github.com/zztkm/nyagos

やること

  • NYAGOS をビルドする
  • NYAGOSを実行する
  • NYAGOSを普段使いしてみる
zztkmzztkm

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

全然よくわからんのであとで色々調べる。かなり大変になるかもしれないというか動かせるのか?ググってみる

hymkorhymkor

原因わかりました。

ほとんどのパッケージだと、ソースは「Windows」か「not Windows」で分けていたのですが、go-windows-filefile というサブパッケージに限っては、なぜか「Windows」か「Linux」でやってました。Linux 扱いのところを not Windows 扱いに修正しますね。

なお、Makefile でビルドすると、Windows の実行ファイルにアイコンやらバージョンナンバーを埋め込みできるというメリットがあるだけで、他の OS の場合は CGO_ENABLED=0 go build で十分だと思います。

hymkorhymkor

go-windows-filefile については修正したので、go get -u で go.mod/go.sum をアップデートしていただければよいかと存じます

こちらで GOOS=darwin go build してみると、UNIX系ではみな同じかと思われていたところでエラーになるようです。が、こちらでいちいち直していると、たぶん楽しみを奪ってしまいそうなので、このあたりにしておきたいと思います(もし、MacOS で動くようになりましたら、ぜひプルリクを…)

zztkmzztkm

ご対応ありがとうございます!

自分でコツコツ直してみてPR送れるとこまでできたら最高だなと思っていたのでご配慮感謝です!
ちょっとずつ試してみます!

zztkmzztkm

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だった)

解決策

対策案

  1. darwin 向けのファイルを作ってビルドオプションで分ける
    • その場合、getFileAttributes を使っている箇所全ての darwin 向け作った方が良い・・・?
  2. uint16 を uint32 に型キャストする
    • 大丈夫かな??

実験

試しに、uint16 を uint32 に型キャストするようにしてみたらビルドに成功し、実行もできた。以下はそのときのコンソールのスクショ

参考

zztkmzztkm

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
$

現在原因調査を進めているが基本的によくわかっていないので時間かかりそう

zztkmzztkm

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>
$ 

またわからなくなった、、

hymkorhymkor

Lua の文法上の話になりますが、nyagos.env.path の内容が nil になっていて、.. 演算子で nil と文字列の連結をしようとして、エラーになってしまったようです(同演算子は型にうるさいので)
なぜか環境変数 PATH が未定義状態になっているようですね。
(環境変数名の大文字・小文字でも区別しているのかな…)

zztkmzztkm

なるほど…
逆に結合ではなく適当なパス文字列を代入するだけなら通るって感じですかね🤔

ちょっとpathちゃんと取れてない理由を調べてみます!

zztkmzztkm

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だった)