7e973cce52depends: Make tarball creation from local directory reproducible (Hennadii Stepanov) Pull request description: This guarantees `$(package)_sha256_hash` reproducibility regardless of the default behavior of `$(build_TAR)` and fixes [caching](https://github.com/bitcoin/bitcoin/pull/36006#issuecomment-5328809116) for the `native_libmultiprocess` package. Steps to reproduce the issue using the master branch @2a9e35d293: ```console $ mkdir a && cd a && git init $ git remote add origin https://github.com/bitcoin/bitcoin.git $ git fetch --depth 1 origin2a9e35d293$ git checkout FETCH_HEAD $ cd depends $ gmake print-native_libmultiprocess_sha256_hash # Hash A. Compare with Hash B. native_libmultiprocess_sha256_hash=7dd817bfc0ee23c408299907aff13fefb0bd3a54ec66dc14ea15b0cc38c3d9ce $ cd ../../ && sleep 2 $ mkdir b && cd b && git init $ git remote add origin https://github.com/bitcoin/bitcoin.git $ git fetch --depth 1 origin2a9e35d293$ git checkout FETCH_HEAD $ cd depends $ gmake print-native_libmultiprocess_sha256_hash # Hash B. Compare with Hash A. native_libmultiprocess_sha256_hash=34d6f79560c0ff7a4f46bd6bfb4693076546b41f071b6dbf879da45ac8384688 ``` ACKs for top commit: fanquake: ACK7e973cce52willcl-ark: ACK7e973cce52Tree-SHA512: f939cd1b2aca04eaa0f8426858bae3657ee9625f915834980caacfbf80843b952451f4d1c29e27179e533de3e10d31688593e4c25ed32e62392bfbaf9e58dd12
Depends build
This is a system of building and caching dependencies necessary for building Bitcoin Core. It supports cross-compilation. For more details see description.md, as well as packages.md for how to add packages.
Usage
Ubuntu & Debian
apt install cmake curl make patch
Skip the following packages if you don't intend to use the GUI and will build with NO_QT=1:
apt install bison g++ ninja-build pkgconf python3 xz-utils
To build dependencies for the current arch+OS:
make
macOS
Install Xcode Command Line Tools and Homebrew Package Manager, see build-osx.md.
brew install cmake make ninja
To build dependencies for the current arch+OS:
gmake
FreeBSD
pkg install bash cmake curl gmake
Skip the following packages if you don't intend to use the GUI and will build with NO_QT=1:
pkg install bison ninja pkgconf python3
To build dependencies for the current arch+OS:
gmake
NetBSD
pkgin install bash cmake curl gmake perl
To build dependencies for the current arch+OS:
gmake
OpenBSD
pkg_add bash cmake curl gmake gtar
Skip the following packages if you don't intend to use the GUI and will build with NO_QT=1:
pkg_add bison ninja
To build dependencies for the current arch+OS:
gmake
Alpine
apk add bash build-base cmake curl make patch
Skip the following packages if you don't intend to use the GUI and will build with NO_QT=1:
apk add bison linux-headers samurai pkgconf python3
To build dependencies for the current arch+OS:
make
Configuring Bitcoin Core
When configuring Bitcoin Core, CMake by default will ignore the depends output. In
order for it to pick up libraries, tools, and settings from the depends build,
you must specify the toolchain file.
In the above example for Ubuntu, a file named depends/x86_64-pc-linux-gnu/toolchain.cmake will be
created. To use it during configuring Bitcoin Core:
cmake -B build --toolchain depends/x86_64-pc-linux-gnu/toolchain.cmake
Dependency Options
The following can be set when running make: make FOO=bar
SOURCES_PATH: Downloaded sources will be placed hereBASE_CACHE: Built packages will be placed hereSDK_PATH: Path where SDKs can be found (used by macOS)FALLBACK_DOWNLOAD_PATH: If a source file can't be fetched, try here before giving upC_STANDARD: Set the C standard version used. Defaults toc11.CXX_STANDARD: Set the C++ standard version used. Defaults toc++20.NO_BOOST: Don't download/build/cache BoostNO_QT: Don't download/build/cache Qt and its dependenciesNO_QR: Don't download/build/cache packages needed for enabling qrencodeNO_ZMQ: Don't download/build/cache packages needed for enabling ZeroMQNO_WALLET: Don't download/build/cache libs needed to enable the wallet (SQLite)NO_USDT: Don't download/build/cache packages needed for enabling USDT tracepointsNO_IPC: Don't build Cap’n Proto and libmultiprocess packages. Default on Windows.DEBUG: Disable some optimizations and enable more runtime checkingHOST_ID_SALT: Optional salt to use when generating host package idsBUILD_ID_SALT: Optional salt to use when generating build package idsLOG: Use file-based logging for individual packages. During a package build its log file resides in thedependsdirectory, and the log file is printed out automatically in case of build error. After successful build log files are moved along with package archivesLTO: Enable options needed for LTO. Does not add-fltorelated options to *FLAGS.
If some packages are not built, for example make NO_WALLET=1, the appropriate CMake cache
variables will be set when generating the Bitcoin Core buildsystem. In this case, -DENABLE_WALLET=OFF.
Compiler Configuration
CC and CXX control target compilers. build_CC and build_CXX control
compilers for native build tools (e.g. native_capnp, native_qt), which
default to gcc/g++ on Linux and clang/clang++ on macOS/FreeBSD/OpenBSD
(see ./depends/builders/*.mk).
On a system where the default build compiler is not available (e.g. Linux without gcc/g++), you could use the following to build all packages using clang:
make -C depends build_CC=clang build_CXX=clang++ CC=clang CXX=clang++
Cross compilation
To build for another arch+OS:
make HOST=host-platform-triplet
For example:
make HOST=x86_64-w64-mingw32 -j4
Common host-platform-triplets for cross compilation are:
i686-linux-gnufor Linux x86 32-bitx86_64-linux-gnufor Linux x86 64-bitx86_64-w64-mingw32for Windows using MSVCRTx86_64-w64-mingw32ucrtfor Windows using UCRTx86_64-apple-darwinfor Intel macOSarm64-apple-darwinfor ARM macOSarm-linux-gnueabihffor Linux ARM 32-bitaarch64-linux-gnufor Linux ARM 64-bitpowerpc64-linux-gnufor Linux POWER 64-bit (big endian)powerpc64le-linux-gnufor Linux POWER 64-bit (little endian)riscv32-linux-gnufor Linux RISC-V 32-bitriscv64-linux-gnufor Linux RISC-V 64-bits390x-linux-gnufor Linux S390X
The paths are automatically configured and no other options are needed.
For macOS cross compilation
apt install clang lld llvm zip
Clang 18 or later is required. You must also obtain the macOS SDK before
proceeding with a cross-compile. Under the depends directory, create a
subdirectory named SDKs. Then, place the extracted SDK under this new directory.
For more information, see SDK Extraction.
For Windows cross compilation
Using MSVCRT:
apt install g++-mingw-w64-x86-64-posix
Using UCRT:
apt install g++-mingw-w64-ucrt64
Some Ubuntu or Debian versions may not offer a working package. In this case,
you may install nix-bin and use the Nix shell from the repository root:
apt install nix-bin
NIX_BUILD_SHELL=bash HOST=x86_64-w64-mingw32 nix-shell contrib/devtools/shell-win64-cross.nix # MSVCRT
NIX_BUILD_SHELL=bash HOST=x86_64-w64-mingw32ucrt nix-shell contrib/devtools/shell-win64-cross.nix # UCRT
For Linux cross compilation
Please note that package availability might depend on the arch+OS you are building on.
For Linux x86 32-bit cross compilation:
sudo apt-get install g++-i686-linux-gnu binutils-i686-linux-gnu
For Linux x86 64-bit cross compilation:
sudo apt-get install g++-x86-64-linux-gnu binutils-x86-64-linux-gnu
For Linux ARM 32-bit cross compilation:
sudo apt-get install g++-arm-linux-gnueabihf binutils-arm-linux-gnueabihf
For Linux ARM 64-bit cross compilation:
sudo apt-get install g++-aarch64-linux-gnu binutils-aarch64-linux-gnu
For Linux POWER 64-bit cross compilation (there are no packages for 32-bit):
sudo apt-get install g++-powerpc64-linux-gnu binutils-powerpc64-linux-gnu g++-powerpc64le-linux-gnu binutils-powerpc64le-linux-gnu
For Linux RISC-V 64-bit cross compilation (there are no packages for 32-bit):
sudo apt-get install g++-riscv64-linux-gnu binutils-riscv64-linux-gnu
For Linux S390X cross compilation:
sudo apt-get install g++-s390x-linux-gnu binutils-s390x-linux-gnu
Additional targets
download: run 'make download' to fetch all sources without building them
download-osx: run 'make download-osx' to fetch all sources needed for macOS builds
download-win: run 'make download-win' to fetch all sources needed for win builds
download-linux: run 'make download-linux' to fetch all sources needed for linux builds