forked from bitcoin/bitcoin
-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
build: Add CMake-based build system (5 of N) #12
Closed
Closed
Changes from all commits
Commits
Show all changes
26 commits
Select commit
Hold shift + click to select a range
00c44c8
cmake: Add root `CMakeLists.txt` file
hebasto 01048c6
cmake: Add `config/bitcoin-config.h` support
hebasto d223179
cmake: Add `cmake/introspection.cmake` file
hebasto 524f6a1
cmake: Check system headers
hebasto f17680e
cmake: Check system symbols
hebasto 6f55612
cmake: Check compiler features
hebasto 615998b
cmake: Build `crc32c` static library
hebasto 5020bff
cmake: Build `leveldb` static library
hebasto f16998d
cmake: Add essential platform-specific definitions and options
hebasto 3d450e1
cmake: Add `CheckStdFilesystem` module
hebasto cf880ce
cmake: Build `minisketch` static library
hebasto 705233e
cmake: Build `secp256k1` static library
hebasto 1b37eab
cmake: Build `univalue` static library
hebasto e2e38bd
cmake: Build `bitcoin_crypto` library
hebasto d17d37b
cmake: Build `bitcoin_util` static library
hebasto e593e11
cmake: Build `bitcoin_consensus` library
hebasto 90e8efd
cmake: Build `bitcoind` executable
hebasto ccc0e49
build: Generate `share/toolchain.cmake` in depends
hebasto 5b25bcd
cmake: Add cross-compiling support
hebasto 3bbed8f
cmake: Add `TristateOption` module
hebasto da15813
cmake: Add `ccache` support
hebasto 30e2d1c
cmake: Add `GetBrewPackageDetails` module
hebasto 0e9a86b
cmake: Add `libnatpmp` optional package support
hebasto 142bbc8
cmake: Add `libminiupnpc` optional package support
hebasto 33e90df
cmake: Add `libzmq` optional package support
hebasto bd048fc
cmake: Add `systemtap-sdt` optional package support
hebasto File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,203 @@ | ||
# Copyright (c) 2023 The Bitcoin Core developers | ||
# Distributed under the MIT software license, see the accompanying | ||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
# IMPORTANT: Changes which affect binary results may not be quietly gated | ||
# by CMake version. | ||
# | ||
# Debian 10 Buster, https://wiki.debian.org/LTS, EOL 2024: | ||
# - CMake 3.13.4, https://packages.debian.org/buster/cmake | ||
# | ||
# Ubuntu 22.04 Jammy, https://wiki.ubuntu.com/Releases, EOL 2032: | ||
# - CMake 3.22.1, https://packages.ubuntu.com/jammy/cmake | ||
# | ||
# Visual Studio 17 2022, https://visualstudio.microsoft.com: | ||
# - CMake 3.24 | ||
# | ||
# All policies known to the running version of CMake and introduced | ||
# in the 3.24 version or earlier will be set to use NEW behavior. | ||
# All policies introduced in later versions will be unset. | ||
# See: https://cmake.org/cmake/help/latest/manual/cmake-policies.7.html | ||
cmake_minimum_required(VERSION 3.13...3.24) | ||
|
||
project("Bitcoin Core" | ||
VERSION 24.99.0 | ||
DESCRIPTION "Bitcoin client software" | ||
HOMEPAGE_URL "https://bitcoincore.org/" | ||
LANGUAGES CXX ASM | ||
) | ||
|
||
set(CLIENT_VERSION_IS_RELEASE "false") | ||
set(COPYRIGHT_YEAR "2023") | ||
set(COPYRIGHT_HOLDERS "The %s developers") | ||
set(COPYRIGHT_HOLDERS_FINAL "The ${PROJECT_NAME} developers") | ||
set(PACKAGE_BUGREPORT "https://github.com/bitcoin/bitcoin/issues") | ||
|
||
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/module) | ||
|
||
# Configurable options. | ||
# When adding a new option, end the <help_text> with a full stop for consistency. | ||
include(CMakeDependentOption) | ||
option(BUILD_DAEMON "Build bitcoind executable." ON) | ||
option(ASM "Use assembly routines." ON) | ||
cmake_dependent_option(CXX20 "Enable compilation in C++20 mode." OFF "NOT MSVC" ON) | ||
option(THREADLOCAL "Enable features that depend on the C++ thread_local keyword (currently just thread names in debug logs)." ON) | ||
include(TristateOption) | ||
tristate_option(CCACHE "Use ccache for compiling." "if ccache is found." AUTO) | ||
tristate_option(WITH_NATPMP "Enable NAT-PMP." "if libnatpmp is found." AUTO) | ||
tristate_option(WITH_MINIUPNPC "Enable UPnP." "if libminiupnpc is found." AUTO) | ||
tristate_option(WITH_ZMQ "Enable ZMQ notifications." "if libzmq is found." AUTO) | ||
tristate_option(WITH_USDT | ||
"Enable tracepoints for Userspace, Statically Defined Tracing." | ||
"if sys/sdt.h is found." | ||
AUTO | ||
) | ||
|
||
if(CXX20) | ||
set(CMAKE_CXX_STANDARD 20) | ||
else() | ||
set(CMAKE_CXX_STANDARD 17) | ||
endif() | ||
set(CMAKE_CXX_STANDARD_REQUIRED ON) | ||
set(CMAKE_CXX_EXTENSIONS OFF) | ||
|
||
set(configure_warnings) | ||
|
||
if(WIN32) | ||
#[=[ | ||
This build system supports two ways to build binaries for Windows. | ||
|
||
1. Building on Windows using MSVC. | ||
Implementation notes: | ||
- /DWIN32 and /D_WINDOWS definitions are included into the CMAKE_CXX_FLAGS_INIT | ||
and CMAKE_CXX_FLAGS_INIT variables by default. | ||
- A run-time library is selected using the CMAKE_MSVC_RUNTIME_LIBRARY variable. | ||
- MSVC-specific options, for example, /Zc:__cplusplus, are additionally required. | ||
|
||
2. Cross-compiling using MinGW. | ||
Implementation notes: | ||
- WIN32 and _WINDOWS definitions must be provided explicitly. | ||
- A run-time library must be specified explicitly using _MT definition. | ||
]=] | ||
|
||
add_compile_definitions(_WIN32_WINNT=0x0601 _WIN32_IE=0x0501 WIN32_LEAN_AND_MEAN NOMINMAX) | ||
|
||
if(MSVC) | ||
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") | ||
add_compile_options(/utf-8 /Zc:__cplusplus) | ||
endif() | ||
|
||
if(MINGW) | ||
add_compile_definitions(WIN32 _WINDOWS _MT) | ||
# We require Windows 7 (NT 6.1) or later. | ||
add_link_options(-Wl,--major-subsystem-version,6 -Wl,--minor-subsystem-version,1) | ||
endif() | ||
endif() | ||
|
||
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") | ||
add_compile_definitions(MAC_OSX) | ||
endif() | ||
|
||
if(CMAKE_CROSSCOMPILING AND DEPENDS_ALLOW_HOST_PACKAGES) | ||
list(APPEND CMAKE_FIND_ROOT_PATH "${CMAKE_SYSTEM_PREFIX_PATH}") | ||
endif() | ||
|
||
include(AddThreadsIfNeeded) | ||
add_threads_if_needed() | ||
|
||
include(AddBoostIfNeeded) | ||
add_boost_if_needed() | ||
|
||
include(CheckSourceCompilesAndLinks) | ||
|
||
include(AddLibeventIfNeeded) | ||
add_libevent_if_needed() | ||
|
||
include(cmake/introspection.cmake) | ||
|
||
include(cmake/crc32c.cmake) | ||
include(cmake/leveldb.cmake) | ||
include(cmake/minisketch.cmake) | ||
include(cmake/secp256k1.cmake) | ||
|
||
include(CheckStdFilesystem) | ||
check_std_filesystem() | ||
|
||
include(cmake/optional.cmake) | ||
|
||
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.14) | ||
include(CheckPIESupported) | ||
check_pie_supported(OUTPUT_VARIABLE check_pie_output LANGUAGES CXX) | ||
if(CMAKE_CXX_LINK_PIE_SUPPORTED) | ||
set(CMAKE_POSITION_INDEPENDENT_CODE ON) | ||
endif() | ||
else() | ||
check_cxx_source_links_with_flags(-fPIE "int main(){}" COMPILER_SUPPORTS_PIE) | ||
if(COMPILER_SUPPORTS_PIE) | ||
set(CMAKE_POSITION_INDEPENDENT_CODE ON) | ||
endif() | ||
endif() | ||
|
||
add_subdirectory(src) | ||
|
||
message("\n") | ||
message("Configure summary") | ||
message("=================") | ||
message("Executables:") | ||
message(" bitcoind ............................ ${BUILD_DAEMON}") | ||
message("Optional packages:") | ||
message(" NAT-PMP ............................. ${WITH_NATPMP}") | ||
message(" UPnP ................................ ${WITH_MINIUPNPC}") | ||
message(" ZeroMQ .............................. ${WITH_ZMQ}") | ||
message(" USDT tracing ........................ ${WITH_USDT}") | ||
message("") | ||
if(CMAKE_CROSSCOMPILING) | ||
set(cross_status "TRUE, for ${CMAKE_SYSTEM_NAME}, ${CMAKE_SYSTEM_PROCESSOR}") | ||
else() | ||
set(cross_status "FALSE") | ||
endif() | ||
message("Cross compiling ....................... ${cross_status}") | ||
get_directory_property(definitions COMPILE_DEFINITIONS) | ||
string(REPLACE ";" " " definitions "${definitions}") | ||
message("Preprocessor defined macros ........... ${definitions}") | ||
message("C compiler ............................ ${CMAKE_C_COMPILER}") | ||
message("CFLAGS ................................ ${CMAKE_C_FLAGS}") | ||
message("C++ compiler .......................... ${CMAKE_CXX_COMPILER}") | ||
message("CXXFLAGS .............................. ${CMAKE_CXX_FLAGS}") | ||
get_directory_property(common_compile_options COMPILE_OPTIONS) | ||
string(REPLACE ";" " " common_compile_options "${common_compile_options}") | ||
message("Common compile options ................ ${common_compile_options}") | ||
get_directory_property(common_link_options LINK_OPTIONS) | ||
string(REPLACE ";" " " common_link_options "${common_link_options}") | ||
message("Common link options ................... ${common_link_options}") | ||
if(DEFINED CMAKE_BUILD_TYPE) | ||
message("Build type:") | ||
message(" - CMAKE_BUILD_TYPE ................... ${CMAKE_BUILD_TYPE}") | ||
string(TOUPPER "${CMAKE_BUILD_TYPE}" build_type) | ||
message(" - CFLAGS ............................. ${CMAKE_C_FLAGS_${build_type}}") | ||
message(" - CXXFLAGS ........................... ${CMAKE_CXX_FLAGS_${build_type}}") | ||
message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_${build_type}}") | ||
message(" - LDFLAGS for shared libraries ....... ${CMAKE_SHARED_LINKER_FLAGS_${build_type}}") | ||
else() | ||
message("Available configurations .............. ${CMAKE_CONFIGURATION_TYPES}") | ||
message("Debug configuration:") | ||
message(" - CFLAGS ............................. ${CMAKE_C_FLAGS_DEBUG}") | ||
message(" - CXXFLAGS ........................... ${CMAKE_CXX_FLAGS_DEBUG}") | ||
message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_DEBUG}") | ||
message(" - LDFLAGS for shared libraries ....... ${CMAKE_SHARED_LINKER_FLAGS_DEBUG}") | ||
message("Release configuration:") | ||
message(" - CFLAGS ............................. ${CMAKE_C_FLAGS_RELEASE}") | ||
message(" - CXXFLAGS ........................... ${CMAKE_CXX_FLAGS_RELEASE}") | ||
message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_RELEASE}") | ||
message(" - LDFLAGS for shared libraries ....... ${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") | ||
endif() | ||
message("Use assembly routines ................. ${ASM}") | ||
message("Use ccache for compiling .............. ${CCACHE}") | ||
message("\n") | ||
if(configure_warnings) | ||
message(" ******\n") | ||
foreach(warning IN LISTS configure_warnings) | ||
message(WARNING "${warning}") | ||
endforeach() | ||
message(" ******\n") | ||
endif() |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I suspect this will irritate @fanquake, so I think we should come up with a plan for these.
IMO it's useful during testing to be generally faithful to the current buildsystem as you've done here. On the other hand, with a shiny new buildsystem, I think we really want features like this OFF by default.
So I propose: to keep these discussions from disrupting review progress, I think it makes sense to continue to copy the current buildsystem. BUT I think we should build in a follow-up step with a planned change of defaults soon-after cmake merge.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yea. We certainly wont be adopting this
tri-state
logic/machinery into our CMake build system long-term/at-merge-time. I'd consider it a regression to reimplement this Autotools behaviour. As for disabling certain "features" by default, yes, I think that is what we are going to do. It continues to make less & less sense to compile in stuff like this by default, let alone auto-opt-in builders to it, based on what happens to be installed on their systems at the time of compilation.