nptclのブログ

Common Lisp処理系nptの開発メモです。https://github.com/nptcl/npt

npt for Windowsのコンパイル方法

以前の投稿でnpt-windowsのバイナリを配布しました。
nptのWindows版を公開します - nptclのブログ
ウィルスというか、トロイの木馬報告もされました。
npt64.exeのウィルス検出について - nptclのブログ

ここでは手動でnpt-windowsコンパイルする方法について説明します。
作者はVisual Studio 2017を使って確認しています。

まずはソースを用意してください。

https://github.com/nptcl/npt

このリポジトリに、Windows用のソースも含まれています。
場所は下記の通り。

  • npt/develop/windows/.

コンパイルは、下記の値をdefineします。

  • LISP_WINDOWS
  • LISP_TERME
  • LISP_WINMAIN

FreeBSDLinuxコンパイルする場合は、LISP_TERMEがデフォルトで指定されます。
しかしWindowsの場合は、LISP_STDINがデフォルトです。
上記のようにLISP_WINDOWSLISP_TERMEを両方指定することで、 Windowsアプリケーションを作成することができます。

このモードでコンパイルする場合は、Windows用のソースを追加で指定する必要があります。
ソースは下記の場所に存在します。

  • develop\windows
    • windows_*.c
    • windows_*.h

ビルド用のMakefileではincludeパスとソースパスを指定しているため 場所を意識する必要はありませんが、 手動で実行する場合は自分で何とかしなければいけません。
色々と方法はあると思いますが、 nptのソースファイル一式と、上記のWindows用ソースを 一か所にまとめるとコンパイルしやすいかと思います。

Windowsアプリケーションとしてコンパイルする場合は、 コンソール画面を表示しないようにする必要があります。
設定は次の2つにて行います。

  • LISP_WINMAINをdefineする
  • LINK.EXE/SUBSYSTEM:WINDOWSを指定する

コンパイルの例を示します。
まずはCL.EXELINK.EXEを利用できる状態にしてください。
カレントディレクトリに、nptのソースとWindowsのソースが存在しているものとします。

まずはコンパイルを行います。

> CL.EXE /C /DLISP_WINDOWS /DLISP_TERME /DLISP_WINMAIN *.c

コンパイルが成功すると、objファイルが生成されます。
次にリンクを行います。

> LINK.EXE /OUT:npt.exe *.obj Shell32.lib User32.lib Gdi32.lib /SUBSYSTEM:WINDOWS

ライブラリは、次の3ファイルを指定する必要があります。

  • Shell32.lib
  • User32.lib
  • Gdi32.lib

正常に実行された場合は、npt.exeが出力されます。
生成されたnpt.exeは通常のWindowsアプリケーションなので、 実行するとウィンドウが表示されます。

コンパイルのためのスクリプトも用意しています。
buildディレクトリ上をご確認ください。

  • 構築スクリプト
    • windows_terme_debug.bat
    • windows_terme_release.bat
  • Makefile一式
    • Makefile.windows_terme_debug
    • Makefile.windows_terme_release
  • Visual Studio 2017用
    • vs2017_terme_debug64.bat
    • vs2017_terme_release64.bat