C++ - 패키지 시스템 vcpkg

작년에 정리한 것으로 최신 버전과 일부 다른 부분이 있을 수 있음.

C++ 패키지 시스템 vcpkg

  • 크로스 플랫폼 지원 C++ 패키지 툴
  • 버전 관리, 바이너리 캐싱, 매니페스트 및 레지스트리를 지원
  • 공식 사이트
  • Browse packages
  • 문서
  • 한국어로 쓴 Vcpkg 설명서
  • 지원 플래폼, 라이브러리 타입(32/64비트, dynamic/static) 리스트는 아래 명령어로 확인할 수 있다
     vcpkg help triplet
    
  • 바이너리 캐싱: 네트워크 파일 공유, NuGet 피드 또는 클라우드 바이너리 스토리지 솔루션에서 필요에 따라 복원 할 수 있는 미리 빌드된 라이브러리 바이너리의 복사본을 저장한다. 이 기능을 사용하면 종속성을 한 번만 빌드한 다음 다른 시스템, 컨테이너 또는 지속적인 통합 실행에서 더 빠른 후속 획득을 위해 이것을 캐시 할 수 있다.
  • 매니페스트: 소스 제어에서 유지 관리 할 수 ​​있고, MSBuild 및 CMake 프로젝트와 자동으로 통합 되는 vcpkg.json 파일에서 종속성을 선언 할 수 있다. MSBuild 컴파일을 실행하거나 CMake 캐시를 생성하여 누락된 종속성을 자동으로 복원한다.
  • Versioning: 특정 버전에서 획득 할 라이브러리를 설정하고 이것에 잠금을 한다.
  • 레지스트리: 공개 카탈로그에서 사용 가능한 오픈 소스 라이브러리의 포크 또는 기타 사용자 지정 라이브러리(사설 조직 전용 종속성 포함) 여부에 관계없이 자체 라이브러리를 vcpkg로 가져온다.




설치

Windows

  • 사전 필수 설치 프로그램
    • Windows 7 or newer, Git, Visual Studio 2015 Update 3 or newer
  • 문서: https://vcpkg.io/en/getting-started.html


Step 1: Clone the vcpkg repo
vcpkg 디렉토리가 만들어질 곳으로 이동 후 아래 명령어를 실행한다

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

Step 2: Run the bootstrap script to build vcpkg

.\vcpkg\bootstrap-vcpkg.bat


Install libraries for your project

vcpkg install [packages to install]

Using vcpkg with MSBuild / Visual Studio (may require elevation)

vcpkg integrate install

위의 명령을 윈도우 환경에서 사용하시면 vcpkg로 설치된 모든 라이브러리를 추가 작업 없이 #include로 바로 사용 할 수 있다.




라이브러리 설치

vcpkg 샘플 코드

프로토콜 버퍼

기본은 32비트가 설치 되므로 x64-windows로 64비트 버전이 설치되도록 한다

cpkg install protobuf:x64-windows

Boost 라이브러리

$ .\vcpkg install boost:x64-windows

IDE - CLion에서 사용하기

CLion으로 빈 C++ 프로젝트를 생성하고 CMakeLists.txt에 아래 코드 추가

find_package(Boost 1.73 REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})

그리고 아래처럼 잘 되는지 확인한다

#include <algorithm>
#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>

int main() {
    using in = std::istream_iterator<int>;
    std::for_each(in(std::cin), in(), std::cout << (boost::lambda::_1 * 3) << '\n');
    return 0;
}




유튜브 영상


주요 명령어

  • vcpkg search 설치할 수 있는 패키지 검색
  • vcpkg install 패키지 설치
  • vcpkg remove 패키지 제거
  • vcpkg remove –outdated 만료된 패키지 모두 제거
  • vcpkg list 설치된 패키지 나열
  • vcpkg update 업데이트할 패키지 목록 표시
  • vcpkg upgrade 만료된 모든 패키지 다시 빌드
  • vcpkg hash 특정 알고리즘에 따라 파일 해시, 기본 SHA512


메니페스트 파일

매니페스트는 프로젝트 디렉토리에 있어야하며 소스 제어에 쉽게 체크인 할 수 있는 vcpkg.json 이라는 파일 이름을 가진 파일이다. 이를 통해 라이브러리 종속성을 선언하고, 활성 빌드 구성에 누락 된 종속성을 설치하기 위한 사전 빌드 단계의 일부로 vcpkg가 자동으로 실행되도록 구성 할 수 있다.

