概述
Vcpkg使用起來確實比較方便,基本上是免工程配置,但是現在只支持Visual Studio 2015及以上版本,那么,是否有可能支持Visual Studio 2010呢?或者說支持各種Visual Studio版本?
局限從何而來
之前講過,Vcpkg能夠整合到Visual Studio 2015上是因為有MSBuild擴展點可以導入配置,擴展點在:
$(MSBUILDLOCATION)/Microsoft.Cpp/v4.0/V140/ImportBefore/Default/
那么,如果能夠找到Visual Studio 2010對應的MSBuild擴展點,就可以實現對應的庫管理器。
Visual Studio 2010的擴展點
任意打開一個Visual Studio 2010的工程,在工程配置頁簽打開宏,輸入custom
,即可看到:
擴展點
也就是說,Visual Studio 2010的MSBuild也是支持擴展的,具體位置在:
C:\Program Files (x86)\MSBuild\v4.0\
在MicrosoftCommonTargets
之前和之后都可以插入對應的.Targets
。
支持Visual Studio 2010庫的方法
- Vcpkg的triplet可以修改為
[x86/x64]-windows-[v100/v140]-static
類似這種組合方式; -
portfile.cmake
腳本中可以根據VCPKG_TOOLSET
得到對應的Visual Studio版本,然后執行對應的構建流程; - 在整合Visual Studio時,根據不同的版本寫入調整不同的
.targets
文件來實現任何版本的庫配置導入; - 根據不同的toolset和platform合成不同的triplet,來保證庫導入正確。
延伸
如果不需要全局庫管理,僅僅是針對于對應的sln或者vcxproj,從上述擴展思路延伸來看,可以實現局部庫管理:
- 根據約定統一存放依賴庫的include、library和binary
- 編寫
librarys.targets
文件來完成庫導入 - 編寫與sln和vcxproj同名的
.targets
文件
使用$(MSBuildThisFileDirectory)
獲取當前路徑來保證相對位置:
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Generate By pkgUser" AfterTargets="AfterBuild">
<Message Text="*** author:liff.engineer@gmail.com ***" Importance="high"/>
</Target>
<Import Condition="Exists('$(MSBuildThisFileDirectory)..\..\config\librarys.targets')" Project="$(MSBuildThisFileDirectory)..\..\config\librarys.targets"/>
</Project>
- 使用Visual Studio的擴展點導入
.targets
譬如,導入與sln路徑下同名的庫配置:
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(SolutionPath).targets" Condition="Exists('$(SolutionPath).targets')" />
</Project>
通過上述步驟即可完成面向解決方案的庫管理及配置。