Skip to content

Commit c01451c

Browse files
committed
build with cmake
1 parent 9020d75 commit c01451c

File tree

4 files changed

+267
-0
lines changed

4 files changed

+267
-0
lines changed

.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Build subdirectories.
2+
/*build*
3+
!/build-aux
4+
!/build_msvc
5+
6+
*.pyc
7+
8+
/CMakeUserPresets.json

CMakeLists.txt

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
cmake_minimum_required(VERSION 3.22)
2+
3+
project(BitcoinCoreApp
4+
DESCRIPTION "Bitcoin GUI"
5+
HOMEPAGE_URL "https://bitcoincore.org/"
6+
LANGUAGES CXX
7+
)
8+
9+
# Language setup
10+
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NOT CMAKE_HOST_APPLE)
11+
# We do not use the install_name_tool when cross-compiling for macOS.
12+
# So disable this tool check in further enable_language() commands.
13+
set(CMAKE_PLATFORM_HAS_INSTALLNAME FALSE)
14+
endif()
15+
16+
set(CMAKE_CXX_STANDARD 20)
17+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
18+
set(CMAKE_CXX_EXTENSIONS OFF)
19+
20+
# Set top-level target output locations.
21+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
22+
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
23+
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
24+
25+
# Include Find*.cmake files
26+
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/module)
27+
28+
# Qt dependencies QML
29+
set(qt_components Core Gui LinguistTools Widgets Qml Quick QuickControls2)
30+
find_package(Qt 6.2 MODULE REQUIRED
31+
COMPONENTS ${qt_components}
32+
)
33+
find_package(Libevent 2.1.8 MODULE REQUIRED)
34+
35+
# Do not build any executable targets from bitcoin submodule
36+
set(BUILD_BENCH OFF)
37+
set(BUILD_BITCOIN_BIN OFF)
38+
set(BUILD_CLI OFF)
39+
set(BUILD_DAEMON OFF)
40+
set(BUILD_FOR_FUZZING OFF)
41+
set(BUILD_FUZZ_BINARY OFF)
42+
set(BUILD_GUI_TESTS OFF)
43+
set(BUILD_KERNEL_LIB OFF)
44+
set(BUILD_SHARED_LIBS OFF)
45+
set(BUILD_TESTS OFF)
46+
set(BUILD_TX OFF)
47+
set(BUILD_UTIL OFF)
48+
set(BUILD_UTIL_CHAINSTATE OFF)
49+
set(BUILD_WALLET_TOOL OFF)
50+
# We need this libraries, can ignore the executable bitcoin-qt
51+
set(BUILD_GUI ON)
52+
set(ENABLE_WALLET ON)
53+
54+
# Bitcoin Core codebase
55+
# Builds libraries: univalue, core_interface, bitcoin_node, bitcoin_wallet
56+
add_subdirectory(bitcoin)
57+
58+
# Qt-specific commands
59+
set(CMAKE_AUTOMOC ON)
60+
set(CMAKE_AUTOMOC_MOC_OPTIONS "-p${CMAKE_CURRENT_SOURCE_DIR}")
61+
set(CMAKE_AUTORCC ON)
62+
set(CMAKE_AUTOUIC ON)
63+
# but don't let Qt interfere with bitcoin core libraries
64+
set_target_properties(bitcoin_wallet PROPERTIES AUTOUIC OFF)
65+
66+
# Compile Qt+QML sources
67+
set(CMAKE_AUTOMOC_MOC_OPTIONS "-I${CMAKE_CURRENT_SOURCE_DIR}/qml")
68+
file(GLOB_RECURSE QML_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/qml/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/qml/*.h")
69+
list(FILTER QML_SOURCES EXCLUDE REGEX "androidnotifier\\.(cpp|h)$")
70+
set(QML_QRC "${CMAKE_CURRENT_SOURCE_DIR}/qml/bitcoin_qml.qrc")
71+
qt6_add_resources(QML_QRC_CPP ${QML_QRC})
72+
list(APPEND QML_SOURCES ${QML_QRC_CPP})
73+
list(APPEND QML_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/bitcoin/src/init/bitcoin-qt.cpp")
74+
75+
# Build QML library
76+
add_library(bitcoinqml STATIC ${QML_SOURCES})
77+
# Prevent Qt macros like "signal" from polluting bitcoin core code
78+
target_compile_definitions(bitcoinqml
79+
PUBLIC
80+
QT_NO_KEYWORDS
81+
QT_USE_QSTRINGBUILDER
82+
)
83+
target_include_directories(bitcoinqml
84+
PRIVATE
85+
# to keep the convention of #include <qml/*.h>
86+
${CMAKE_CURRENT_SOURCE_DIR}
87+
88+
# for interfaces consensus chainparams etc...
89+
${CMAKE_CURRENT_SOURCE_DIR}/bitcoin/src
90+
91+
# for qt/guiutil.h qt/peertablemodel.h qt/rpcconsole.h etc...
92+
${CMAKE_CURRENT_SOURCE_DIR}/bitcoin/src/qt
93+
94+
# for bitcoin-build-config.h
95+
${CMAKE_CURRENT_BINARY_DIR}/bitcoin/src
96+
)
97+
target_link_libraries(bitcoinqml
98+
PUBLIC
99+
core_interface
100+
bitcoin_node
101+
univalue
102+
Qt6::Qml
103+
Qt6::Quick
104+
Qt6::QuickControls2
105+
Qt6::Widgets
106+
)
107+
108+
# Put it all together
109+
add_executable(bitcoin-core-app main.cpp)
110+
target_include_directories(bitcoin-core-app
111+
PRIVATE
112+
# to keep the convention of #include <qml/*.h>
113+
${CMAKE_CURRENT_SOURCE_DIR}
114+
115+
# for interfaces compat util etc...
116+
${CMAKE_CURRENT_SOURCE_DIR}/bitcoin/src
117+
118+
# for bitcoin-build-config.h
119+
${CMAKE_CURRENT_BINARY_DIR}/bitcoin/src
120+
)
121+
target_link_libraries(bitcoin-core-app
122+
PRIVATE
123+
univalue
124+
core_interface
125+
bitcoin_node
126+
bitcoinqml
127+
bitcoinqt
128+
)

cmake/module/FindLibevent.cmake

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# Copyright (c) 2024-present The Bitcoin Core developers
2+
# Distributed under the MIT software license, see the accompanying
3+
# file COPYING or https://opensource.org/license/mit/.
4+
5+
#[=======================================================================[
6+
FindLibevent
7+
------------
8+
9+
Finds the Libevent headers and libraries.
10+
11+
This is a wrapper around find_package()/pkg_check_modules() commands that:
12+
- facilitates searching in various build environments
13+
- prints a standard log message
14+
15+
#]=======================================================================]
16+
17+
# Check whether evhttp_connection_get_peer expects const char**.
18+
# See https://github.com/libevent/libevent/commit/a18301a2bb160ff7c3ffaf5b7653c39ffe27b385
19+
function(check_evhttp_connection_get_peer target)
20+
include(CMakePushCheckState)
21+
cmake_push_check_state(RESET)
22+
set(CMAKE_REQUIRED_LIBRARIES ${target})
23+
include(CheckCXXSourceCompiles)
24+
check_cxx_source_compiles("
25+
#include <cstdint>
26+
#include <event2/http.h>
27+
28+
int main()
29+
{
30+
evhttp_connection* conn = (evhttp_connection*)1;
31+
const char* host;
32+
uint16_t port;
33+
evhttp_connection_get_peer(conn, &host, &port);
34+
}
35+
" HAVE_EVHTTP_CONNECTION_GET_PEER_CONST_CHAR
36+
)
37+
cmake_pop_check_state()
38+
target_compile_definitions(${target} INTERFACE
39+
$<$<BOOL:${HAVE_EVHTTP_CONNECTION_GET_PEER_CONST_CHAR}>:HAVE_EVHTTP_CONNECTION_GET_PEER_CONST_CHAR>
40+
)
41+
endfunction()
42+
43+
set(_libevent_components core extra)
44+
if(NOT WIN32)
45+
list(APPEND _libevent_components pthreads)
46+
endif()
47+
48+
find_package(Libevent ${Libevent_FIND_VERSION} QUIET
49+
NO_MODULE
50+
)
51+
52+
include(FindPackageHandleStandardArgs)
53+
if(Libevent_FOUND)
54+
find_package(Libevent ${Libevent_FIND_VERSION} QUIET
55+
REQUIRED COMPONENTS ${_libevent_components}
56+
NO_MODULE
57+
)
58+
find_package_handle_standard_args(Libevent
59+
REQUIRED_VARS Libevent_DIR
60+
VERSION_VAR Libevent_VERSION
61+
)
62+
check_evhttp_connection_get_peer(libevent::extra)
63+
else()
64+
find_package(PkgConfig REQUIRED)
65+
foreach(component IN LISTS _libevent_components)
66+
pkg_check_modules(libevent_${component}
67+
REQUIRED QUIET
68+
IMPORTED_TARGET GLOBAL
69+
libevent_${component}>=${Libevent_FIND_VERSION}
70+
)
71+
if(TARGET PkgConfig::libevent_${component} AND NOT TARGET libevent::${component})
72+
add_library(libevent::${component} ALIAS PkgConfig::libevent_${component})
73+
endif()
74+
endforeach()
75+
find_package_handle_standard_args(Libevent
76+
REQUIRED_VARS libevent_core_LIBRARY_DIRS
77+
VERSION_VAR libevent_core_VERSION
78+
)
79+
check_evhttp_connection_get_peer(PkgConfig::libevent_extra)
80+
endif()
81+
82+
unset(_libevent_components)
83+
84+
mark_as_advanced(Libevent_DIR)
85+
mark_as_advanced(_event_h)
86+
mark_as_advanced(_event_lib)

cmake/module/FindQt.cmake

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Copyright (c) 2024-present The Bitcoin Core developers
2+
# Distributed under the MIT software license, see the accompanying
3+
# file COPYING or https://opensource.org/license/mit/.
4+
5+
#[=======================================================================[
6+
FindQt
7+
------
8+
9+
Finds the Qt headers and libraries.
10+
11+
This is a wrapper around find_package() command that:
12+
- facilitates searching in various build environments
13+
- prints a standard log message
14+
15+
#]=======================================================================]
16+
17+
set(_qt_homebrew_prefix)
18+
if(CMAKE_HOST_APPLE)
19+
find_program(HOMEBREW_EXECUTABLE brew)
20+
if(HOMEBREW_EXECUTABLE)
21+
execute_process(
22+
COMMAND ${HOMEBREW_EXECUTABLE} --prefix qt@${Qt_FIND_VERSION_MAJOR}
23+
OUTPUT_VARIABLE _qt_homebrew_prefix
24+
ERROR_QUIET
25+
OUTPUT_STRIP_TRAILING_WHITESPACE
26+
)
27+
endif()
28+
endif()
29+
30+
find_package(Qt${Qt_FIND_VERSION_MAJOR} ${Qt_FIND_VERSION}
31+
COMPONENTS ${Qt_FIND_COMPONENTS}
32+
HINTS ${_qt_homebrew_prefix}
33+
PATH_SUFFIXES Qt${Qt_FIND_VERSION_MAJOR} # Required on OpenBSD systems.
34+
)
35+
unset(_qt_homebrew_prefix)
36+
37+
include(FindPackageHandleStandardArgs)
38+
find_package_handle_standard_args(Qt
39+
REQUIRED_VARS Qt${Qt_FIND_VERSION_MAJOR}_DIR
40+
VERSION_VAR Qt${Qt_FIND_VERSION_MAJOR}_VERSION
41+
)
42+
43+
foreach(component IN LISTS Qt_FIND_COMPONENTS ITEMS "")
44+
mark_as_advanced(Qt${Qt_FIND_VERSION_MAJOR}${component}_DIR)
45+
endforeach()

0 commit comments

Comments
 (0)