概述
Vcpkg使用起來(lái)確實(shí)比較方便,基本上是免工程配置,但是現(xiàn)在只支持Visual Studio 2015及以上版本,那么,是否有可能支持Visual Studio 2010呢?或者說(shuō)支持各種Visual Studio版本?
局限從何而來(lái)
之前講過(guò),Vcpkg能夠整合到Visual Studio 2015上是因?yàn)橛蠱SBuild擴(kuò)展點(diǎn)可以導(dǎo)入配置,擴(kuò)展點(diǎn)在:
$(MSBUILDLOCATION)/Microsoft.Cpp/v4.0/V140/ImportBefore/Default/
那么,如果能夠找到Visual Studio 2010對(duì)應(yīng)的MSBuild擴(kuò)展點(diǎn),就可以實(shí)現(xiàn)對(duì)應(yīng)的庫(kù)管理器。
Visual Studio 2010的擴(kuò)展點(diǎn)
任意打開(kāi)一個(gè)Visual Studio 2010的工程,在工程配置頁(yè)簽打開(kāi)宏,輸入custom,即可看到:

擴(kuò)展點(diǎn)
也就是說(shuō),Visual Studio 2010的MSBuild也是支持?jǐn)U展的,具體位置在:
C:\Program Files (x86)\MSBuild\v4.0\
在MicrosoftCommonTargets之前和之后都可以插入對(duì)應(yīng)的.Targets。
支持Visual Studio 2010庫(kù)的方法
- Vcpkg的triplet可以修改為
[x86/x64]-windows-[v100/v140]-static類(lèi)似這種組合方式; -
portfile.cmake腳本中可以根據(jù)VCPKG_TOOLSET得到對(duì)應(yīng)的Visual Studio版本,然后執(zhí)行對(duì)應(yīng)的構(gòu)建流程; - 在整合Visual Studio時(shí),根據(jù)不同的版本寫(xiě)入調(diào)整不同的
.targets文件來(lái)實(shí)現(xiàn)任何版本的庫(kù)配置導(dǎo)入; - 根據(jù)不同的toolset和platform合成不同的triplet,來(lái)保證庫(kù)導(dǎo)入正確。
延伸
如果不需要全局庫(kù)管理,僅僅是針對(duì)于對(duì)應(yīng)的sln或者vcxproj,從上述擴(kuò)展思路延伸來(lái)看,可以實(shí)現(xiàn)局部庫(kù)管理:
- 根據(jù)約定統(tǒng)一存放依賴(lài)庫(kù)的include、library和binary
- 編寫(xiě)
librarys.targets文件來(lái)完成庫(kù)導(dǎo)入 - 編寫(xiě)與sln和vcxproj同名的
.targets文件
使用$(MSBuildThisFileDirectory)獲取當(dāng)前路徑來(lái)保證相對(duì)位置:
<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的擴(kuò)展點(diǎn)導(dǎo)入
.targets
譬如,導(dǎo)入與sln路徑下同名的庫(kù)配置:
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(SolutionPath).targets" Condition="Exists('$(SolutionPath).targets')" />
</Project>
通過(guò)上述步驟即可完成面向解決方案的庫(kù)管理及配置。