1
0
Fork 0
forked from lthn/blockchain

Merge branch 'dev' into dev-build-cache

This commit is contained in:
Snider 2025-10-07 01:10:13 +01:00 committed by GitHub
commit f45c40723c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
16 changed files with 279 additions and 92 deletions

View file

@ -1,28 +0,0 @@
name: PR Fast
permissions:
contents: write
on:
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
pull_request:
types:
- opened
- synchronize
- reopened
branches:
- dev
- main
- dev-*
paths-ignore:
- '**.md'
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
build-macos-arm64:
name: Compile
uses: ./.github/workflows/build-macos-arm64.yml
with:
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}

View file

@ -7,7 +7,9 @@ on:
pull_request_review:
pull_request:
types:
- review_requested
- opened
- synchronize
- reopened
- closed
concurrency:
@ -38,50 +40,39 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
build-linux-intel:
name: Chain
if: |
(github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') ||
(github.event.review.state == 'approved' && !github.event.pull_request.draft)
name: Linux
if: ${{!github.event.pull_request.draft}}
uses: ./.github/workflows/build-linux-intel.yml
secrets: inherit
with:
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
build-linux-arm:
name: Chain
if: |
(github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') ||
(github.event.review.state == 'approved' && !github.event.pull_request.draft)
name: Linux
if: ${{!github.event.pull_request.draft}}
uses: ./.github/workflows/build-linux-arm64.yml
secrets: inherit
with:
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
build-windows-intel:
name: Chain
if: |
(github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') ||
(github.event.review.state == 'approved' && !github.event.pull_request.draft)
name: Windows
if: ${{!github.event.pull_request.draft}}
uses: ./.github/workflows/build-windows-intel.yml
secrets: inherit
with:
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
build-macos-arm64:
name: Chain
if: |
(github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') ||
(github.event.review.state == 'approved' && !github.event.pull_request.draft)
name: MacOS
uses: ./.github/workflows/build-macos-arm64.yml
secrets: inherit
with:
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
build-macos-intel:
name: Chain
if: |
(github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') ||
(github.event.review.state == 'approved' && !github.event.pull_request.draft)
name: MacOS
if: ${{!github.event.pull_request.draft}}
uses: ./.github/workflows/build-macos-intel.yml
secrets: inherit
with:
@ -89,9 +80,7 @@ jobs:
build-docker:
name: Docker
if: |
(github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') ||
(github.event.review.state == 'approved' && !github.event.pull_request.draft)
if: ${{!github.event.pull_request.draft}}
uses: ./.github/workflows/build-docker.yml
secrets: inherit
with:
@ -99,7 +88,5 @@ jobs:
build-docs:
name: Docs
if: |
(github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') ||
(github.event.review.state == 'approved' && !github.event.pull_request.draft)
if: ${{!github.event.pull_request.draft}}
uses: ./.github/workflows/build-docs.yml

View file

@ -16,31 +16,31 @@ concurrency:
jobs:
build-linux-intel:
name: Chain
name: Linux
uses: ./.github/workflows/build-linux-intel.yml
with:
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
build-linux-arm:
name: Chain
name: Linux
uses: ./.github/workflows/build-linux-arm64.yml
with:
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
build-windows-intel:
name: Chain
name: Windows
uses: ./.github/workflows/build-windows-intel.yml
with:
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
build-macos-arm64:
name: Chain
name: MacOS
uses: ./.github/workflows/build-macos-arm64.yml
with:
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
build-macos-intel:
name: Chain
name: MacOS
uses: ./.github/workflows/build-macos-intel.yml
with:
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}

View file

@ -1,6 +1,6 @@
name: docs
permissions:
contents: read
contents: write
on:
workflow_call:
@ -17,16 +17,13 @@ jobs:
with:
python-version: 3.x
- name: Install Conan
uses: conan-io/setup-conan@v1
- name: Cache SDK Folder
uses: actions/cache@v4
with:
home: ${{ github.workspace }}/build/sdk
cache_packages: true
- uses: actions/cache@v4
with:
key: ${{ github.ref }}
path: .cache
path: |
${{ github.workspace }}/build/sdk
${{ github.workspace }}/build/bin
key: ${{ runner.os }}-${{ runner.arch }}-sdk
- run: sudo apt-get install -y libcairo2-dev libfreetype6-dev libffi-dev libjpeg-dev libpng-dev libz-dev pngquant
- run: pip install mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin mkdocs-material[imaging]
@ -34,13 +31,10 @@ jobs:
- name: Build Offline Version
run: make docs
- name: Zip Build
run: |
cd build/docs
zip -qq -r ../documentation.zip *
- name: Upload Artifacts
uses: actions/upload-artifact@v4.6.2
- name: CLI Artifacts
uses: ./.github/actions/upload-artifacts
with:
name: Documentation
path: build/documentation.zip
chain-network: ${{ inputs.chain-network }}
assets: "*"
asset-type: 'docs'
asset-directory: ${{ github.workspace }}/build/docs

View file

@ -49,6 +49,7 @@ jobs:
make build-deps CPU_CORES=4 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} CONAN_USER=ci-user CONAN_PASSWORD=${{ secrets.CONAN_PASSWORD }}
make upload-conan-cache
build:
name: compile-arm64
needs: cache

View file

@ -50,6 +50,7 @@ jobs:
make upload-conan-cache
build:
name: compile-x86_64
needs: cache

View file

@ -47,6 +47,7 @@ jobs:
make build-deps CPU_CORES=3 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} CONAN_USER=ci-user CONAN_PASSWORD=${{ secrets.CONAN_PASSWORD }}
make upload-conan-cache
build:
name: compile-armv8
needs: cache

View file

@ -6,15 +6,11 @@ set(DISABLE_TOR TRUE CACHE BOOL "Disable TOR library(and related tor-connect sub
PROJECT(Lethean)
set(VERSION "1.0" CACHE STRING "Build version")
message("OPENSSL_INCLUDE_DIR: ${OPENSSL_INCLUDE_DIR}")
message("OPENSSL_CRYPTO_LIBRARY: ${OPENSSL_CRYPTO_LIBRARY}")
message("OPENSSL_SSL_LIBRARY: ${OPENSSL_SSL_LIBRARY}")
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
list(INSERT CMAKE_MODULE_PATH 0
"${CMAKE_CURRENT_SOURCE_DIR}/cmake")
include(DocBuilder)
if(POLICY CMP0043)
cmake_policy(SET CMP0043 NEW)
@ -22,6 +18,9 @@ endif()
if(POLICY CMP0043)
cmake_policy(SET CMP0074 NEW)
endif()
if(POLICY CMP0091)
cmake_policy(SET CMP0091 NEW)
endif()
if(POLICY CMP0144)
cmake_policy(SET CMP0144 NEW)
endif()
@ -29,6 +28,14 @@ if(POLICY CMP0167)
cmake_policy(SET CMP0167 OLD)
endif()
include(DocBuilder)
option (USE_CCACHE "Use ccache if a usable instance is found" ON)
if (USE_CCACHE)
include(FindCcache)
else()
message(STATUS "ccache deselected")
endif()
#option (USE_CCACHE "Use ccache if a usable instance is found" ON)
#if (USE_CCACHE)
# include(FindCcache) # Has to be included after the project() macro, to be able to read the CXX variable.
@ -36,8 +43,7 @@ endif()
# message(STATUS "ccache deselected")
#endif()
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR CMAKE_SYSTEM_NAME STREQUAL "Android")

View file

@ -56,7 +56,7 @@ if(CMAKE_BUILD_TYPE STREQUAL "Release")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt")
# set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md")
set(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}/packages")
set(CPACK_PACKAGE_DIRECTORY "${CMAKE_SOURCE_DIR}/build/packages")
install(FILES README.md LICENSE.txt
DESTINATION "share/doc/${PROJECT_NAME}"

58
cmake/CleanBuild.cmake Normal file
View file

@ -0,0 +1,58 @@
# cmake/CleanBuild.cmake
# Function to selectively clean the build directory.
#
# This function will remove most of the generated build files from the build
# directory, while preserving specific directories that contain downloaded
# tools or generated documentation.
#
# Golden Rules:
# - never delete build/
# - never delete build/bin
# - never delete build/docs
# - never delete build/sdk (non cache)
#
# It will:
# - purge build files
# - clean up conan build files, cached sources can always remain.
function(selective_clean_build_dir)
if(EXISTS "${CMAKE_SOURCE_DIR}/build")
message(STATUS "Selectively cleaning build directory: ${CMAKE_SOURCE_DIR}/build")
# List of top-level items in the build directory to keep.
set(golden_items
"${CMAKE_SOURCE_DIR}/build/.ccache"
"${CMAKE_SOURCE_DIR}/build/bin"
"${CMAKE_SOURCE_DIR}/build/docs"
"${CMAKE_SOURCE_DIR}/build/sdk"
)
# Get all top-level items in the build directory.
file(GLOB top_level_items "${CMAKE_SOURCE_DIR}/build/*")
foreach(item ${top_level_items})
list(FIND golden_items "${item}" is_golden)
if(is_golden STREQUAL "-1")
string(FIND "${item}" "${CMAKE_SOURCE_DIR}/build" is_prefixed)
if(is_prefixed EQUAL 0)
message(STATUS "Removing: ${item}")
if(IS_DIRECTORY "${item}")
file(REMOVE_RECURSE "${item}")
else()
file(REMOVE "${item}")
endif()
else()
message(WARNING "Safety check failed: Will not remove '${item}' because it is not prefixed with CMAKE_SOURCE_DIR/build.")
endif()
else()
message(STATUS "Keeping golden item: ${item}")
endif()
endforeach()
message(STATUS "Selective clean complete.")
else()
message(STATUS "Build directory not found, skipping clean.")
endif()
endfunction()
selective_clean_build_dir()

View file

@ -0,0 +1,38 @@
set(CONAN_HOME "${CMAKE_SOURCE_DIR}/build/sdk")
set(DEFAULT_PROFILE "${CONAN_HOME}/profiles/default")
if(WIN32)
set(CONAN_EXECUTABLE "${CMAKE_SOURCE_DIR}/build/bin/conan.exe")
else()
set(CONAN_EXECUTABLE "${CMAKE_SOURCE_DIR}/build/bin/conan")
endif()
if(NOT EXISTS "${DEFAULT_PROFILE}")
message(STATUS "Conan default profile not found. Detecting a new one...")
set(ENV{CONAN_HOME} "${CONAN_HOME}")
execute_process(
COMMAND "${CONAN_EXECUTABLE}" profile detect --name=default --force
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
RESULT_VARIABLE return_code
)
unset(ENV{CONAN_HOME})
if(NOT return_code EQUAL 0)
message(FATAL_ERROR "Conan profile detection failed with exit code: ${return_code}")
endif()
endif()
message(STATUS "Appending custom settings to Conan default profile...")
set(CUSTOM_SETTINGS "
compiler.cppstd=17
")
#if(WIN32)
# message(STATUS "Windows detected. Appending static runtime setting.")
# string(APPEND CUSTOM_SETTINGS "
#compiler.runtime=static
#")
#endif()
file(APPEND "${DEFAULT_PROFILE}" "${CUSTOM_SETTINGS}")
message(STATUS "Conan profile setup is complete.")

8
cmake/FindCcache.cmake Normal file
View file

@ -0,0 +1,8 @@
find_program(CCACHE_FOUND ccache)
if (CCACHE_FOUND)
message(STATUS "Found usable ccache: ${CCACHE_FOUND}")
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_FOUND} cache_dir=${CMAKE_SOURCE_DIR}/build/.ccache")
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CCACHE_FOUND} cache_dir=${CMAKE_SOURCE_DIR}/build/.ccache")
else()
message(STATUS "ccache NOT found! Please install it for faster rebuilds.")
endif()

102
cmake/GetConan.cmake Normal file
View file

@ -0,0 +1,102 @@
# cmake/GetConan.cmake
# This module downloads and installs Conan if it's not found.
# Set the Conan version
set(CONAN_VERSION 2.21.0)
# Set the download URLs
set(CONAN_URL_MACOS_ARM "https://github.com/conan-io/conan/releases/download/${CONAN_VERSION}/conan-${CONAN_VERSION}-macos-arm64.tgz")
set(CONAN_URL_MACOS_INTEL "https://github.com/conan-io/conan/releases/download/${CONAN_VERSION}/conan-${CONAN_VERSION}-macos-x86_64.tgz")
set(CONAN_URL_WINDOWS_X86_64 "https://github.com/conan-io/conan/releases/download/${CONAN_VERSION}/conan-${CONAN_VERSION}-windows-x86_64.zip")
set(CONAN_URL_WINDOWS_ARM64 "https://github.com/conan-io/conan/releases/download/${CONAN_VERSION}/conan-${CONAN_VERSION}-windows-arm64.zip")
set(CONAN_URL_LINUX_X86_64 "https://github.com/conan-io/conan/releases/download/${CONAN_VERSION}/conan-${CONAN_VERSION}-linux-x86_64.tgz")
set(CONAN_URL_LINUX_AARCH64 "https://github.com/conan-io/conan/releases/download/${CONAN_VERSION}/conan-${CONAN_VERSION}-linux-aarch64.tgz")
# Set the installation directory
if(NOT CMAKE_BINARY_DIR)
set(CMAKE_BINARY_DIR "${CONAN_INSTALL_DIR}")
endif()
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
set(CONAN_INSTALL_DIR "${CMAKE_SOURCE_DIR}/build/bin")
set(CONAN_EXECUTABLE "${CMAKE_SOURCE_DIR}/build/bin/conan.exe")
else ()
set(CONAN_INSTALL_DIR "${CMAKE_SOURCE_DIR}/build")
set(CONAN_EXECUTABLE "${CONAN_INSTALL_DIR}/bin/conan")
endif ()
# Check if Conan is already installed
if(NOT EXISTS "${CONAN_EXECUTABLE}")
message(STATUS "Conan not found. Downloading and installing...")
file(MAKE_DIRECTORY "${CONAN_INSTALL_DIR}")
# Determine the processor architecture, with a fallback
if(CMAKE_HOST_SYSTEM_PROCESSOR)
set(HOST_PROCESSOR ${CMAKE_HOST_SYSTEM_PROCESSOR})
else()
cmake_host_system_information(RESULT HOST_PROCESSOR QUERY OS_PLATFORM)
endif()
# Detect the operating system and architecture
message(STATUS "Detecting OS and architecture: ${HOST_PROCESSOR} on ${CMAKE_HOST_SYSTEM_NAME}")
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
if(HOST_PROCESSOR MATCHES "arm64")
set(CONAN_URL ${CONAN_URL_MACOS_ARM})
set(CONAN_ARCHIVE_TYPE "tgz")
else()
set(CONAN_URL ${CONAN_URL_MACOS_INTEL})
set(CONAN_ARCHIVE_TYPE "tgz")
endif()
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
if(HOST_PROCESSOR MATCHES "ARM64")
set(CONAN_URL ${CONAN_URL_WINDOWS_ARM64})
set(CONAN_ARCHIVE_TYPE "zip")
else()
set(CONAN_URL ${CONAN_URL_WINDOWS_X86_64})
set(CONAN_ARCHIVE_TYPE "zip")
endif()
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
if(HOST_PROCESSOR MATCHES "aarch64|arm64|ARM64")
set(CONAN_URL ${CONAN_URL_LINUX_AARCH64})
set(CONAN_ARCHIVE_TYPE "tgz")
else()
set(CONAN_URL ${CONAN_URL_LINUX_X86_64})
set(CONAN_ARCHIVE_TYPE "tgz")
endif()
else()
message(FATAL_ERROR "Unsupported operating system: ${CMAKE_HOST_SYSTEM_NAME}")
endif()
# Download and extract Conan
set(CONAN_ARCHIVE "${CMAKE_BINARY_DIR}/conan.${CONAN_ARCHIVE_TYPE}")
message(STATUS "Downloading ${CONAN_URL} to ${CONAN_ARCHIVE}")
file(DOWNLOAD "${CONAN_URL}" "${CONAN_ARCHIVE}" SHOW_PROGRESS)
message(STATUS "Extracting ${CONAN_ARCHIVE} to ${CONAN_INSTALL_DIR}")
if(CONAN_ARCHIVE_TYPE STREQUAL "tgz")
execute_process(
COMMAND ${CMAKE_COMMAND} -E tar xzf "${CONAN_ARCHIVE}"
WORKING_DIRECTORY "${CONAN_INSTALL_DIR}"
RESULT_VARIABLE result
)
elseif(CONAN_ARCHIVE_TYPE STREQUAL "zip")
# CMake -E tar can handle zip files
execute_process(
COMMAND ${CMAKE_COMMAND} -E tar xf "${CONAN_ARCHIVE}"
WORKING_DIRECTORY "${CONAN_INSTALL_DIR}"
RESULT_VARIABLE result
)
endif()
if(NOT result EQUAL 0)
message(FATAL_ERROR "Failed to extract Conan archive.")
endif()
# Clean up the archive
file(REMOVE "${CONAN_ARCHIVE}")
message(STATUS "Conan installed successfully at ${CONAN_EXECUTABLE}")
else()
message(STATUS "Conan already installed at ${CONAN_EXECUTABLE}")
endif()

View file

@ -565,7 +565,23 @@ macro(conan_provide_dependency method package_name)
set_property(GLOBAL PROPERTY CONAN_PROVIDE_DEPENDENCY_INVOKED TRUE)
get_property(_conan_install_success GLOBAL PROPERTY CONAN_INSTALL_SUCCESS)
if(NOT _conan_install_success)
find_program(CONAN_COMMAND "conan" REQUIRED)
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
set(CONAN_COMMAND "${CMAKE_SOURCE_DIR}/build/bin/conan.exe")
else ()
set(CONAN_COMMAND "${CMAKE_SOURCE_DIR}/build/bin/conan")
endif ()
if(NOT EXISTS ${CONAN_COMMAND})
message(STATUS "CMake-Conan: Local conan not found, attempting to download it.")
execute_process(COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_LIST_DIR}/GetConan.cmake"
RESULT_VARIABLE result
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
if(NOT result EQUAL 0)
message(FATAL_ERROR "Failed to download conan.")
endif()
endif()
if(NOT EXISTS ${CONAN_COMMAND})
message(FATAL_ERROR "Conan executable not found at ${CONAN_COMMAND} after trying to download it. Also, make sure it has execution permissions.")
endif()
conan_get_version(${CONAN_COMMAND} CONAN_CURRENT_VERSION)
conan_version_check(MINIMUM ${CONAN_MINIMUM_VERSION} CURRENT ${CONAN_CURRENT_VERSION})
message(STATUS "CMake-Conan: first find_package() found. Installing dependencies with Conan")

View file

@ -1,7 +1,7 @@
import os
from conan import ConanFile
from conan.tools.cmake import cmake_layout, CMakeDeps, CMakeToolchain, CMake
from conan.tools.cmake import CMakeDeps, CMakeToolchain, CMake
class BlockchainConan(ConanFile):
@ -15,9 +15,12 @@ class BlockchainConan(ConanFile):
}
default_options = {
"static": False,
"testnet": False
"testnet": False,
"boost/*:without_test": True
}
tool_requires = "ccache/4.11"
requires = [
"zlib/1.3.1",
"boost/1.85.0",

View file

@ -19,7 +19,7 @@ RUN apt install -y build-essential pkgconf \
g++ llvm clang lld cmake python-is-python3 \
git python3 python3-pip python3-dev xz-utils gperf
RUN pip3 install conan mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin mkdocs-material[imaging] --break-system-packages
RUN pip3 install mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin mkdocs-material[imaging] --break-system-packages
WORKDIR /