1# generates JSONRPC Stub Server && Client
2#
3# this script expects
4# ETH_SOURCE_DIR - main CMAKE_SOURCE_DIR
5# ETH_SPEC_PATH
6# ETH_SERVER_DIR
7# ETH_CLIENT_DIR
8# ETH_SERVER_NAME
9# ETH_CLIENT_NAME
10# ETH_JSON_RPC_STUB
11#
12# example usage:
13# cmake -DETH_SPEC_PATH=spec.json -DETH_SERVER_DIR=libweb3jsonrpc -DETH_CLIENT_DIR=test
14# -DETH_SERVER_NAME=AbstractWebThreeStubServer -DETH_CLIENT_NAME=WebThreeStubClient -DETH_JSON_RPC_STUB=/usr/local/bin/jsonrpcstub
15
16# setup names, and allow different filename from classname for namespaced classes.
17# For an example call look at libethereum/CMakeLists.txt for eth::dev::Sentinel
18if (ETH_SERVER_FILENAME)
19	set(SERVER_TMPFILE "${ETH_SERVER_DIR}/${ETH_SERVER_FILENAME}.h.tmp")
20	set(SERVER_TMPFILE2 "${ETH_SERVER_DIR}/${ETH_SERVER_FILENAME}.h.tmp2")
21	set(SERVER_OUTFILE "${ETH_SERVER_DIR}/${ETH_SERVER_FILENAME}.h")
22else ()
23	set(SERVER_TMPFILE "${ETH_SERVER_DIR}/${ETH_SERVER_NAME}.h.tmp")
24	set(SERVER_TMPFILE2 "${ETH_SERVER_DIR}/${ETH_SERVER_NAME}.h.tmp2")
25	set(SERVER_OUTFILE "${ETH_SERVER_DIR}/${ETH_SERVER_NAME}.h")
26endif()
27if (ETH_CLIENT_FILENAME)
28	set(CLIENT_TMPFILE "${ETH_CLIENT_DIR}/${ETH_CLIENT_FILENAME}.h.tmp")
29	set(CLIENT_OUTFILE "${ETH_CLIENT_DIR}/${ETH_CLIENT_FILENAME}.h")
30else ()
31	set(CLIENT_TMPFILE "${ETH_CLIENT_DIR}/${ETH_CLIENT_NAME}.h.tmp")
32	set(CLIENT_OUTFILE "${ETH_CLIENT_DIR}/${ETH_CLIENT_NAME}.h")
33endif ()
34
35# create tmp files
36if (NOT ETH_SERVER_DIR)
37	execute_process(
38		COMMAND ${ETH_JSON_RPC_STUB} ${ETH_SPEC_PATH}
39			--cpp-client=${ETH_CLIENT_NAME} --cpp-client-file=${CLIENT_TMPFILE}
40			OUTPUT_VARIABLE ERR ERROR_QUIET
41	)
42else ()
43	execute_process(
44		COMMAND ${ETH_JSON_RPC_STUB} ${ETH_SPEC_PATH}
45			--cpp-server=${ETH_SERVER_NAME} --cpp-server-file=${SERVER_TMPFILE}
46			--cpp-client=${ETH_CLIENT_NAME} --cpp-client-file=${CLIENT_TMPFILE}
47			OUTPUT_VARIABLE ERR ERROR_QUIET
48	)
49
50	# get name without namespace
51	string(REPLACE "::" ";" SERVER_NAME_LIST "${ETH_SERVER_NAME}")
52	list(LENGTH SERVER_NAME_LIST SERVER_NAME_LENGTH)
53	math(EXPR SERVER_NAME_POS "${SERVER_NAME_LENGTH} - 1")
54	list(GET SERVER_NAME_LIST ${SERVER_NAME_POS} SERVER_NAME)
55
56	file(READ ${SERVER_TMPFILE} SERVER_CONTENT)
57
58	# The following cmake regexps are equal to this sed command
59	# 	sed -e s/include\ \<jsonrpccpp\\/server\.h\>/include\ ${INCLUDE_NAME}/g \
60	#		-e s/public\ jsonrpc::AbstractServer\<${NAME}\>/public\ ServerInterface\<${NAME}\>/g \
61	#		-e s/${NAME}\(jsonrpc::AbstractServerConnector\ \&conn,\ jsonrpc::serverVersion_t\ type\ =\ jsonrpc::JSONRPC_SERVER_V2\)\ :\ jsonrpc::AbstractServer\<${NAME}\>\(conn,\ type\)/${NAME}\(\)/g \
62	string(REGEX REPLACE "include\ <jsonrpccpp/server.h>" "include\ \"ModularServer.h\"" SERVER_CONTENT "${SERVER_CONTENT}")
63	string(REGEX REPLACE "public\ jsonrpc::AbstractServer<${SERVER_NAME}>" "public ServerInterface<${SERVER_NAME}>" SERVER_CONTENT "${SERVER_CONTENT}")
64	string(REGEX REPLACE "${SERVER_NAME}\\(jsonrpc::AbstractServerConnector\ &conn,\ jsonrpc::serverVersion_t\ type\ =\ jsonrpc::JSONRPC_SERVER_V2\\)\ :\ jsonrpc::AbstractServer<${SERVER_NAME}>\\(conn, type\\)" "${SERVER_NAME}()" SERVER_CONTENT "${SERVER_CONTENT}")
65
66	file(WRITE ${SERVER_TMPFILE2} "${SERVER_CONTENT}")
67endif()
68
69# don't throw fatal error on jsonrpcstub error, someone might have old version of jsonrpcstub,
70# he does not need to upgrade it if he is not working on JSON RPC
71# show him warning instead
72if (ERR)
73	message(WARNING "Your version of jsonrcpstub tool is not supported. Please upgrade it.")
74	message(WARNING "${ERR}")
75else()
76	include("${ETH_CMAKE_DIR}/EthUtils.cmake")
77	if (ETH_SERVER_DIR)
78		file(REMOVE "${SERVER_TMPFILE}")
79		replace_if_different("${SERVER_TMPFILE2}" "${SERVER_OUTFILE}")
80	endif()
81	replace_if_different("${CLIENT_TMPFILE}" "${CLIENT_OUTFILE}")
82endif()
83