このチュートリアルでは、カスタム オーバーレイを使用して vcpkg ポートを変更する方法について説明します。 先に進む前に、ライブラリのパッケージ化に関するチュートリアルをお読みください。
このチュートリアルでは、次の事項について説明します。
前提条件
1 - オーバーレイ ポートを作成する
最初の手順では、変更する パッケージのオーバーレイ ポート を作成します。
オーバーレイ ポートを保持するディレクトリを作成する
オーバーレイ ポート ディレクトリは、任意のファイルシステムの場所に作成できます。 このチュートリアルの任意の手順で、選択した場所に置き換えます $OVERLAY_LOCATION
。
mkdir "$OVERLAY_LOCATION"
mkdir "$OVERLAY_LOCATION"
ポートの内容をオーバーレイ ポート ディレクトリにコピーする
このチュートリアルでは、パッケージ化チュートリアルのポートをvcpkg-sample-library
変更して、動的ライブラリのサポートを追加します。
Copy-Item -Path <path/to/vcpkg-sample-library> -Destination "$OVERLAY_LOCATION" -Recurse
xcopy <path/to/vcpkg-sample-library> "$OVERLAY_LOCATION" /E
cp -R <path/to/vcpkg-sample-library> "$OVERLAY_LOCATION"
2 - ポートのソース コードを取得する
変更するポートのソース コードを取得するには、次のコマンドを実行します。
vcpkg install "--overlay-ports=$OVERLAY_LOCATION" vcpkg-sample-library --editable
出力には、次のような行が含まれている必要があります。
-- Using source at path/to/vcpkg/buildtrees/vcpkg-sample-library/src/1.0.0-b54c55c215
これはポートのソース コードの場所です。
3 - 一時的な Git レジストリを作成する
ソース コードの場所で一時 Git リポジトリを初期化します。 これは、Git を使用して、スクリプトで適用できるパッチ ファイルを portfile.cmake
生成するために使用されます。 前の手順で取得した場所に置き換えます $SOURCE_PATH
。
cd "$SOURCE_PATH"
git init
git add .
git commit -m "Initial commit"
4 - 必要なファイルを変更する
次のソース コード ファイルを変更して、動的ライブラリのサポートを追加します vcpkg-sample-library
。
my_sample_lib.h
#pragma once
#include <string>
#if MYLIB_EXPORTS
__declspec(dllexport)
#endif
std::string greet(const std::string& name);
CMakeLists.txt
呼び出しから削除 STATIC
します add_library()
。
add_library(my_sample_lib my_sample_lib.cpp)
共有ライブラリとしてビルドするときにコンパイル定義を追加します。
if (BUILD_SHARED_LIBS)
target_compile_definitions(my_sample_lib PRIVATE MYLIB_EXPORTS)
endif()
5 - パッチ ファイルを生成する
ソース コード ディレクトリで、次のコマンドを実行してパッチ ファイルを生成します。
git diff --output "$OVERLAY_LOCATION/vcpkg-sample-library/add-dynamic-lib-support.patch"
これにより、オーバーレイ ポートに次 add-dynamic-lib-support.patch
のような名前のファイルが作成されます。
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2b42f71..378aac7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,26 +2,33 @@ cmake_minimum_required(VERSION 3.10)
project(my_sample_lib)
+include(GNUInstallDirs)
+
# Find the fmt library
find_package(fmt CONFIG REQUIRED)
# Add your library
-add_library(my_sample_lib STATIC my_sample_lib.cpp)
+add_library(my_sample_lib my_sample_lib.cpp)
+
+if (BUILD_SHARED_LIBS AND MSVC)
+ target_compile_definitions(my_sample_lib PRIVATE MYLIB_EXPORTS)
+endif()
# Link your library to fmt
target_link_libraries(my_sample_lib PRIVATE fmt::fmt)
+
# Add include directories
target_include_directories(my_sample_lib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> # for headers when building
- $<INSTALL_INTERFACE:include> # for client in install mode
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> # for client in install mode
)
# Install the library and its headers
install(TARGETS my_sample_lib
EXPORT my_sample_lib_targets
- ARCHIVE DESTINATION lib
- LIBRARY DESTINATION lib
- RUNTIME DESTINATION bin)
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
install(FILES my_sample_lib.h DESTINATION include)
diff --git a/my_sample_lib.h b/my_sample_lib.h
index d6d70b8..0b62141 100644
--- a/my_sample_lib.h
+++ b/my_sample_lib.h
@@ -2,4 +2,7 @@
#include <string>
+#if MYLIB_EXPORTS
+__declspec(dllexport)
+#endif
std::string greet(const std::string& name);
6 - 修正 portfile.cmake
プログラムを適用する
制限をONLY_STATIC_LIBRARY
削除し、ソース コードにパッチを適用するように変更portfile.cmake
します。
portfile.cmake
vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH
REPO MicrosoftDocs/vcpkg-docs
REF 1.0.0 # This is for demonstration purposes as '1.0.2' of the sample library already has dynamic library support
SHA512 3f206cc2fe61d9c97c82b30852e1e4e6df299d93f6159edd1e56c644fa03ccc4670f7681e356d0e3db898a74e099a1ec531821df5430a7b14d61c743c5aa8c30
HEAD_REF cmake-sample-lib
PATCHES
"add-dynamic-lib-support.patch"
)
vcpkg_cmake_configure(
SOURCE_PATH "${SOURCE_PATH}"
)
vcpkg_cmake_install()
vcpkg_cmake_config_fixup(PACKAGE_NAME "my_sample_lib")
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include")
file(INSTALL "${CMAKE_CURRENT_LIST_DIR}/usage" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}")
vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE")
7 - オーバーレイ ポートをインストールする
次のコマンドを実行します。
vcpkg install "--overlay-ports=$OVERLAY_LOCATION" vcpkg-sample-library
パッチ ファイルがソース コードの--editable
クリーン コピーに適用されるように、必ずフラグを削除してください。 出力のソース コードにパッチ ファイルを適用する方法に関する行が表示されます。
-- Cleaning sources at D:/Work/vcpkg/buildtrees/vcpkg-sample-library/src/1.0.0-8f646312ed.clean. Use --editable to skip cleaning for the packages you specify.
-- Extracting source D:/Work/vcpkg/downloads/Microsoft-vcpkg-docs-1.0.0.tar.gz
-- Applying patch add-dynamic-lib-support.patch
次のステップ
以上で作業は終了です。 パッチ ファイルを使用して、ローカルに変更された依存関係をインストールしました。
次に試すタスクを次に示します。
vcpkg