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