フリーソフト

« 4. Scripting Reference - NSIS Users Manual | トップページ | A. Modern User Interface - NSIS Users Manual »

5. Compile Time Command - NSIS Users Manual

これはNSIS Users Manualの非公式な日本語ドキュメントです。本コンテンツの利用によって生じたいかなる損害も、著者は一切の責任をとることができませんので、自己責任での利用をお願いします。読みやすさを重視するため必ずしも原文に忠実でない部分があります。また、誤りが含まれている可能性もあります。必ず原文をご確認ください。 訳者:Kawai

前へ | 目次 | 次へ

第5章: コンパイル時のコマンド

5.1 Compiler Utility Commands

[原文]

これらのコマンドは、目的と機能の面において、C 言語におけるプリプロセッサに類似しています。これらのコマンドによって、ファイルのインクルードや、条件付きコンパイル、ヘッダパッキングの実行、ビルド中の処理の実行が可能となります。これらすべてのコマンドでは、変数の使用ができないという点に注意してください。

5.1.1 !include

[/NONFATAL] file

このコマンドは、スクリプトにファイル file をインクルードします。インクルードされたコードは、元のスクリプトの一部であったかのように扱われます。ここで、他のディレクトリからファイルがインクルードされた場合でも、カレントディレクトリはスクリプトがコンパイルされた位置のままという点に注意してください。インクルードファイルがあるディレクトリに移動しません。ファイルが見つからない場合は、すべてのインクルードディレクトリから探索されます。詳細については、 !addincludedir を参照してください。/nonfatal スイッチが使用されていると、ファイルが見つからない場合は、エラーの代わりに警告が発生します。

!include WinMessages.nsh
!include Library.nsh
!include C:\MyConfig.nsi
!include ..\MyConfig.nsh
!include /NONFATAL file_that_may_exist_or_not.nsh

5.1.2 !addincludedir

directory

インクルードディレクトリのリストに、他のディレクトリ directory を追加します。!include が使用されると、このリストに含まれているディレクトリが探索されます。このリストの初期値は、 ${NSISDIR}\Include だけです。

!addincludedir ..\include
!include something.nsh

5.1.3 !addplugindir

directory

指定したディレクトリ directory からプラグイン DLL を探索するよう NSIS コンパイラに指示します。

!addplugindir myplugin
MyPlugin::SomeFunction

5.1.4 !appendfile

file text

ファイル file にテキスト text を追加します。

!tempfile FILE
!appendfile "${FILE}" "XPStyle on$\n"
!appendfile "${FILE}" "Name 'test'$\n"
!include "${FILE}"
!delfile "${FILE}"
!undef FILE

5.1.5 !cd

new_path

このコマンドは、コンパイラを新しいディレクトリ new_path に移動します。new_path は相対パスでも絶対パスでも指定できます。

!cd ..\more-scripts\new

5.1.6 !delfile

file

このコマンドは、ファイル file を削除します。

!tempfile FILE
!delfile "${FILE}"
!undef FILE

5.1.7 !echo

message

このコマンドは、スクリプトのコンパイル中にメッセージ message を出力します。

!echo "hello world"

5.1.8 !error

[message]

このコマンドは、スクリプトコンパイラにエラーを発生させ、スクリプトの実行を中断させます。このエラーに、メッセージ message を追加することも可能です。

!ifdef VERSION & NOVERSION
  !error "both VERSION and NOVERSION are defined"
!endif

5.1.9 !execute

command

このコマンドは、CreateProcess() を使って、コマンド command を実行します。!system とは異なり、コマンドラインプロセッサを使用しません。そのため、入力/出力のリダイレクションや、'cd'、'dir'、'type'のようなコマンドは使用することができません。また、!execute は実行コマンドの返り値を無視します。現在のところ、!system に対する !execute の利点は、カレント作業ディレクトリが UNC で指定された場合に、トラブルが発生しないという点だけです。

POSIX プラットホームでは、 !execute は !system と同様の system() が使用されます。

!execute '"%WINDIR%\notepad.exe" "${NSISDIR}\license.txt"'

5.1.10 !packhdr

tempfile command

このオプションは、実行可能ヘッダを圧縮するために、外部の EXE 圧縮コマンド(例えば、PetiteUPX)を利用するようコンパイラに指示します。一時ファイル名 tempfile (例: "temp.dat")と、コマンドライン command (例: "C:\program files\upx\upx -9 temp.dat")を指定してヘッダを圧縮します。

