수성컴전자방입니다. 지난 글에 이어서 NSIS에 대해 계속 알아보겠습니다. Windows에서 프로그램을 설치하다 보면 설치하려는 구성 요소를 선택할 수 있는 경우를 보신 적이 있을 것입니다. 이것은 NSIS에서 Section과 SectionGroup 기능을 사용하여 구현할 수 있습니다. 오늘은 Section과 SectionGroup에 대해 알아보겠습니다.
목차
1. NSIS + HM NIS Edit 설치
2. 기본적인 Windows용 설치 프로그램(설치기) 만들기
3. Section과 SectionGroup(이번 글)
3.1. Section
3.2. SectionGroup
3.3. 특정 SectionGroup 펼친 상태를 기본값으로
3.4. 특정 Section 체크 해제를 기본값으로
3.5. Section 또는 SectionGroup 이름을 굵게 표시하기
3.6. 설치 제거 section
3.7. 완성 예제 코드
3.8. 글 마무리
3.9. 참고 자료
4. 환영 이미지, 헤더 이미지, 브랜딩 텍스트, 스플래시 이미지
5. 프로그래밍(분기, 조건문, 반복문)
6. 커스텀 페이지
7. 인터넷에서 내려받기
3.1. Section
3.1.1. 먼저 HM NIS Edit의 ‘스크립트 작성 마법사’를 이용해 코드를 생성합니다. 이때 ‘프로그램 파일’ 단계에서 여러 개의 section을 만들고 section별로 파일을 추가한 다음 사용자가 설치할 컴포넌트를 선택할 수 있도록 설정에 체크합니다.
저는 예시를 들기 위해서 사칙연산 프로그램을 만들었고, 덧셈, 뺄셈, 곱셈, 나눗셈, 바로가기 중에서 원하는 것들만 고를 수 있게 하려고 합니다.
이때 ‘바로가기’는 NSIS 코드를 직접 수정해서 구현할 것이므로 아무 파일도 추가하지 않았습니다.
‘프로그램 파일’ 외에 다른 단계의 설정은 아래와 같이 했습니다.
- 설치 언어: Korean
- GUI: Modern
- 압축 방식: LZMA
- 파일이 이미 존재할 경우: 항상 덮어쓰기
잘 모르겠는 분은 2편 글을 참고해 주세요.
3.1.2. NSIS 코드가 생성되면 Section들이 나뉘어 있는 것을 보실 수 있습니다. Section 소스코드의 구조는 아래와 같습니다.
Section “section이름“ section고유번호
해당 section이 체크되면 수행할 코드
SectionEnd
3.1.3. 맨 위의 section(예제에서는 “Main”)에만 있는 SetOutPath “$INSTDIR”을 다른 section들에도 복사합니다. 어떤 section을 체크하든지 프로그램 기본 디렉토리에 설치하기 위함입니다.
3.1.4. 맨 위의 section(예제에서는 “Main”)에만 있는 SetOverWrite on을 그 section과 ShowUnInstDetails show 사이로 옮깁니다(더 위로 올라가야 한다는 뜻). 어떤 section을 체크하든지 항상 덮어쓰기로 설치하기 위함입니다.
3.1.5. 바로가기 section을 체크했을 때만 바탕화면에 바로가기 아이콘을 생성하도록 하기 위해서 맨 위의 section(예제에서는 “Main”)에 있는 CreateShortCut “$DESKTOP\사칙연산.lnk” “$INSTDIR\main.exe”를 “바로가기” section으로 옮깁니다.
3.1.3. 컴파일 및 실행해 보면 설치하려는 구성 요소를 선택하는 창에 여러 가지 체크박스가 생긴 것을 보실 수 있습니다.
모두 체크하면 모든 구성 요소가 설치되고 바탕화면에 바로가기도 만들어졌습니다.
프로그램을 제거하고 다시 설치해 보겠습니다. 이번에는 나눗셈과 바로가기를 해제해 보겠습니다.
div.exe가 설치되지 않았고, 바탕화면에 바로가기가 생성되지 않았습니다.
3.2. SectionGroup
Section이 여러 개일 때 그룹으로 묶을 수 있습니다. 저는 Main, 덧셈, 뺄셈, 곱셈, 나눗셈을 하나의 SectionGroup으로 묶어 보겠습니다.
그룹으로 묶을 section들을 SectionGroup “SectionGroup이름“ SectionGroup고유번호와 SectionGroupEnd로 감쌉니다.
컴파일 및 실행해 보면 SectionGroup이 만들어진 것을 보실 수 있습니다.
SectionGroup 이름 왼쪽의 +/-를 클릭하여 SectionGroup을 펼치거나 접을 수 있습니다.
3.3. 특정 SectionGroup 펼친 상태를 기본값으로
구성 요소 선택 화면에서 SectionGroup이 처음부터 펼쳐져 있게 하려면 어떻게 해야 할까요?
펼쳐져 있게 할 SectionGroup 이름 왼쪽에 /e를 넣습니다.
컴파일 및 실행해 보면 SectionGroup이 펼쳐져 있습니다.
3.4. 특정 Section 체크 해제를 기본값으로
기본적으로 모든 section은 체크가 이미 되어 있는데요, 체크가 해제되어 있게 설정할 수도 있습니다.
체크 해제할 section의 이름 왼쪽에 /o를 붙입니다.
컴파일 및 실행해 보면 /o를 붙인 section이 체크 해제되어 있습니다. 그러면 설치하고 싶은 사람이 직접 체크해서 설치할 수 있겠죠?
3.5. Section 또는 SectionGroup 이름을 굵게 표시하기
설치 프로그램에서 Section 또는 SectionGroup 이름을 굵게 표시하려면 이름 앞에 !를 붙이면 됩니다. 이때 큰따옴표 안에 느낌표가 들어가야 합니다.
저는 SectionGroup 이름 앞에 !를 붙였기 때문에 SectionGroup 이름이 굵게 표시되었습니다.
3.6. 설치 제거 Section 및 SectionGroup
Section 또는 SectionGroup 이름이 un.으로 시작되면 설치 제거 section으로 사용됩니다.
3.7. 완성 예제 코드
3.5절까지의 내용을 모두 진행한 완성 예제 코드를 올려드리겠습니다. 단, 설치될 파일은 제공하지 않습니다.
; Script generated by the HM NIS Edit Script Wizard.
; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "사칙연산"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "수성컴"
!define PRODUCT_WEB_SITE "https://sooseongcom.com"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\main.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
SetCompressor lzma
; MUI 1.67 compatible ------
!include "MUI.nsh"
; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "license.txt"
; Components page
!insertmacro MUI_PAGE_COMPONENTS
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_RUN "$INSTDIR\main.exe"
!insertmacro MUI_PAGE_FINISH
; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
; Language files
!insertmacro MUI_LANGUAGE "Korean"
; Reserve files
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
; MUI end ------
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "Setup.exe"
InstallDir "$PROGRAMFILES64\사칙연산"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show
SetOverwrite on
SectionGroup /e "!사칙연산 프로그램" M1
Section "Main" SEC01
SetOutPath "$INSTDIR"
File "main.exe"
CreateDirectory "$SMPROGRAMS\사칙연산"
CreateShortCut "$SMPROGRAMS\사칙연산\사칙연산.lnk" "$INSTDIR\main.exe"
SectionEnd
Section "덧셈" SEC02
SetOutPath "$INSTDIR"
File "add.exe"
SectionEnd
Section "뺄셈" SEC03
SetOutPath "$INSTDIR"
File "sub.exe"
SectionEnd
Section "곱셈" SEC04
SetOutPath "$INSTDIR"
File "mul.exe"
SectionEnd
Section "나눗셈" SEC05
SetOutPath "$INSTDIR"
File "div.exe"
SectionEnd
SectionGroupEnd
Section /o "바로가기" SEC06
CreateShortCut "$DESKTOP\사칙연산.lnk" "$INSTDIR\main.exe"
SectionEnd
Section -AdditionalIcons
CreateShortCut "$SMPROGRAMS\사칙연산\Uninstall.lnk" "$INSTDIR\uninst.exe"
SectionEnd
Section -Post
WriteUninstaller "$INSTDIR\uninst.exe"
WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\main.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\main.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd
; Section descriptions
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SEC01} "프로그램 첫 화면입니다."
!insertmacro MUI_DESCRIPTION_TEXT ${SEC02} "정수 덧셈 기능입니다."
!insertmacro MUI_DESCRIPTION_TEXT ${SEC03} "정수 뺄셈 기능입니다."
!insertmacro MUI_DESCRIPTION_TEXT ${SEC04} "정수 곱셈 기능입니다."
!insertmacro MUI_DESCRIPTION_TEXT ${SEC05} "정수 나눗셈 기능입니다."
!insertmacro MUI_DESCRIPTION_TEXT ${SEC06} "바탕화면에 바로가기 아이콘을 만듭니다."
!insertmacro MUI_FUNCTION_DESCRIPTION_END
Function un.onUninstSuccess
HideWindow
MessageBox MB_ICONINFORMATION|MB_OK "$(^Name)는(은) 완전히 제거되었습니다."
FunctionEnd
Function un.onInit
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "$(^Name)을(를) 제거하시겠습니까?" IDYES +2
Abort
FunctionEnd
Section Uninstall
Delete "$INSTDIR\uninst.exe"
Delete "$INSTDIR\div.exe"
Delete "$INSTDIR\mul.exe"
Delete "$INSTDIR\sub.exe"
Delete "$INSTDIR\add.exe"
Delete "$INSTDIR\main.exe"
Delete "$SMPROGRAMS\사칙연산\Uninstall.lnk"
Delete "$DESKTOP\사칙연산.lnk"
Delete "$SMPROGRAMS\사칙연산\사칙연산.lnk"
RMDir "$SMPROGRAMS\사칙연산"
RMDir "$INSTDIR"
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
SetAutoClose true
SectionEnd
3.8. 글 마무리
오늘 준비한 내용은 여기까지입니다. 제 글을 읽어 주셔서 감사합니다.
다음에 만나요!
3.9. 참고 자료
1) 애스크. 2019. “[NSIS+HM NIS EDIT]6강 - SectionGroup”, YouTube. (2024. 03. 01. 방문). https://youtu.be/zfzJQdh5pak?si=9xTC3VrKa9S_HcKL
2) moltak. 2010. “NSIS 기초지식”, code toolbox. (2024. 03. 01. 방문). https://moltak.tistory.com/48