데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      Windows에 vcpkg custom registry를 통해 배포하기 : 5편

      이너 24.09.24
      3,045 6 0
      DEVOTEE 요약
      Microsoft가 개발한 vcpkg는 C/C++ 프로젝트에서 라이브러리 관리를 쉽게 할 수 있는 패키지 관리 도구입니다. vcpkg는 소스 기반 빌드를 통해 패키지를 설치하며, 디버그 및 릴리즈 모드로 각각 빌드하여 두 가지 버전을 모두 지원합니다. 또한, vcpkg는 CMake와 긴밀하게 통합되어 있으며, 간단한 명령어로 패키지를 설치, 제거, 검색할 수 있습니다.

      Windows 환경에서 C/C++ 프로젝트를 진행할 때, 라이브러리 관리는 종종 개발자들에게 골치 아픈 문제가 되곤 합니다.

      이러한 문제를 해결하기 위해 Microsoft에서 개발한 vcpkg는 Windows, Linux, macOS에서 C/C++ 라이브러리를

      쉽게 획득, 빌드 및 설치할 수 있게 해주는 강력한 패키지 관리자로 자리 잡았습니다.


      vcpkg의 기본 기능만으로도 많은 개발자들의 고민을 해결해주었지만, 때로는 공식 포트에 포함되지 않은 사용자 정의 라이브러리나 특정 버전의 패키지를 관리해야 할 필요가 있습니다.

      이럴 때 사용할 수 있는 것이 바로 vcpkg custom registry입니다.


      이번 글에서는 이전에 소개했던 ALN(Amazing Lucky Numbers) 라이브러리를 예제로 사용하여,

      vcpkg custom registry를 통해 패키지를 만들고 배포하는 전체 과정을 단계별로 설명하겠습니다.


      vcpkg

      vcpkg는 마이크로소프트에서 개발한 C++ 라이브러리 패키지 매니저로, 다양한 오픈소스 라이브러리들을 간편하게 설치하고 관리할 수 있도록 도와줍니다.

      vcpkg는 CMake와 긴밀하게 통합되어 있어, CMake를 사용하는 프로젝트에서 특히 유용합니다.


      vcpkg를 이용하면 아래와 같은 명령어로 패키지를 설치하고 관리할 수 있습니다.

      vcpkg install <package-name>  : 패키지 설치
      vcpkg remove <package-name>   : 패키지 제거
      vcpkg list                    : 설치된 전체 패키지 목록 확인
      vcpkg search <package-name>   : 패키지 검색
      vcpkg update                  : 패키지 데이터베이스 업데이트
      vcpkg upgrade                 : 설치된 패키지 업그레이드
      vcpkg integrate install       : vcpkg를 현재 사용자 환경에 통합
      vcpkg integrate remove        : vcpkg 통합 제거
      vcpkg export <package-name>   : 패키지를 다른 환경으로 내보내기

      vcpkg를 사용하기 위해서는 Windows에 Git과 Visual Studio BuildTools가 필요합니다. 아래 명령어로 이를 설치할 수 있습니다

      winget install -e --id Git.Git
      winget install -e --id=Microsoft.VisualStudio.2022.BuildTools

      이후 Visual Studio Installer를 통해 MSVC C++ 빌드 도구와 같은 컴파일러를 추가로 설치해야 합니다. 준비가 끝났으면, 이제 Git을 통해 vcpkg를 다운로드 받습니다.

      git clone https://github.com/microsoft/vcpkg.git

      기본 설정 과정인 bootstrap-vcpkg.sh 스크립트를 실행해야 vcpkg.exe 실행 파일이 생성됩니다.

      cd vcpkg
      bootstrap-vcpkg.bat

      이제 vcpkg 명령을 이용할 수 있습니다.

      디렉토리 구조

      vcpkg는 Homebrew와 유사하게 Git 저장소 기반으로 되어 있고, vcpkg를 통해 설치되는 패키지들은 모두 하위 디렉토리에 저장됩니다.

      세부 디렉토리 구성은 아래와 같습니다.

      vcpkg/
      ├── downloads/        : 패키지 소스 코드 및 관련 파일 다운로드 저장소
      ├── installed/        : 설치된 패키지 저장소
      │   └── x64-windows/  : Windows 64비트용 설치 파일
      │       ├── bin/      : DLL 파일
      │       ├── include/  : 헤더 파일
      │       ├── lib/      : 라이브러리 파일
      │       ├── debug/    : 디버그 버전으로 빌드된 DLL 및 라이브러리 파일
      │       └── tools/    : 실행 파일 및 관련 도구
      ├── packages/         : 빌드된 패키지의 임시 저장소
      ├── buildtrees/       : 패키지 빌드 중간 파일 및 로그 저장소
      ├── scripts/          : vcpkg 동작에 필요한 스크립트 파일
      └── ports/            : 각 패키지의 포트 파일 (빌드 및 설치 방법 정의)

      glib 라이브러리 기준으로 어떻게 구성되는지 확인해 보겠습니다.

      일단 패키지를 설치합니다:

      ./vcpkg install glib

      의존성으로 같이 설치되는 다른 패키지들은 제외하고 디렉토리 구성을 확인해 보겠습니다.

      vcpkg
      ├── buildtrees
      │   └── glib
      │       ├── src                : 다운로드된 소스 파일의 압축 해제된 디렉토리
      │       ├── x64-windows-dbg    : Debug용 빌드 디렉토리
      │       ├── x64-windows-rel    : Release용 빌드 디렉토리
      │       └── *.log              : 빌드 로그 파일
      ├── downloads
      │   └── glib-2.78.4.tar.xz     : 소스 압축 파일
      ├── installed
      │   └── x64-windows
      │       ├── bin                : *.dll, *.pdb
      │       ├── debug
      │       │   ├── bin            : Debug용으로 빌드된 *.dll, *.pdb
      │       │   └── lib            : Debug용으로 빌드된 *.lib
      │       │       └── pkgconfig  : *.pc
      │       ├── include            : *.h
      │       ├── lib                : *.lib
      │       │   └── pkgconfig      : *.pc
      │       ├── share
      │       │   └── glib           : copyright 등
      │       └── tools
      │           └── glib           : 각종 툴(gdbus.exe, ...) 및 *.dll
      └── packages
          └── glib_x64-windows
              └── {bin, debug, ...}  : installed에 설치할 파일들

      glib 포트 파일에 정의된 내용에 따라 소스 압축파일을 다운로드 받아 downloads 디렉토리에 저장하고, buildtrees/glib/src 디렉토리에 압축을 풉니다.

      이후 buildtrees/glib/x64-windows-dbg 디렉토리에서 Debug용으로 빌드를 진행하고,

      buildtrees/glib/x64-windows-rel 디렉토리에서 Release용으로 빌드를 진행합니다.


      빌드가 완료되면 packages/glib_x64-windows 디렉토리에 임시로 설치되며,

      최종적으로 통합 디렉토리인 installed/x64-windows 디렉토리에 복사됩니다.

      vcpkg 특징

      vcpkg는 다른 패키징 툴과 비교했을 때 몇 가지 독특한 특징을 가지고 있습니다. 다음은 vcpkg의 주요 특징들입니다:

      1. 소스 기반 빌드를 통한 패키지 설치: vcpkg는 패키지를 소스 코드에서 빌드하여 설치합니다.

        이는 사용자가 라이브러리를 자신의 환경에 맞게 최적화할 수 있도록 해줍니다. 현재까지 바이너리 패키지 배포를 위한 기본 서버는 제공되지 않고 있습니다.

      2. 디버그 및 릴리즈 바이너리 동시 설치: vcpkg는 라이브러리를 디버그와 릴리즈 모드로 각각 빌드하여 두 가지 버전을 모두 설치합니다.

        이렇게 하면 개발자가 디버깅과 최적화된 릴리즈 바이너리를 손쉽게 전환하며 사용할 수 있습니다.

      3. CMake와의 긴밀한 통합: vcpkg는 기본적으로 CMake 시스템 기반으로 구축되어 있습니다.

        물론 Autotools, Meson 같은 다른 빌드 시스템을 지원하지만, 이러한 경우에도 portfile.cmake 파일 내에서 해당 빌드 시스템을 위한 헬퍼 함수들을 사용해야 합니다.

      4. 클래식(Classic) 모드와 매니페스트(Manifest) 모드 지원: 클래식 모드는 다른 패키지 매니저들과 유사하게 전역적으로 패키지를 설치하고 여러 프로젝트가 공유할 수 있는 간단한 방식이고,

        매니페스트 모드는 프로젝트별로 독립적인 패키지 관리를 가능하게 하며, 각 프로젝트의 의존성을 명시적으로 정의하는 방식입니다.


      패키지 만들기

      vcpkg는 다양한 라이브러리와 패키지를 관리하기 위한 포트(ports)라는 개념을 사용하는데,

      특정 라이브러리나 패키지를 설치하고 빌드하는 방법을 정의한 파일 및 스크립트의 집합입니다.

      포트는 일반적으로 다음과 같은 파일들로 구성됩니다:

      • vcpkg.json: 포트의 메타데이터를 정의하는 JSON 파일입니다. 여기에는 버전 정보, 의존성, 라이센스 정보 등이 포함됩니다.

      • portfile.cmake: 라이브러리를 빌드하고 설치하는 방법을 정의하는 CMake 스크립트입니다.

      • 패치 파일: 특정 라이브러리에 대해 vcpkg를 위해 필요한 수정사항이 있을 경우, 이를 포함합니다.

      vcpkg/ports 디렉토리에서 다양한 패키지의 포트 정보를 확인할 수 있습니다. 예를 들어, glib 라이브러리의 포트는 다음과 같은 파일들로 구성되어 있습니다:

      vcpkg/ports/glib/
        ├── portfile.cmake                 : glib 빌드 및 설치 방법에 대한 정의
        ├── vcpkg.json                     : glib 버전, 의존성, 라이센스 정보
        ├── libintl.patch                  : 패치 파일
        └── use-libiconv-on-windows.patch  : 패치 파일

      vcpkg.json

      위에서 설명한 것처럼 vcpkg.json 파일은 vcpkg에서 사용하는 포트의 메타데이터를 정의하는 JSON 파일로,

      이 파일에는 패키지의 버전 정보, 의존성, 라이센스 정보 등과 같은 중요한 메타데이터가 포함됩니다.

      또한, 패키지가 제공하는 선택적 기능(Features)에 대한 정보도 정의할 수 있습니다.


      vcpkg.json의 주요 항목:

      • name: 패키지의 이름을 정의합니다.

      • version: 패키지의 버전을 정의합니다.

      • port-version: 패키지의 포트 버전을 정의합니다. 이는 동일한 소스 버전에서 포트가 업데이트된 경우 증가시킵니다.

      • description: 패키지에 대한 설명을 제공합니다.

      • homepage: 패키지의 홈페이지 URL을 정의합니다.

      • license: 패키지의 라이센스를 명시합니다.

      • supports: 패키지가 지원하는 플랫폼 및 빌드 환경을 명시합니다.

      • dependencies: 패키지가 의존하는 다른 패키지들을 정의합니다.

      • features: 패키지가 제공하는 선택적 기능들을 정의합니다.

      glib 포트에 대한 vcpkg.json 파일을 확인해 보겠습니다.

      {
        "name": "glib",
        "version": "2.78.4",
        "port-version": 3,
        "description": "Portable, general-purpose utility library.",
        "homepage": "https://developer.gnome.org/glib/",
        "license": "LGPL-2.1-or-later",
        "supports": "!uwp & !xbox",
        "dependencies": [
          "dirent",
          "gettext",
          "libffi",
          "libiconv",
          "pcre2",
          {
            "name": "vcpkg-tool-meson",
            "host": true
          },
          "zlib"
        ],
        "features": {
          "libmount": {
            "description": "Build with libmount support.",
            "supports": "linux",
            "dependencies": [
              "libmount"
            ]
          },
          "selinux": {
            "description": "Build with selinux support.",
            "supports": "linux"
          }
        }
      }

      대부분의 항목들은 쉽게 이해할 수 있으므로, 다른 패키징 시스템에서는 생소할 수 있는 몇 가지 항목들 위주로 설명드리겠습니다.

      • "port-version": 3: 다른 패키징 시스템에서 사용하는 리비전(revision) 넘버와 비슷한 개념입니다.

        동일한 glib v2.78.4 소스에 대해 포트 패키징 작업이 세 번째 이루어진 버전이라고 이해하면 됩니다.

      • "supports": "!uwp & !xbox": 해당 패키지가 UWP(Universal Windows Platform)와 Xbox 플랫폼을 지원하지 않음을 의미합니다.

      • "features": { ... }: glib 패키지가 제공하는 선택적 기능을 정의합니다.

        위의 예에서는 "libmount"와 "selinux"라는 두 가지 기능을 제공하며, 패키지 설치 시 아래와 같이 선택할 수 있습니다.

        • vcpkg install glib : 추가 feature 없이 설치

        • vcpkg install glib[libmount] : "libmount" feature를 활성화하여 설치

        • vcpkg install glib[libmount,selinux] : "libmount"와 "selinux" feature를 모두 활성화하여 설치

      portfile.cmake

      portfile.cmake 파일은 vcpkg에서 포트(패키지)를 빌드하고 설치하는 방법을 정의하는 CMake 스크립트입니다.

      이 파일은 vcpkg가 라이브러리나 패키지를 소스 코드에서 빌드하고 설치하는 데 필요한 모든 명령어와 설정을 포함합니다.


      portfile.cmake의 주요 단계:

      • 소스 코드 다운로드 및 압축 해제

      • 빌드 옵션 설정 (Feature 처리)

      • 빌드 및 설치

      • 디버그 빌드에서 생성된 불필요한 파일 제거

      위 단계들을 CMake의 기본 스크립트만으로 처리하는 것은 너무 어렵기 때문에 vcpkg에서는 다양한 헬퍼 함수 및 변수들을 제공하고 있습니다.

      각 단계별로 사용되는 주요 함수와 변수에 대해 간략하게 설명드리겠습니다.


      소스 코드 다운로드 및 압축 해제 단계에 사용되는 주요 함수들:

      빌드 옵션 설정 (Feature 처리) 단계에 사용되는 함수:

      각 빌드 시스템별 빌드 및 설치 단계에 사용되는 함수들:

      디버그 빌드에서 생성된 불필요한 파일 제거: 보통 아래와 같이 CMake의 기본 기능인 REMOVE_RECURSE를 이용해 수동으로 제거합니다.

      file(REMOVE_RECURSE
          "${CURRENT_PACKAGES_DIR}/debug/include"
          "${CURRENT_PACKAGES_DIR}/debug/share"
      )

      전체 함수 목록은 vcpkg 설명서 홈페이지의 왼쪽 목록에서 참조 -> 포트 파일 함수를 참고 바랍니다.


      이제 glib 포트에 대한 portfile.cmake 파일을 통해 위에서 설명한 내용들이 적용되어 있는지 확인해 보겠습니다.

      string(REGEX MATCH "^([0-9]*[.][0-9]*)" GLIB_MAJOR_MINOR "${VERSION}")
      vcpkg_download_distfile(GLIB_ARCHIVE
          URLS "https://download.gnome.org/sources/glib/${GLIB_MAJOR_MINOR}/glib-${VERSION}.tar.xz"
          FILENAME "glib-${VERSION}.tar.xz"
          SHA512 6f3a06e10e7373a2dbf0688512de4126472fb73cbec488b7983b5ffecff09c64d7e1ca462f892e8f215d3d277d103ca802bad7ef0bd0f91edf26fc6ce67187b6
      )
      
      vcpkg_extract_source_archive(SOURCE_PATH
          ARCHIVE "${GLIB_ARCHIVE}"
          PATCHES
              use-libiconv-on-windows.patch
              libintl.patch
      )
      
      # ... 중략 ...
      
      vcpkg_configure_meson(
          SOURCE_PATH "${SOURCE_PATH}"
          LANGUAGES C CXX OBJC OBJCXX
          ADDITIONAL_BINARIES
              ${ADDITIONAL_BINARIES}
          OPTIONS
              ${OPTIONS}
              -Dgtk_doc=false
              -Dinstalled_tests=false
              -Dlibelf=disabled
              -Dman=false
              -Dtests=false
              -Dxattr=false
      )
      vcpkg_install_meson(ADD_BIN_TO_PATH)
      vcpkg_copy_pdbs()
      
      # ... 중략 ...
      
      set(GLIB_TOOLS
          gapplication
          gdbus
          gio
          gio-querymodules
          glib-compile-resources
          glib-compile-schemas
          gobject-query
          gresource
          gsettings
          gtester
      )
      
      # ... 중략 ...
      
      vcpkg_copy_tools(TOOL_NAMES ${GLIB_TOOLS} AUTO_CLEAN)
      
      vcpkg_fixup_pkgconfig()
      
      # ... 중략 ...
      
      file(REMOVE_RECURSE
          "${CURRENT_PACKAGES_DIR}/debug/include"
          "${CURRENT_PACKAGES_DIR}/debug/share"
          "${CURRENT_PACKAGES_DIR}/share/gdb"
          "${CURRENT_PACKAGES_DIR}/debug/lib/gio"
          "${CURRENT_PACKAGES_DIR}/lib/gio"
      )
      
      vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSES/LGPL-2.1-or-later.txt")

      파일이 너무 길어서 일부 중요하지 않은 항목들은 생략하였는데, 위에서 설명드린 주요 단계에 맞게 CMake 스크립가 작성된 것을 확인할 수 있습니다.

      포트 작성

      예제 라이브러리인 ALN 기준으로 실제로 포트를 작성해 보겠습니다. 먼저 작업할 디렉토리를 vcpkg/ports 하위에 추가합니다.

      mkdir ports/aln

      ports/aln/vcpkg.json 파일을 작성합니다. ALN 자체가 간단한 기능을 제공하는 라이브러리이기 때문에 이름, 버전과 같은 기본 정보와 의존성 정보만 추가합니다.

      {
        "name": "aln",
        "version": "0.1.0",
        "description": "Amazing Lucky Numbers",
        "homepage": "https://github.com/webispy/aln",
        "license": "Apache-2.0",
        "dependencies": [
          "glib",
          "pkgconf",
          {
            "name": "vcpkg-cmake",
            "host": true
          },
          {
            "name": "vcpkg-cmake-config",
            "host": true
          }
        ]
      }

      이제 빌드를 위한 ports/aln/portfile.cmake 파일을 작성합니다.

      ALN의 경우 내부적으로 CMake 기반의 빌드 시스템을 사용하고 있기 때문에, vcpkg에서 제공하는 vcpkg_cmake_* 계열의 헬퍼 함수들을 사용했습니다.

      vcpkg_from_github(
          OUT_SOURCE_PATH SOURCE_PATH
          REPO webispy/aln
          REF v0.1.0
          SHA512 5727316847c18ac42c7a683f0b6d3ec5d97bdc372c2732d259206589684d95b4108ec956eab29470dc567d96af650758f0805ae790a5b50b20c27344728db6dd
          HEAD_REF master
      )
      
      vcpkg_cmake_configure(
          SOURCE_PATH "${SOURCE_PATH}"
      )
      
      vcpkg_cmake_install()
      vcpkg_copy_pdbs()
      vcpkg_fixup_pkgconfig()
      
      vcpkg_copy_tools(TOOL_NAMES aln AUTO_CLEAN)
      
      # Clean
      file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include")
      file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/share")
      
      vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE")

      이렇게 해서 포트 파일 작성을 완료했습니다.

      정상적으로 빌드가 되는지 확인해 보겠습니다.

      (의존성 패키지가 설치되어 있지 않을 경우 아래와 다르게 더 많은 패키지 설치 과정이 진행될 수 있습니다.)

      C:\workspace\vcpkg> ./vcpkg install aln
      Computing installation plan...
      The following packages will be built and installed:
          aln:x64-windows@0.1.0
      Detecting compiler hash for triplet x64-windows...
      Compiler found: C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/Tools/MSVC/14.40.33807/bin/Hostx64/x64/cl.exe
      Restored 0 package(s) from C:\Users\work\AppData\Local\vcpkg\archives in 86.9 us. Use --debug to see more details.
      Installing 1/1 aln:x64-windows@0.1.0...
      Building aln:x64-windows@0.1.0...
      -- Downloading https://github.com/webispy/aln/archive/v0.1.0.tar.gz -> webispy-aln-v0.1.0.tar.gz...
      -- Extracting source C:/workspace/vcpkg/downloads/webispy-aln-v0.1.0.tar.gz
      -- Using source at C:/workspace/vcpkg/buildtrees/aln/src/v0.1.0-0e2680e997.clean
      -- Found external ninja('1.11.0').
      -- Configuring x64-windows
      -- Building x64-windows-dbg
      -- Building x64-windows-rel
      -- Fixing pkgconfig file: C:/workspace/vcpkg/packages/aln_x64-windows/lib/pkgconfig/aln.pc
      -- Using cached msys2-mingw-w64-clang-x86_64-pkgconf-1~2.2.0-1-any.pkg.tar.zst.
      -- Using cached msys2-msys2-runtime-3.5.3-3-x86_64.pkg.tar.zst.
      -- Using msys root at C:/workspace/vcpkg/downloads/tools/msys2/8fb75a18dbf79dc6
      -- Fixing pkgconfig file: C:/workspace/vcpkg/packages/aln_x64-windows/debug/lib/pkgconfig/aln.pc
      -- Installing: C:/workspace/vcpkg/packages/aln_x64-windows/share/aln/copyright
      -- Performing post-build validation
      Stored binaries in 1 destinations in 275 ms.
      Elapsed time to handle aln:x64-windows: 11 s
      aln:x64-windows package ABI: 201b058fcb0b7c098975c32e39c5c6239c89fd4af9edc1c422d1f902bd652855
      Total install time: 11 s
      aln provides pkg-config modules:
      
        # Library for Amazing Lucky Number generation
        aln

      빌드가 정상적으로 진행되었습니다. 예제 프로그램이 실행되는지 확인해 보겠습니다.

      다른 플랫폼과 다르게 실행 파일이 bin이 아니라 tools에 설치되기 때문에 해당 디렉토리로 먼저 이동합니다.

      C:\workspace\vcpkg> cd .\installed\x64-windows\tools\aln\

      ls 명령으로 설치된 파일 목록을 확인해 보면, 예제 프로그램인 aln.exe와 실행에 필요한 라이브러리가 정상적으로 설치된 것을 확인할 수 있습니다.

      C:\workspace\vcpkg\installed\x64-windows\tools\aln> ls
      
          디렉터리: C:\workspace\vcpkg\installed\x64-windows\tools\aln
      
      Mode                 LastWriteTime         Length Name
      ----                 -------------         ------ ----
      -a----      2024-07-18   오후 3:47          11264 aln.dll
      -a----      2024-07-18   오후 3:47          11776 aln.exe
      -a----      2024-07-18   오후 3:47         413696 aln.pdb
      -a----      2024-07-17   오후 5:43        1195008 glib-2.0-0.dll
      -a----      2024-07-17   오후 5:26        1077248 iconv-2.dll
      -a----      2024-07-17   오후 5:35          96768 intl-8.dll
      -a----      2024-07-17   오후 5:41         522240 pcre2-8.dll

      또한, 예제 프로그램도 정상적으로 실행되는 것을 확인할 수 있습니다.

      C:\workspace\vcpkg\installed\x64-windows\tools\aln> .\aln.exe
      03 14 26 09 25 10
      08 02 21 04 44 29
      42 25 26 34 29 36
      24 09 05 30 23 46
      07 18 06 37 38 05

      이렇게 해서 vcpkg용 포트를 작성해 보았습니다.

      만약 배포하려는 패키지가 공식적이고 다양한 곳에서 사용된다면, 작성한 포트를 vcpkg에 Pull request로 제출해보는 것도 좋을 것 같습니다.


      ALN과 같이 예제로 작성한 라이브러리나 한정된 곳에서만 사용될 목적으로 만든 경우, 공식 저장소 대신 Custom registry를 통해 포트를 배포할 수 있습니다.


      Custom registry

      vcpkg의 Custom Registry 기능은 사용자가 자신의 포트 레포지토리를 생성하고 관리할 수 있도록 합니다.

      이를 통해 공식 vcpkg 레포지토리 외부에서 패키지를 배포하고 사용할 수 있습니다.

      Registry 생성

      먼저 Registry로 사용할 디렉토리(aln-vcpkg-registry)를 생성합니다.

      차후에 vcpkg 명령으로 쉽게 접근하기 위해 아래와 같이 vcpkg 디렉토리와 같은 레벨를 사용합니다.

      workspace
      ├── vcpkg               : vcpkg가 설치된 디렉토리
      └── aln-vcpkg-registry  : Custom registry로 생성할 디렉토리

      아래와 같이 디렉토리를 생성한 후 Git 저장소로 만듭니다.

      C:\workspace> mkdir aln-vcpkg-registry
      C:\workspace> cd aln-vcpkg-registry
      C:\workspace\aln-vcpkg-registry> git init .
      Initialized empty Git repository in C:/workspace/aln-vcpkg-registry/.git/

      vcpkg에서 제공하는 x-init-registry 명령을 이용해 Registry를 초기화합니다.

      C:\workspace\aln-vcpkg-registry> ..\vcpkg\vcpkg.exe x-init-registry .
      Successfully created registry at C:\workspace\aln-vcpkg-registry\.

      이전 단계에서 만들었던 aln 포트를 Custom registry로 이동시킵니다.

      C:\workspace> Move-Item -Path "vcpkg/ports/aln" -Destination "aln-vcpkg-registry/ports/"

      기본적인 작업은 완료되었습니다. 현재까지 작업한 내용들을 커밋으로 저장합니다.

      C:\workspace\aln-vcpkg-registry> git add .
      C:\workspace\aln-vcpkg-registry> git commit -m "Initial commit"
      [master (root-commit) f3f0c27] Initial commit
       3 files changed, 45 insertions(+)
       create mode 100644 ports/aln/portfile.cmake
       create mode 100644 ports/aln/vcpkg.json
       create mode 100644 versions/baseline.json

      이제 임시로 생성했던 versions database(versions/baseline.json) 파일을 포트에 맞게 업데이트해야 합니다.

      다행히 vcpkg에서 명령을 제공해주고 있기 때문에 아래와 같이 실행하면 업데이트가 완료됩니다.

      C:\workspace\aln-vcpkg-registry> ../vcpkg/vcpkg `
          --x-builtin-ports-root=./ports `
          --x-builtin-registry-versions-dir=./versions `
          x-add-version --all --verbose --overwrite-version
      added version 0.1.0 to C:\workspace\aln-vcpkg-registry\versions\a-\aln.json (new file)
      added version 0.1.0 to C:\workspace\aln-vcpkg-registry\versions\baseline.json

      수정된 항목들을 Git 커밋으로 반영합니다.

      C:\workspace\aln-vcpkg-registry> git add .
      C:\workspace\aln-vcpkg-registry> git commit -m "Update versions database"

      전체 가이드는 https://learn.microsoft.com/en-us/vcpkg/produce/publish-to-a-git-registry 문서를 참고 바랍니다.

      Registry를 이용한 패키지 설치

      위에서 생성한 Custom registry를 이용해 패키지를 설치해 보겠습니다.

      클래식 모드

      클래식 모드에서는 간단하게 --overlay-ports를 이용해서 패키치를 설치해볼 수 있습니다.

      ./vcpkg install aln --overlay-ports=../aln-vcpkg-registry/ports

      매니페스트 모드

      매니페스트 모드 테스트를 위해 별도의 프로젝트 디렉토리(test)를 생성한 후,

      vcpkg 명령을 통해 현재 작업 디렉터리의 프로젝트에서 사용할 수 있는 매니페스트 파일(vcpkg.json) 및 기본 구성 파일(vcpkg-configuration.json)을 만듭니다.

      C:\workspace> mkdir test
      C:\workspace> cd test
      C:\workspace\test> ..\vcpkg\vcpkg.exe new --application

      Custom registry 추가를 위해 vcpkg-configuration.json 파일을 편집기로 오픈합니다.

      C:\workspace\test> notepad vcpkg-configuration.json

      registries 배열에 Custom registry에 대한 정보(Github 주소, 커밋 ID, 제공하는 패키지 목록)를 추가합니다.

      {
        "default-registry": {
          "kind": "git",
          "baseline": "1318ab14aae14db20085441cd71366891a9c9d0c",
          "repository": "https://github.com/microsoft/vcpkg"
        },
        "registries": [
          {
            "kind": "artifact",
            "location": "https://github.com/microsoft/vcpkg-ce-catalog/archive/refs/heads/main.zip",
            "name": "microsoft"
          },
          {
            "kind": "git",
            "repository": "https://github.com/webispy/aln-vcpkg-registry",
            "baseline": "f929043290a441ba01bdf06e122eb57e6ada4855",
            "packages": [ "aln" ]
          }
        ]
      }

      설치를 테스트하기 위해 test 프로젝트의 의존성 정보에 aln을 추가합니다.

      C:\workspace\test> ..\vcpkg\vcpkg.exe add port aln

      vcpkg.json 파일에 아래와 같이 추가된 것을 확인할 수 있습니다.

      {
        "dependencies": [
          "aln"
        ]
      }

      이제 패키지가 설치되는지 테스트해 보겠습니다.

      C:\workspace\test> ..\vcpkg\vcpkg.exe install
      Fetching registry information from https://github.com/webispy/aln-vcpkg-registry (HEAD)...
      Fetching registry information from https://github.com/microsoft/vcpkg (HEAD)...
      # 중략: ... 의존성 패키지 설치 ...
      Installing 14/14 aln:x64-windows@0.1.0...
      Building aln:x64-windows@0.1.0...
      C:\Users\work\AppData\Local\vcpkg\registries\git-trees\c35212cbf7f33194a4c120e1bcce4381de128dab: info: installing overlay port from here
      -- Using cached webispy-aln-v0.1.0.tar.gz.
      -- Cleaning sources at C:/workspace/vcpkg/buildtrees/aln/src/v0.1.0-0e2680e997.clean. Use --editable to skip cleaning for the packages you specify.
      -- Extracting source C:/workspace/vcpkg/downloads/webispy-aln-v0.1.0.tar.gz
      -- Using source at C:/workspace/vcpkg/buildtrees/aln/src/v0.1.0-0e2680e997.clean
      -- Found external ninja('1.11.0').
      -- Configuring x64-windows
      -- Building x64-windows-dbg
      -- Building x64-windows-rel
      -- Fixing pkgconfig file: C:/workspace/vcpkg/packages/aln_x64-windows/lib/pkgconfig/aln.pc
      -- Using cached msys2-mingw-w64-clang-x86_64-pkgconf-1~2.2.0-1-any.pkg.tar.zst.
      -- Using cached msys2-msys2-runtime-3.5.3-3-x86_64.pkg.tar.zst.
      -- Using msys root at C:/workspace/vcpkg/downloads/tools/msys2/8fb75a18dbf79dc6
      -- Fixing pkgconfig file: C:/workspace/vcpkg/packages/aln_x64-windows/debug/lib/pkgconfig/aln.pc
      -- Installing: C:/workspace/vcpkg/packages/aln_x64-windows/share/aln/copyright
      -- Performing post-build validation
      Stored binaries in 1 destinations in 252 ms.
      Elapsed time to handle aln:x64-windows: 10 s
      aln:x64-windows package ABI: 854463babb3e57397d66c8c04e5c39f3c26f718d5be1e765066795495c56baf6
      Total install time: 11 s
      aln provides pkg-config modules:
      
        # Library for Amazing Lucky Number generation
        aln

      패키지가 성공적으로 설치되었습니다.


      마무리

      이렇게 해서 Windows에서 vcpkg 포트를 작성하고 Custom registry를 통해 패키지를 배포하는 과정을 살펴보았습니다.

      이번 글이 여러분의 vcpkg 활용에 도움이 되길 바랍니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      이너 님의 최신 블로그

      더보기
      동영상 기고하기