!packhdr "$%TEMP%\exehead.tmp" '"C:\Program Files\UPX\upx.exe" "$%TEMP%\exehead.tmp"'

5.1.11 !system

command [compare comparevalue]

このコマンドは、system() を利用してコマンド command を実行します。返り値は、comparevaluecompare を使用して比較され、比較結果が偽(false)の場合は実行が中断されます。compare には、'<' または '>' または '<>' または '=' が指定できます。

!system '"%WINDIR%\notepad.exe" "${NSISDIR}\license.txt"'
!system 'echo !define something > newinclude.nsh'
!include newinclude.nsh
!ifdef something
  !echo "something is defined"
!endif

5.1.12 !tempfile

symbol

このコマンドは、一時ファイルを作成します。一時ファイルのパスは、名前付きシンボル symbol として定義(define)されます。

!tempfile PACKHDRTEMP
!packhdr "${PACKHDRTEMP}" '"C:\Program Files\UPX\upx.exe" "${PACKHDRTEMP}"'
!tempfile FILE
!define /date DATE "%H:%M:%S %d %b, %Y"
!system 'echo built on ${DATE} > "${FILE}"'
File /oname=build.txt "${FILE}"
!delfile "${FILE}"
!undef FILE
!undef DATE

5.1.13 !warning

[message]

このコマンドは、スクリプトコンパイラに警告を発生させます。この警告に、メッセージ message を追加することも可能です。

!ifdef USE_DANGEROUS_STUFF
  !warning "using dangerous stuff"
!endif

5.1.14 !verbose

level | push | pop

このコマンドは、出力メッセージの量を設定します。4=すべて、3=スクリプトなし、2=情報なし、1=警告なし、0=なし。

push を指定すると、!verbose は現在の出力レベルを特別なスタックにプッシュ(push)します。pop を指定すると、!verbose は現在の出力レベルを同じスタックからポップ(pop)して、それを利用します。

!verbose push
!verbose 1
!include WinMessages.nsh
!verbose pop

5.2 定義済み変数

[原文]

これらの標準的な定義済み変数を利用することが可能です。これにより、自動でビルド時刻を開発バージョンのタイトルに追加したり、日付をバージョンに追加したりすることができます。

5.2.1 ${__FILE__}

現在のスクリプト名。

5.2.2 ${__LINE__}

現在の行番号。

5.2.3 ${__DATE__}

現在のロケールに従ってスクリプトのコンパイルを開始した日付。

5.2.4 ${__TIME__}

現在のロケールに従ってスクリプトのコンパイルを開始した時刻。

5.2.5 ${__TIMESTAMP__}

現在のロケールに従ったスクリプトファイルの最終更新日時。

5.2.6 ${NSIS_VERSION}

スクリプトのビルドに使用された NSIS のバージョン。

5.2.7 スコープに関する定義済み変数

現在のコードのスコープに関する情報を保持する標準的な定義済み変数。

5.2.7.1 ${__GLOBAL__}

グローバルスコープで定義されている。

Section test

  !ifdef ${__GLOBAL__}
    !error "this shouldn't be here!"
  !endif

SectionEnd

Function test

  !ifdef ${__GLOBAL__}
    !error "this shouldn't be here!"
  !endif

FunctionEnd

PageEx instfiles

  !ifdef ${__GLOBAL__}
    !error "this shouldn't be here!"
  !endif

PageExEnd

5.2.7.2 ${__SECTION__}

セクション スコープで、セクション名(プレフィックスなし)として定義されている。

!ifdef __SECTION__
  !error "this shouldn't be here!"
!endif

Section test

  !ifndef __SECTION__
    !error "missing predefine!"
  !endif

  !if ${__SECTION__} != test
    !error "wrong predefine value!"
  !endif

SectionEnd

Section !test

  !if ${__SECTION__} != test
    !error "wrong predefine value!"
  !endif

SectionEnd

Section un.test

  !if ${__SECTION__} != test
    !error "wrong predefine value!"
  !endif

SectionEnd

5.2.7.3 ${__FUNCTION__}

関数 スコープで、関数名(プレフィックスなし)として定義されている。

!ifdef __FUNCTION__
  !error "this shouldn't be here!"
!endif

Function test

  !ifndef __FUNCTION__
    !error "missing predefine!"
  !endif

  !if ${__FUNCTION__} != test
    !error "wrong predefine value!"
  !endif

FunctionEnd

Function un.test

  !if ${__FUNCTION__} != test
    !error "wrong predefine value!"
  !endif

FunctionEnd

5.2.7.4 ${__PAGEEX__}

