Skip to content

Commit 19dea85

Browse files
committed
Merge #95: cmake: Introduce LibmultiprocessMacros module
66643d8 cmake, refactor: Use `target_capnp_sources` for examples (Hennadii Stepanov) bd2dfe2 cmake, refactor: Use `target_capnp_sources` for `mptest` target (Hennadii Stepanov) d9ec22f cmake: Add `LibmultiprocessMacros` module (Hennadii Stepanov) Pull request description: This PR introduces the `LibmultiprocessMacros` module that is used internally and might be exported as a part of the (future) `LibmultiprocessGen` package (it is a subject of the follow-up [PR](#96)). Also see a discussion in hebasto/bitcoin#118. ACKs for top commit: ryanofsky: Code review ACK 66643d8 Tree-SHA512: b97fcb2ce7b2085b3a041c422e3f51f06b8bf7a0abaa5baa7f39db2bf03491447bf7af073c95fb8bb6bc602d30e0c8856ae523954980cdb85afd87442c0b909a
2 parents 8da797c + 66643d8 commit 19dea85

File tree

4 files changed

+110
-159
lines changed

4 files changed

+110
-159
lines changed

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ add_library(multiprocess STATIC
7777
${MP_PUBLIC_HEADERS}
7878
src/mp/proxy.cpp
7979
$<TARGET_OBJECTS:util>)
80+
add_library(Libmultiprocess::multiprocess ALIAS multiprocess)
8081
target_include_directories(multiprocess PUBLIC
8182
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
8283
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
@@ -102,6 +103,7 @@ add_custom_target(install-lib
102103
add_dependencies(install-lib multiprocess)
103104

104105
add_executable(mpgen src/mp/gen.cpp $<TARGET_OBJECTS:util>)
106+
add_executable(Libmultiprocess::mpgen ALIAS mpgen)
105107
target_include_directories(mpgen PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>)
106108
target_include_directories(mpgen PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
107109
target_link_libraries(mpgen PRIVATE CapnProto::capnp)

cmake/LibmultiprocessMacros.cmake

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
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+
7+
target_capnp_sources
8+
--------------------
9+
10+
This function adds build steps to generate C++ files from Cap'n Proto files
11+
and build them as part of a specified target.
12+
13+
Arguments:
14+
15+
target: The name of the CMake target (e.g., a library or executable) to
16+
which the generated source files will be added. This target must already
17+
be defined elsewhere in the CMake scripts.
18+
19+
include_prefix: Absolute path indicating what portion of capnp source paths
20+
should be used in relative #include statements in the generated C++
21+
files. For example, if the .capnp path is /home/src/lib/schema.capnp
22+
and include_prefix is /home/src, generated includes look like:
23+
24+
#include <lib/schema.capnp.h>
25+
26+
And if include_prefix is /home/src/lib, generated includes look like:
27+
28+
#include <schema.capnp.h>
29+
30+
The specified include_prefix should be ${CMAKE_SOURCE_DIR} or a
31+
subdirectory of it to include files relative to the project root. It can
32+
be ${CMAKE_CURRENT_SOURCE_DIR} to include files relative to the current
33+
source directory.
34+
35+
Additional Unnamed Arguments:
36+
37+
After `target` and `include_prefix`, all unnamed arguments are treated as
38+
paths to `.capnp` schema files. These should be paths relative to
39+
${CMAKE_CURRENT_SOURCE_DIR}.
40+
41+
Optional Keyword Arguments:
42+
43+
IMPORT_PATHS: Specifies additional directories to search for imported
44+
`.capnp` files.
45+
46+
Example:
47+
# Assuming `my_library` is a target and `lib/` contains `.capnp` schema
48+
# files with imports from `include/`.
49+
target_capnp_sources(my_library "${CMAKE_SOURCE_DIR}"
50+
lib/schema1.capnp lib/schema2.capnp
51+
IMPORT_PATHS ${CMAKE_SOURCE_DIR}/include)
52+
53+
#]=]
54+
55+
function(target_capnp_sources target include_prefix)
56+
cmake_parse_arguments(PARSE_ARGV 2
57+
"TCS" # prefix
58+
"" # options
59+
"" # one_value_keywords
60+
"IMPORT_PATHS" # multi_value_keywords
61+
)
62+
63+
if(NOT TARGET Libmultiprocess::mpgen)
64+
message(FATAL_ERROR "Target 'Libmultiprocess::mpgen' does not exist.")
65+
endif()
66+
67+
foreach(capnp_file IN LISTS TCS_UNPARSED_ARGUMENTS)
68+
add_custom_command(
69+
OUTPUT ${capnp_file}.c++ ${capnp_file}.h ${capnp_file}.proxy-client.c++ ${capnp_file}.proxy-types.h ${capnp_file}.proxy-server.c++ ${capnp_file}.proxy-types.c++ ${capnp_file}.proxy.h
70+
COMMAND Libmultiprocess::mpgen ${CMAKE_CURRENT_SOURCE_DIR} ${include_prefix} ${CMAKE_CURRENT_SOURCE_DIR}/${capnp_file} ${TCS_IMPORT_PATHS}
71+
DEPENDS ${capnp_file}
72+
VERBATIM
73+
)
74+
target_sources(${target} PRIVATE
75+
${CMAKE_CURRENT_BINARY_DIR}/${capnp_file}.c++
76+
${CMAKE_CURRENT_BINARY_DIR}/${capnp_file}.proxy-client.c++
77+
${CMAKE_CURRENT_BINARY_DIR}/${capnp_file}.proxy-server.c++
78+
${CMAKE_CURRENT_BINARY_DIR}/${capnp_file}.proxy-types.c++
79+
)
80+
endforeach()
81+
82+
# Translate include_prefix from a source path to a binary path and add it as a
83+
# target include directory.
84+
set(build_include_prefix ${CMAKE_BINARY_DIR})
85+
file(RELATIVE_PATH relative_path ${CMAKE_SOURCE_DIR} ${include_prefix})
86+
if(relative_path)
87+
string(APPEND build_include_prefix "/" "${relative_path}")
88+
endif()
89+
target_include_directories(${target} PUBLIC $<BUILD_INTERFACE:${build_include_prefix}>)
90+
91+
if(TARGET Libmultiprocess::multiprocess)
92+
target_link_libraries(${target} PRIVATE Libmultiprocess::multiprocess)
93+
endif()
94+
endfunction()

example/CMakeLists.txt

Lines changed: 10 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -2,154 +2,34 @@
22
# Distributed under the MIT software license, see the accompanying
33
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
44

5-
add_custom_command(
6-
OUTPUT
7-
init.capnp.h
8-
init.capnp.c++
9-
init.capnp.proxy.h
10-
init.capnp.proxy-server.c++
11-
init.capnp.proxy-client.c++
12-
init.capnp.proxy-types.c++
13-
init.capnp.proxy-types.h
14-
COMMAND mpgen "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/init.capnp" "${CMAKE_SOURCE_DIR}/include" "${capnp_PREFIX}/include"
15-
DEPENDS init.capnp mpgen
16-
)
17-
18-
add_custom_command(
19-
OUTPUT
20-
calculator.capnp.h
21-
calculator.capnp.c++
22-
calculator.capnp.proxy.h
23-
calculator.capnp.proxy-server.c++
24-
calculator.capnp.proxy-client.c++
25-
calculator.capnp.proxy-types.c++
26-
calculator.capnp.proxy-types.h
27-
COMMAND mpgen "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/calculator.capnp" "${CMAKE_SOURCE_DIR}/include" "${capnp_PREFIX}/include"
28-
DEPENDS calculator.capnp mpgen
29-
)
5+
include(${PROJECT_SOURCE_DIR}/cmake/LibmultiprocessMacros.cmake)
306

317
add_executable(mpcalculator
32-
calculator.capnp.h
33-
calculator.capnp.c++
34-
calculator.capnp.proxy.h
35-
calculator.capnp.proxy-server.c++
36-
calculator.capnp.proxy-client.c++
37-
calculator.capnp.proxy-types.c++
38-
calculator.capnp.proxy-types.h
398
calculator.cpp
40-
init.capnp.h
41-
init.capnp.c++
42-
init.capnp.proxy.h
43-
init.capnp.proxy-server.c++
44-
init.capnp.proxy-client.c++
45-
init.capnp.proxy-types.c++
46-
init.capnp.proxy-types.h
47-
printer.capnp.h
48-
printer.capnp.c++
49-
printer.capnp.proxy.h
50-
printer.capnp.proxy-server.c++
51-
printer.capnp.proxy-client.c++
52-
printer.capnp.proxy-types.c++
53-
printer.capnp.proxy-types.h
549
)
55-
target_include_directories(mpcalculator PUBLIC
56-
${CAPNP_INCLUDE_DIRECTORY}
57-
${CMAKE_CURRENT_SOURCE_DIR}
58-
${CMAKE_CURRENT_BINARY_DIR}
10+
target_capnp_sources(mpcalculator ${CMAKE_CURRENT_SOURCE_DIR} init.capnp calculator.capnp printer.capnp
11+
IMPORT_PATHS ${CMAKE_SOURCE_DIR}/include
5912
)
60-
target_link_libraries(mpcalculator PRIVATE CapnProto::capnp)
61-
target_link_libraries(mpcalculator PRIVATE CapnProto::capnp-rpc)
62-
target_link_libraries(mpcalculator PRIVATE CapnProto::kj)
63-
target_link_libraries(mpcalculator PRIVATE CapnProto::kj-async)
13+
target_include_directories(mpcalculator PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
6414
target_link_libraries(mpcalculator PRIVATE Threads::Threads)
65-
target_link_libraries(mpcalculator PRIVATE multiprocess)
66-
67-
add_custom_command(
68-
OUTPUT
69-
printer.capnp.h
70-
printer.capnp.c++
71-
printer.capnp.proxy.h
72-
printer.capnp.proxy-server.c++
73-
printer.capnp.proxy-client.c++
74-
printer.capnp.proxy-types.c++
75-
printer.capnp.proxy-types.h
76-
COMMAND mpgen "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/printer.capnp" "${CMAKE_SOURCE_DIR}/include" "${capnp_PREFIX}/include"
77-
DEPENDS printer.capnp mpgen
78-
)
7915

8016
add_executable(mpprinter
81-
calculator.capnp.c++
82-
calculator.capnp.h
83-
calculator.capnp.proxy-client.c++
84-
calculator.capnp.proxy-server.c++
85-
calculator.capnp.proxy-types.c++
86-
calculator.capnp.proxy-types.h
87-
calculator.capnp.proxy.h
88-
init.capnp.h
89-
init.capnp.c++
90-
init.capnp.proxy.h
91-
init.capnp.proxy-server.c++
92-
init.capnp.proxy-client.c++
93-
init.capnp.proxy-types.c++
94-
init.capnp.proxy-types.h
95-
printer.capnp.h
96-
printer.capnp.c++
97-
printer.capnp.proxy.h
98-
printer.capnp.proxy-server.c++
99-
printer.capnp.proxy-client.c++
100-
printer.capnp.proxy-types.c++
101-
printer.capnp.proxy-types.h
10217
printer.cpp
10318
)
104-
target_include_directories(mpprinter PUBLIC
105-
${CAPNP_INCLUDE_DIRECTORY}
106-
${CMAKE_CURRENT_SOURCE_DIR}
107-
${CMAKE_CURRENT_BINARY_DIR}
19+
target_capnp_sources(mpprinter ${CMAKE_CURRENT_SOURCE_DIR} init.capnp calculator.capnp printer.capnp
20+
IMPORT_PATHS ${CMAKE_SOURCE_DIR}/include
10821
)
109-
target_link_libraries(mpprinter PRIVATE CapnProto::capnp)
110-
target_link_libraries(mpprinter PRIVATE CapnProto::capnp-rpc)
111-
target_link_libraries(mpprinter PRIVATE CapnProto::kj)
112-
target_link_libraries(mpprinter PRIVATE CapnProto::kj-async)
22+
target_include_directories(mpprinter PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
11323
target_link_libraries(mpprinter PRIVATE Threads::Threads)
114-
target_link_libraries(mpprinter PRIVATE multiprocess)
11524

11625
add_executable(mpexample
117-
calculator.capnp.c++
118-
calculator.capnp.h
119-
calculator.capnp.proxy-client.c++
120-
calculator.capnp.proxy-server.c++
121-
calculator.capnp.proxy-types.c++
122-
calculator.capnp.proxy-types.h
123-
calculator.capnp.proxy.h
124-
init.capnp.c++
125-
init.capnp.h
126-
init.capnp.proxy-client.c++
127-
init.capnp.proxy-server.c++
128-
init.capnp.proxy-types.c++
129-
init.capnp.proxy-types.h
130-
init.capnp.proxy.h
131-
printer.capnp.h
132-
printer.capnp.c++
133-
printer.capnp.proxy.h
134-
printer.capnp.proxy-server.c++
135-
printer.capnp.proxy-client.c++
136-
printer.capnp.proxy-types.c++
137-
printer.capnp.proxy-types.h
138-
printer.h
139-
calculator.h
14026
example.cpp
14127
)
142-
target_include_directories(mpexample PUBLIC
143-
${CAPNP_INCLUDE_DIRECTORY}
144-
${CMAKE_CURRENT_SOURCE_DIR}
145-
${CMAKE_CURRENT_BINARY_DIR}
28+
target_capnp_sources(mpexample ${CMAKE_CURRENT_SOURCE_DIR} init.capnp calculator.capnp printer.capnp
29+
IMPORT_PATHS ${CMAKE_SOURCE_DIR}/include
14630
)
147-
target_link_libraries(mpexample PRIVATE CapnProto::capnp)
148-
target_link_libraries(mpexample PRIVATE CapnProto::capnp-rpc)
149-
target_link_libraries(mpexample PRIVATE CapnProto::kj)
150-
target_link_libraries(mpexample PRIVATE CapnProto::kj-async)
31+
target_include_directories(mpexample PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
15132
target_link_libraries(mpexample PRIVATE Threads::Threads)
152-
target_link_libraries(mpexample PRIVATE multiprocess)
15333
target_link_libraries(mpexample PRIVATE stdc++fs)
15434

15535
add_custom_target(example DEPENDS mpexample mpcalculator mpprinter)

test/CMakeLists.txt

Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,46 +15,21 @@ add_custom_target(tests)
1515
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} DEPENDS tests)
1616

1717
if(BUILD_TESTING AND TARGET CapnProto::kj-test)
18-
add_custom_command(
19-
OUTPUT
20-
mp/test/foo.capnp.h
21-
mp/test/foo.capnp.c++
22-
mp/test/foo.capnp.proxy.h
23-
mp/test/foo.capnp.proxy-server.c++
24-
mp/test/foo.capnp.proxy-client.c++
25-
mp/test/foo.capnp.proxy-types.c++
26-
mp/test/foo.capnp.proxy-types.h
27-
COMMAND mpgen "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/mp/test/foo.capnp" "${CMAKE_SOURCE_DIR}/include" "${capnp_PREFIX}/include"
28-
DEPENDS mp/test/foo.capnp mpgen
29-
)
30-
3118
set_property(SOURCE ${MP_PROXY_HDRS} PROPERTY GENERATED 1)
3219

3320
add_executable(mptest
3421
${MP_PROXY_HDRS}
35-
mp/test/foo.capnp.h
36-
mp/test/foo.capnp.c++
37-
mp/test/foo.capnp.proxy.h
38-
mp/test/foo.capnp.proxy-server.c++
39-
mp/test/foo.capnp.proxy-client.c++
40-
mp/test/foo.capnp.proxy-types.c++
41-
mp/test/foo.capnp.proxy-types.h
4222
mp/test/foo-types.h
4323
mp/test/foo.h
4424
mp/test/test.cpp
4525
)
46-
target_include_directories(mptest PUBLIC
47-
${CAPNP_INCLUDE_DIRECTORY}
48-
${CMAKE_CURRENT_SOURCE_DIR}
49-
${CMAKE_CURRENT_BINARY_DIR}
26+
include(${PROJECT_SOURCE_DIR}/cmake/LibmultiprocessMacros.cmake)
27+
target_capnp_sources(mptest ${CMAKE_CURRENT_SOURCE_DIR} mp/test/foo.capnp
28+
IMPORT_PATHS ${CMAKE_SOURCE_DIR}/include
5029
)
51-
target_link_libraries(mptest PRIVATE CapnProto::capnp)
52-
target_link_libraries(mptest PRIVATE CapnProto::capnp-rpc)
53-
target_link_libraries(mptest PRIVATE CapnProto::kj)
54-
target_link_libraries(mptest PRIVATE CapnProto::kj-async)
30+
target_include_directories(mptest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
5531
target_link_libraries(mptest PRIVATE CapnProto::kj-test)
5632
target_link_libraries(mptest PRIVATE Threads::Threads)
57-
target_link_libraries(mptest PRIVATE multiprocess)
5833

5934
add_dependencies(tests mptest)
6035
add_test(NAME mptest COMMAND mptest)

0 commit comments

Comments
 (0)