다음을 통해 공유


작성 스크립트 포트

도우미 포트라고도 하는 스크립트 포트는 빌드 프로세스 중에 사용할 다른 포트에 대한 함수를 노출합니다. 예를 들어, vcpkg-cmake 포트는 다른 포트가 사용할 수 있도록 vcpkg_cmake_configure() 함수를 정의합니다. 일반적인 스크립트를 도우미 포트에 패키징하면 단일 위치에서 업데이트를 수행할 수 있으므로 유지 관리가 더욱 간소화됩니다. 또한 도우미 포트도 버전을 지정할 수 있고 일반 포트와 동일한 메커니즘을 사용하여 의존할 수 있습니다.

어떻게 작동합니까?

도우미 포트는 확장 메커니즘을 vcpkg-port-config.cmake 통해 구현됩니다.

포트를 실행하기 전에 vcpkg는 실행될 포트의 직접 종속성에 의해 내보낸 모든 vcpkg-port-config.cmake 파일을 가져옵니다.

도우미 포트가 다른 도우미 포트에 종속된 경우 종속성 파일을 명시적으로 가져와 vcpkg-port-config.cmake 야 합니다. 도우미-도우미 포트 종속성은 호스트 종속성으로 표시되지 않아야 합니다. 이렇게 하면 한 스크립트가 동일한 설치 디렉터리에 있는 다른 스크립트에 종속될 수 있습니다.

도우미 포트에 종속된 포트는 종속성을 호스트 종속성으로 표시해야 합니다.

도우미 포트는 항상 vcpkg-port-config.cmakeshare/${PORT} 하위 디렉터리에 해당 파일을 설치 해야 합니다.

예: 간단한 도우미 포트 작성

1 - 도우미 함수를 정의하는 CMake 파일을 만듭니다.

my-helper/my_helper_function.cmake

include_guard(GLOBAL)

function(my_helper_function)
  message(STATUS "my_helper_function() was called")
  my_other_helper_function()
endfunction()

include_guard(GLOBAL) 파일이 여러 번 포함될 때 파일 맨 위에 있는 이 함수를 다시 정의하지 않도록 보호합니다.

다음 줄은 메시지를 표시하고 다른 도우미 포트에 정의된 함수를 my_helper_function 호출하는 함수 my_other_helper_function 를 선언합니다.

2 - 도우미 포트의 porftile.cmake 파일 만들기

my-helper/portfile.cmake

set(VCPKG_POLICY_CMAKE_HELPER_PORT enabled)

file(INSTALL "${CMAKE_CURRENT_LIST_DIR}/my_helper_function.cmake" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}")
file(INSTALL "${CMAKE_CURRENT_LIST_DIR}/vcpkg-port-config.cmake" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}")

file(INSTALL "${VCPKG_ROOT_DIR}/LICENSE.txt" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright)

정책을 VCPKG_POLICY_CMAKE_HELPER_PORT 사용하도록 설정하면 vcpkg는 도우미 포트에 특화된 빌드 후 검사를 사용하도록 설정합니다. 특히 vcpkg-port-config.cmake이 올바른 경로에 설치되어 있고, include 디렉터리에 파일이 설치되지 않았는지 확인합니다.

다음 줄은 필요한 vcpkg-port-config.cmake 파일과 copyright 파일을 올바른 위치(share/${PORT})에 설치합니다.

3 - 도우미 포트의 vcpkg.json 파일 만들기

my-helper/vcpkg.json

{
  "name": "my-helper",
  "version-date": "2024-03-20",
  "description": "Provide my_helper_function()",
  "license": "MIT",
  "dependencies": [ 
    { "name": "my-other-helper" } 
  ]
}

도우미 포트의 version-date로 사용하는 것이 좋습니다.

dependencies 예제에서는 이름이 my-other-helper다른 도우미 포트에 대한 참조를 포함합니다. 종속성은 도우미-도우미 포트 종속성이므로 의도적으로 호스트 종속성으로 표시되지 않습니다.

4 - 도우미 포트의 vcpkg-port-config.cmake파일 만들기

my-helper/vcpkg-port-config.cmake

include_guard(GLOBAL)

include("${CMAKE_CURRENT_LIST_DIR}/../my-other-helper/vcpkg-port-config.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/my_helper_function.cmake")

파일은 vcpkg-port-config.cmake 세 줄로 구성되며, 첫 번째는 파일이 여러 번 포함되지 않도록 하는 전역 include guard입니다.

직접 종속성 목록에 my-other-helper를 포함하지 않고도 my-other-helper에 종속된 포트에서 my-helper의 함수를 사용할 수 있도록 두 번째 줄에 my-other-helper/vcpkg-port-config.cmake가 포함됩니다.

마지막으로 my_helper_function.cmake 정의를 포함하고 있는 my_helper_function 파일이 포함됩니다.

5 - 매니페스트에서 my-helper을(를) 소모하다

my-helper의 모든 소비자는 my-helper에 대한 직접 종속성을 포함해야 하며, my-other-helper에 대한 종속성이 필요하지 않습니다. 소비 매니페스트는 종속성을 호스트 종속성으로 표시해야 합니다.

my-port/vcpkg.json

{
  "name": "my-port",
  "version": "1.0.0",
  "dependencies": [
    {
      "name": "my-helper",
      "host": true
    }
  ]
}

이 기능은 my_helper_function에서 my-port/portfile.cmake 사용할 수 있습니다.

my-port/portfile.cmake

my_helper_function()