| | |
| | |
|
| | | <!--
|
| | | /////////////////////////////////////////////////////////////////////////////////////////////////
|
| | | // 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
|
| | |
| | | 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>
|
| | |
|
| | |
| | | // -->
|
| | | <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>
|
| | |
| | | // -->
|
| | | <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>
|
| | |
| | | <!-- // 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>
|
| | |
| | | </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>
|
| | |
| | | <!-- // 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)"
|
| | |
| | | <!-- // Generate result item -->
|
| | | <ItemGroup
|
| | | Condition="'$(ApplicationType)' == 'Linux'
|
| | | AND '@(QtWork)' != '' AND '$(DesignTimeBuild)' != 'true'">
|
| | | AND '@(QtWork)' != '' AND '$(QtDesignTimeBuild)' != 'true'">
|
| | | <QtWorkResult Include="@(QtWork)">
|
| | | <ExitCode>0</ExitCode>
|
| | | </QtWorkResult>
|
| | |
| | | ///////////////////////////////////////////////////////////////////////////////////////////////
|
| | | // 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>
|
| | |
| | | ///////////////////////////////////////////////////////////////////////////////////////////////
|
| | | // 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>
|
| | |
| | | ///////////////////////////////////////////////////////////////////////////////////////////////
|
| | | // 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>
|
| | |
| | | ///////////////////////////////////////////////////////////////////////////////////////////////
|
| | | // 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"/>
|
| | |
| | | // -->
|
| | | <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))"/>
|
| | |
|
| | |
| | | // Clean-up
|
| | | // -->
|
| | | <ItemGroup>
|
| | | <ClCompile Remove="DefaultClCompile" />
|
| | | <QtWork Remove="@(QtWork)"/>
|
| | | <QtWorkResult Remove="@(QtWorkResult)"/>
|
| | | <QtWorkLog Remove="@(QtWorkLog)"/>
|
| | |
| | |
|
| | | <!--
|
| | | /////////////////////////////////////////////////////////////////////////////////////////////////
|
| | | /// 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>
|
| | |
|
| | | <!--
|
| | | /////////////////////////////////////////////////////////////////////////////////////////////////
|
| | |
| | | <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>
|