{ 
    "name": "supertux", 
    "version-string": "1.3.1", 
    "dependencies": [ 
        "boost-date-time", 
        "boost-filesystem", 
        "boost-format", 
        "boost-locale", 
        "boost-system", 
        "curl", 
        "freetype", 
        "glew", 
        "libogg", 
        "libvorbis", 
        "openal-soft", 
        "sdl2", 
        "sdl2-image" 
    ] 
}

바이너리 캐싱은 바이너리가 vcpkg에 의해 처음 컴파일 될 때 바이너리 사본을 저장합니다. 캐시 위치는 로컬 파일 시스템에서 원격 파일 공유 또는 아티팩트 저장소 위치까지 어디에서나 설정할 수 있습니다.


vcpkg의 x86-windows-static-md triplet

출처

Target Triplet in vcpkg

vcpkg에는 라이브러리를 정적으로 링크하거나 동적으로 링크할지 여부를 지정하기 위해 x64-windows-staticx64-windows 라는 빌드 대상 문자열(triplet)를 사용한다. 예

vcpkg install openblas --triplet x64-windows

이것으로 OpenBLAS를 동적 라이브러리(.dll)로 빌드 되고,

vcpkg install openblas --triplet x64-windows-static

이것으로 OpenBLAS이 정적 라이브러리(.a)으로 빌드된다.


사실 여기에 또 다른 종류가 있는데 x64-windows-static-md라는 것이 있다

vcpkg install openblas --triplet x64-windows-static

이 라이브러리(이 경우 OpenBLAS)는 static으로 C Runtime(CRT)은 dynamic으로 링크한다. 이것으로 빌드 성과물에 CRT분이 포함되지 않기 때문에 크기가 줄어든다. 대신 런타임에 CRT를 검색 할 수 있어야 한다.

이 Triplet은 vcpkg 본가가 아닌 커뮤니티에서 관리 되고 있다. Why should x64-windows-static-md not be the preferred triplet on Windows?에 자세한 설명이 있다.


기본 triplet 변경

환경 변수 VCPKG_DEFAULT_TRIPLET의 값을 임의의 triplet로 하면된다. 일일이 package 이름 뒤에 triplet를 입력하는 수고를 줄일 수 있다.
개인적으로는 64bit 용을 개발한다면, x64-windows-static-md로 하는 것이 무난할 것 같다.


static, dynamic 패키지를 혼재 시키고 싶을 때

예를 들어 오픈 소스 버전의 Qt는 기본적으로 LGPL 라이센스이기 때문에 대개는 dynamic link가 선택되지만, 다른 라이브러리는 static link로 하는쪽을 선호한다. 이들을 혼합하면 triplet을 편집 할 필요 가있다. %VCPKG_ROOT%\triplets(%VCPKG_ROOT%는 vcpkg을 설치한 폴더)가 triplet 설정을 두는 곳이기 때문에, 여기에 자신만의 설정 파일을 추가하면 된다. 예를 들어 x64-windows-static을 기반으로 Qt5만 dynamic으로 변경한 자기만의 환경을 준비한다.

  1. x64-windows-static.cmake를 복사 붙여넣기 하고, 임의의 파일 이름(x64-windows-myenv.cmake 라든가)로 변경한다.
  2. 아래처럼 바꾼다
set(VCPKG_TARGET_ARCHITECTURE x64)
set(VCPKG_CRT_LINKAGE static)
set(VCPKG_LIBRARY_LINKAGE static)

if(${PORT} MATCHES "^(qt5).*")
    set(VCPKG_LIBRARY_LINKAGE dynamic)
endif()

${PORT}에는 설치하려고 하는 패키지의 이름이 들어있는 것 같다. 이것이 “qt5”로 시작하는 이름일 때만 VCPKG_LIBRARY_LINKAGE를 dynamic으로 수정하고 있다. 이후는 패키지를 설치할 때 package:x64-windows-myenv 처럼 만든 설정 파일 이름을 지정하면 된다. 물론 위의 VCPKG_DEFAULT_TRIPLET에 지정해도 좋다.


Visual Studio가 포함 디렉토리 등을 찾지 못하는 경우

Visual Studio 2019에서 확인.
Visual Studio와 통합하려면 vcpkg integrate install을 실행시켜라 고만 설명되어 있지 않지만, 이 때 Visual Studio는 triplet이 x86-windows 또는 x64-windows 라고 가정하고 있는 것 같다. 만약 이외의 triplet에 설치한 경우 포함하려고 하는 파일은 찾을 수 없다.
프로젝트의 속성을 열고 구성 속성 -> vcpkg -> Triplet에 해당하는 triplet을 지정하면 된다.




