Poprzedni | Spis treści | Następny

Rozdział 5: Polecenia przy Kompilacji


5.1 Polecenia Narzędziowe Kompilatora

Polecenia te podobne są do poleceń preprocesora C w funkcjonalności i zasadach działania. Pozwalają one na dołączanie plików, warunkową kompilację, kompresowanie nagłówka pliku wykonywalnego oraz wykonywania procesów podczas budowania instalatora. Uwaga: żadne z tych poleceń nie pozwalają na używanie zmiennych.

5.1.1 !include

[/NONFATAL] plik

Powyższe polecenie dołączy 'plik', tak jakby był on częścią oryginalnego skryptu. Zauważ, że jeśli plik dołączany znajduje się w innym katalogu, bieżący katalog znajduje się wciąż tam gdzie skompilowany został skrypt (a nie tam, gdzie znajduje się dołączany plik). Jeśli kompilator nie może znaleźć pliku, będzie go szukał w każdym katalogu do dołączania plików (include). Więcej informacji znajdziesz tutaj: !addincludedir. Jeśli używany jest przełącznik /nonfatal i nie znaleziono żadnych plików, wygenerowane zostanie ostrzeżenie zamiast błędu.

!include WinMessages.nsh
!include Biblioteka.nsh
!include C:\MojaKonfiguracja.nsi
!include ..\MojaKonfiguracja.nsh
!include /NONFATAL plik_ktory_moze_istniec_albo_nie.nsh

5.1.2 !addincludedir

katalog

Dodaje kolejny katalog typu include do listy katalogów include. Lista ta jest przeszukiwana po użyciu polecenia !include. Początkową wartością jest ${NSISDIR}\Include.

!addincludedir ..\include
!include jakisplik.nsh

5.1.3 !addplugindir

katalog

Nakazuje kompilatorowi NSIS skanowanie podanego katalogu w celu wyszukania wtyczek bibliotek DLL.

!addplugindir MojaWtyczka
MojaWtyczka::JakasFunkcja

5.1.4 !appendfile

plik tekst

Dodaje tekst do plik.

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

5.1.5 !cd

nowa_sciezka

Polecenie to zmieni kompilator na nowy katalog, nowa_sciezka. Nowa_sciezka może być względna lub bezwzględna.

!cd ..\wiecej-skryptow\nowy

5.1.6 !delfile

plik

Polecenie to usuwa plik.

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

5.1.7 !echo

komunikat

Polecenie to wyświetli komunikat użytkownikowi kompilującemu skrypt.

!echo "witaj swiecie"

5.1.8 !error

[komunikat]

Polecenie to spowoduje wyświetlenie błędu przez kompilator i zatrzymanie wykonywania skryptu. Możesz również dodać komunikat do tego błędu.

!ifdef VERSION & NOVERSION
  !error "Zarówno VERSION jak i NOVERSION są już zdefiniowane"
!endif

5.1.9 !execute

polecenie

To polecenie wykona 'polecenie' używając wywołania CreateProcess(). W przeciwieństwie do polecenia !system, nie używa procesora lini poleceń, więc polecenia przeadresowywania input/output oraz polecenia takie jak 'cd', 'dir' oraz 'type' nie mogą być użyte. !execute również ignoruje zwracaną wartość wykonanego polecenia. Obecnie, jedyną znaną przewagą polecenia !execute nad poleceniem !system jest to, że nie powoduje problemów, gdy bieżący katalog roboczy jest określony przy użyciu UNC.

Na platformach POSIX, polecenie !execute wykorzysta system(), jak tutaj: !system.

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

5.1.10 !packhdr

pliktymczasowy polecenie

Opcja ta pozwala kompilatorowi na użycie zewnętrznego kompresora pliku wykonywalnego EXE (takiego jak Petite lub UPX), służących do kompresji wykonywalnego nagłówka. Określ nazwę pliku tymczasowego (na przykład "temp.dat") oraz linię polecenia (na przykład "C:\program files\upx\upx -9 temp.dat") aby skompresować nagłówek.

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

5.1.11 !system

polecenie [porównanie wartoscporównywana]

Polecenie to wykona 'polecenie' używając wywołania funkcji system(), i jeśli zwrócona wartość porównania (używajac 'porównanie') z 'wartoscporównania' jest fałszem, wykonanie zostanie zatrzymane. Parametr 'porównanie' może być '<' lub '>' lub '<>' lub '='.

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

5.1.12 !tempfile

symbol

Polecenie to tworzy plik tymczasowy. Wstawia ścieżkę dostępu do definicji, nazwanej symbol.

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

5.1.13 !warning

[komunikat]

