Skip to content

Commit 9ca3578

Browse files
committed
Merge #10: build: Add CMake-based build system (4 of N)
b0351e3 [FIXUP] cmake: Rework PIC/PIE logic (Hennadii Stepanov) a8917ab cmake: Add cross-compiling support (Hennadii Stepanov) e5e6bd3 build: Generate `share/toolchain.cmake` in depends (Hennadii Stepanov) d37c9a2 [FIXUP] cmake: Ensure C language is disabled for FindThreads (Hennadii Stepanov) 3bb3448 [FIXUP] cmake: Enable C language for libsecp256k1 (Hennadii Stepanov) 75b9b6c [FIXUP] cmake: Drop C language from the global project (Hennadii Stepanov) Pull request description: #7 (comment): > So.. requesting a hookup to depends in the next PR please :) Delivered :) --- The parent PR: bitcoin#25797. The previous PRs in the staging branch: #5, #6, #7. --- EXAMPLES: Cross-compiling for Windows: ``` make -C depends HOST=x86_64-w64-mingw32 NO_QT=1 NO_WALLET=1 NO_ZMQ=1 NO_UPNP=1 NO_NATPMP=1 NO_USDT=1 cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=depends/x86_64-w64-mingw32/share/toolchain.cmake cmake --build build ``` Cross-compiling for macOS, arm64: ``` make -C depends HOST=arm64-apple-darwin NO_QT=1 NO_WALLET=1 NO_ZMQ=1 NO_UPNP=1 NO_NATPMP=1 NO_USDT=1 cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=depends/arm64-apple-darwin/share/toolchain.cmake cmake --build build ``` ACKs for top commit: theuni: ACK b0351e3, with the caveat that I hope we can make _significant_ changes to the `toolchain.cmake.in`. But I'm ok calling that a work-in-progress while the rest of the work is introduced to keep it from holding up review further. Tree-SHA512: 41e9925fb30766c61eca3506eed4b8a75701d0ba84c3077317266f73771eca50b14b40102e473b15d5f3f8eac7d87a19c5b27889cb6f350d089b3231b57c0991
2 parents 38604b7 + b0351e3 commit 9ca3578

File tree

7 files changed

+224
-15
lines changed

7 files changed

+224
-15
lines changed

CMakeLists.txt

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ project("Bitcoin Core"
2424
VERSION 24.99.0
2525
DESCRIPTION "Bitcoin client software"
2626
HOMEPAGE_URL "https://bitcoincore.org/"
27-
LANGUAGES CXX C ASM
27+
LANGUAGES CXX ASM
2828
)
2929

3030
set(CLIENT_VERSION_IS_RELEASE "false")
@@ -52,16 +52,6 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
5252
set(CMAKE_CXX_EXTENSIONS OFF)
5353

5454
set(configure_warnings)
55-
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.14)
56-
include(CheckPIESupported)
57-
check_pie_supported(OUTPUT_VARIABLE check_pie_output LANGUAGES CXX)
58-
if(NOT CMAKE_CXX_LINK_PIE_SUPPORTED)
59-
list(APPEND configure_warnings "PIE link options are not supported for executable targets: ${check_pie_output}.")
60-
endif()
61-
else()
62-
list(APPEND configure_warnings "No PIE options will be passed to a linker for executable targets.")
63-
endif()
64-
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
6555

6656
if(WIN32)
6757
#[=[
@@ -98,6 +88,10 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
9888
add_compile_definitions(MAC_OSX)
9989
endif()
10090

91+
if(CMAKE_CROSSCOMPILING AND DEPENDS_ALLOW_HOST_PACKAGES)
92+
list(APPEND CMAKE_FIND_ROOT_PATH "${CMAKE_SYSTEM_PREFIX_PATH}")
93+
endif()
94+
10195
include(AddThreadsIfNeeded)
10296
add_threads_if_needed()
10397

@@ -119,6 +113,19 @@ include(cmake/secp256k1.cmake)
119113
include(CheckStdFilesystem)
120114
check_std_filesystem()
121115

