Skip to content

Commit 79bbb38

Browse files
committed
Merge bitcoin/bitcoin#30901: cmake: Revamp handling of data files
ecf54a3 cmake: Add support for builtin `codegen` target (Hennadii Stepanov) a8c78a0 cmake: Revamp handling of data files (Hennadii Stepanov) Pull request description: This PR leverages the approach from the https://github.com/chaincodelabs/libmultiprocess project and introduces a new functions `target_json_data_sources()` and `target_raw_data_sources()`, which minimize the amount of code required to assign to assign a `*.json` or `*.raw` data file to the `test_bitcoin`, `bench_bitcoin` or `unitester` targets. As requested in bitcoin/bitcoin#30901 (comment), the `codegen` build target is now supported, if available: ``` $ cmake --version cmake version 3.31.5 CMake suite maintained and supported by Kitware (kitware.com/cmake). $ cmake -G "Ninja" -B build $ cmake --build build --target codegen ``` ACKs for top commit: fjahr: re-ACK ecf54a3 Sjors: re-tACK ecf54a3 theuni: ACK ecf54a3 Tree-SHA512: bab92df6b81c47d9d97ba8db37470a6d7aa435d5578afe40df7154885eda55afc59f0bf20dc9db3b2fd88ceb9a0319b9678f9e9af01e7afd4851ec3a79f3f402
2 parents 3c1f72a + ecf54a3 commit 79bbb38

File tree

6 files changed

+141
-167
lines changed

6 files changed

+141
-167
lines changed

CMakeLists.txt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,16 @@
99
# - CMake 3.26.5, https://mirror.stream.centos.org/9-stream/AppStream/x86_64/os/Packages/
1010
cmake_minimum_required(VERSION 3.22)
1111

12-
if (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
12+
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
1313
message(FATAL_ERROR "In-source builds are not allowed.")
1414
endif()
1515

16+
if(POLICY CMP0171)
17+
# `codegen` is a reserved target name.
18+
# See: https://cmake.org/cmake/help/latest/policy/CMP0171.html
19+
cmake_policy(SET CMP0171 NEW)
20+
endif()
21+
1622
#=============================
1723
# Project / Package metadata
1824
#=============================

cmake/module/GenerateHeaders.cmake

Lines changed: 0 additions & 29 deletions
This file was deleted.

cmake/module/TargetDataSources.cmake

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# Copyright (c) 2023-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+
macro(set_add_custom_command_options)
6+
set(DEPENDS_EXPLICIT_OPT "")
7+
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.27)
8+
set(DEPENDS_EXPLICIT_OPT DEPENDS_EXPLICIT_ONLY)
9+
endif()
10+
set(CODEGEN_OPT "")
11+
if(POLICY CMP0171)
12+
cmake_policy(GET CMP0171 _cmp0171_status)
13+
if(_cmp0171_status STREQUAL "NEW")
14+
set(CODEGEN_OPT CODEGEN)
15+
endif()
16+
unset(_cmp0171_status)
17+
endif()
18+
endmacro()
19+
20+
# Specifies JSON data files to be processed into corresponding
21+
# header files for inclusion when building a target.
22+
function(target_json_data_sources target)
23+
set_add_custom_command_options()
24+
foreach(json_file IN LISTS ARGN)
25+
set(header ${CMAKE_CURRENT_BINARY_DIR}/${json_file}.h)
26+
add_custom_command(
27+
OUTPUT ${header}
28+
COMMAND ${CMAKE_COMMAND} -DJSON_SOURCE_PATH=${CMAKE_CURRENT_SOURCE_DIR}/${json_file} -DHEADER_PATH=${header} -P ${PROJECT_SOURCE_DIR}/cmake/script/GenerateHeaderFromJson.cmake
29+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${json_file} ${PROJECT_SOURCE_DIR}/cmake/script/GenerateHeaderFromJson.cmake
30+
VERBATIM
31+
${CODEGEN_OPT}
32+
${DEPENDS_EXPLICIT_OPT}
33+
)
34+
target_sources(${target} PRIVATE ${header})
35+
endforeach()
36+
endfunction()
37+
38+
# Specifies raw binary data files to be processed into corresponding
39+
# header files for inclusion when building a target.
40+
function(target_raw_data_sources target)
41+
cmake_parse_arguments(PARSE_ARGV 1 _ "" "NAMESPACE" "")
42+
set_add_custom_command_options()
43+
foreach(raw_file IN LISTS __UNPARSED_ARGUMENTS)
44+
set(header ${CMAKE_CURRENT_BINARY_DIR}/${raw_file}.h)
45+
add_custom_command(
46+
OUTPUT ${header}
47+
COMMAND ${CMAKE_COMMAND} -DRAW_SOURCE_PATH=${CMAKE_CURRENT_SOURCE_DIR}/${raw_file} -DHEADER_PATH=${header} -DRAW_NAMESPACE=${__NAMESPACE} -P ${PROJECT_SOURCE_DIR}/cmake/script/GenerateHeaderFromRaw.cmake
48+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${raw_file} ${PROJECT_SOURCE_DIR}/cmake/script/GenerateHeaderFromRaw.cmake
49+
VERBATIM
50+
${CODEGEN_OPT}
51+
${DEPENDS_EXPLICIT_OPT}
52+
)
53+
target_sources(${target} PRIVATE ${header})
54+
endforeach()
55+
endfunction()

