본문 바로가기

4.개발 및 운영 환경

[NSIS] 설치와 제거 양쪽에 사용하는 함수 정의하기

[NSIS] 함수 정의하기

Writer: http://ospace.tistory.com/(ospace114@empal.com) 2008.08.28

개요

NSIS에서는 함수 호출가능한 경우가 두가지가 있다. 설치와 제거이다.
즉, 설치시 호출하는 함수와 제거시 호출하는 함수명이 틀리다.
제거시 반드시 함수 명 앞에 "un."이라는게 들어가야 한다.
이를 하나의 함수로 두 곳에서 사용할 수 있는 방법을 살펴보겠다.

일반적 사용

예들들어 FindPorcess라는 함수가 다음과 같이 정의 되어 있다면;

Function FindProcess
;주저리 주저리
FunctionEnd

NSIS이벤트 중에 .onInit에서 호출하면 이상없이 호출되지만,
Function .onInit
  Call FindProcess
  ;...
FunctionEnd

un.onInit에서 호출하면 에러가 발생한다.
Function un.onInit
Call FindProcess
;...
FunctionEnd

발생 에러

Call must be used with function names starting with "un." in the uninstall section.
Usage: Call function_name : [:label_name]

이라고 출력이 된다.
그럼 거두 절미하고 바로 쉽게 설치와 제거에서 사용할 수 있는 함수 사용을 보자.

새로운 함수 정의

일단, 함수 정의 전에 매크로를 정의해서 사용하겠다.

!ifndef UN
  !define UN ""
!endif

!macro FUNC_FINDPROCESS UN
;주저리 주저리
!macroend

감을 잡으신 분도 있을 것이다. 즉 매크로를 이용해서 두가지 함수를 정의한다.
뒤에 UN은 현재 설치 인지 제거 인지 식별하기 위한 값이다.

함수 선언은 다음과 같이 하면 된다.

Function FindProcess
  !insertmacro FUNC_FINDPROCESS ""
FunctionEnd

Function un.FindProcess
  !insertmacro FUNC_FINDPROCESS "un."
FunctionEnd

그러면 제거이든 설치이든 아무 곳이나 함수를 호출해서 사용하면 된다. 물론 제거시에는 앞에 "un."를 붙여줘야한다.

결론

그냥 함수를 정의해서 사용하는 방법에 비해서 복잡한 선언이 필요하다. 각 함수를 매크로로 정의하고 해당 매크로를 다시 두 종류의 함수로 정의하게 된다. 상당히 번거로운 작업이 된다.
그러나, 설치와 제거를 따로 구현하는 중복 코드가 없어지면, 한곳에서 관리되기에 유지보수에도 편한 장점도 있다. 그러나, 사용 목적이나 장소에 따라서 선택적으로 적용하면 될 것이다.

참조: NSIS의 스크립트 헤더 파일

반응형