116+
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.14)
117+
include(CheckPIESupported)
118+
check_pie_supported(OUTPUT_VARIABLE check_pie_output LANGUAGES CXX)
119+
if(CMAKE_CXX_LINK_PIE_SUPPORTED)
120+
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
121+
endif()
122+
else()
123+
check_cxx_source_links_with_flags(-fPIE "int main(){}" COMPILER_SUPPORTS_PIE)
124+
if(COMPILER_SUPPORTS_PIE)
125+
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
126+
endif()
127+
endif()
128+
122129
add_subdirectory(src)
123130

124131
message("\n")
@@ -127,6 +134,12 @@ message("=================")
127134
message("Executables:")
128135
message(" bitcoind ............................ ${BUILD_DAEMON}")
129136
message("")
137+
if(CMAKE_CROSSCOMPILING)
138+
set(cross_status "TRUE, for ${CMAKE_SYSTEM_NAME}, ${CMAKE_SYSTEM_PROCESSOR}")
139+
else()
140+
set(cross_status "FALSE")
141+
endif()
142+
message("Cross compiling ....................... ${cross_status}")
130143
get_directory_property(definitions COMPILE_DEFINITIONS)
131144
string(REPLACE ";" " " definitions "${definitions}")
132145
message("Preprocessor defined macros ........... ${definitions}")

cmake/module/AddLibeventIfNeeded.cmake

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@ function(add_libevent_if_needed)
3737
return()
3838
endif()
3939

40-
find_package(PkgConfig)
41-
pkg_check_modules(libevent REQUIRED libevent>=${libevent_minimum_version} IMPORTED_TARGET GLOBAL)
40+
include(CrossPkgConfig)
41+
cross_pkg_check_modules(libevent REQUIRED libevent>=${libevent_minimum_version} IMPORTED_TARGET GLOBAL)
4242
check_evhttp_connection_get_peer(PkgConfig::libevent)
4343
target_link_libraries(PkgConfig::libevent INTERFACE
4444
$<$<BOOL:${MINGW}>:iphlpapi;ws2_32>
4545
)
4646
add_library(libevent::libevent ALIAS PkgConfig::libevent)
4747

4848
if(NOT WIN32)
49-
pkg_check_modules(libevent_pthreads REQUIRED libevent_pthreads>=${libevent_minimum_version} IMPORTED_TARGET)
49+
cross_pkg_check_modules(libevent_pthreads REQUIRED libevent_pthreads>=${libevent_minimum_version} IMPORTED_TARGET)
5050
endif()
5151
endfunction()

cmake/module/AddThreadsIfNeeded.cmake

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,17 @@ function(add_threads_if_needed)
77
# require Threads. Therefore, a proper check will be
88
# appropriate here.
99

10+
if(CMAKE_C_COMPILER_LOADED)
11+
message(FATAL_ERROR [=[
12+
To make FindThreads check C++ language features, C language must be
13+
disabled. This is essential, at least, when cross-compiling for MinGW-w64
14+
because two different threading models are available.
15+
]=] )
16+
endif()
17+
1018
set(THREADS_PREFER_PTHREAD_FLAG ON)
1119
find_package(Threads REQUIRED)
20+
set_target_properties(Threads::Threads PROPERTIES IMPORTED_GLOBAL TRUE)
1221

1322
set(thread_local)
1423
if(MINGW)

cmake/module/CrossPkgConfig.cmake

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Copyright (c) 2023 The Bitcoin Core developers
2+
# Distributed under the MIT software license, see the accompanying
3+
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
4+
5+
find_package(PkgConfig REQUIRED)
6+
7+
macro(cross_pkg_check_modules)
8+
if(CMAKE_CROSSCOMPILING)
9+
set(pkg_config_path_saved "$ENV{PKG_CONFIG_PATH}")
10+
set(pkg_config_libdir_saved "$ENV{PKG_CONFIG_LIBDIR}")
11+
set(ENV{PKG_CONFIG_PATH} ${PKG_CONFIG_PATH})
12+
set(ENV{PKG_CONFIG_LIBDIR} ${PKG_CONFIG_LIBDIR})
13+
pkg_check_modules(${ARGV})
14+
set(ENV{PKG_CONFIG_PATH} ${pkg_config_path_saved})
15+
set(ENV{PKG_CONFIG_LIBDIR} ${pkg_config_libdir_saved})
16+
else()
17+
pkg_check_modules(${ARGV})
18+
endif()
19+
endmacro()

