見出し画像

TWSNMP FC:Windows版のパケージ化をDocker+Wineでやろうとして泥沼にはまる

今朝も5時に起きました。今週は配布用パッケージの作成方法を改善しています。Mac OS版は開発している環境と同じなのであまり苦労せずにできました。Makefileを作ってコマンド一発でパッケージ化できるようになりました。ここまでは快調です。
Linux版はDockerを使ってDebianのパッケージを作ればよいはずなので何とかできそうだと思っています。後回しです。
問題なのはWindows版です。プログラムへの署名やインストーラーを作るプログラムはWindowsでしか使えないのでMac OS上で作った実行ファイルをWindows上で署名してからパッケージ化する必要があります。
何とかMac OSの開発環境だけでできないか悩んでいました。昨日、ふと良いアイデアが浮かびました。
Macで動作するDocker上のLinuxの中でWine

を起動して、その中で署名やインストラーを作るプログラムを動作させる。
これは、非常に面白いと思って昨日の夜試してみました。DebianのパッケージにWineがあったのでインストールは簡単にできて、
GO言語で作ったWindowsのHello Worldプログラムも動作しました。
これは快調と思いましたが、ここから泥沼の始まりです。
署名するプログラム(signtool.exe)やインストラーを作るプログラム(Wix Tools)

を実行して見るとDLLやライブラリが足りないというエラーが沢山でて動きません。それに画面を表示できないというエラーもでています。
今朝は5時に起きたのにWineについていろいろ調べているうちに時間切れです。

のサイトなどを参考にして無理やり動作させたら、

 # xvfb-run wine /tmp/signtool.exe
00fc:fixme:heap:RtlSetHeapInformation 0000000000000000 1 0000000000000000 0 stub
SignTool Error: A required parameter is missing.
Usage: signtool <command> [options]

 Valid commands:
   sign       --  Sign files using an embedded signature.
   timestamp  --  Timestamp previously-signed files.
   verify     --  Verify embedded or catalog signatures.
   catdb      --  Modify a catalog database.
   remove     --  Remove embedded signature(s) or reduce the size of an
                  embedded signed file.

For help on a specific command, enter "signtool <command> /?"

とか

# xvfb-run wine wix/candle.exe
0024:fixme:ntdll:NtQuerySystemInformation info_class SYSTEM_PERFORMANCE_INFORMATION
0024:fixme:heap:GetNumaHighestNodeNumber semi-stub: 0031FC58
0024:fixme:path:parse_url failed to parse L"wix"
0024:fixme:thread:QueryThreadCycleTime (FFFFFFFE,038A2560): stub!
0024:fixme:nls:get_dummy_preferred_ui_language (0x8 0031EC3C 00000000 0031EC38) returning a dummy value (current locale)
0024:fixme:nls:get_dummy_preferred_ui_language (0x8 0031EC3C 0013F158 0031EC38) returning a dummy value (current locale)
0024:fixme:path:parse_url failed to parse L"System"
0024:fixme:path:parse_url failed to parse L"System.Configuration"
0024:fixme:path:parse_url failed to parse L"System.Xml"
0024:fixme:path:parse_url failed to parse L"System.Xml"
0024:fixme:path:parse_url failed to parse L"System.Data.SqlXml"
0024:fixme:path:parse_url failed to parse L"wconsole"
0024:fixme:ntdll:EtwEventRegister ({8e9f5090-2d75-4d03-8a81-e5afbf85daf1}, 00A80412, 00000000, 0168B634) stub.
0024:fixme:nls:LCMapStringEx unsupported lparam 1494f8
Windows Installer XML Toolset Compiler version 3.11.2.4516
Copyright (c) .NET Foundation and contributors. All rights reserved.

usage:  candle.exe [-?] [-nologo] [-out outputFile] sourceFile [sourceFile ...] [@responseFile]

  -arch      set architecture defaults for package, components, etc.
             values: x86, x64, or ia64 (default: x86)
  -d<name>[=<value>]  define a parameter for the preprocessor
  -ext <extension>  extension assembly or "class, assembly"
  -fips      enables FIPS compliant algorithms
  -I<dir>    add to include search path
  -nologo    skip printing candle logo information
  -o[ut]     specify output file (default: write to current directory)
  -p<file>   preprocess to a file (or stdout if no file supplied)
  -pedantic  show pedantic messages
  -platform  (deprecated alias for -arch)
  -sfdvital  suppress marking files as Vital by default (deprecated)
  -ss        suppress schema validation of documents (performance boost) (deprecated)
  -sw[N]     suppress all warnings or a specific message ID
             (example: -sw1009 -sw1103)
  -swall     suppress all warnings (deprecated)
  -trace     show source trace for errors, warnings, and verbose messages (deprecated)
  -v         verbose output
  -wx[N]     treat all warnings or a specific message ID as an error
             (example: -wx1009 -wx1103)
  -wxall     treat all warnings as errors (deprecated)
  -? | -help this help information

For more information see: http://wixtoolset.org/
0024:fixme:virtual:NtFlushProcessWriteBuffers stub
0100:fixme:ntdll:EtwEventUnregister (deadbeef) stub.
X connection to :99 broken (explicit kill or server shutdown).
​

起動はできました。でも、fixmeという警告?が沢山でているので、あまり気持ちよくはありません。
なので、Windowsのパッケージ作成はWindowsで作るかもしれません。(この方法は諦めムードです。)
このWineと悪戦苦闘したことでWindowsのプログラムを動かすために必要なライブラリ(DLL)がものすごく沢山あるのを実感しました。
GO言語で作ったプログラムは依存するDLLがないのが利点ということも実感できました。この教訓のための3時間だったと思います。

明日に続く



開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。