vcpkg 패키지 버전 관리 - 매니페스트 모드

출처

vcpkg는 클래식 모드매니페스트 모드의 두 가지 동작이 있다. 클래식 모드는 아래와 같이 패키지를 하나 하나 지정하여 설치해 나가는 방법이다.

vcpkg install opencv3:x64-windows-static-md

또 다른 vcpkg 사용이 매니페스트 모드 이다. 이것은 각 프로젝트의 루트 디렉토리(CMake 프로젝트의 경우 대부분 CMakeLists.txt가 있는 디렉토리 등)에 vcpkg.json라는 의존 패키지 목록을 기재한 json 파일을 배치하고, 여기에서 각 패키지를 설치하는 방법이다. 이것은 Rust의 Cargo 등과 비슷하고, vcpkg의 실행 파일을 직접 명령으로 시작할 필요가 없고, vcpkg.json에 종속성을 써 두는 것으로 CMake(또는 MSBuild) 실행 시 자동으로 패키지 다운로드 설치가 진행된다.

매니페스트 모드는 최근 각 패키지의 버전 지정 설치를 지원한다. 클래식 모드에서는 어려웠던 패키지 버전 관리가 매니페스트 모드라면 가능하다. 정래에는 이 매니페스트 모드를 주로 이용할 것이다.

매니페스트 모드의 기본

매니페스트 모드는 앞서 언급했듯이, vcpkg.json 라는 의존 패키지를 나열하는 파일을 프로젝트의 디렉토리 아래에 작성하여 패키지를 관리한다. 일반적으로 vcpkg.json가 있는 디렉토리 아래에 vcpkg_install 라는 디렉토리가 만들어지고, 여기에 의존 패키지가 설치된다. 즉 의존 패키지는 모두 프로젝트의 디렉토리 아래에 설치된다.

이 방법은 환경을 프로젝트 별로 구축 할 수 있고, 프로젝트 간의 환경과 간섭하지 않는다는 장점이 있다. 만약 프로젝트마다 의존 패키지 버전이나 옵션이 다르는 등 독립적으로 환경을 관리하려면, 이것은 아주 좋은 기능이다. 그러나 예를 들어 거의 같은 의존 패키지를 사용하는 여러 프로젝트가 있다면(프로젝트와 종속 서브 프로젝트 등) 많은 일반적인 패키지를 프로젝트 각각 중복하여 설치해야 한다는 단점도 된다. 스토리지 용량도 설치 시간도 낭비가 발생한다.

여러 프로젝트에서 공유 할 수 있는 환경에서 패키지 버전을 지정하고 싶다면, 매니페스트 모드의 보다는 레지스트리를 사용하는 것이 현재 가장 괜찮은 방법 일 것이라고 생각한다.

준비

매니페스트 모드와 버전 관리는 최신 버전에서 지원한다.

vcpkg.json 작성

매우 간단한 CMake 프로젝트를 생각한다. 아래와 같은 파일이 MyProject 디렉토리 아래에 있다고 하자.

  
MyProject/
    CMakeLists.txt
    main.cpp
    vcpkg.json

main.cpp의 내용은 무엇이든 좋지만 일단 boost와 fmt에 의존하는 것으로 생각한다.
vcpkg.json 에는 이 프로젝트가 boost와 fmt에 의존하는 것을 명시해야 한다. 아래와 같이 쓴다.

{
  "name": "my-project",
  "version": "1.0.0",
  "dependencies": [
    "boost",
    "fmt"
  ],
  "builtin-baseline": "git commit SHA"
}

name은 이 프로젝트의 이름, version도 그대로 버전이며, vcpkg.json 의 맨 앞에 반드시 적어 둘 필요가 있다.
그러나 name이 vcpkg의 방식에 따라 표기, 즉 소문자와 숫자, 하이픈만으로 해야 한다. 버전은 점으로 구분된 숫자 이외에도 여러 가지 방법에 대한 서술 방법이 있는 것 같지만, 여기에서는 설명하지 않는다. 이것이 무엇을 의미하는지는 솔직히 잘 이해하고 있지 않지만, 라이브러리 공급자가 이 라이브러리 버전의 메타 데이터를 vcpkg에 전하는데 사용한다.