Polecenie to wygeneruje ostrzeżenie dla kompilatora skryptu. Możesz dodać również komunikat do tego ostrzeżenia.

!ifdef USE_DANGEROUS_STUFF
  !warning "Używam niebezpiecznych danych"
!endif

5.1.14 !verbose

poziom | push | pop

Polecenie to ustawia poziom zwracanej wartości. 4=wszystko, 3=bez skryptu, 2=bez info, 1=bez ostrzeżeń, 0=brak.

Polecenie push spowoduje, że polecenie !verbose ustawi poziom zwracanej wartości na specjalny stos. Polecenie pop zaś spowoduje to, że polecenie !verbose użyje bieżącego ustawienia poziomu zwracanej wartości ze stosu i użyje tego ustawienia.

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

5.2 Predefiniowane

Możesz użyć tych standardowych predefinicji, by automatycznie dodać czas zbudowania do nagłówka z tytułem wersji produktu oraz datę do numeru wersji, itp.

5.2.1 ${__FILE__}

Bieżąca nazwa skryptu.

5.2.2 ${__LINE__}

Bieżący numer lini.

5.2.3 ${__DATE__}

Data rozpoczęcia kompilacji skryptu, zgodna z lokalnymi ustawieniami daty.

5.2.4 ${__TIME__}

Czas rozpoczęcia kompilacji skryptu, zgodny z lokalnymi ustawieniami czasu.

5.2.5 ${__TIMESTAMP__}

Data & czas ostatniej modyfikacji pliku skryptu, zgodnie z lokalnymi ustawieniami daty, czasu.

5.2.6 Scope Predefines

Standard predefines that contain information of the current code scope.

5.2.6.1 ${__GLOBAL__}

Defined in the global scope.

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.6.2 ${__SECTION__}

Defined as the section name, without any prefixes, in section scope.

!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.6.3 ${__FUNCTION__}

Defined as the function name, without any prefixes, in function scope.

!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.6.4 ${__PAGEEX__}

Defined in PageEx scope.

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

PageEx instfiles

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

PageExEnd

5.2.6.5 ${__UNINSTALL__}

Defined in section, function or PageEx scopes of the uninstaller.

!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 Odczyt zmiennych środowiskowych

5.3.1 $%envVarName%

$%envVarName% zostanie zastąpiona podczas kompilacji przez zmienną środowiskową envVarName.


5.4 Kompilacja Warunkowa

Kompilator posiada wbudowaną listę zdefiniowanych symboli, które mogą być definiowane przy użyciu polecenia !define lub przełącznika w lini poleceń /D . Te zdefiniowane symbole mogą być używane w kompilacji warynkowej (dzięki użyciu !ifdef) lub w celu zastępowania symboli (prosta forma makr). Aby zastąpić symbol daną wartością, użyj ${SYMBOL} (jeśli SYMBOL jest niezdefiniowany, nie będzie translacji). Translacja taka jest typu first-come-first-served:

!define symbol_pierwszy ${symbol_drugi}

Jeśli symbol_drugi jest zdefiniowany w tej lini, zostanie on zastąpiony. W przeciwnym razie zostaną zastąpione wszystkie wystąpienia ${symbol_pierwszy}.

Powiązane zdefiniowane/warunkowe polecenia kompilacji:

5.4.1 !define

([/date|/utcdate] gflag [value]) | (/math gflag val1 OP val2)

Polecenie to doda gflag do globalnej listy definicji. Odniesie to podobny efekt jak użycie przełącznika /D w lini poleceń (tylko po poleceniu !define).

Jeśli /date lub /utcdate są użyte, value zostanie przekazana do strftime, a rezultat zostanie użyty jako wartość gflag. Polecenie strftime przekształca specjalne symbole w pewne części bieżącego czasu lub daty. Na przykład, %H zostanie przekształcony w bieżącą wartość godziny w formacie 24-godzinnym. kompletna lista dostępnych symboli strftime dostępna jest na MSDN. Na platformach POSIX, możesz pobrać tę listę używając polecenia man strftime.

Jeśli użyty jest /math, wynik 'val1 OP val2', gdzie OP może być +,-,*,/ lub % , będzie użyty jako wartość gflag. Zauważ, że val1 AND val2 MUSZĄ być wartościami typu całkowitego!

!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}

5.4.2 !undef

gflag

Usuwanie wpisu z globalnej listy definicji. Zauważ że, ${SYMBOL}, który nie jest zdefiniowany, zostanie przekształcony na "${SYMBOL}".

!define SOMETHING
!undef SOMETHING

5.4.3 !ifdef

gflag [bcheck gflag [...]]]

