diff options
Diffstat (limited to 'scripts/buildsystems')
| -rw-r--r-- | scripts/buildsystems/msbuild/vcpkg-general.xml | 42 | ||||
| -rw-r--r-- | scripts/buildsystems/msbuild/vcpkg.props | 10 | ||||
| -rw-r--r-- | scripts/buildsystems/msbuild/vcpkg.targets | 43 | ||||
| -rw-r--r-- | scripts/buildsystems/vcpkg.cmake | 84 |
4 files changed, 149 insertions, 30 deletions
diff --git a/scripts/buildsystems/msbuild/vcpkg-general.xml b/scripts/buildsystems/msbuild/vcpkg-general.xml index 2ee5599be..55d5a736b 100644 --- a/scripts/buildsystems/msbuild/vcpkg-general.xml +++ b/scripts/buildsystems/msbuild/vcpkg-general.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?>
<Rule
- Name="VcpkgGeneral"
+ Name="VcpkgOptions"
DisplayName="Vcpkg"
PageTemplate="generic"
Description="Vcpkg"
@@ -11,16 +11,28 @@ <Rule.DataSource>
<DataSource Persistence="ProjectFile" Label="Vcpkg" HasConfigurationCondition="true" />
</Rule.DataSource>
- <BoolProperty Name="VcpkgEnabled"
- DisplayName="Use Vcpkg"
- Description="Use Vcpkg for includes and libraries."
- Category="General"
+ <BoolProperty Name="VcpkgEnabled"
+ DisplayName="Use Vcpkg"
+ Description="Use Vcpkg for includes and libraries."
+ Category="General"
+ Default="true">
+ </BoolProperty>
+ <BoolProperty Name="VcpkgEnableManifest"
+ DisplayName="Use Vcpkg Manifest"
+ Description="Use the vcpkg manifest file to define your dependencies."
+ Category="General"
+ Default="false">
+ </BoolProperty>
+ <BoolProperty Name="VcpkgManifestInstall"
+ DisplayName="Install vcpkg dependencies"
+ Description="Install dependencies from the vcpkg manifest."
+ Category="General"
Default="true">
</BoolProperty>
- <BoolProperty Name="VcpkgUseStatic"
- DisplayName="Use static libraries"
- Description="Vcpkg can build static libraries (e.g. x64-windows-static). This options changes the default triplet to use these static libraries by appending -static to $(VcpkgTriplet). This will not be shown in the evaluation of the Triplet within the UI."
- Category="General"
+ <BoolProperty Name="VcpkgUseStatic"
+ DisplayName="Use static libraries"
+ Description="Vcpkg can build static libraries (e.g. x64-windows-static). This options changes the default triplet to use these static libraries by appending -static to $(VcpkgTriplet). This will not be shown in the evaluation of the Triplet within the UI."
+ Category="General"
Default="false">
</BoolProperty>
<BoolProperty Name="VcpkgAutoLink"
@@ -42,11 +54,19 @@ Subtype="folder"
Visible="false">
</StringProperty>
+ <StringProperty Name="VcpkgManifestRoot"
+ DisplayName="Vcpkg Manifest Root"
+ Description="The path to the directory which contains the manifest file, and the vcpkg_installed directory."
+ Category="General"
+ Subtype="folder"
+ Visible="false">
+ </StringProperty>
<StringProperty Name="VcpkgCurrentInstalledDir"
DisplayName="Package install directory"
Description="Defines the direct path to the installed Vcpkg packages. Only change this if you know what you are doing!"
Category="General"
- Subtype="folder">
+ Subtype="folder"
+ Visible="false">
</StringProperty>
<EnumProperty Name="VcpkgConfiguration" DisplayName="Vcpkg Configuration" Description="Specifies if release or debug libraries build with vcpkg should be used." Category="General">
<EnumValue Name="Release" Switch="Release" DisplayName="Release" Description="Uses release libraries">
@@ -54,4 +74,4 @@ <EnumValue Name="Debug" Switch="Debug" DisplayName="Debug" Description="Uses debug libraries">
</EnumValue>
</EnumProperty>
-</Rule>
\ No newline at end of file +</Rule>
diff --git a/scripts/buildsystems/msbuild/vcpkg.props b/scripts/buildsystems/msbuild/vcpkg.props index a9b97348f..f9db4fc58 100644 --- a/scripts/buildsystems/msbuild/vcpkg.props +++ b/scripts/buildsystems/msbuild/vcpkg.props @@ -25,11 +25,17 @@ <VcpkgPlatformTarget Condition="'$(VcpkgPlatformTarget)' == ''">$(Platform)</VcpkgPlatformTarget>
</PropertyGroup>
+ <!-- Manifest files -->
+ <PropertyGroup>
+ <VcpkgEnableManifest Condition="'$(VcpkgEnableManifest)' == ''">false</VcpkgEnableManifest>
+ <VcpkgManifestInstall Condition="'$(VcpkgManifestInstall)' == ''">true</VcpkgManifestInstall>
+ <VcpkgManifestRoot>$([MSbuild]::GetDirectoryNameOfFileAbove($(MSBuildProjectDirectory), vcpkg.json))</VcpkgManifestRoot>
+ </PropertyGroup>
+
<!-- Set other defaults-->
<PropertyGroup>
<VcpkgUserTriplet Condition="'$(VcpkgUserTriplet)' == ''">$(VcpkgPlatformTarget)-$(VcpkgOSTarget)</VcpkgUserTriplet>
<VcpkgTriplet Condition="'$(VcpkgTriplet)' == ''">$(VcpkgUserTriplet)</VcpkgTriplet>
- <VcpkgCurrentInstalledDir Condition="'$(VcpkgCurrentInstalledDir)' == ''">$(VcpkgRoot)\installed\$(VcpkgTriplet)\</VcpkgCurrentInstalledDir>
<VcpkgPageSchema>$(VcpkgRoot)\scripts\buildsystems\msbuild\vcpkg-general.xml</VcpkgPageSchema>
- </PropertyGroup>
+ </PropertyGroup>
</Project>
diff --git a/scripts/buildsystems/msbuild/vcpkg.targets b/scripts/buildsystems/msbuild/vcpkg.targets index 626e72228..0f562a876 100644 --- a/scripts/buildsystems/msbuild/vcpkg.targets +++ b/scripts/buildsystems/msbuild/vcpkg.targets @@ -7,6 +7,9 @@ <VcpkgRoot Condition="'$(VcpkgRoot)' == ''">$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), .vcpkg-root))</VcpkgRoot> <VcpkgConfiguration Condition="'$(VcpkgConfiguration)' == ''">$(Configuration)</VcpkgConfiguration> <VcpkgPageSchema Condition="'$(VcpkgPageSchema)' == ''">$(VcpkgRoot)\scripts\buildsystems\msbuild\vcpkg-general.xml</VcpkgPageSchema> + <VcpkgEnableManifest Condition="'$(VcpkgEnableManifest)' == ''">false</VcpkgEnableManifest> + <VcpkgManifestInstall Condition="'$(VcpkgManifestInstall)' == ''">true</VcpkgManifestInstall> + <VcpkgManifestRoot>$([MSbuild]::GetDirectoryNameOfFileAbove($(MSBuildProjectDirectory), vcpkg.json))</VcpkgManifestRoot> </PropertyGroup> <!-- Set default OS Target--> @@ -22,7 +25,7 @@ <VcpkgUserTriplet Condition="'$(VcpkgUserTriplet)' == ''">$(PlatformTarget)-$(VcpkgOSTarget)</VcpkgUserTriplet> <VcpkgTriplet Condition="'$(VcpkgTriplet)' == ''">$(VcpkgUserTriplet)</VcpkgTriplet> <VcpkgCurrentInstalledDir Condition="'$(VcpkgCurrentInstalledDir)' == ''">$(VcpkgRoot)\installed\$(VcpkgTriplet)\</VcpkgCurrentInstalledDir> - </PropertyGroup> + </PropertyGroup> <!--Import property page for vcpkg --> <ItemGroup Condition="'$(VcpkgPageSchema)' != '' "> @@ -31,19 +34,24 @@ </PropertyPageSchema> </ItemGroup> + <!-- Update properties if manifests are enabled or disabled --> + <PropertyGroup Condition="'$(VcpkgEnableManifest)' == 'true'"> + <VcpkgInstalledDir>$(VcpkgManifestRoot)\vcpkg_installed\</VcpkgInstalledDir> + </PropertyGroup> + <PropertyGroup Condition="'$(VcpkgEnableManifest)' != 'true'"> + <VcpkgInstalledDir>$(VcpkgRoot)\installed\</VcpkgInstalledDir> + </PropertyGroup> + <!-- Update properties if using static libs--> <PropertyGroup Condition="'$(VcpkgUseStatic)' == 'true'"> - <VcpkgTripletTmp>$(VcpkgUserTriplet)</VcpkgTripletTmp> - <VcpkgTriplet>$(VcpkgTripletTmp)-static</VcpkgTriplet> - <VcpkgCurrentInstalledDir Condition="'$(VcpkgCurrentInstalledDir)' == '$(VcpkgRoot)\installed\$(VcpkgTripletTmp)\'">$(VcpkgRoot)\installed\$(VcpkgTriplet)\</VcpkgCurrentInstalledDir> - <VcpkgTripletTmp /> + <VcpkgTriplet>$(VcpkgUserTriplet)-static</VcpkgTriplet> </PropertyGroup> - <PropertyGroup Condition="'$(VcpkgUseStatic)' != 'true'"> - <VcpkgTripletTmp>$(VcpkgTriplet)</VcpkgTripletTmp> - <VcpkgTriplet Condition="'$(VcpkgTriplet)'!='$(VcpkgUserTriplet)'">$(VcpkgUserTriplet)</VcpkgTriplet> - <VcpkgCurrentInstalledDir Condition="'$(VcpkgCurrentInstalledDir)' == '$(VcpkgRoot)\installed\$(VcpkgTripletTmp)\'">$(VcpkgRoot)\installed\$(VcpkgUserTriplet)\</VcpkgCurrentInstalledDir> - <VcpkgTripletTmp /> + <VcpkgTriplet>$(VcpkgUserTriplet)</VcpkgTriplet> + </PropertyGroup> + + <PropertyGroup Condition="'$(VcpkgCurrentInstalledDir)' == ''"> + <VcpkgCurrentInstalledDir>$(VcpkgInstalledDir)$(VcpkgTriplet)</VcpkgCurrentInstalledDir> </PropertyGroup> <PropertyGroup Condition="'$(VcpkgEnabled)' == 'true'"> @@ -51,8 +59,9 @@ <VcpkgNormalizedConfiguration Condition="$(VcpkgConfiguration.StartsWith('Release')) or '$(VcpkgConfiguration)' == 'RelWithDebInfo' or '$(VcpkgConfiguration)' == 'MinSizeRel'">Release</VcpkgNormalizedConfiguration> <VcpkgRoot Condition="!$(VcpkgRoot.EndsWith('\'))">$(VcpkgRoot)\</VcpkgRoot> <VcpkgCurrentInstalledDir Condition="!$(VcpkgCurrentInstalledDir.EndsWith('\'))">$(VcpkgCurrentInstalledDir)\</VcpkgCurrentInstalledDir> + <VcpkgManifestRoot Condition="!$(VcpkgManifestRoot.EndsWith('\'))">$(VcpkgManifestRoot)\</VcpkgManifestRoot> <VcpkgApplocalDeps Condition="'$(VcpkgApplocalDeps)' == ''">true</VcpkgApplocalDeps> - <!-- Deactivate Autolinking if lld is used as a linker. (Until a better way to solve the problem is found!). + <!-- Deactivate Autolinking if lld is used as a linker. (Until a better way to solve the problem is found!). Tried to add /lib as a parameter to the linker call but was unable to find a way to pass it as the first parameter. --> <VcpkgAutoLink Condition="'$(UseLldLink)' == 'true' and '$(VcpkgAutoLink)' == ''">false</VcpkgAutoLink> </PropertyGroup> @@ -72,12 +81,22 @@ </ResourceCompile> </ItemDefinitionGroup> + <Target Name="VcpkgCheckManifestRoot" Condition="'$(VcpkgEnabled)' == 'true'" BeforeTargets="VcpkgInstallManifestDependencies"> + <Error Text="The Vcpkg manifest was enabled, but we couldn't find a manifest file (vcpkg.json) in any directories above $(MSBuildProjectDirectory). Please add a manifest, disable manifests in your properties page, or pass /p:VcpkgEnableManifest=false." Condition="'$(VcpkgEnableManifest)' == 'true' and '$(VcpkgManifestRoot)' == ''" /> + <Message Text="The Vcpkg manifest was disabled, but we found a manifest file in $(VcpkgManifestRoot). You may want to enable vcpkg manifests in your properties page or pass /p:VcpkgEnableManifest=true to the msbuild invocation." Importance="High" Condition="'$(VcpkgEnableManifest)' != 'true' and '$(VcpkgManifestRoot)' != ''" /> + </Target> + <Target Name="VcpkgTripletSelection" BeforeTargets="ClCompile"> <Message Text="Using triplet "$(VcpkgTriplet)" from "$(VcpkgCurrentInstalledDir)"" Importance="High" Condition="'$(VcpkgEnabled)' == 'true'"/> <Message Text="Not using Vcpkg because VcpkgEnabled is "$(VcpkgEnabled)"" Importance="High" Condition="'$(VcpkgEnabled)' != 'true'"/> <Message Text="Vcpkg is unable to link because we cannot decide between Release and Debug libraries. Please define the property VcpkgConfiguration to be 'Release' or 'Debug' (currently '$(VcpkgConfiguration)')." Importance="High" Condition="'$(VcpkgEnabled)' == 'true' and '$(VcpkgNormalizedConfiguration)' == ''"/> </Target> + <Target Name="VcpkgInstallManifestDependencies" Condition="'$(VcpkgEnabled)' == 'true' and '$(VcpkgEnableManifest)' == 'true' and '$(VcpkgManifestInstall)' == 'true'" BeforeTargets="ClCompile"> + <Message Text="Installing vcpkg dependencies" Importance="High" /> + <Exec Command="%22$(VcpkgRoot)vcpkg.exe%22 install --triplet %22$(VcpkgTriplet)%22 --vcpkg-root %22$(VcpkgRoot)\%22 %22--x-manifest-root=$(VcpkgManifestRoot)\%22 %22--x-install-root=$(VcpkgInstalledDir)\%22 --binarycaching" StandardOutputImportance="High" /> + </Target> + <Target Name="AppLocalFromInstalled" AfterTargets="CopyFilesToOutputDirectory" BeforeTargets="CopyLocalFilesOutputGroup;RegisterOutput" Condition="'$(VcpkgEnabled)' == 'true' and '$(VcpkgApplocalDeps)' == 'true'"> <WriteLinesToFile File="$(TLogLocation)$(ProjectName).write.1u.tlog" @@ -98,4 +117,4 @@ <ReferenceCopyLocalPaths Include="@(VcpkgAppLocalDLLs)" /> </ItemGroup> </Target> -</Project>
\ No newline at end of file +</Project> diff --git a/scripts/buildsystems/vcpkg.cmake b/scripts/buildsystems/vcpkg.cmake index 03926336b..10be7a423 100644 --- a/scripts/buildsystems/vcpkg.cmake +++ b/scripts/buildsystems/vcpkg.cmake @@ -5,6 +5,46 @@ mark_as_advanced(CMAKE_TOOLCHAIN_FILE) option(VCPKG_VERBOSE "Enables messages from the VCPKG toolchain for debugging purposes." OFF) mark_as_advanced(VCPKG_VERBOSE) +function(_vcpkg_get_directory_name_of_file_above OUT DIRECTORY FILENAME) + if(DEFINED ${OUT}) + return() + endif() + + set(_vcpkg_get_dir_candidate ${DIRECTORY}) + while(IS_DIRECTORY ${_vcpkg_get_dir_candidate} AND NOT DEFINED _vcpkg_get_dir_out) + if(EXISTS ${_vcpkg_get_dir_candidate}/${FILENAME}) + set(_vcpkg_get_dir_out ${_vcpkg_get_dir_candidate}) + else() + get_filename_component(_vcpkg_get_dir_candidate_tmp ${_vcpkg_get_dir_candidate} DIRECTORY) + if(_vcpkg_get_dir_candidate STREQUAL _vcpkg_get_dir_candidate_tmp) # we've reached the root + set(_vcpkg_get_dir_out "${OUT}-NOTFOUND") + else() + set(_vcpkg_get_dir_candidate ${_vcpkg_get_dir_candidate_tmp}) + endif() + endif() + endwhile() + + set(${OUT} ${_vcpkg_get_dir_out} CACHE INTERNAL "_vcpkg_get_directory_name_of_file_above: ${OUT}") +endfunction() + +_vcpkg_get_directory_name_of_file_above(_VCPKG_MANIFEST_DIR ${CMAKE_CURRENT_SOURCE_DIR} "vcpkg.json") +if(_VCPKG_MANIFEST_DIR) + set(_VCPKG_MANIFEST_MODE_DEFAULT ON) +else() + set(_VCPKG_MANIFEST_MODE_DEFAULT OFF) +endif() + +option(VCPKG_MANIFEST_MODE "Set vcpkg to manifest mode" ${_VCPKG_MANIFEST_MODE_DEFAULT}) + +if(NOT _VCPKG_MANIFEST_DIR AND VCPKG_MANIFEST_MODE) + message(FATAL_ERROR + "vcpkg manifest mode was enabled, but we couldn't find a manifest file (vcpkg.json) " + "in any directories above ${CMAKE_CURRENT_SOURCE_DIR}. Please add a manifest, or " + "disable manifests by turning off VCPKG_MANIFEST_MODE.") +endif() + +option(VCPKG_MANIFEST_INSTALL "Install packages from the manifest" ON) + # Determine whether the toolchain is loaded during a try-compile configuration get_property(_CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE) @@ -144,19 +184,28 @@ if(NOT DEFINED _VCPKG_ROOT_DIR) while(IS_DIRECTORY ${_VCPKG_ROOT_DIR_CANDIDATE} AND NOT EXISTS "${_VCPKG_ROOT_DIR_CANDIDATE}/.vcpkg-root") get_filename_component(_VCPKG_ROOT_DIR_TEMP ${_VCPKG_ROOT_DIR_CANDIDATE} DIRECTORY) if (_VCPKG_ROOT_DIR_TEMP STREQUAL _VCPKG_ROOT_DIR_CANDIDATE) # If unchanged, we have reached the root of the drive - message(FATAL_ERROR "Could not find .vcpkg-root") else() SET(_VCPKG_ROOT_DIR_CANDIDATE ${_VCPKG_ROOT_DIR_TEMP}) endif() endwhile() set(_VCPKG_ROOT_DIR ${_VCPKG_ROOT_DIR_CANDIDATE} CACHE INTERNAL "Vcpkg root directory") endif() -if (NOT DEFINED _VCPKG_INSTALLED_DIR) - set(_VCPKG_INSTALLED_DIR ${_VCPKG_ROOT_DIR}/installed) + +_vcpkg_get_directory_name_of_file_above(_VCPKG_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR} ".vcpkg-root") +if(NOT _VCPKG_ROOT_DIR) + message(FATAL_ERROR "Could not find .vcpkg-root") endif() -if(NOT EXISTS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}" AND NOT _CMAKE_IN_TRY_COMPILE AND NOT VCPKG_SUPPRESS_INSTALLED_LIBRARIES_WARNING) - message(WARNING "There are no libraries installed for the Vcpkg triplet ${VCPKG_TARGET_TRIPLET}.") +if (NOT DEFINED _VCPKG_INSTALLED_DIR) + if(_VCPKG_MANIFEST_DIR) + set(_VCPKG_INSTALLED_DIR ${_VCPKG_MANIFEST_DIR}/vcpkg_installed) + else() + set(_VCPKG_INSTALLED_DIR ${_VCPKG_ROOT_DIR}/installed) + endif() + + set(_VCPKG_INSTALLED_DIR ${_VCPKG_INSTALLED_DIR} + CACHE PATH + "The directory which contains the installed libraries for each triplet") endif() if(CMAKE_BUILD_TYPE MATCHES "^[Dd][Ee][Bb][Uu][Gg]$" OR NOT DEFINED CMAKE_BUILD_TYPE) #Debug build: Put Debug paths before Release paths. @@ -218,6 +267,31 @@ foreach(_VCPKG_TOOLS_DIR ${_VCPKG_TOOLS_DIRS}) endif() endforeach() + +# CMAKE_EXECUTABLE_SUFFIX is not yet defined +if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") + set(_VCPKG_EXECUTABLE_SUFFIX ".exe") +else() + set(_VCPKG_EXECUTABLE_SUFFIX "") +endif() + +if(VCPKG_MANIFEST_MODE AND VCPKG_MANIFEST_INSTALL AND NOT _CMAKE_IN_TRY_COMPILE) + execute_process( + COMMAND "${_VCPKG_ROOT_DIR}/vcpkg${_VCPKG_EXECUTABLE_SUFFIX}" install + --triplet ${VCPKG_TARGET_TRIPLET} + --vcpkg-root ${_VCPKG_ROOT_DIR} + --x-manifest-root=${_VCPKG_MANIFEST_DIR} + --x-install-root=${_VCPKG_INSTALLED_DIR} + --binarycaching + RESULT_VARIABLE _VCPKG_INSTALL_RESULT) + if (NOT _VCPKG_INSTALL_RESULT EQUAL 0) + message(FATAL_ERROR "vcpkg install failed") + endif() + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS + "${_VCPKG_MANIFEST_DIR}/vcpkg.json" + "${_VCPKG_INSTALLED_DIR}/vcpkg/status") +endif() + option(VCPKG_APPLOCAL_DEPS "Automatically copy dependencies into the output directory for executables." ON) function(add_executable name) _add_executable(${ARGV}) |