builtin-baseline은 의존 라이브러리의 최소 버전을 vcpkg 커밋의 SHA로 지정한다. 만약 설치된 패키지의 버전이 builtin-baseline 것보다 오래된 경우 자동으로 업데이트 된다.

또한 dependencies는 또 다른 쓰는 방법이 있다.

"dependencies": [
    {
      "name": "boost",
      "version>=": "1.65.0"
    },
    "fmt"
 ]

여기에서의 작성은 boost 버전의 하한을 지정하고 있다. boost 이외는 builtin-baseline 버전으로 충분하지만, boost만 더 새로운 것을 사용하고 싶다 등의 경우 여기에 필요한 최소 버전을 기술한다. fmt의 최소 버전은 builtin-baseline로 판정된다.

의존 패키지의 버전을 지정한다

그러면 이번에는 드디어 boost 버전을 고정하는 방법이다. 위의 기술을 제대로 읽은 현명한 사람은 반드시 "version==": "1.64.0" 라고 쓰는 것일까,라고 생각하겠지만. 불행히도 꽝이다.

{
  "name": "MyProject",
  "version": "1.0.0",
  "dependencies": [
    "boost",
    "fmt"
  ],
  "builtin-baseline": "git commit SHA",
  "overrides": [
    { "name": "boost", "version": "1.64.0" }
  ]
}

갑자기 출현한 필드 “overrides”에 “dependencies” 버전을 덮어쓰는 정보를 기입한다. 여기에 기입된 버전은 “builtin-baseline” 또는 “version>=” 보다 우선 되어, boost는 1.64.0으로 고정된다. fmt는 overrides에는 아무것도 적혀 있지 않기 때문에, 버전은 고정되지 않고 “builtin-baseline” 이상이 설치된다.

CMake에서 빌드 할 때

CMake는 클래식 모드뿐만 아니라 CMAKE_TOOLCHAIN_FILE, VCPKG_DEFAULT_TRIPLET를 지정한다. 그 이외는 기본적으로 불필요 하고, CMake 실행시 만약 CMakeList.txt 폴더에 “vcpkg.json”가 있으면 자동으로 매니페스트 모드로 판정하고 설치까지 실행 해 준다.




vcpkg 패키지 버전 관리 - 레지스트리

출처

vcpkg의 레지스트리는 쉽게 말하면, vcpkg가 가지는 패키지의 버전 및 종속성 확장 등을 기록한 것이다.
물론 vcpkg에는 기본 레지스트리가 있고, 그 실체는 <vcpkg-root>/ports/<package-name> 디렉토리 안에 있는 CONTROL, portfile.cmake라는 포트 파일 군으로서 존재한다. 여기에는 vcpkg에 포함된 1000개 이상의 패키지에 대한 저장소 버전 등의 정보가 기재 되어 있다.

vcpkg는 최근 이 레지스트리를 사용자가 지정하는 방법이 구현 되었다. 간단히 말하면, 기본 레지스트리에 추가, 덮어 쓰기 위한 json 파일, CONTROL, portfile.cmake 등을 작성하고 이 정보를 사용하여 모든 패키지를 설치하는 것이다.

그렇다고 해도 이 방법은 주로 원래 git 저장소 등을 vcpkg에 추가하기 위해 이용하는 것이다. 이 글은 패키지 버전 관리가 목적이다. 즉, 사용자 레지스트리를 사용하여 설치 패키지 버전을 덮어 쓰고 싶은 것이다. 매니페스트 모드에서 일단 버전 지정은 가능했지만, 이것은 프로젝트 단위로 환경을 처음부터 구축할 필요가 있기 때문에, 패키지 중복 설치가 필요하는 등 어색한 측면이 있다. 이것을 회피하면서 클래식 모드에서 매니페스트 모드에서도 공통적으로 사용할 수 있는 버전 지정 방법을 도출하려고 한다.

사용자 레지스트리는 어떠한 저장소의 시험 버전 등을 사용하는 것 등도 고려된 기능으로 인해 과거 버전에 고정하는 것도 고려 하고 있지만, 공식 문서에서 이러한 용도에 대한 설명이 제대로 되어 않고, 오히려 공식 문서의 기술이 (2021/6/22)현재 오래된 사양의 상태로 업데이트 되지 않았거나, 정확하게 어떻게 동작하는지 알기가 어렵다. 패키지는 함부로 버전을 변경하면 종속성 문제가 생기거나, 빌드에 실패하기도 한다. 의존 패키지를 모두 버전 지정해서 정리하면 잘될 것이라고 생각하지만, 상당한 수고가 필요하다. 정말 이 방법을 취해야 할 것인지 충분히 검토해야 한다. 어느 단일 프로젝트 전용 환경 구축이라면 버전 지정은 매니페스트 모드 쪽이 훨씬 간단하다.

