📑

arch|linuxのnimからwindows版をクロスコンパイル(環境を構築)

2021/09/04に公開

archなのでyay

windows版バイナリの作成には、mingw-w64ツールチェインが必要だが、これらはAURからインストールしなければならない。
どの道、手操作が必要なので、コマンドラインに複数並べるメリットはあまりない。
sudo がタイムアウトすることを考えれば、1つづつ入れるのがお勧めである。
下記のコマンドラインを使えば手間は最小限になる。

yay --answerdiff none --answerclean none --answeredit none mingw-w64-binutils-bin
yay --answerdiff none --answerclean none --answeredit none mingw-w64-crt-bin
yay --answerdiff none --answerclean none --answeredit none mingw-w64-gcc-bin
yay --answerdiff none --answerclean none --answeredit none mingw-w64-headers-bin
yay --answerdiff none --answerclean none --answeredit none mingw-w64-winpthreads-bin

*.nim.cfg

nimでのクロスコンパイル自体は n番煎じなので、概ねそのとおりに書けばよい。

https://qiita.com/hatchet/items/24569bb852fef41b8a62

https://qiita.com/6in/items/c72d73d063146e6272fa

archlinuxでは/etc/nim.cfgに十分な記述があるので、差分だけ書けば良い。

GNU-linkerのオプションが、一部 mingw-linkerでは通らないので、本家オプションの中身を空欄で上書きして潰す必要がある。

amd64.windows.gcc.path = "/usr/bin/"
amd64.windows.gcc.exe = "x86_64-w64-mingw32-gcc"
amd64.windows.gcc.linkerexe = "x86_64-w64-mingw32-gcc"
#amd64.windows.gcc.options.linker = ""
gcc.options.linker = ""

nim c --os:windows *.nim

あとは --os:windows を入れれば、出力ファイル名も *.exe にしてくれる。
windowsでの動作は試してないが :P wineで動いたので多分問題ないだろう。

例えば とあるスクリプト をos:windowsビルドするとこうなる

$ nim c --os:windows modini.nim
Hint: used config file '/etc/nim/nim.cfg' [Conf]
Hint: used config file '/etc/nim/config.nims' [Conf]
Hint: used config file '.../modini.nim.cfg' [Conf]
...

Hint:  [Link]
Hint: 42996 LOC; 0.794 sec; 47.617MiB peakmem; Debug build; proj: .../modini.nim; out: .../modini.exe [SuccessX]
$ file modini.exe 
modini.exe: PE32+ executable (console) x86-64, for MS Windows
$ wine ./modini.exe 

Discussion