src/bench/CMakeLists.txt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,10 @@
22
# Distributed under the MIT software license, see the accompanying
33
# file COPYING or https://opensource.org/license/mit/.
44

5-
include(GenerateHeaders)
6-
generate_header_from_raw(data/block413567.raw benchmark::data)
7-
85
add_executable(bench_bitcoin
96
bench_bitcoin.cpp
107
bench.cpp
118
nanobench.cpp
12-
${CMAKE_CURRENT_BINARY_DIR}/data/block413567.raw.h
139
# Benchmarks:
1410
addrman.cpp
1511
base58.cpp
@@ -56,6 +52,11 @@ add_executable(bench_bitcoin
5652
xor.cpp
5753
)
5854

55+
include(TargetDataSources)
56+
target_raw_data_sources(bench_bitcoin NAMESPACE benchmark::data
57+
data/block413567.raw
58+
)
59+
5960
target_link_libraries(bench_bitcoin
6061
core_interface
6162
test_util

src/test/CMakeLists.txt

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,10 @@
22
# Distributed under the MIT software license, see the accompanying
33
# file COPYING or https://opensource.org/license/mit/.
44

5-
include(GenerateHeaders)
6-
generate_header_from_json(data/base58_encode_decode.json)
7-
generate_header_from_json(data/bip341_wallet_vectors.json)
8-
generate_header_from_json(data/blockfilters.json)
9-
generate_header_from_json(data/key_io_invalid.json)
10-
generate_header_from_json(data/key_io_valid.json)
11-
generate_header_from_json(data/script_tests.json)
12-
generate_header_from_json(data/sighash.json)
13-
generate_header_from_json(data/tx_invalid.json)
14-
generate_header_from_json(data/tx_valid.json)
15-
generate_header_from_raw(data/asmap.raw test::data)
16-
175
# Do not use generator expressions in test sources because the
186
# SOURCES property is processed to gather test suite macros.
197
add_executable(test_bitcoin
208
main.cpp
21-
${CMAKE_CURRENT_BINARY_DIR}/data/asmap.raw.h
22-
${CMAKE_CURRENT_BINARY_DIR}/data/base58_encode_decode.json.h
23-
${CMAKE_CURRENT_BINARY_DIR}/data/bip341_wallet_vectors.json.h
24-
${CMAKE_CURRENT_BINARY_DIR}/data/blockfilters.json.h
25-
${CMAKE_CURRENT_BINARY_DIR}/data/key_io_invalid.json.h
26-
${CMAKE_CURRENT_BINARY_DIR}/data/key_io_valid.json.h
27-
${CMAKE_CURRENT_BINARY_DIR}/data/script_tests.json.h
28-
${CMAKE_CURRENT_BINARY_DIR}/data/sighash.json.h
29-
${CMAKE_CURRENT_BINARY_DIR}/data/tx_invalid.json.h
30-
${CMAKE_CURRENT_BINARY_DIR}/data/tx_valid.json.h
319
addrman_tests.cpp
3210
allocator_tests.cpp
3311
amount_tests.cpp
@@ -146,6 +124,22 @@ add_executable(test_bitcoin
146124
versionbits_tests.cpp
147125
)
148126

127+
include(TargetDataSources)
128+
target_json_data_sources(test_bitcoin
129+
data/base58_encode_decode.json
130+
data/bip341_wallet_vectors.json
131+
data/blockfilters.json
132+
data/key_io_invalid.json
133+
data/key_io_valid.json
134+
data/script_tests.json
135+
data/sighash.json
136+
data/tx_invalid.json
137+
data/tx_valid.json
138+
)
139+
target_raw_data_sources(test_bitcoin NAMESPACE test::data
140+
data/asmap.raw
141+
)
142+
149143
target_link_libraries(test_bitcoin
150144
core_interface
151145
test_util

src/univalue/CMakeLists.txt

Lines changed: 58 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -15,120 +15,67 @@ target_include_directories(univalue
1515
target_link_libraries(univalue PRIVATE core_interface)
1616

1717
if(BUILD_TESTS)
18-
include(GenerateHeaders)
19-
generate_header_from_json(test/fail1.json)
20-
generate_header_from_json(test/fail10.json)
21-
generate_header_from_json(test/fail11.json)
22-
generate_header_from_json(test/fail12.json)
23-
generate_header_from_json(test/fail13.json)
24-
generate_header_from_json(test/fail14.json)
25-
generate_header_from_json(test/fail15.json)
26-
generate_header_from_json(test/fail16.json)
27-
generate_header_from_json(test/fail17.json)
28-
generate_header_from_json(test/fail18.json)
29-
generate_header_from_json(test/fail19.json)
30-
generate_header_from_json(test/fail2.json)
31-
generate_header_from_json(test/fail20.json)
32-
generate_header_from_json(test/fail21.json)
33-
generate_header_from_json(test/fail22.json)
34-
generate_header_from_json(test/fail23.json)
35-
generate_header_from_json(test/fail24.json)
36-
generate_header_from_json(test/fail25.json)
37-
generate_header_from_json(test/fail26.json)
38-
generate_header_from_json(test/fail27.json)
39-
generate_header_from_json(test/fail28.json)
40-
generate_header_from_json(test/fail29.json)
41-
generate_header_from_json(test/fail3.json)
42-
generate_header_from_json(test/fail30.json)
43-
generate_header_from_json(test/fail31.json)
44-
generate_header_from_json(test/fail32.json)
45-
generate_header_from_json(test/fail33.json)
46-
generate_header_from_json(test/fail34.json)
47-
generate_header_from_json(test/fail35.json)
48-
generate_header_from_json(test/fail36.json)
49-
generate_header_from_json(test/fail37.json)
50-
generate_header_from_json(test/fail38.json)
51-
generate_header_from_json(test/fail39.json)
52-
generate_header_from_json(test/fail4.json)
53-
generate_header_from_json(test/fail40.json)
54-
generate_header_from_json(test/fail41.json)
55-
generate_header_from_json(test/fail42.json)
56-
generate_header_from_json(test/fail44.json)
57-
generate_header_from_json(test/fail45.json)
58-
generate_header_from_json(test/fail5.json)
59-
generate_header_from_json(test/fail6.json)
60-
generate_header_from_json(test/fail7.json)
61-
generate_header_from_json(test/fail8.json)
62-
generate_header_from_json(test/fail9.json)
63-
generate_header_from_json(test/pass1.json)
64-
generate_header_from_json(test/pass2.json)
65-
generate_header_from_json(test/pass3.json)
66-
generate_header_from_json(test/pass4.json)
67-
generate_header_from_json(test/round1.json)
68-
generate_header_from_json(test/round2.json)
69-
generate_header_from_json(test/round3.json)
70-
generate_header_from_json(test/round4.json)
71-
generate_header_from_json(test/round5.json)
72-
generate_header_from_json(test/round6.json)
73-
generate_header_from_json(test/round7.json)
7418
add_executable(unitester
75-
${CMAKE_CURRENT_BINARY_DIR}/test/fail1.json.h
76-
${CMAKE_CURRENT_BINARY_DIR}/test/fail10.json.h
77-
${CMAKE_CURRENT_BINARY_DIR}/test/fail11.json.h
78-
${CMAKE_CURRENT_BINARY_DIR}/test/fail12.json.h
79-
${CMAKE_CURRENT_BINARY_DIR}/test/fail13.json.h
80-
${CMAKE_CURRENT_BINARY_DIR}/test/fail14.json.h
81-
${CMAKE_CURRENT_BINARY_DIR}/test/fail15.json.h
82-
${CMAKE_CURRENT_BINARY_DIR}/test/fail16.json.h
83-
${CMAKE_CURRENT_BINARY_DIR}/test/fail17.json.h
84-
${CMAKE_CURRENT_BINARY_DIR}/test/fail18.json.h
85-
${CMAKE_CURRENT_BINARY_DIR}/test/fail19.json.h
86-
${CMAKE_CURRENT_BINARY_DIR}/test/fail2.json.h
87-
${CMAKE_CURRENT_BINARY_DIR}/test/fail20.json.h
88-
${CMAKE_CURRENT_BINARY_DIR}/test/fail21.json.h
89-
${CMAKE_CURRENT_BINARY_DIR}/test/fail22.json.h
90-
${CMAKE_CURRENT_BINARY_DIR}/test/fail23.json.h
91-
${CMAKE_CURRENT_BINARY_DIR}/test/fail24.json.h
92-
${CMAKE_CURRENT_BINARY_DIR}/test/fail25.json.h
93-
${CMAKE_CURRENT_BINARY_DIR}/test/fail26.json.h
94-
${CMAKE_CURRENT_BINARY_DIR}/test/fail27.json.h
95-
${CMAKE_CURRENT_BINARY_DIR}/test/fail28.json.h
96-
${CMAKE_CURRENT_BINARY_DIR}/test/fail29.json.h
97-
${CMAKE_CURRENT_BINARY_DIR}/test/fail3.json.h
98-
${CMAKE_CURRENT_BINARY_DIR}/test/fail30.json.h
99-
${CMAKE_CURRENT_BINARY_DIR}/test/fail31.json.h
100-
${CMAKE_CURRENT_BINARY_DIR}/test/fail32.json.h
101-
${CMAKE_CURRENT_BINARY_DIR}/test/fail33.json.h
102-
${CMAKE_CURRENT_BINARY_DIR}/test/fail34.json.h
103-
${CMAKE_CURRENT_BINARY_DIR}/test/fail35.json.h
104-
${CMAKE_CURRENT_BINARY_DIR}/test/fail36.json.h
105-
${CMAKE_CURRENT_BINARY_DIR}/test/fail37.json.h
106-
${CMAKE_CURRENT_BINARY_DIR}/test/fail38.json.h
107-
${CMAKE_CURRENT_BINARY_DIR}/test/fail39.json.h
108-
${CMAKE_CURRENT_BINARY_DIR}/test/fail4.json.h
109-
${CMAKE_CURRENT_BINARY_DIR}/test/fail40.json.h
110-
${CMAKE_CURRENT_BINARY_DIR}/test/fail41.json.h
111-
${CMAKE_CURRENT_BINARY_DIR}/test/fail42.json.h
112-
${CMAKE_CURRENT_BINARY_DIR}/test/fail44.json.h
113-
${CMAKE_CURRENT_BINARY_DIR}/test/fail45.json.h
114-
${CMAKE_CURRENT_BINARY_DIR}/test/fail5.json.h
115-
${CMAKE_CURRENT_BINARY_DIR}/test/fail6.json.h
116-
${CMAKE_CURRENT_BINARY_DIR}/test/fail7.json.h
117-
${CMAKE_CURRENT_BINARY_DIR}/test/fail8.json.h
118-
${CMAKE_CURRENT_BINARY_DIR}/test/fail9.json.h
119-
${CMAKE_CURRENT_BINARY_DIR}/test/pass1.json.h
120-
${CMAKE_CURRENT_BINARY_DIR}/test/pass2.json.h
121-
${CMAKE_CURRENT_BINARY_DIR}/test/pass3.json.h
122-
${CMAKE_CURRENT_BINARY_DIR}/test/pass4.json.h
123-
${CMAKE_CURRENT_BINARY_DIR}/test/round1.json.h
124-
${CMAKE_CURRENT_BINARY_DIR}/test/round2.json.h
125-
${CMAKE_CURRENT_BINARY_DIR}/test/round3.json.h
126-
${CMAKE_CURRENT_BINARY_DIR}/test/round4.json.h
127-
${CMAKE_CURRENT_BINARY_DIR}/test/round5.json.h
128-
${CMAKE_CURRENT_BINARY_DIR}/test/round6.json.h
129-
${CMAKE_CURRENT_BINARY_DIR}/test/round7.json.h
13019
test/unitester.cpp
13120
)
21+
include(TargetDataSources)
22+
target_json_data_sources(unitester
23+
test/fail1.json
24+
test/fail10.json
25+
test/fail11.json
26+
test/fail12.json
27+
test/fail13.json
28+
test/fail14.json
29+
test/fail15.json
30+
test/fail16.json
31+
test/fail17.json
32+
test/fail18.json
33+
test/fail19.json
34+
test/fail2.json
35+
test/fail20.json
36+
test/fail21.json
37+
test/fail22.json
38+
test/fail23.json
39+
test/fail24.json
40+
test/fail25.json
41+
test/fail26.json
42+
test/fail27.json
43+
test/fail28.json
44+
test/fail29.json
45+
test/fail3.json
46+
test/fail30.json
47+
test/fail31.json
48+
test/fail32.json
49+
test/fail33.json
50+
test/fail34.json
51+
test/fail35.json
52+
test/fail36.json
53+
test/fail37.json
54+
test/fail38.json
55+
test/fail39.json
56+
test/fail4.json
57+
test/fail40.json
58+
test/fail41.json
59+
test/fail42.json
60+
test/fail44.json
61+
test/fail45.json
62+
test/fail5.json
63+
test/fail6.json
64+
test/fail7.json
65+
test/fail8.json
66+
test/fail9.json
67+
test/pass1.json
68+
test/pass2.json
69+
test/pass3.json
70+
test/pass4.json
71+
test/round1.json
72+
test/round2.json
73+
test/round3.json
74+
test/round4.json
75+
test/round5.json
76+
test/round6.json
77+
test/round7.json
78+
)
13279
target_link_libraries(unitester
13380
PRIVATE
13481
core_interface

0 commit comments

Comments
 (0)