PageEx スコープで、ページのタイプとして定義されている。

!ifdef __PAGEEX__
  !error "this shouldn't be here!"
!endif

PageEx instfiles

  !ifndef __PAGEEX__
    !error "missing predefine!"
  !endif

  !if ${__PAGEEX__} != instfiles
    !error "wrong page type"
  !endif

PageExEnd

5.2.7.5 ${__UNINSTALL__}

アンインストーラの セクション、または 関数PageEx スコープで定義されている。

!ifdef __UNINSTALL__
  !error "this shouldn't be here!"
!endif

Function test

  !ifdef __UNINSTALL__
    !error "this shouldn't be here!"
  !endif

FunctionEnd

Function un.test

  !ifndef __UNINSTALL__
    !error "missing predefine!"
  !endif

FunctionEnd

5.3 環境変数の読み込み

[原文]

5.3.1 $%envVarName%

$%envVarName% はコンパイル時に、環境変数 envVarName に置き換えられます。

5.4 条件付きコンパイル

[原文]

コンパイラは、!define や コマンドラインの /D スイッチを利用して定義された定義済みシンボルのリストを保持しています。これらの定義済みシンボルは、!ifdef による条件付きコンパイルや、シンボルの置換(マクロの簡単な形式)に利用することができます。シンボルをその値に置き換えるためには、${SYMBOL} を使用します。SYMBOL が定義されていない場合は、置き換えは発生しません。置き換えは、first-come-first-served です。つまり、以下のようにした場合、

!define symbol_one ${symbol_two}

この行までに、symbol_two が定義されていれば、置換されます。未定義であれば、${symbol_one} が参照されても、置き換えは発生しません。

define および条件付きコンパイルに関連したコマンドを示します。

5.4.1 !define

([/date|/utcdate] gflag [value]) | (/math gflag val1 OP val2) | (/file gflag filename.txt)

このコマンドは、gflag をグローバルな定義リストに追加します。コマンドラインで /D スイッチを利用するのと同じ効果が得られます(!define コマンドより以降でのみ定義は有効となります)。

/date/utcdate が利用された場合は、value は strftime に渡され、その結果が gflag の値として利用されます。strftime は、特定の記号を、現在の時刻や日付の一部に置換します。例えば、%H は現在の時(24時間形式)に変換されます。利用可能な記号の一覧については、MSDN の strftime を検索してください。POSIX においては、man strftime を利用して一覧を得ることができます。

/math が利用された場合は、val1 OP val2 の結果が gflag の値として使用されます。OP は、+、-、*、&、|、^、/、% のいずれかです。val1 および val2 は整数値でなければならないという点に注意してください。

/file が利用された場合は、指定されたテキストファイルの全体(空白や改行も含む)が読み込まれ、gflag に格納されます。

!define USE_SOMETHING
!define VERSION 1.2
!define /date NOW "%H:%M:%S %d %b, %Y"
!define /math RESULT 3 + 10
!define /math REST 15 % ${RESULT}
!define /file BUNCHASTUFF somesourcefile.cpp

5.4.2 !undef

gflag

グローバルな定義リストから項目を取り除きます。SYMBOL が未定義となった ${SYMBOL} は "${SYMBOL}" に置換されるという点に注意してください。

!define SOMETHING
!undef SOMETHING

5.4.3 !ifdef

gflag [bcheck gflag [...]]]

このコマンドと !endif コマンドの間に含まれる行をコンパイルするかどうかを、コンパイラに通知します。gflag がグローバルに定義済みであれば(!define もしくは /D スイッチを利用)、コンパイルされます。定義済みでなければ、それらの行はスキップされます。bcheck には、& (論理積)あるいは | (論理和)が利用でき、その他の gflag とともに指定することができます。これらは、単純に左から右へ処理されます。

!define SOMETHING
!ifdef SOMETHING
  !echo "SOMETHING is defined"
!endif
!undef SOMETHING
!ifdef SOMETHING
  !echo "SOMETHING is defined" # will never be printed
!endif

5.4.4 !ifndef

gflag [bcheck gflag [...]]]

!ifdef の反対です。gflag が定義されていない場合、行がコンパイルされます。

5.4.5 !if

[!] value [op value2]

このコマンドと !endif コマンドの間に含まれる行をコンパイルするかどうかを、コンパイラに通知します。valueが0でない場合、あるいは valuevalue2 の比較結果が真(true)である場合は、コンパイルされます。そうでない場合は、それらの行はスキップされます。op には、== または != (文字列の比較)、<=、<、>、>= (実数の比較)、&& または || (論理値の比較)のいずれかを指定することが可能です。[!] が設定された場合は、返り値の真が偽に、偽が真に入れ替わります。

