|
| 1 | +<?xml version="1.0" encoding="utf-8"?> |
| 2 | +<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
| 3 | + |
| 4 | + <PropertyGroup> |
| 5 | + <_PropertySheetDisplayName>Git Substitution (ConfigurableFile)</_PropertySheetDisplayName> |
| 6 | + |
| 7 | + <!-- Output root for generated headers (overridable from vcxproj) --> |
| 8 | + <GeneratedIncludeDir Condition="'$(GeneratedIncludeDir)' == ''">$(IntDir)generated\include\</GeneratedIncludeDir> |
| 9 | + |
| 10 | + <!-- @TOKEN@ names in .in files (overridable from vcxproj) --> |
| 11 | + <VersionMajorToken Condition="'$(VersionMajorToken)' == ''">LIBBITCOIN_VERSION_MAJOR</VersionMajorToken> |
| 12 | + <VersionMinorToken Condition="'$(VersionMinorToken)' == ''">LIBBITCOIN_VERSION_MINOR</VersionMinorToken> |
| 13 | + <VersionPatchToken Condition="'$(VersionPatchToken)' == ''">LIBBITCOIN_VERSION_PATCH</VersionPatchToken> |
| 14 | + <GitCommitHashToken Condition="'$(GitCommitHashToken)' == ''">GIT_COMMIT_HASH</GitCommitHashToken> |
| 15 | + <GitOriginUrlToken Condition="'$(GitOriginUrlToken)' == ''">GIT_ORIGIN_URL</GitOriginUrlToken> |
| 16 | + <GitDirtyToken Condition="'$(GitDirtyToken)' == ''">GIT_DIRTY</GitDirtyToken> |
| 17 | + |
| 18 | + <!-- Substituted values (overridable from vcxproj; patch filled in target if still empty) --> |
| 19 | + <VersionMajorValue Condition="'$(VersionMajorValue)' == ''">4</VersionMajorValue> |
| 20 | + <VersionMinorValue Condition="'$(VersionMinorValue)' == ''">0</VersionMinorValue> |
| 21 | + </PropertyGroup> |
| 22 | + |
| 23 | + <!-- Prepend generated include dir unless disabled by caller --> |
| 24 | + <ItemDefinitionGroup Condition="'$(GitSubstitutionAddIncludeDir)' != 'false'"> |
| 25 | + <ClCompile> |
| 26 | + <AdditionalIncludeDirectories> |
| 27 | + $(GeneratedIncludeDir);%(AdditionalIncludeDirectories) |
| 28 | + </AdditionalIncludeDirectories> |
| 29 | + </ClCompile> |
| 30 | + </ItemDefinitionGroup> |
| 31 | + |
| 32 | + <Target Name="GenerateConfiguredHeaders" |
| 33 | + BeforeTargets="ClCompile" |
| 34 | + Condition="'@(ConfigurableFile)' != ''" |
| 35 | + Inputs="%(ConfigurableFile.FileInput)" |
| 36 | + Outputs="%(ConfigurableFile.FileOutput)"> |
| 37 | + |
| 38 | + <!-- Resolve RepoRoot; fall back to empty if unset so git -C still runs safely --> |
| 39 | + <PropertyGroup> |
| 40 | + <_GitRepoRoot Condition="'$(RepoRoot)' != ''">$([System.IO.Path]::GetFullPath('$(RepoRoot)').TrimEnd('\'))</_GitRepoRoot> |
| 41 | + <_GitRepoRoot Condition="'$(RepoRoot)' == ''">.</_GitRepoRoot> |
| 42 | + </PropertyGroup> |
| 43 | + |
| 44 | + <Exec Command="git -C "$(_GitRepoRoot)" rev-parse HEAD" |
| 45 | + ConsoleToMSBuild="true" |
| 46 | + IgnoreExitCode="true" |
| 47 | + StandardOutputImportance="low" |
| 48 | + Condition="'$(GitCommitHash)' == ''"> |
| 49 | + <Output TaskParameter="ConsoleOutput" PropertyName="GitCommitHash" /> |
| 50 | + <Output TaskParameter="ExitCode" PropertyName="_GitRevParseExit" /> |
| 51 | + </Exec> |
| 52 | + |
| 53 | + <Exec Command="git -C "$(_GitRepoRoot)" rev-list --count HEAD" |
| 54 | + ConsoleToMSBuild="true" |
| 55 | + IgnoreExitCode="true" |
| 56 | + StandardOutputImportance="low" |
| 57 | + Condition="'$(GitCommitHeight)' == ''"> |
| 58 | + <Output TaskParameter="ConsoleOutput" PropertyName="GitCommitHeight" /> |
| 59 | + </Exec> |
| 60 | + |
| 61 | + <Exec Command="git -C "$(_GitRepoRoot)" remote get-url origin" |
| 62 | + ConsoleToMSBuild="true" |
| 63 | + IgnoreExitCode="true" |
| 64 | + StandardOutputImportance="low" |
| 65 | + Condition="'$(GitOriginUrl)' == ''"> |
| 66 | + <Output TaskParameter="ConsoleOutput" PropertyName="GitOriginUrl" /> |
| 67 | + </Exec> |
| 68 | + |
| 69 | + <Exec Command="git -C "$(_GitRepoRoot)" status --porcelain" |
| 70 | + ConsoleToMSBuild="true" |
| 71 | + IgnoreExitCode="true" |
| 72 | + StandardOutputImportance="low" |
| 73 | + Condition="'$(GitDirty)' == ''"> |
| 74 | + <Output TaskParameter="ConsoleOutput" PropertyName="GitStatus" /> |
| 75 | + </Exec> |
| 76 | + |
| 77 | + <!-- Sanitize git outputs: reject multi-line / non-hash / empty results from failed git --> |
| 78 | + <PropertyGroup> |
| 79 | + <!-- Commit hash: keep only a plausible single-line hex hash; else unknown --> |
| 80 | + <GitCommitHash Condition="'$(GitCommitHash)' == '' or $(GitCommitHash.Contains($([System.Environment]::NewLine))) or $(GitCommitHash.Contains(' '))">unknown</GitCommitHash> |
| 81 | + <GitCommitHash Condition="'$(GitCommitHash)' == ''">unknown</GitCommitHash> |
| 82 | + |
| 83 | + <!-- Height: digits only; else 0 --> |
| 84 | + <GitCommitHeight Condition="'$(GitCommitHeight)' == '' or $([System.Text.RegularExpressions.Regex]::IsMatch('$(GitCommitHeight)', '[^0-9]'))">0</GitCommitHeight> |
| 85 | + <GitCommitHeight Condition="'$(GitCommitHeight)' == ''">0</GitCommitHeight> |
| 86 | + |
| 87 | + <!-- Origin URL: clear if it looks like an error message --> |
| 88 | + <GitOriginUrl Condition="$(GitOriginUrl.Contains('fatal:')) or $(GitOriginUrl.Contains('error:'))"></GitOriginUrl> |
| 89 | + <GitOriginUrl Condition="'$(GitOriginUrl)' == ''"></GitOriginUrl> |
| 90 | + |
| 91 | + <!-- Dirty: any non-empty porcelain status => 1 --> |
| 92 | + <GitDirty Condition="'$(GitStatus)' != '' and !$(GitStatus.Contains('fatal:'))">1</GitDirty> |
| 93 | + <GitDirty Condition="'$(GitDirty)' == ''">0</GitDirty> |
| 94 | + |
| 95 | + <VersionPatchValue Condition="'$(VersionPatchValue)' == ''">$(GitCommitHeight)</VersionPatchValue> |
| 96 | + </PropertyGroup> |
| 97 | + |
| 98 | + <MakeDir Directories="$([System.IO.Path]::GetDirectoryName('%(ConfigurableFile.FileOutput)'))" /> |
| 99 | + |
| 100 | + <!-- Invoke external script; values passed as discrete arguments (avoids cmd/PowerShell quoting bugs) --> |
| 101 | + <Exec Command="powershell -NoProfile -ExecutionPolicy Bypass -File "$(MSBuildThisFileDirectory)GitSubstitute.ps1" -InputPath "%(ConfigurableFile.FileInput)" -OutputPath "%(ConfigurableFile.FileOutput)" -VersionMajorToken "$(VersionMajorToken)" -VersionMinorToken "$(VersionMinorToken)" -VersionPatchToken "$(VersionPatchToken)" -GitCommitHashToken "$(GitCommitHashToken)" -GitOriginUrlToken "$(GitOriginUrlToken)" -GitDirtyToken "$(GitDirtyToken)" -VersionMajorValue "$(VersionMajorValue)" -VersionMinorValue "$(VersionMinorValue)" -VersionPatchValue "$(VersionPatchValue)" -GitCommitHash "$(GitCommitHash)" -GitOriginUrl "$(GitOriginUrl)" -GitDirty "$(GitDirty)"" /> |
| 102 | + </Target> |
| 103 | + |
| 104 | +</Project> |
0 commit comments