cmake/secp256k1.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
# support has been merged we should switch to using the upstream CMake
77
# buildsystem.
88

9+
enable_language(C)
910
set(CMAKE_C_STANDARD 90)
1011
set(CMAKE_C_EXTENSIONS OFF)
1112

depends/Makefile

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ $(host_arch)_$(host_os)_native_toolchain?=$($(host_os)_native_toolchain)
190190
include funcs.mk
191191

192192
final_build_id_long+=$(shell $(build_SHA256SUM) config.site.in)
193+
final_build_id_long+=$(shell $(build_SHA256SUM) toolchain.cmake.in)
193194
final_build_id+=$(shell echo -n "$(final_build_id_long)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH))
194195
$(host_prefix)/.stamp_$(final_build_id): $(native_packages) $(packages)
195196
rm -rf $(@D)
@@ -257,6 +258,34 @@ $(host_prefix)/share/config.site : config.site.in $(host_prefix)/.stamp_$(final_
257258
$< > $@
258259
touch $@
259260

261+
$(host_prefix)/share/toolchain.cmake : toolchain.cmake.in $(host_prefix)/.stamp_$(final_build_id)
262+
@mkdir -p $(@D)
263+
sed -e 's|@host_system@|$($(host_os)_cmake_system)|' \
264+
-e 's|@host_arch@|$(host_arch)|' \
265+
-e 's|@CC@|$(host_CC)|' \
266+
-e 's|@CXX@|$(host_CXX)|' \
267+
-e 's|@AR@|$(host_AR)|' \
268+
-e 's|@RANLIB@|$(host_RANLIB)|' \
269+
-e 's|@STRIP@|$(host_STRIP)|' \
270+
-e 's|@OBJCOPY@|$(host_OBJCOPY)|' \
271+
-e 's|@INSTALL_NAME_TOOL@|$(host_INSTALL_NAME_TOOL)|' \
272+
-e 's|@OTOOL@|$(host_OTOOL)|' \
273+
-e 's|@depends_prefix@|$(host_prefix)|' \
274+
-e 's|@CFLAGS@|$(strip $(host_CFLAGS) $(host_$(release_type)_CFLAGS))|' \
275+
-e 's|@CXXFLAGS@|$(strip $(host_CXXFLAGS) $(host_$(release_type)_CXXFLAGS))|' \
276+
-e 's|@CPPFLAGS@|$(strip $(host_CPPFLAGS) $(host_$(release_type)_CPPFLAGS))|' \
277+
-e 's|@allow_host_packages@|$(ALLOW_HOST_PACKAGES)|' \
278+
-e 's|@no_qt@|$(NO_QT)|' \
279+
-e 's|@no_qr@|$(NO_QR)|' \
280+
-e 's|@no_zmq@|$(NO_ZMQ)|' \
281+
-e 's|@no_wallet@|$(NO_WALLET)|' \
282+
-e 's|@no_bdb@|$(NO_BDB)|' \
283+
-e 's|@no_sqlite@|$(NO_SQLITE)|' \
284+
-e 's|@no_upnp@|$(NO_UPNP)|' \
285+
-e 's|@no_natpmp@|$(NO_NATPMP)|' \
286+
-e 's|@no_usdt@|$(NO_USDT)|' \
287+
$< > $@
288+
touch $@
260289

261290
define check_or_remove_cached
262291
mkdir -p $(BASE_CACHE)/$(host)/$(package) && cd $(BASE_CACHE)/$(host)/$(package); \
@@ -278,6 +307,7 @@ check-sources:
278307
@$(foreach package,$(all_packages),$(call check_or_remove_sources,$(package));)
279308

280309
$(host_prefix)/share/config.site: check-packages
310+
$(host_prefix)/share/toolchain.cmake: check-packages
281311

282312
check-packages: check-sources
283313

@@ -287,7 +317,7 @@ clean-all: clean
287317
clean:
288318
@rm -rf $(WORK_PATH) $(BASE_CACHE) $(BUILD) *.log
289319

290-
install: check-packages $(host_prefix)/share/config.site
320+
install: check-packages $(host_prefix)/share/config.site $(host_prefix)/share/toolchain.cmake
291321

292322

293323
download-one: check-sources $(all_sources)

depends/toolchain.cmake.in

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
# This file is expected to be highly volatile and may still change substantially.
2+
3+
set(CMAKE_SYSTEM_NAME @host_system@)
4+
set(CMAKE_SYSTEM_PROCESSOR @host_arch@)
5+
6+
function(split_compiler_launcher env_compiler launcher compiler)
7+
set(${launcher})
8+
list(GET ${env_compiler} 0 start_token)
9+
if(start_token STREQUAL "env")
10+
set(${compiler})
11+
set(env_arg_parsing TRUE)
12+
foreach(token IN LISTS ${env_compiler})
13+
if(env_arg_parsing)
14+
list(APPEND ${launcher} ${token})
15+
set(env_arg_parsing FALSE)
16+
continue()
17+
elseif(token STREQUAL "-u")
18+
list(APPEND ${launcher} ${token})
19+
set(env_arg_parsing TRUE)
20+
continue()
21+
endif()
22+
list(APPEND ${compiler} ${token})
23+
endforeach()
24+
else()
25+
set(${compiler} ${${env_compiler}})
26+
endif()
27+
set(${launcher} ${${launcher}} PARENT_SCOPE)
28+
set(${compiler} ${${compiler}} PARENT_SCOPE)
29+
endfunction()
30+
31+
if(NOT CMAKE_C_COMPILER)
32+
set(DEPENDS_C_COMPILER_WITH_LAUNCHER @CC@)
33+
split_compiler_launcher(DEPENDS_C_COMPILER_WITH_LAUNCHER CMAKE_C_COMPILER_LAUNCHER CMAKE_C_COMPILER)
34+
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.21)
35+
set(CMAKE_C_LINKER_LAUNCHER ${CMAKE_C_COMPILER_LAUNCHER})
36+
endif()
37+
if(CMAKE_VERSION VERSION_LESS 3.19)
38+
set(DEPENDS_C_COMPILER_FLAGS ${CMAKE_C_COMPILER})
39+
list(REMOVE_AT DEPENDS_C_COMPILER_FLAGS 0)
40+
string(REPLACE ";" " " DEPENDS_C_COMPILER_FLAGS "${DEPENDS_C_COMPILER_FLAGS}")
41+
list(GET CMAKE_C_COMPILER 0 CMAKE_C_COMPILER)
42+
endif()
43+
endif()
44+
set(CMAKE_C_FLAGS_INIT "${DEPENDS_C_COMPILER_FLAGS} @CPPFLAGS@ @CFLAGS@")
45+
46+
if(NOT CMAKE_CXX_COMPILER)
47+
set(DEPENDS_CXX_COMPILER_WITH_LAUNCHER @CXX@)
48+
split_compiler_launcher(DEPENDS_CXX_COMPILER_WITH_LAUNCHER CMAKE_CXX_COMPILER_LAUNCHER CMAKE_CXX_COMPILER)
49+
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.21)
50+
set(CMAKE_CXX_LINKER_LAUNCHER ${CMAKE_CXX_COMPILER_LAUNCHER})
51+
endif()
52+
if(CMAKE_VERSION VERSION_LESS 3.19)
53+
set(DEPENDS_CXX_COMPILER_FLAGS ${CMAKE_CXX_COMPILER})
54+
list(REMOVE_AT DEPENDS_CXX_COMPILER_FLAGS 0)
55+
string(REPLACE ";" " " DEPENDS_CXX_COMPILER_FLAGS "${DEPENDS_CXX_COMPILER_FLAGS}")
56+
list(GET CMAKE_CXX_COMPILER 0 CMAKE_CXX_COMPILER)
57+
endif()
58+
endif()
59+
set(CMAKE_CXX_FLAGS_INIT "${DEPENDS_CXX_COMPILER_FLAGS} @CPPFLAGS@ @CXXFLAGS@")
60+
61+
if(NOT CMAKE_OBJCXX_COMPILER)
62+
set(DEPENDS_OBJCXX_COMPILER_WITH_LAUNCHER @CXX@)
63+
split_compiler_launcher(DEPENDS_OBJCXX_COMPILER_WITH_LAUNCHER CMAKE_OBJCXX_COMPILER_LAUNCHER CMAKE_OBJCXX_COMPILER)
64+
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.21)
65+
set(CMAKE_OBJCXX_LINKER_LAUNCHER ${CMAKE_OBJCXX_COMPILER_LAUNCHER})
66+
endif()
67+
if(CMAKE_VERSION VERSION_LESS 3.19)
68+
set(DEPENDS_OBJCXX_COMPILER_FLAGS ${CMAKE_OBJCXX_COMPILER})
69+
list(REMOVE_AT DEPENDS_OBJCXX_COMPILER_FLAGS 0)
70+
string(REPLACE ";" " " DEPENDS_OBJCXX_COMPILER_FLAGS "${DEPENDS_OBJCXX_COMPILER_FLAGS}")
71+
list(GET CMAKE_OBJCXX_COMPILER 0 CMAKE_OBJCXX_COMPILER)
72+
endif()
73+
endif()
74+
set(CMAKE_OBJCXX_FLAGS_INIT "${DEPENDS_OBJCXX_COMPILER_FLAGS} @CPPFLAGS@ @CXXFLAGS@")
75+
76+
set(CMAKE_AR "@AR@")
77+
set(CMAKE_RANLIB "@RANLIB@")
78+
set(CMAKE_STRIP "@STRIP@")
79+
set(CMAKE_OBJCOPY "@OBJCOPY@")
80+
set(CMAKE_INSTALL_NAME_TOOL "@INSTALL_NAME_TOOL@")
81+
set(OTOOL "@OTOOL@")
82+
83+
set(CMAKE_FIND_ROOT_PATH "@depends_prefix@")
84+
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
85+
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
86+
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
87+
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
88+
set(PKG_CONFIG_PATH "@depends_prefix@/lib/pkgconfig")
89+
if("@allow_host_packages@" STREQUAL "1")
90+
set(DEPENDS_ALLOW_HOST_PACKAGES TRUE)
91+
else()
92+
set(DEPENDS_ALLOW_HOST_PACKAGES FALSE)
93+
set(PKG_CONFIG_LIBDIR "${PKG_CONFIG_PATH}")
94+
endif()
95+
set(QT_TRANSLATIONS_DIR "@depends_prefix@/translations")
96+
97+
if(NOT WITH_GUI AND "@no_qt@" STREQUAL "1")
98+
set(WITH_GUI "no" CACHE STRING "")
99+
endif()
100+
101+
if(NOT WITH_QRENCODE AND "@no_qr@" STREQUAL "1")
102+
set(WITH_QRENCODE OFF CACHE STRING "")
103+
endif()
104+
105+
if(NOT WITH_ZMQ AND "@no_zmq@" STREQUAL "1")
106+
set(WITH_ZMQ OFF CACHE STRING "")
107+
endif()
108+
109+
if(NOT ENABLE_WALLET AND "@no_wallet@" STREQUAL "1")
110+
set(ENABLE_WALLET OFF CACHE BOOL "")
111+
endif()
112+
113+
if(NOT WITH_BDB AND "@no_bdb@" STREQUAL "1")
114+
set(WITH_BDB OFF CACHE STRING "")
115+
endif()
116+
117+
if(NOT WITH_SQLITE AND "@no_sqlite@" STREQUAL "1")
118+
set(WITH_SQLITE OFF CACHE STRING "")
119+
endif()
120+
121+
if(NOT WITH_MINIUPNPC AND "@no_upnp@" STREQUAL "1")
122+
set(WITH_MINIUPNPC OFF CACHE STRING "")
123+
endif()
124+
125+
if(NOT WITH_NATPMP AND "@no_natpmp@" STREQUAL "1")
126+
set(WITH_NATPMP OFF CACHE STRING "")
127+
endif()
128+
129+
if(NOT WITH_USDT AND "@no_usdt@" STREQUAL "1")
130+
set(WITH_USDT OFF CACHE STRING "")
131+
endif()
132+
133+
if(DEFINED ENV{PYTHONPATH})
134+
set(PYTHONPATH "@depends_prefix@/native/lib/python3/dist-packages:$ENV{PYTHONPATH}")
135+
else()
136+
set(PYTHONPATH "@depends_prefix@/native/lib/python3/dist-packages")
137+
endif()

0 commit comments

Comments
 (0)