!if 1 < 2
  !echo "1 is smaller than 2!!"
!else if ! 3.1 > 1.99
  !error "this line should never appear"
!else
  !error "neither should this"
!endif

5.4.6 !ifmacrodef

gflag [bcheck gflag [...]]]

このコマンドと !endif コマンドの間に含まれる行をコンパイルするかどうかを、コンパイラに通知します。マクロ gflag が存在する場合は、コンパイルされます。そうでない場合は、それらの行はスキップされます。op には、& (論理積)あるいは | (論理和)が利用でき、その他の gflag とともに指定することができます。これらは、単純に左から右へ処理されます。

!macro SomeMacro
!macroend
!ifmacrodef SomeMacro
  !echo "SomeMacro is defined"
!endif

5.4.7 !ifmacrondef

gflag [bcheck gflag [...]]]

!ifmacrodef の反対です。マクロ gflag が存在しない場合、行がコンパイルされます。

5.4.8 !else

[if|ifdef|ifndef|ifmacrodef|ifmacrondef [...]]

このコマンドは、別の定義やマクロが設定された場合に、別のコードを簡単に挿入することを可能とします。!ifdef/!else/!endif や !ifdef/!else ifdef/!else/!endif のようなブロックを作成することができます。

!ifdef VERSION
OutFile installer-${VERSION}.exe
!else
OutFile installer.exe
!endif

5.4.9 !endif

このコマンドは、!if や !ifdef、!ifndef、!ifmacrodef、!ifmacrondef によって開始されたブロックを閉じます。

5.4.10 !insertmacro

macro_name [parameter] [...]

!macro によって作成されたマクロの内容を挿入します。引数付きで作成されたマクロについては、必要な数の引数を指定する必要があります。

!macro Print text
  DetailPrint "${text}"
!macroend
!insertmacro Print "some text"
!insertmacro Print "some more text"

5.4.11 !macro

macro_name [parameter][...]

macro_name という名前のマクロを作成します。!macro!macroend の間のすべての行が保存されます。あとでマクロを挿入するには、!insertmacro を使用します。!macro 定義は、定義された1つ以上の引数 parameter を持つことができます。!define と同様にして、マクロ内から引数にアクセスすることができます(例: ${PARMNAME})。

!macro SomeMacro parm1 parm2 parm3
  DetailPrint "${parm1}"
  MessageBox MB_OK "${parm2}"
  File "${parm3}"
!macroend

5.4.12 !macroend

!macro によって開始されたマクロの終了。

5.4.13 !searchparse

[/ignorecase] [/noerrors] [/file] source_string_or_file substring_start OUTPUTSYMBOL1 [substring [OUTPUTSYMBOL2 [substring ...]]]

source_string_or_file を解析し(文字列として、あるいは /file が設定されている場合はファイル名として)、substring_start を探索します。substring_start が見つかった場合は、OUTPUTSYMBOL1 は残りの文字列(すべての substring を除去した文字列)として定義されます。いくつかの OUTPUTSYMBOLx が指定された場合は、最後の substring はオプションです。

/noerrors が指定された場合は、マッチする箇所が、引数で指定された文字列よりも少ない場合も許されます。この場合、substring が見つからないと、後ろの OUTPUTSYMBOLx はすべて無視されます。

/file が指定された場合は、ファイルは行の連続として扱われます。ファイルは、すべての substring がマッチする行が見つかるまで探索されます。/noerrors が指定された場合は、すべての文字列がマッチしない場合でも、最も多くのシンボルがマッチした最初の行が利用されます。

# filename.cpp から '#define APP_VERSION "2.5"' という行を探索し、${VER_MAJOR} に 2 を、${VER_MINOR} に 5 を設定
!searchparse /file filename.cpp `#define APP_VERSION "` VER_MAJOR `.` VER_MINOR `"`

5.4.14 !searchreplace

[/ignorecase] symbol_out source_string searchfor replacewith

source_string から searchfor を探索して、すべてを replacewith に置換します。!define とは異なり、!searchreplace は、エラーや警告なしで symbol_out を再定義することができます。

# ${blah} を "i like ponies" と定義
!searchreplace blah "i love ponies" "love" "like"

前へ | 目次 | 次へ


 
SourceForge Logo

« 4. Scripting Reference - NSIS Users Manual | トップページ | A. Modern User Interface - NSIS Users Manual »

技術文書」カテゴリの記事