From ca47896204482bf4a6979e3838bf7f09f61cebeb Mon Sep 17 00:00:00 2001 From: giy <giy@omp-system.ru> Date: Fri, 02 Sep 2022 14:16:56 +0300 Subject: [PATCH] Обновление до версии 2.9.0 --- QtMSBuild/QtMsBuild/qt_globals.targets | 259 +++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 208 insertions(+), 51 deletions(-) diff --git a/QtMSBuild/QtMsBuild/qt_globals.targets b/QtMSBuild/QtMsBuild/qt_globals.targets index a8cb31c..966a084 100644 --- a/QtMSBuild/QtMsBuild/qt_globals.targets +++ b/QtMSBuild/QtMsBuild/qt_globals.targets @@ -84,6 +84,29 @@ <!-- ///////////////////////////////////////////////////////////////////////////////////////////////// + // Set up inner build if Qt vars property file is outdated + // --> + <PropertyGroup Condition="'$(QtInnerBuild)' == ''"> + <QtVarsOutdated>false</QtVarsOutdated> + <QtVarsOutdated + Condition="!Exists('$(QtVarsFilePath)') + OR '$(QtBkup_QtInstall)' != '$(QtInstall)' + OR '$(QtBkup_QtModules)' != '$(QtModules)' + OR '$(QtBkup_QtPathBinaries)' != '$(QtPathBinaries)' + OR '$(QtBkup_QtPathLibraryExecutables)' != '$(QtPathLibraryExecutables)' + OR '$(QtBkup_QtHeaderSearchPath)' != '$(QtHeaderSearchPath)' + OR '$(QtBkup_QtLibrarySearchPath)' != '$(QtLibrarySearchPath)' + OR '$(QtBkup_QtVars)' != '$(QtVars)' + OR '$(QtBkup_QMakeCodeLines)' != '$(QMakeCodeLines)' + OR '$(QtBkup_QtBuildConfig)' != '$(QtBuildConfig)'" + >true</QtVarsOutdated> + </PropertyGroup> + + <!-- // Enable inner build targets --> + <Import Condition="'$(QtVarsOutdated)' == 'true'" Project="qt_inner.targets"/> + + <!-- + ///////////////////////////////////////////////////////////////////////////////////////////////// /// TARGET QtGetDefaultClCompile ///////////////////////////////////////////////////////////////////////////////////////////////// // Get default C++ properties @@ -201,7 +224,8 @@ OR ('$(project_changed)' == 'true' AND '$(log_hash)' != '$(work_hash)')" >true</do_work> <skip_work - Condition="'$(do_work)' != 'true' OR '$(DesignTimeBuild)' == 'true'" + Condition="'$(do_work)' != 'true' + OR ('$(QtDesignTimeBuild)' == 'true' AND '$(QtToolsDesignTime)' != 'true')" >true</skip_work> </PropertyGroup> @@ -268,8 +292,7 @@ // --> <QtRunWork Condition="'$(ApplicationType)' != 'Linux' AND '@(QtWork)' != '' - AND '%(QtWork.ParallelBuild)' == 'true' - AND '$(DesignTimeBuild)' != 'true'" + AND '%(QtWork.ParallelBuild)' == 'true'" QtWork="@(QtWork)" QtMaxProcs="$(QtMaxProcs)" QtDebug="$(QtDebug)"> <Output TaskParameter="Result" ItemName="QtWorkResult" /> </QtRunWork> @@ -280,8 +303,7 @@ // --> <QtRunWork Condition="'$(ApplicationType)' != 'Linux' AND '@(QtWork)' != '' - AND '%(QtWork.ParallelBuild)' != 'true' - AND '$(DesignTimeBuild)' != 'true'" + AND '%(QtWork.ParallelBuild)' != 'true'" QtWork="@(QtWork)" QtMaxProcs="1" QtDebug="$(QtDebug)"> <Output TaskParameter="Result" ItemName="QtWorkResult" /> </QtRunWork> @@ -293,13 +315,13 @@ <!-- // Translate local paths to host paths --> <Flatten Condition="'$(ApplicationType)' == 'Linux' - AND '@(QtWork)' != '' AND '$(DesignTimeBuild)' != 'true'" + AND '@(QtWork)' != '' AND '$(QtDesignTimeBuild)' != 'true'" Items="@(QtWork)" Metadata="ResourceFiles"> <Output TaskParameter="Result" ItemName="ResourceFiles"/> </Flatten> <ItemGroup Condition="'$(ApplicationType)' == 'Linux' - AND '@(QtWork)' != '' AND '$(DesignTimeBuild)' != 'true'"> + AND '@(QtWork)' != '' AND '$(QtDesignTimeBuild)' != 'true'"> <LocalPath Include="%(QtWork.Identity)"> <Name>InputPath</Name> <Item>%(QtWork.Identity)</Item> @@ -320,7 +342,7 @@ </ItemGroup> <HostTranslatePaths Condition="'$(ApplicationType)' == 'Linux' - AND '@(QtWork)' != '' AND '$(DesignTimeBuild)' != 'true'" + AND '@(QtWork)' != '' AND '$(QtDesignTimeBuild)' != 'true'" Items="@(LocalPath)" Names="InputPath;OutputPath"> <Output TaskParameter="Result" ItemName="HostPath"/> </HostTranslatePaths> @@ -332,7 +354,7 @@ <!-- // Run command --> <HostExec Condition="'$(ApplicationType)' == 'Linux' - AND '%(Identity)' != '' AND '$(DesignTimeBuild)' != 'true'" + AND '%(Identity)' != '' AND '$(QtDesignTimeBuild)' != 'true'" Message="@(QtWork->'%(WorkType) %(Identity)')" Command="@(QtWork->'%(ToolPath) %(Options)')" Inputs="@(InputPath)" @@ -344,7 +366,7 @@ <!-- // Generate result item --> <ItemGroup Condition="'$(ApplicationType)' == 'Linux' - AND '@(QtWork)' != '' AND '$(DesignTimeBuild)' != 'true'"> + AND '@(QtWork)' != '' AND '$(QtDesignTimeBuild)' != 'true'"> <QtWorkResult Include="@(QtWork)"> <ExitCode>0</ExitCode> </QtWorkResult> @@ -354,9 +376,11 @@ /////////////////////////////////////////////////////////////////////////////////////////////// // Save tracking log of files read during build; used by VS to check the up-to-date status // --> - <ItemGroup Condition="'$(DesignTimeBuild)' != 'true' AND '$(QtVSToolsBuild)' != 'true'"> + <ItemGroup> <read_log Include="^%(QtWorkResult.FullPath);%(QtWorkResult.AdditionalDependencies)" - Condition="'%(QtWorkResult.ExitCode)' == '0' AND '%(QtWorkResult.DisableLog)' != 'true'"> + Condition="'%(QtWorkResult.ExitCode)' == '0' + AND '%(QtWorkResult.DisableLog)' != 'true' + AND '%(QtWorkResult.Skipped)' != 'true'"> <WorkType>%(QtWorkResult.WorkType)</WorkType> </read_log> <read_log> @@ -377,9 +401,11 @@ /////////////////////////////////////////////////////////////////////////////////////////////// // Save tracking log of files written during build; used by VS to check the up-to-date status // --> - <ItemGroup Condition="'$(DesignTimeBuild)' != 'true' AND '$(QtVSToolsBuild)' != 'true'"> + <ItemGroup> <write_log Include="^%(QtWorkResult.FullPath);%(QtWorkResult.OutputFile)" - Condition="'%(QtWorkResult.ExitCode)' == '0' AND '%(QtWorkResult.DisableLog)' != 'true'"> + Condition="'%(QtWorkResult.ExitCode)' == '0' + AND '%(QtWorkResult.DisableLog)' != 'true' + AND '%(QtWorkResult.Skipped)' != 'true'"> <WorkType>%(QtWorkResult.WorkType)</WorkType> </write_log> <write_log> @@ -398,7 +424,7 @@ /////////////////////////////////////////////////////////////////////////////////////////////// // Log output files; this is used by VS to determine what files to delete on "Clean" // --> - <ItemGroup Condition="'$(DesignTimeBuild)' != 'true' AND '$(QtVSToolsBuild)' != 'true'"> + <ItemGroup> <clean_log Include="%(QtWorkResult.OutputFile)" Condition="'%(QtWorkResult.ExitCode)' == '0'"> <Source>@(QtWorkResult, '|')</Source> @@ -414,7 +440,7 @@ /////////////////////////////////////////////////////////////////////////////////////////////// // Log calls to Qt tools; used in QtWorkPrepare to detect changes to the options of Qt tools // --> - <WriteLinesToFile Condition="'@(QtWorkLog)' != '' AND '$(DesignTimeBuild)' != 'true'" + <WriteLinesToFile Condition="'@(QtWorkLog)' != ''" File="$(QtLogFilePath)" Lines="@(QtWorkLog->'%(Identity)|%(Hash)')" Overwrite="true" Encoding="Unicode"/> @@ -425,8 +451,7 @@ // --> <Error Condition="'%(QtWorkResult.ExitCode)' != '' - AND '%(QtWorkResult.ExitCode)' != '0' - AND '$(DesignTimeBuild)' != 'true'" + AND '%(QtWorkResult.ExitCode)' != '0'" File="%(QtWorkResult.Identity)" Code="%(QtWorkResult.ExitCode)" Text="%(QtWorkResult.WorkType) (%(QtWorkResult.ToolPath))"/> @@ -513,6 +538,7 @@ // Clean-up // --> <ItemGroup> + <ClCompile Remove="DefaultClCompile" /> <QtWork Remove="@(QtWork)"/> <QtWorkResult Remove="@(QtWorkResult)"/> <QtWorkLog Remove="@(QtWorkLog)"/> @@ -524,51 +550,158 @@ <!-- ///////////////////////////////////////////////////////////////////////////////////////////////// - /// TARGET Qt + /// TARGET QtSetAdditionalOptions ///////////////////////////////////////////////////////////////////////////////////////////////// - // Root Qt target + // Adds additional compiler options flowing from Qt. + // Skips options that are already specified in the user project. // --> - <Target Name="Qt" DependsOnTargets="QtPrepare;QtWork" BeforeTargets="FixupCLCompileOptions"> + <Target Name="QtSetAdditionalOptions" Condition="'@(ClCompile)' != ''"> + + <!-- Command line parser regex --> + <PropertyGroup> + <CmdLineParser>"[^"]*"|[^\s]+</CmdLineParser> + </PropertyGroup> + + <!-- Parse compiler options from Qt --> + <PropertyGroup> + <QtCmdLine + >$([System.Text.RegularExpressions.Regex]::Matches( + '$(Qt_CL_OPTIONS_)', '$(CmdLineParser)'))</QtCmdLine> + </PropertyGroup> + + <!-- Calculate command line for each source file in the project --> + <QtRunTask + Items="@(ClCompile)" + AssemblyPath="$(VCTargetsPath)\Microsoft.Build.CPPTasks.Common.dll" + TaskName="Microsoft.Build.CPPTasks.CLCommandLine" + TaskInput="Sources" + TaskOutput="CommandLines" + NewMetadata="ProjectOptions"> + <Output TaskParameter="Result" ItemName="ClCompile_CmdLine" /> + </QtRunTask> + + <!-- Append excluded Qt options to calculated command line --> <ItemGroup> - <ClCompile Remove="DefaultClCompile" /> + <ClCompile_CmdLine Condition="'$(QtExcludedOptions)' != ''"> + <ProjectOptions>%(ProjectOptions) $(QtExcludedOptions)</ProjectOptions> + </ClCompile_CmdLine> </ItemGroup> - <CriticalSection Lock="false" Name="$(ProjectGuid)" /> - <OnError ExecuteTargets="QtLeaveCriticalSection_OnError"/> + + <!-- Parse compiler command line of each source file --> + <ItemGroup> + <ClCompile_CmdLine> + <ProjectOptions + >$([System.Text.RegularExpressions.Regex]::Matches( + '%(ProjectOptions)', '$(CmdLineParser)'))</ProjectOptions> + </ClCompile_CmdLine> + </ItemGroup> + + <!-- Add (previously parsed) Qt options to each source file --> + <ItemGroup> + <ClCompile_CmdLine> + <QtOptions>$(QtCmdLine)</QtOptions> + </ClCompile_CmdLine> + </ItemGroup> + + <!-- Result of parsing command lines, per source file: + * ClCompile_CmdLine ::= (Item x ProjectOptions x QtOptions), where: + * Item ::= source file + * ProjectOptions ::= list of tokens from the compiler command line for Item + * QtOptions ::= list of tokens from the Qt additional options --> + + <!-- Flatten results into a list of tokens per source file: + * ClOptions ::= (Item x Name x Value), where: + * Item ::= source file + * Name ::= token origin: from compiler command line or from Qt + * Value ::= token value --> + <Flatten Items="@(ClCompile_CmdLine)" Metadata="ProjectOptions;QtOptions"> + <Output TaskParameter="Result" ItemName="ClOptions" /> + </Flatten> + + <!-- Remove non-switch tokens, i.e. tokens that do not start with '/' or '-' --> + <ItemGroup> + <ClOptions + Remove="@(ClOptions)" + Condition="!$([System.String]::Copy('%(Value)').StartsWith('-')) + AND !$([System.String]::Copy('%(Value)').StartsWith('/'))"/> + </ItemGroup> + + <!-- Calculate option id: token without leading '/' or '-', and without trailing '-' --> + <ItemGroup> + <ClOptions> + <OptionId>$([System.String]::Copy('%(Value)').Substring(1).TrimEnd('-'))</OptionId> + </ClOptions> + </ItemGroup> + + <!-- Split into list of Qt options and list of project options --> + <ItemGroup> + <QtOptions + Include="@(ClOptions->'%(Item)')" + Condition="'%(ClOptions.Name)' == 'QtOptions'"/> + <ProjectOptions + Include="@(ClOptions->'%(Item)')" + Condition="'%(ClOptions.Name)' == 'ProjectOptions'"/> + </ItemGroup> + + <!-- Find conflicting options, i.e. defined both in Qt options and project options --> + <ItemGroup> + <QtOptions + Condition="'@(QtOptions)' != '' + AND '@(ProjectOptions)' != '' + AND '%(Item)' != '' + AND '%(OptionId)' != ''"> + <Conflict>true</Conflict> + </QtOptions> + </ItemGroup> + + <!-- Set additional compiler options for all source files --> + <ItemGroup> + <ClCompile Condition="'%(Identity)' != '' AND '%(QtOptions.Conflict)' != 'true'"> + <AdditionalOptions + >@(QtOptions->'%(Value)', ' ') @(ClCompile->'%(AdditionalOptions)')</AdditionalOptions> + </ClCompile> + <ClCompile Condition="'%(AdditionalOptions)' != ''"> + <AdditionalOptions + >$([System.String]::Copy('%(AdditionalOptions)').Trim())</AdditionalOptions> + </ClCompile> + </ItemGroup> + + <!-- Print result to build log, if requested --> + <Message + Condition="'$(QtOptionsBuildLog)' == 'true'" + Importance="High" + Text=" Qt - Additional Compiler Options"/> + <Message + Condition="'$(QtOptionsBuildLog)' == 'true' + AND '%(Identity)' != '' AND '%(QtOptions.Conflict)' != 'true'" + Importance="High" + Text=" [%(Identity)]: @(QtOptions->'%(Value)', ' ')"/> + + <!-- Clean-up --> + <PropertyGroup> + <CmdLineParser/> + <QtCmdLine/> + </PropertyGroup> + <ItemGroup> + <ClCompile_CmdLine Remove="@(ClCompile_CmdLine)"/> + <ClOptions Remove="@(ClOptions)"/> + <ProjectOptions Remove="@(ProjectOptions)"/> + <QtOptions Remove="@(QtOptions)"/> + </ItemGroup> </Target> <!-- ///////////////////////////////////////////////////////////////////////////////////////////////// - /// TARGET QtOuterBuild + /// TARGET Qt ///////////////////////////////////////////////////////////////////////////////////////////////// - // Run targets in $(QtOuterBuildDependsOn) and then recursively invoke build + // Root Qt target // --> - <Target Name="QtOuterBuild" DependsOnTargets="$(QtOuterBuildDependsOn)"> - <!--// Invoke inner build: recursive build in second MSBuild instance --> - <MSBuild - Projects="$(MSBuildProjectFullPath)" - Targets="Build" - Properties="QtInnerBuild=$(MSBuildProjectFullPath);RandomFileName=$(RandomFileName);BuildProjectReferences=false"> - </MSBuild> + <Target + Name="Qt" + DependsOnTargets="QtPrepare;QtWork;QtSetAdditionalOptions"> + <CriticalSection Lock="false" Name="$(ProjectGuid)" /> <OnError ExecuteTargets="QtLeaveCriticalSection_OnError"/> </Target> - - <PropertyGroup - Condition="'$(QtInnerBuild)' == '' AND '$(DesignTimeBuild)' != 'true'"> - <!--// Outer build: invoke inner build --> - <BuildDependsOn> - $(QtOuterBuildPrepare); - QtOuterBuild; - $(QtOuterBuildFinalize) - </BuildDependsOn> - <QtInnerBuild>$(MSBuildProjectFullPath)</QtInnerBuild> - <RandomFileName>$([System.IO.Path]::GetRandomFileName())</RandomFileName> - </PropertyGroup> - - <PropertyGroup - Condition="'$(QtInnerBuild)' != '$(MSBuildProjectFullPath)' AND '$(DesignTimeBuild)' != 'true'"> - <!--// Dependent project inner build: skip build --> - <BuildDependsOn>$(QtOuterBuildPrepare);$(QtOuterBuildFinalize)</BuildDependsOn> - </PropertyGroup> <!-- ///////////////////////////////////////////////////////////////////////////////////////////////// @@ -633,4 +766,28 @@ <Target Name="QtLeaveCriticalSection_OnError"> <CriticalSection Lock="false" Name="$(ProjectGuid)" /> </Target> + + <!-- + ///////////////////////////////////////////////////////////////////////////////////////////////// + /// TARGET QtNatvis + ///////////////////////////////////////////////////////////////////////////////////////////////// + // Copies the .natvis file matching the Qt version and replaces the namespace placeholder + // --> + <Target Name="QtNatvis" BeforeTargets="Link" + Condition="'$(Configuration)' == 'Debug' AND '$(LinkNatvisFile)' == 'true'" + Inputs="$(MSBuildProjectFile);$(QtMsBuild)\qt$(QtVersionMajor).natvis.xml" + Outputs="$(IntDir)\qt.natvis"> + <PropertyGroup> + <InputFile>$(QtMsBuild)\qt$(QtVersionMajor).natvis.xml</InputFile> + </PropertyGroup> + <WriteLinesToFile Condition="'$(QtNamespace)' == ''" + Overwrite="true" + File="$(IntDir)\qt.natvis" + Lines="$([System.IO.File]::ReadAllText($(InputFile)).Replace('##NAMESPACE##::',''))" /> + <WriteLinesToFile Condition="'$(QtNamespace)' != ''" + Overwrite="true" + File="$(IntDir)\qt.natvis" + Lines="$([System.IO.File]::ReadAllText($(InputFile)).Replace('##NAMESPACE##','$(QtNamespace)'))" /> + </Target> + </Project> -- Gitblit v1.9.1