vcpkg은 2021.05.12 버전을 사용하고 있다.

사용자 정의 레지스트리

사용자 정의 레지스트리의 작성에 많은 파일이 필요하다. 우선 먼저 앞에 이야기한 CONTROL, portfile.cmake, 그 외, 사용 버전을 지정하는 baseline.json, 개별 port에 대한 .json, 그리고 레지스트리 재정의 위치를 지정하는 vcpkg-configuration.json 이다.

사용자 레지스트리 에서

  1. 자작 라이브러리 등의 새로운 포트를 만든다
  2. 기존 라브러리의 포트를 덮어쓴다
    라는 것이 가능하다. 이 중 1번에 대해서는 이 글에서는 설명하지 않는다. 어디 까지나 2를 사용하여 패키지 버전 지정을 한다.

이번에는 일단 Eigen3 버전을 이전 버전으로 내리는 것을 생각해 본다.

파일의 배치

각 파일의 설명 전에 어떤 파일을 어떻게 배치하는지에 그림으로 설명한다. 우선 vcpkg-configuration.json 인데, 이것은 vcpkg이 클래식 모드 또는 매니페스트 모드 이냐에 따라 다르다. 클래식 모드이면 vcpkg의 루트 디렉토리 아래에 배치한다. 매니페스트 모드의 경우 vcpkg. json 과 같은 폴더에 있다.


클래식 모드의 경우

  
vcpkg-root/
    vcpkg-configuration.json


매니페스트 모드의 경우

vcpkg.json와 같은 위치에

project-root/
    vcpkg-configuration.json
    vcpkg.json

다음으로 덮어쓰는 포트의 정보이다.

custom-port-path(임의의 위치)/
    ports/
         package-name/
            CONTROL
            portfile.json
            etc...
    versions/
        baseline.json
         first-character/
            eigen3.json

<custom-port-path>는 임의의 장소이다. 이것은 vcpkg-configuration.json에서 파일 경로를 직접 지정하기 때문에 어디서든 상관 없다. - 는 이 패키지의 첫 글자를 의미한다. 예를 들어 eigen3의 경우 디렉토리 이름은 `e-`이 된다. 이들은 `/ports/` 및 `/versions/`과 같은 구조이므로, 저쪽 속을 살펴보면 어떻게 되어 있는지 알 것이다.


CONTROL, portfile.cmake 등의 취득

지금 Eigen3 버전을 예를 들어 3.3.7로 내린다고 하자. 이들은 vcpkg의 2020.04 버전 등 일부 포함 되어 있다. 과거 vcpkg 중에 포함된 버전이면 CONTROL과 portfile.cmake 등의 포트 파일은 그 안에 있는 /ports/eigen3 라는 디렉토리를 통째로 복사하는 방법도 사용할 수 있다. CONTROL, portfile.cmake 이외에도 파일이 있을지도 모르지만, 그들은 패치 파일 등 필요한 정보이므로 파일을 모두 복사하고 이를 앞의 그림과 같이 설치한다. 그러나 이전 vcpkg 용 파일이므로 그대로 제대로 작동할지 여부는 형언 할 수 없다. 경우에 따라서는 일부 수정이 필요할지도 모른다.


baseline.json및 .json작성

두 json 파일을 생성한다. 첫째 baseline.json에 대해서

2020.04 버전에 포함된 Eigen3의 CONTROL를 열면 해당 버전이 포함되어 있다. 여기에는 3.3.7-4라고 되어 있었으므로, 우선 baseline. json 의 “baseline”에 해당 버전을 지정 둔다. “port-version”은 본래 vcpkg 업데이트시 패키지 버전이 변경되지 않은 경우, 포트 정보의 중복을 방지하기 위해 여기를 1 씩 증가하지만, 이번 지정 포트의 경우 원래 포트가 1 가지 밖에 없기 때문에 아마 0으로 문제 없을 것이다. 공식 문서에서도 설명없이 0이 사용 되고 있었다.

{
    "default": {
        "eigen3": {
            "baseline": "3.3.7-4",
            "port-version": 0
        }
    }
}

