Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ builds/gnu/.dirstamp
# pkg-config pc file from .pc.in
builds/gnu/*.pc

# configured headers from in-tree configure
builds/gnu/include

# msbuild/msvc
/.vs
*.db
Expand Down
25 changes: 23 additions & 2 deletions builds/cmake/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ find_package(Git QUIET)
set( GIT_COMMIT_HASH "unknown" )
set( GIT_COMMIT_HEIGHT 0 )
set( GIT_DIRTY 0 )
set( GIT_ORIGIN_URL "https://github.com/libbitcoin/libbitcoin-node" )
set( GIT_ORIGIN_URL "unknown" )

if ( GIT_EXECUTABLE )
execute_process(
Expand All @@ -21,6 +21,10 @@ if ( GIT_EXECUTABLE )
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET )

if ( NOT GIT_COMMIT_HASH )
set( GIT_COMMIT_HASH "unknown" )
endif()

execute_process(
COMMAND ${GIT_EXECUTABLE} rev-list --count HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
Expand All @@ -33,12 +37,16 @@ if ( GIT_EXECUTABLE )
endif()

execute_process(
COMMAND ${GIT_EXECUTABLE} remote get-url origin
COMMAND ${GIT_EXECUTABLE} ls-remote --get-url
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_ORIGIN_URL
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET )

if ( NOT GIT_ORIGIN_URL MATCHES "://|@" )
set( GIT_ORIGIN_URL "unknown" )
endif()

execute_process(
COMMAND ${GIT_EXECUTABLE} status --porcelain
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
Expand Down Expand Up @@ -171,6 +179,15 @@ endif()
#------------------------------------------------------------------------------
include(CheckLinkerFlag)

#------------------------------------------------------------------------------
# Configurable file(s).
#------------------------------------------------------------------------------

configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/../../include/bitcoin/node/version.hpp.in
${CMAKE_CURRENT_BINARY_DIR}/include/bitcoin/node/version.hpp
@ONLY )

#------------------------------------------------------------------------------
# libbitcoin-node library
#------------------------------------------------------------------------------
Expand Down Expand Up @@ -212,6 +229,10 @@ target_sources( libbitcoin-node
BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/../../include"
FILES
${libbitcoin_node_HEADERS}
FILE_SET HEADERS
BASE_DIRS "${CMAKE_CURRENT_BINARY_DIR}/include"
FILES
"${CMAKE_CURRENT_BINARY_DIR}/include/bitcoin/node/version.hpp"
PRIVATE
${libbitcoin_node_SOURCES}
)
Expand Down
3 changes: 2 additions & 1 deletion builds/gnu/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ lib_LTLIBRARIES = src/libbitcoin-node.la
src_libbitcoin_node_la_LIBS = src/libbitcoin-node.la

src_libbitcoin_node_la_CPPFLAGS = \
-I${top_builddir}/include \
-I${srcdir}/../../include \
${libbitcoin_database_BUILD_CPPFLAGS} \
${libbitcoin_network_BUILD_CPPFLAGS}
Expand Down Expand Up @@ -115,7 +116,7 @@ include_bitcoin_node_HEADERS = \
${srcdir}/../../include/bitcoin/node/events.hpp \
${srcdir}/../../include/bitcoin/node/full_node.hpp \
${srcdir}/../../include/bitcoin/node/settings.hpp \
${srcdir}/../../include/bitcoin/node/version.hpp
include/bitcoin/node/version.hpp

include_bitcoin_node_channelsdir = \
${includedir}/bitcoin/node/channels
Expand Down
3 changes: 2 additions & 1 deletion builds/gnu/configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ m4_define([_git_dirty],
m4_define([_GIT_DIRTY], m4_ifnblank(_git_dirty, [_git_dirty], [0]))

m4_define([_GIT_ORIGIN_URL],
m4_dquote(m4_esyscmd_s([git remote get-url origin 2>/dev/null || echo https://github.com/libbitcoin/libbitcoin-node])))
m4_dquote(m4_esyscmd_s([git ls-remote --get-url 2>/dev/null | grep -e '://' -e '@' || echo unknown])))

m4_define([_LIBBITCOIN_VERSION_MAJOR], [4])
m4_define([_LIBBITCOIN_VERSION_MINOR], [0])
Expand Down Expand Up @@ -296,6 +296,7 @@ AS_IF([(test "x${with_tests}" != "xno")],
AC_CONFIG_FILES([
Makefile
libbitcoin-node.pc
include/bitcoin/node/version.hpp:${repository_root_dir}/include/bitcoin/node/version.hpp.in
])

AC_OUTPUT
52 changes: 52 additions & 0 deletions builds/msvc/properties/Git.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<PropertyGroup>
<_PropertySheetDisplayName>Git Settings</_PropertySheetDisplayName>
</PropertyGroup>

<!-- Substitutes @TOKEN@ values into each ConfigurableFile, writing %(Generated) only when its content changes. -->
<Target Name="ConfigureFiles" BeforeTargets="ClCompile;ResourceCompile" Inputs="%(ConfigurableFile.Identity)" Outputs="%(ConfigurableFile.Generated)">

<Exec Command="git -C &quot;$(RepoRoot).&quot; rev-parse HEAD 2&gt;nul" Condition="'$(GitCommitHash)' == ''" ConsoleToMSBuild="true" EchoOff="true" IgnoreExitCode="true" IgnoreStandardErrorWarningFormat="true" StandardOutputImportance="low">
<Output TaskParameter="ConsoleOutput" PropertyName="GitCommitHash" />
</Exec>
<Exec Command="git -C &quot;$(RepoRoot).&quot; rev-list --count HEAD 2&gt;nul" Condition="'$(GitCommitHeight)' == ''" ConsoleToMSBuild="true" EchoOff="true" IgnoreExitCode="true" IgnoreStandardErrorWarningFormat="true" StandardOutputImportance="low">
<Output TaskParameter="ConsoleOutput" PropertyName="GitCommitHeight" />
</Exec>
<Exec Command="git -C &quot;$(RepoRoot).&quot; status --porcelain 2&gt;nul" Condition="'$(GitDirty)' == ''" ConsoleToMSBuild="true" EchoOff="true" IgnoreExitCode="true" IgnoreStandardErrorWarningFormat="true" StandardOutputImportance="low">
<Output TaskParameter="ConsoleOutput" PropertyName="_GitStatus" />
</Exec>
<Exec Command="git -C &quot;$(RepoRoot).&quot; ls-remote --get-url 2&gt;nul" Condition="'$(GitOriginUrl)' == ''" ConsoleToMSBuild="true" EchoOff="true" IgnoreExitCode="true" IgnoreStandardErrorWarningFormat="true" StandardOutputImportance="low">
<Output TaskParameter="ConsoleOutput" PropertyName="GitOriginUrl" />
</Exec>

<PropertyGroup>
<GitCommitHash Condition="!$([System.Text.RegularExpressions.Regex]::IsMatch('$(GitCommitHash)', '^[0-9a-f]{40}$'))">unknown</GitCommitHash>
<GitCommitHeight Condition="!$([System.Text.RegularExpressions.Regex]::IsMatch('$(GitCommitHeight)', '^[0-9]+$'))">0</GitCommitHeight>
<GitDirty Condition="'$(GitDirty)' == '' And '$(_GitStatus)' != ''">1</GitDirty>
<GitDirty Condition="'$(GitDirty)' == ''">0</GitDirty>
<GitOriginUrl Condition="!$([System.Text.RegularExpressions.Regex]::IsMatch('$(GitOriginUrl)', '^(https?|ssh|git)://[^;\s]+$|^[^@;\s]+@[^:;\s]+:[^;\s]+$'))">unknown</GitOriginUrl>
<VersionPatch Condition="'$(VersionPatch)' == ''">$(GitCommitHeight)</VersionPatch>
</PropertyGroup>

<PropertyGroup>
<_Configured>$([System.IO.File]::ReadAllText('%(ConfigurableFile.FullPath)'))</_Configured>
<_Configured>$(_Configured.Replace('@LIBBITCOIN_VERSION_MAJOR@', '$(VersionMajor)'))</_Configured>
<_Configured>$(_Configured.Replace('@LIBBITCOIN_VERSION_MINOR@', '$(VersionMinor)'))</_Configured>
<_Configured>$(_Configured.Replace('@LIBBITCOIN_VERSION_PATCH@', '$(VersionPatch)'))</_Configured>
<_Configured>$(_Configured.Replace('@GIT_COMMIT_HASH@', '$(GitCommitHash)'))</_Configured>
<_Configured>$(_Configured.Replace('@GIT_ORIGIN_URL@', '$(GitOriginUrl)'))</_Configured>
<_Configured>$(_Configured.Replace('@GIT_DIRTY@', '$(GitDirty)'))</_Configured>
</PropertyGroup>

<MakeDir Directories="$([System.IO.Path]::GetDirectoryName('%(ConfigurableFile.Generated)'))" />
<WriteLinesToFile File="%(ConfigurableFile.Generated)" Lines="$([MSBuild]::Escape($(_Configured.TrimEnd())))" Overwrite="true" WriteOnlyWhenDifferent="true" />
<Message Text="Configured : %(ConfigurableFile.Generated)" Importance="high" />
</Target>

<Target Name="CleanConfiguredFiles" AfterTargets="Clean">
<Delete Files="@(ConfigurableFile->'%(Generated)')" />
</Target>

</Project>
89 changes: 89 additions & 0 deletions builds/msvc/properties/GitSubstitute.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# GitSubstitute.ps1
# Substitutes @TOKEN@ placeholders in a template (.in) file using values passed from MSBuild.
# Intended to be invoked by GitSubstitution.props.

[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string] $InputPath,

[Parameter(Mandatory = $true)]
[string] $OutputPath,

[Parameter(Mandatory = $true)]
[string] $VersionMajorToken,

[Parameter(Mandatory = $true)]
[string] $VersionMinorToken,

[Parameter(Mandatory = $true)]
[string] $VersionPatchToken,

[Parameter(Mandatory = $true)]
[string] $GitCommitHashToken,

[Parameter(Mandatory = $true)]
[string] $GitOriginUrlToken,

[Parameter(Mandatory = $true)]
[string] $GitDirtyToken,

[Parameter(Mandatory = $true)]
[string] $VersionMajorValue,

[Parameter(Mandatory = $true)]
[string] $VersionMinorValue,

[Parameter(Mandatory = $true)]
[string] $VersionPatchValue,

[Parameter(Mandatory = $true)]
[AllowEmptyString()]
[string] $GitCommitHash,

[Parameter(Mandatory = $true)]
[AllowEmptyString()]
[string] $GitOriginUrl,

[Parameter(Mandatory = $true)]
[string] $GitDirty
)

$ErrorActionPreference = 'Stop'

function Escape-RegexLiteral {
param([string] $Text)
return [regex]::Escape($Text)
}

if (-not (Test-Path -LiteralPath $InputPath)) {
throw "Input template not found: $InputPath"
}

$outDir = Split-Path -Parent $OutputPath
if ($outDir -and -not (Test-Path -LiteralPath $outDir)) {
New-Item -ItemType Directory -Path $outDir -Force | Out-Null
}

$content = Get-Content -LiteralPath $InputPath -Raw

# -replace treats the pattern as regex; escape tokens so '@...@' is matched literally.
$replacements = @(
@{ Token = $VersionMajorToken; Value = $VersionMajorValue }
@{ Token = $VersionMinorToken; Value = $VersionMinorValue }
@{ Token = $VersionPatchToken; Value = $VersionPatchValue }
@{ Token = $GitCommitHashToken; Value = $GitCommitHash }
@{ Token = $GitOriginUrlToken; Value = $GitOriginUrl }
@{ Token = $GitDirtyToken; Value = $GitDirty }
)

foreach ($r in $replacements) {
$pattern = '@' + (Escape-RegexLiteral $r.Token) + '@'
# Replacement string: use MatchEvaluator so $ and other specials in values stay literal.
$content = [regex]::Replace($content, $pattern, { param($m) $r.Value })
}

# -NoNewline matches the previous inline script behavior.
Set-Content -LiteralPath $OutputPath -Value $content -NoNewline -Encoding utf8

Write-Host "Generated: $OutputPath"
104 changes: 104 additions & 0 deletions builds/msvc/properties/GitSubstitution.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<PropertyGroup>
<_PropertySheetDisplayName>Git Substitution (ConfigurableFile)</_PropertySheetDisplayName>

<!-- Output root for generated headers (overridable from vcxproj) -->
<GeneratedIncludeDir Condition="'$(GeneratedIncludeDir)' == ''">$(IntDir)generated\include\</GeneratedIncludeDir>

<!-- @TOKEN@ names in .in files (overridable from vcxproj) -->
<VersionMajorToken Condition="'$(VersionMajorToken)' == ''">LIBBITCOIN_VERSION_MAJOR</VersionMajorToken>
<VersionMinorToken Condition="'$(VersionMinorToken)' == ''">LIBBITCOIN_VERSION_MINOR</VersionMinorToken>
<VersionPatchToken Condition="'$(VersionPatchToken)' == ''">LIBBITCOIN_VERSION_PATCH</VersionPatchToken>
<GitCommitHashToken Condition="'$(GitCommitHashToken)' == ''">GIT_COMMIT_HASH</GitCommitHashToken>
<GitOriginUrlToken Condition="'$(GitOriginUrlToken)' == ''">GIT_ORIGIN_URL</GitOriginUrlToken>
<GitDirtyToken Condition="'$(GitDirtyToken)' == ''">GIT_DIRTY</GitDirtyToken>

<!-- Substituted values (overridable from vcxproj; patch filled in target if still empty) -->
<VersionMajorValue Condition="'$(VersionMajorValue)' == ''">4</VersionMajorValue>
<VersionMinorValue Condition="'$(VersionMinorValue)' == ''">0</VersionMinorValue>
</PropertyGroup>

<!-- Prepend generated include dir unless disabled by caller -->
<ItemDefinitionGroup Condition="'$(GitSubstitutionAddIncludeDir)' != 'false'">
<ClCompile>
<AdditionalIncludeDirectories>
$(GeneratedIncludeDir);%(AdditionalIncludeDirectories)
</AdditionalIncludeDirectories>
</ClCompile>
</ItemDefinitionGroup>

<Target Name="GenerateConfiguredHeaders"
BeforeTargets="ClCompile"
Condition="'@(ConfigurableFile)' != ''"
Inputs="%(ConfigurableFile.FileInput)"
Outputs="%(ConfigurableFile.FileOutput)">

<!-- Resolve RepoRoot; fall back to empty if unset so git -C still runs safely -->
<PropertyGroup>
<_GitRepoRoot Condition="'$(RepoRoot)' != ''">$([System.IO.Path]::GetFullPath('$(RepoRoot)').TrimEnd('\'))</_GitRepoRoot>
<_GitRepoRoot Condition="'$(RepoRoot)' == ''">.</_GitRepoRoot>
</PropertyGroup>

<Exec Command="git -C &quot;$(_GitRepoRoot)&quot; rev-parse HEAD"
ConsoleToMSBuild="true"
IgnoreExitCode="true"
StandardOutputImportance="low"
Condition="'$(GitCommitHash)' == ''">
<Output TaskParameter="ConsoleOutput" PropertyName="GitCommitHash" />
<Output TaskParameter="ExitCode" PropertyName="_GitRevParseExit" />
</Exec>

<Exec Command="git -C &quot;$(_GitRepoRoot)&quot; rev-list --count HEAD"
ConsoleToMSBuild="true"
IgnoreExitCode="true"
StandardOutputImportance="low"
Condition="'$(GitCommitHeight)' == ''">
<Output TaskParameter="ConsoleOutput" PropertyName="GitCommitHeight" />
</Exec>

<Exec Command="git -C &quot;$(_GitRepoRoot)&quot; remote get-url origin"
ConsoleToMSBuild="true"
IgnoreExitCode="true"
StandardOutputImportance="low"
Condition="'$(GitOriginUrl)' == ''">
<Output TaskParameter="ConsoleOutput" PropertyName="GitOriginUrl" />
</Exec>

<Exec Command="git -C &quot;$(_GitRepoRoot)&quot; status --porcelain"
ConsoleToMSBuild="true"
IgnoreExitCode="true"
StandardOutputImportance="low"
Condition="'$(GitDirty)' == ''">
<Output TaskParameter="ConsoleOutput" PropertyName="GitStatus" />
</Exec>

<!-- Sanitize git outputs: reject multi-line / non-hash / empty results from failed git -->
<PropertyGroup>
<!-- Commit hash: keep only a plausible single-line hex hash; else unknown -->
<GitCommitHash Condition="'$(GitCommitHash)' == '' or $(GitCommitHash.Contains($([System.Environment]::NewLine))) or $(GitCommitHash.Contains(' '))">unknown</GitCommitHash>
<GitCommitHash Condition="'$(GitCommitHash)' == ''">unknown</GitCommitHash>

<!-- Height: digits only; else 0 -->
<GitCommitHeight Condition="'$(GitCommitHeight)' == '' or $([System.Text.RegularExpressions.Regex]::IsMatch('$(GitCommitHeight)', '[^0-9]'))">0</GitCommitHeight>
<GitCommitHeight Condition="'$(GitCommitHeight)' == ''">0</GitCommitHeight>

<!-- Origin URL: clear if it looks like an error message -->
<GitOriginUrl Condition="$(GitOriginUrl.Contains('fatal:')) or $(GitOriginUrl.Contains('error:'))"></GitOriginUrl>
<GitOriginUrl Condition="'$(GitOriginUrl)' == ''"></GitOriginUrl>

<!-- Dirty: any non-empty porcelain status => 1 -->
<GitDirty Condition="'$(GitStatus)' != '' and !$(GitStatus.Contains('fatal:'))">1</GitDirty>
<GitDirty Condition="'$(GitDirty)' == ''">0</GitDirty>

<VersionPatchValue Condition="'$(VersionPatchValue)' == ''">$(GitCommitHeight)</VersionPatchValue>
</PropertyGroup>

<MakeDir Directories="$([System.IO.Path]::GetDirectoryName('%(ConfigurableFile.FileOutput)'))" />

<!-- Invoke external script; values passed as discrete arguments (avoids cmd/PowerShell quoting bugs) -->
<Exec Command="powershell -NoProfile -ExecutionPolicy Bypass -File &quot;$(MSBuildThisFileDirectory)GitSubstitute.ps1&quot; -InputPath &quot;%(ConfigurableFile.FileInput)&quot; -OutputPath &quot;%(ConfigurableFile.FileOutput)&quot; -VersionMajorToken &quot;$(VersionMajorToken)&quot; -VersionMinorToken &quot;$(VersionMinorToken)&quot; -VersionPatchToken &quot;$(VersionPatchToken)&quot; -GitCommitHashToken &quot;$(GitCommitHashToken)&quot; -GitOriginUrlToken &quot;$(GitOriginUrlToken)&quot; -GitDirtyToken &quot;$(GitDirtyToken)&quot; -VersionMajorValue &quot;$(VersionMajorValue)&quot; -VersionMinorValue &quot;$(VersionMinorValue)&quot; -VersionPatchValue &quot;$(VersionPatchValue)&quot; -GitCommitHash &quot;$(GitCommitHash)&quot; -GitOriginUrl &quot;$(GitOriginUrl)&quot; -GitDirty &quot;$(GitDirty)&quot;" />
</Target>

</Project>
1 change: 1 addition & 0 deletions builds/msvc/properties/Output.props
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

<ImportGroup Label="PropertySheets">
<Import Project="Messages.props" />
<Import Project="Git.props" />
</ImportGroup>

</Project>
3 changes: 2 additions & 1 deletion builds/msvc/vs2026/libbitcoin-database.import.props
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\..\libbitcoin-database\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\..\libbitcoin-database\build\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions Condition="'$(Linkage-libbitcoin-database)' == 'static' Or '$(Linkage-libbitcoin-database)' == 'ltcg'">BCD_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
Expand All @@ -32,4 +33,4 @@
</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
</Project>
</Project>
3 changes: 2 additions & 1 deletion builds/msvc/vs2026/libbitcoin-network.import.props
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\..\libbitcoin-network\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\..\..\libbitcoin-network\build\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

<!-- Prevent boost from seeing ssl includes when ssl is deselected (requires external headers). -->
<AdditionalIncludeDirectories Condition="'$(Option-ssl)' == 'true'">$(ProjectDir)..\..\..\..\..\libbitcoin-network\include\bitcoin\network\ssl\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
Expand Down Expand Up @@ -59,4 +60,4 @@
</ItemGroup>
</Target>

</Project>
</Project>
Loading
Loading