緣起
在OAuth2.0和C++ REST SDK使用示例中遇到了無法擷取令牌的問題,最終發現示例用的是最新的C++ REST SDK,而本地安裝的不是最新的,耗費了很多時間最終把示例跑通了;
于是之後就更新Vcpkg,但是C++ REST SDK安裝不上了!
Vcpkg的變化
在最新的版本上,增加了庫建構依賴,譬如C++ REST SDK的CONTROL:
Source: cpprestsdk
Version: 2.9.0-1
Build-Depends: zlib [windows], openssl [windows], boost [windows]
Description: C++11 JSON, REST, and OAuth library
The C++ REST SDK is a Microsoft project for cloud-based client-server communication in native code using a modern asynchronous C++ API design. This project aims to help C++ developers connect to and interact with services.
新增了Build-Depends;也就是說,如果嘗試安裝cpprestsdk,會先安裝其依賴:zlib、openssl、boost。
下載下傳boost太艱難
因為網絡的原因,在zlib安裝完成之後,就卡到了boost下載下傳這一步......
最後無奈手動下載下傳了boost源碼包放在vcpkg/downloads下才将boost安裝成功。
openssl建構失敗
建構openssl時失敗了,打開vcpkg/buildtrees/openssl下的建構日志,發現在使用源代碼下的util/copy.pl複制檔案時失敗了......
雖然以前寫過perl腳本,但是許久不用,有些生疏,用了print大法之後,發現在執行複制時,傳遞的檔案清單被包裹上了"号,本來是複制ms/applink.c,由于附加了",變成了複制"ms/applink.c",于是就找不到對應檔案引發報錯。
我電腦上使用了Cmder,内置了perl解釋器,于是懷疑是它的原因,但是下載下傳perl耗時太久,無奈就想辦法調整copy.pl。
在copy.pl腳本第22行附加,看到了這樣一些資訊:
$arg =~ s|\\|/|g; # compensate for bug/feature in cygwin glob...
foreach (glob "\"$arg\"")
由于建構日志中顯示copy_if_different.pl執行是沒有問題的,對比發現是如下的問題:
foreach (glob "\"$arg\"") # copy.pl
foreach (glob $arg) # copy_if_different.pl
{
push @filelist, $_;
}
對perl了解過的都知道,$_擷取的是上一次的結果,copy.pl的寫法裡用"包裹了字元串,進而導緻了之前的問題。
openssl的解決方法
将調整好的copy.pl替換掉原先的copy.pl後即可,如何替換?
将copy.pl置于vcpkg/ports/openssl中
在portfile.cmake中将copy.pl複制到源代碼路徑
file(COPY
${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt
${CMAKE_CURRENT_LIST_DIR}/PerlScriptSpaceInPathFixes.patch
${CMAKE_CURRENT_LIST_DIR}/ConfigureIncludeQuotesFix.patch
${CMAKE_CURRENT_LIST_DIR}/STRINGIFYPatch.patch
${CMAKE_CURRENT_LIST_DIR}/copy.pl
DESTINATION ${SOURCE_PATH})
修改vcpkg\ports\openssl中的CMakeLists.txt,複制copy.pl到正确的位置
由于建構流程的限制,在上一步驟中無法将copy.pl複制到正确的位置,需要再做一步。
vcpkg_apply_patches(
SOURCE_PATH ${SOURCE_PATH}
PATCHES ${CMAKE_CURRENT_LIST_DIR}/PerlScriptSpaceInPathFixes.patch
${CMAKE_CURRENT_LIST_DIR}/ConfigureIncludeQuotesFix.patch
${CMAKE_CURRENT_LIST_DIR}/STRINGIFYPatch.patch
)
file(COPY
${CMAKE_CURRENT_LIST_DIR}/copy.pl
DESTINATION ${SOURCE_PATH}/util)
總結
建構的流程萬變不離其宗,通過了解Vcpkg的實作,了解正常的構造流程,碰到問題時多分析多思考,就可以解決問題。