baseline.json은 이번에 덮어 쓴 Eigen3 뿐만 아니라 덮어 쓰려면 모든 패키지 정보를 기술하는 장소가 된다. 다음으로 .json 을 쓴다. 이번에는 eigen3.json 라는 것이다.

{
    "versions": [
        {
            "version-string": "3.3.7-4",
            "path": "$/ports/eigen3"
        }
    ]
}

이 때 “path”는 를 루트 디렉토리로 한 CONTROL 등의 파일이 담긴 디렉토리 경로이다. "$" 기호가 를 의미하고, 반드시 여기에서 상대 경로로 쓸 필요가 있다.

자, 그럼이 파일을 먼저뿐만 아니라 파일 배치도대로 설치해 두자.


vcpkg-configuration.json 작성

마지막으로 레지스트리의 재정의에 대한 정보를 vcpkg-configuration.json 에 쓴다. 지금 Eigen3는 사용자 지정 포트를 사용하여 설치하고자 하지만, 이 이외의 패키지는 vcpkg 기본 레지스트리에서 얻을 필요가 있다. 그것들을 지정하는 것이다.

{
    "default-registry": {
        "kind": "builtin",
        "baseline": "git commit SHA"
    },
    "registries": [
        {
            "kind": "filesystem",
            "path": "../custom_ports",
            "packages": [ "eigen3" ]
        }
    ]
}

“default-registry” 쪽은 그대로 기본 레지스트리 포트의 지정이 없는 패키지를 설치하는 경우에 사용된다. 대해 “registries”쪽이 무시하는 레지스트리 이다. 어떤 패키지를 어떤 레지스트리 에서 검색하거나 여기에서 지정할 수있다. “registries”는 배열이므로 포트가 여러 곳에 분산된 겨우 경우 배열 요소를 추가해 가면된다.

“kind”는

  1. “builtin”… vcpkg 포함된 레지스트리
  2. “git”… git 저장소 상의 ports/, versions/ 등
  3. “filesystem”… 디스크 위치

중 하나를 지정할 수 있다.

“builtin”의 경우 “baseline”을 지정할 필요가 있다. 이것은 vcpkg 커밋의 SHA(16 진수 40 자리 숫자)를 입력하면 된다. 무엇을 위해 사용하는지는 별로 문서 등에서 언급되어 있지 않지만, Issues에서 찾은 논의에 따르면, 자작 패키지 빌드와 테스트를 실시한 의존 패키지 버전이 명확하게 되도록 사실상 패키지 버전 목록으로 기능하는 SHA를 지정하도록 한 것 등. SHA를 지정해 두면, 과거 어떤 커밋에서 작동, 작동하지 않았는지를 명확하게 할 수 있고, 버전 전환도 1행의 수정으로 끝난다, 그래서 수고는 증가하지만 유지 보수 전체가 잘 될 것이다.

“git”는 git에서 저장소를 포트 정보 취득 처로서 지정하는 경우에 사용하는 것 같지만, CONTROL 및 portfile.json을 손수하지 않는한 때마침 vcpkg 용 포트가 있는 저장소가 우선 없다고 생각하기 때문에 이번 목적으로 사용할 수 없다. 자작 라이브러리를 vcpkg에 추가하는 경우에만 이 방법을 채택해야 할 것이다.

이번에는 “filesystem”을 사용 하였다. filesystem의 경우에 필요한 것은 “path” 정보이다. 앞에 baseline.json과 eigen3.json를 둔 를 여기에 지정한다. 그러나 아무래도 드라이브 문자로 시작하는 절대 경로는 받아들이지 않는 것 같고, 위와 같이 에서 상대 경로로 쓴 것이 좋을 것이다.

마지막으로 “packages”를 지정한다. 이 포트 정보를 취득하는 패키지 목록을 이 배열 안에 쓰면 된다. eigen3 이외에도 사용자 정의를 할 패키지가 custom_ ports 에 있다면, 이것도 “packages”에 넣는다.


설치

이상의 파일 배치가 제대로 완료 되었는지를 확인한 후 예를 들어 아래와 같이 명령을 실행하여 원하는 버전이 나타나는지 확인하자.

vcpkg search eigen3

특히 오류 등이 나오지 않고 제대로 “3.3.7-4” 라고 표시되면 일단 사용자 레지스트리의 작성은 끝났이다. 설치 등은 정상적으로 되었다.




참고


이 글은 2023-05-01에 작성되었습니다.