To polecenie, w połączeniu z poleceniem !endif, instruuje kompilator czy kompilować czy też nie linie pomiędzy dwoma określonymi liniami. Jeśli gflag jest zdefiniowana globalnie (poprzez polecenie !define lub przełącznik /D), to linie z tego określonego zakresu zostaną zdefiniowane. W przeciwnym razie, zostaną one pominięte. 'bcheck' może być określone jako & (logiczne and) lub | (logiczne or) z więcej niż jednym gflags -- w kolejności, z lewej do prawej.

!define SOMETHING
!ifdef SOMETHING
  !echo "SOMETHING jest zdefiniowane"
!endif
!undef SOMETHING
!ifdef SOMETHING
  !echo "SOMETHING jest zdefiniowane" # nie zostanie wypisane
!endif

5.4.4 !ifndef

gflag [bcheck gflag [...]]]

Polecenie przeciwne do !ifdef. Linie zostaną skompilowane, wtedy gdy gflag nie została zdefiniowana.

5.4.5 !if

[!] value [op value2]

Polecenie to, w połączeniu z poleceniem !endif, instruuje kompilator czy kompilować czy też nie linie pomiędzy dwoma określonymi liniami. Jeśli value jest niezerowa, lub porównanie value oraz value2 będzie prawdziwe, to linie z tego określonego zakresu zostaną skompilowane. W przeciwnym razie, zostaną one pominięte. op może być zarówno == lub != (porównywanie łańcuchów znaków), <=, < > lub >= (porównywanie liczb zmiennoprzecinkowych), && lub || (porównywanie logiczne). jeśli [!] jest ustawiony, zwracana wartość będzie przełączona z prawdy na fałsz i na odwrót.

!if 1 < 2
  !echo "1 jest mniejsze od 2!!"
!else if ! 3.1 > 1.99
  !error "ta linia nie powinna się pojawić"
!else
  !error "jak i ta"
!endif

5.4.6 !ifmacrodef

gflag [bcheck gflag [...]]]

Polecenie to, w połączeniu z poleceniem !endif, instruuje kompilator czy kompilować czy też nie linie pomiędzy dwoma określonymi liniami. Jeśli makro gflag istnieje, to linie z tego określonego zakresu zostaną skompilowane. W przeciwnym razie, zostaną one pominięte 'bcheck' może być określony jako & (logiczne and) lub | (logiczne or) z więcej niż jednym gflags -- w kolejności, z lewa do prawej.

!macro JakiesMakro
!macroend
!ifmacrodef JakiesMakro
  !echo "JakiesMakro jest zdefiniowane"
!endif

5.4.7 !ifmacrondef

gflag [bcheck gflag [...]]]

Polecenie przeciwne do polecenia !ifmacrodef. Linie zostaną skompilowane, wtedy gdy makro gflag nie istnieje.

5.4.8 !else

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

Polecenie to pozwala na łatwe wstawianie innego kodu, gdy ustawione są inne definicje lub makra. Możesz tworzyć bloki takie jak !ifdef/!else/!endif, !ifdef/!else ifdef/!else/!endif itp.

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

5.4.9 !endif

Polecenie zamyka blok rozpoczęty poleceniami !if, !ifdef, !ifndef, !ifmacrodef lub !ifmacrondef.

5.4.10 !insertmacro

nazwa_makra [parametr] [...]

Wstawia zawartość makra, które zostało utworzone polecenim !macro. Jeśli makro zostało utworzone z parametrami, musisz wypisać tyle parametrów makra ile jest wymagane.

!macro WydrukujTekst
  DetailPrint "${text}"
!macroend
!insertmacro Print "jakiś tekst"
!insertmacro Print "więcej tekstu"

5.4.11 !macro

nazwa_makra [parametr][...]

Tworzy makro o nazwie 'nazwa_makra'. Wszystkie linie pomiędzy !macro oraz !macroend zostaną zapisane. Aby wstawić makro później, użyj polecenia !insertmacro. Definicje !macro mogą mieć jeden lub więcej zdefiniowanych parametrów. Dostęp do parametrów jest taki sam jak dla !define (np. ${PARMNAME}) z wnętrza makra.

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

5.4.12 !macroend

Kończy makro, które zostało rozpoczęte poleceniem !macro.


Poprzedni | Spis treści | Następny

Ostatnia aktualizacja strony: Niedziela, 6 Września 2009 (16:06:30)
Copyright © 2002 - 2010 by Paweł Porwisz. Wszelkie prawa zastrzeżone.
Strona wygenerowana w 0.001s. Hosted by tox.pl
[Valid XHTML] [Valid CSS] [Valid RSS] [Opera] [BrowseHappy]