Gav Wood
10 years ago
511 changed files with 49948 additions and 29005 deletions
@ -1,384 +1,187 @@ |
|||
# cmake global |
|||
cmake_minimum_required(VERSION 2.8.12) |
|||
# let cmake autolink dependencies on windows |
|||
# it's specified globally, cause qt libraries requires that on windows and they are also found globally |
|||
cmake_policy(SET CMP0020 NEW) |
|||
|
|||
project(ethereum) |
|||
cmake_minimum_required(VERSION 2.8.9) |
|||
set(CMAKE_AUTOMOC ON) |
|||
cmake_policy(SET CMP0015 NEW) |
|||
|
|||
# user defined, defaults |
|||
# Normally, set(...CACHE...) creates cache variables, but does not modify them. |
|||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") |
|||
|
|||
set(HEADLESS OFF CACHE BOOL "Do not compile GUI (AlethZero)") |
|||
set(LANGUAGES OFF CACHE BOOL "Limit build to Serpent/LLL tools") |
|||
set(VMTRACE OFF CACHE BOOL "VM tracing and run-time checks (useful for cross-implementation VM debugging)") |
|||
set(PARANOIA OFF CACHE BOOL "Additional run-time checks") |
|||
|
|||
if (LANGUAGES) |
|||
add_definitions(-DETH_LANGUAGES) |
|||
endif () |
|||
###################################################################################################### |
|||
|
|||
if (PARANOIA) |
|||
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") |
|||
add_definitions(-DETH_PARANOIA) |
|||
else () |
|||
message(FATAL_ERROR "Paranoia requires debug.") |
|||
# user defined, defaults |
|||
# Normally, set(...CACHE...) creates cache variables, but does not modify them. |
|||
function(createDefaultCacheConfig) |
|||
set(HEADLESS OFF CACHE BOOL "Do not compile GUI (AlethZero)") |
|||
set(VMTRACE OFF CACHE BOOL "VM tracing and run-time checks (useful for cross-implementation VM debugging)") |
|||
set(PARANOIA OFF CACHE BOOL "Additional run-time checks") |
|||
set(JSONRPC ON CACHE BOOL "Build with jsonprc. default on") |
|||
endfunction() |
|||
|
|||
|
|||
# propagates CMake configuration options to the compiler |
|||
function(configureProject) |
|||
if (PARANOIA) |
|||
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") |
|||
add_definitions(-DETH_PARANOIA) |
|||
else () |
|||
message(FATAL_ERROR "Paranoia requires debug.") |
|||
endif () |
|||
endif () |
|||
endif () |
|||
|
|||
if (VMTRACE) |
|||
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") |
|||
add_definitions(-DETH_VMTRACE) |
|||
if (VMTRACE) |
|||
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") |
|||
add_definitions(-DETH_VMTRACE) |
|||
else () |
|||
message(FATAL_ERROR "VM tracing requires debug.") |
|||
endif () |
|||
endif () |
|||
endfunction() |
|||
|
|||
|
|||
|
|||
function(createBuildInfo) |
|||
# Set build platform; to be written to BuildInfo.h |
|||
if (CMAKE_COMPILER_IS_MINGW) |
|||
set(ETH_BUILD_PLATFORM "${ETH_BUILD_PLATFORM}/mingw") |
|||
elseif (CMAKE_COMPILER_IS_MSYS) |
|||
set(ETH_BUILD_PLATFORM "${ETH_BUILD_PLATFORM}/msys") |
|||
elseif (CMAKE_COMPILER_IS_GNUCXX) |
|||
set(ETH_BUILD_PLATFORM "${ETH_BUILD_PLATFORM}/g++") |
|||
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") |
|||
set(ETH_BUILD_PLATFORM "${ETH_BUILD_PLATFORM}/msvc") |
|||
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") |
|||
set(ETH_BUILD_PLATFORM "${ETH_BUILD_PLATFORM}/clang") |
|||
else () |
|||
message(FATAL_ERROR "VM tracing requires debug.") |
|||
set(ETH_BUILD_PLATFORM "${ETH_BUILD_PLATFORM}/unknown") |
|||
endif () |
|||
endif () |
|||
|
|||
message("LANGUAGES: ${LANGUAGES}; VMTRACE: ${VMTRACE}; PARANOIA: ${PARANOIA}; HEADLESS: ${HEADLESS}") |
|||
|
|||
# Default TARGET_PLATFORM to "linux". |
|||
set(TARGET_PLATFORM CACHE STRING "linux") |
|||
if ("x${TARGET_PLATFORM}" STREQUAL "x") |
|||
set(TARGET_PLATFORM "linux") |
|||
endif () |
|||
#cmake build type may be not specified when using msvc |
|||
if (${CMAKE_BUILD_TYPE}) |
|||
set(_cmake_build_type ${CMAKE_BUILD_TYPE}) |
|||
else() |
|||
set(_cmake_build_type "undefined") |
|||
endif() |
|||
|
|||
if ("${TARGET_PLATFORM}" STREQUAL "linux") |
|||
set(CMAKE_THREAD_LIBS_INIT pthread) |
|||
endif () |
|||
# Generate header file containing useful build information |
|||
add_custom_target(BuildInfo.h ALL COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/BuildInfo.sh ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${_cmake_build_type} ${ETH_BUILD_PLATFORM}) |
|||
include_directories(${CMAKE_CURRENT_BINARY_DIR}) |
|||
|
|||
# Set default build type to Release w/debug info |
|||
# if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) |
|||
# set(CMAKE_BUILD_TYPE RelWithDebInfo) |
|||
# endif() |
|||
|
|||
# Initialize CXXFLAGS |
|||
set(CMAKE_CXX_FLAGS "-std=c++11 -Wall -Wno-unknown-pragmas -Wextra -DSHAREDLIB") |
|||
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -DETH_DEBUG") |
|||
set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG -DETH_RELEASE") |
|||
set(CMAKE_CXX_FLAGS_RELEASE "-O4 -DNDEBUG -DETH_RELEASE") |
|||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DETH_DEBUG") |
|||
|
|||
# Windows |
|||
if ("${TARGET_PLATFORM}" STREQUAL "w64") |
|||
set(CMAKE_SYSTEM_NAME Windows) |
|||
|
|||
set(CMAKE_CXX_LIBRARY_ARCHITECTURE x86_64-w64-mingw32) |
|||
set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) |
|||
set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) |
|||
set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) |
|||
set(CMAKE_AR x86_64-w64-mingw32-ar) |
|||
set(CMAKE_RANLIB x86_64-w64-mingw32-ranlib) |
|||
|
|||
set(CMAKE_EXECUTABLE_SUFFIX .exe) |
|||
|
|||
set(CMAKE_FIND_ROOT_PATH |
|||
/usr/x86_64-w64-mingw32 |
|||
) |
|||
|
|||
include_directories(/usr/x86_64-w64-mingw32/include/cryptopp) |
|||
|
|||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) |
|||
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) |
|||
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) |
|||
|
|||
set(CMAKE_INSTALL_PREFIX /usr/x86_64-w64-mingw32) |
|||
set(ETH_BUILD_PLATFORM "windows") |
|||
set(ETH_STATIC 1) |
|||
else () |
|||
set(ETH_BUILD_PLATFORM ${CMAKE_SYSTEM_NAME}) |
|||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") |
|||
set(ETH_SHARED 1) |
|||
endif() |
|||
set(CMAKE_INCLUDE_CURRENT_DIR ON) |
|||
set(SRC_LIST BuildInfo.h) |
|||
endfunction() |
|||
|
|||
# Set build platform; to be written to BuildInfo.h |
|||
if (CMAKE_COMPILER_IS_MINGW) |
|||
set(ETH_BUILD_PLATFORM "${ETH_BUILD_PLATFORM}/mingw") |
|||
elseif (CMAKE_COMPILER_IS_MSYS) |
|||
set(ETH_BUILD_PLATFORM "${ETH_BUILD_PLATFORM}/msys") |
|||
elseif (CMAKE_COMPILER_IS_GNUCXX) |
|||
set(ETH_BUILD_PLATFORM "${ETH_BUILD_PLATFORM}/g++") |
|||
elseif (CMAKE_COMPILER_IS_MSVC) |
|||
set(ETH_BUILD_PLATFORM "${ETH_BUILD_PLATFORM}/msvc") |
|||
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") |
|||
set(ETH_BUILD_PLATFORM "${ETH_BUILD_PLATFORM}/clang") |
|||
else () |
|||
set(ETH_BUILD_PLATFORM "${ETH_BUILD_PLATFORM}/unknown") |
|||
endif () |
|||
|
|||
message("CXXFLAGS: ${CMAKE_CXX_FLAGS}") |
|||
#add_definitions("-DETH_BUILD_TYPE=${ETH_BUILD_TYPE}") |
|||
#add_definitions("-DETH_BUILD_PLATFORM=${ETH_BUILD_PLATFORM}") |
|||
|
|||
# C++11 check and activation |
|||
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") |
|||
execute_process( |
|||
COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) |
|||
if (NOT (GCC_VERSION VERSION_GREATER 4.7 OR GCC_VERSION VERSION_EQUAL 4.7)) |
|||
message(FATAL_ERROR "${PROJECT_NAME} requires g++ 4.7 or greater.") |
|||
endif () |
|||
elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") |
|||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") |
|||
else () |
|||
message(FATAL_ERROR "Your C++ compiler does not support C++11.") |
|||
endif () |
|||
###################################################################################################### |
|||
|
|||
if("${TARGET_PLATFORM}" STREQUAL "w64") |
|||
# set(MINIUPNPC_LS /usr/x86_64-w64-mingw32/lib/libminiupnpc.a) |
|||
set(LEVELDB_LS leveldb) |
|||
set(CRYPTOPP_LS cryptopp) |
|||
set(CRYPTOPP_ID /usr/x86_64-w64-mingw32/include/cryptopp) |
|||
else() |
|||
# Look for available Crypto++ version and if it is >= 5.6.2 |
|||
find_path(ID cryptlib.h |
|||
../cryptopp/src |
|||
../../cryptopp/src |
|||
/usr/include/cryptopp |
|||
/usr/include/crypto++ |
|||
/usr/local/include/cryptopp |
|||
/usr/local/include/crypto++ |
|||
/opt/local/include/cryptopp |
|||
/opt/local/include/crypto++ |
|||
) |
|||
find_library(LS NAMES cryptoppeth cryptopp |
|||
../cryptopp/src/../target/build/release |
|||
../../cryptopp/src/../target/build/release |
|||
PATHS |
|||
/usr/lib |
|||
/usr/local/lib |
|||
/opt/local/lib |
|||
) |
|||
|
|||
if (ID AND LS) |
|||
message(STATUS "Found Crypto++: ${ID}, ${LS}") |
|||
set(_CRYPTOPP_VERSION_HEADER ${ID}/config.h) |
|||
if(EXISTS ${_CRYPTOPP_VERSION_HEADER}) |
|||
file(STRINGS ${_CRYPTOPP_VERSION_HEADER} _CRYPTOPP_VERSION REGEX "^#define CRYPTOPP_VERSION[ \t]+[0-9]+$") |
|||
string(REGEX REPLACE "^#define CRYPTOPP_VERSION[ \t]+([0-9]+)" "\\1" _CRYPTOPP_VERSION ${_CRYPTOPP_VERSION}) |
|||
if(${_CRYPTOPP_VERSION} LESS 562) |
|||
message(FATAL_ERROR "Crypto++ version found is smaller than 5.6.2.") |
|||
else() |
|||
set(CRYPTOPP_ID ${ID} CACHE FILEPATH "") |
|||
set(CRYPTOPP_LS ${LS} CACHE FILEPATH "") |
|||
message(STATUS "Crypto++ found and version greater or equal to 5.6.2") |
|||
endif() |
|||
endif() |
|||
else() |
|||
message(STATUS "Crypto++ Not Found: ${CRYPTOPP_ID}, ${CRYPTOPP_LS}") |
|||
endif() |
|||
|
|||
find_path( LEVELDB_ID leveldb/db.h |
|||
/usr/include |
|||
/usr/local/include |
|||
) |
|||
if ( LEVELDB_ID STREQUAL "LEVELDB_ID-NOTFOUND" ) |
|||
message(FATAL_ERROR "Failed to find the LevelDB headers") |
|||
else () |
|||
message(STATUS "Found LevelDB Headers") |
|||
|
|||
# Check for accessory dev libraries leveldb and miniupnpc |
|||
find_library( LEVELDB_LS NAMES leveldb |
|||
PATHS |
|||
/usr/lib |
|||
/usr/local/lib |
|||
/opt/local/lib |
|||
/usr/lib/*/ |
|||
) |
|||
if ( LEVELDB_LS STREQUAL "LEVELDB_LS-NOTFOUND" ) |
|||
message(FATAL_ERROR "Failed to find the LevelDB Library!") |
|||
else () |
|||
message(STATUS "Found LevelDB Library: ${LEVELDB_LS}") |
|||
add_definitions(-DETH_LEVELDB) |
|||
endif () |
|||
endif () |
|||
set(CMAKE_AUTOMOC ON) |
|||
cmake_policy(SET CMP0015 NEW) |
|||
|
|||
find_path( PYTHON_ID pyconfig.h |
|||
${PYTHON_INCLUDE_DIR} |
|||
/usr/include/python2.7 |
|||
/usr/local/include/python2.7 |
|||
) |
|||
if ( PYTHON_ID STREQUAL "PYTHON_ID-NOTFOUND" ) |
|||
message(STATUS "Failed to find the Python-2.7 headers") |
|||
else () |
|||
message(STATUS "Found Python-2.7 Headers: ${PYTHON_ID}") |
|||
|
|||
# Check for accessory dev libraries leveldb and miniupnpc |
|||
find_library( PYTHON_LS NAMES python2.7 |
|||
PATHS |
|||
/usr/lib |
|||
/usr/local/lib |
|||
/opt/local/lib |
|||
/usr/lib/*/ |
|||
) |
|||
if ( PYTHON_LS STREQUAL "PYTHON_LS-NOTFOUND" ) |
|||
message(STATUS "Failed to find the Python-2.7 Library!") |
|||
set(PYTHON_ID) |
|||
set(PYTHON_LS) |
|||
else () |
|||
message(STATUS "Found Python-2.7 Library: ${PYTHON_LS}") |
|||
add_definitions(-DETH_PYTHON) |
|||
endif () |
|||
endif () |
|||
|
|||
find_path( MINIUPNPC_ID miniupnpc/miniwget.h |
|||
/usr/include |
|||
/usr/local/include |
|||
) |
|||
if ( MINIUPNPC_ID ) |
|||
message(STATUS "Found miniupnpc headers") |
|||
|
|||
find_library( MINIUPNPC_LS NAMES miniupnpc |
|||
PATHS |
|||
/usr/lib |
|||
/usr/local/lib |
|||
/opt/local/lib |
|||
/usr/lib/*/ |
|||
) |
|||
if ( MINIUPNPC_LS ) |
|||
message(STATUS "Found miniupnpc library: ${MINIUPNPC_LS}") |
|||
add_definitions(-DETH_MINIUPNPC) |
|||
else () |
|||
message(STATUS "Failed to find the miniupnpc library!") |
|||
endif () |
|||
else () |
|||
message(STATUS "Failed to find the miniupnpc headers!") |
|||
endif () |
|||
createDefaultCacheConfig() |
|||
configureProject() |
|||
message("-- VMTRACE: ${VMTRACE}; PARANOIA: ${PARANOIA}; HEADLESS: ${HEADLESS}; JSONRPC: ${JSONRPC}") |
|||
|
|||
find_path( JSONRPC_ID jsonrpc/rpc.h |
|||
/usr/include |
|||
/usr/local/include |
|||
) |
|||
if ( JSONRPC_ID ) |
|||
message(STATUS "Found jsonrpc headers") |
|||
find_library( JSONRPC_LS NAMES jsonrpc |
|||
PATHS |
|||
/usr/lib |
|||
/usr/local/lib |
|||
/opt/local/lib |
|||
/usr/lib/*/ |
|||
) |
|||
if ( JSONRPC_LS ) |
|||
message(STATUS "Found jsonrpc library: ${JSONRPC_LS}") |
|||
add_definitions(-DETH_JSONRPC) |
|||
else () |
|||
message(STATUS "Failed to find the jsonrpc library!") |
|||
endif () |
|||
else () |
|||
message(STATUS "Failed to find the jsonrpc headers!") |
|||
endif () |
|||
|
|||
find_path( READLINE_ID readline/readline.h |
|||
/usr/include |
|||
/usr/local/include |
|||
) |
|||
if ( READLINE_ID ) |
|||
message(STATUS "Found readline headers") |
|||
find_library( READLINE_LS NAMES readline |
|||
PATHS |
|||
/usr/lib |
|||
/usr/local/lib |
|||
/opt/local/lib |
|||
/usr/lib/*/ |
|||
) |
|||
if ( READLINE_LS ) |
|||
message(STATUS "Found readline library: ${READLINE_LS}") |
|||
add_definitions(-DETH_READLINE) |
|||
else () |
|||
message(STATUS "Failed to find the readline library!") |
|||
endif () |
|||
else () |
|||
message(STATUS "Failed to find the readline headers!") |
|||
endif () |
|||
# Default TARGET_PLATFORM to "linux". |
|||
set(TARGET_PLATFORM CACHE STRING "linux") |
|||
if ("x${TARGET_PLATFORM}" STREQUAL "x") |
|||
set(TARGET_PLATFORM "linux") |
|||
endif () |
|||
|
|||
if (LANGUAGES) |
|||
find_package(Boost 1.53 REQUIRED COMPONENTS thread date_time) |
|||
else() |
|||
find_package(Boost 1.53 REQUIRED COMPONENTS thread date_time system regex) |
|||
endif() |
|||
if ("${TARGET_PLATFORM}" STREQUAL "linux") |
|||
set(CMAKE_THREAD_LIBS_INIT pthread) |
|||
endif () |
|||
|
|||
set(QTQML 1) |
|||
endif() |
|||
include(EthCompilerSettings) |
|||
message("-- CXXFLAGS: ${CMAKE_CXX_FLAGS}") |
|||
|
|||
if(CRYPTOPP_ID) |
|||
include_directories(${CRYPTOPP_ID}) |
|||
endif() |
|||
if(PYTHON_ID) |
|||
include_directories(${PYTHON_ID}) |
|||
endif() |
|||
if(MINIUPNPC_ID) |
|||
include_directories(${MINIUPNPC_ID}) |
|||
endif() |
|||
if(LEVELDB_ID) |
|||
include_directories(${LEVELDB_ID}) |
|||
endif() |
|||
if(READLINE_ID) |
|||
include_directories(${READLINE_ID}) |
|||
endif() |
|||
if(JSONRPC_ID) |
|||
include_directories(${JSONRPC_ID}) |
|||
endif() |
|||
|
|||
# Generate header file containing useful build information |
|||
add_custom_target(BuildInfo.h ALL COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/BuildInfo.sh ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BUILD_TYPE} ${ETH_BUILD_PLATFORM}) |
|||
include_directories(${CMAKE_CURRENT_BINARY_DIR}) |
|||
# this must be an include, as a function it would messs up with variable scope! |
|||
include(EthDependencies) |
|||
include(EthExecutableHelper) |
|||
|
|||
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") |
|||
link_directories(/usr/local/lib) |
|||
include_directories(/usr/local/include) |
|||
endif() |
|||
createBuildInfo() |
|||
|
|||
add_subdirectory(libdevcore) |
|||
add_subdirectory(libevmface) |
|||
add_subdirectory(libevmcore) |
|||
add_subdirectory(liblll) |
|||
add_subdirectory(libserpent) |
|||
if(NOT APPLE) |
|||
if(PYTHON_LS) |
|||
add_subdirectory(libpyserpent) |
|||
endif() |
|||
endif() |
|||
add_subdirectory(libsolidity) |
|||
add_subdirectory(lllc) |
|||
add_subdirectory(solc) |
|||
add_subdirectory(sc) |
|||
if (NOT LANGUAGES) |
|||
add_subdirectory(secp256k1) |
|||
add_subdirectory(libp2p) |
|||
add_subdirectory(libdevcrypto) |
|||
add_subdirectory(libwhisper) |
|||
|
|||
add_subdirectory(libethcore) |
|||
add_subdirectory(libevm) |
|||
add_subdirectory(libethereum) |
|||
# add_subdirectory(libethereumx) # TODO remove |
|||
|
|||
add_subdirectory(libwebthree) |
|||
add_subdirectory(test) |
|||
add_subdirectory(eth) |
|||
if("x${CMAKE_BUILD_TYPE}" STREQUAL "xDebug") |
|||
add_subdirectory(exp) |
|||
endif () |
|||
if(NOT ("${TARGET_PLATFORM}" STREQUAL "w64")) |
|||
add_subdirectory(neth) |
|||
endif () |
|||
if(QTQML) |
|||
add_definitions(-DETH_QTQML) |
|||
endif() |
|||
|
|||
if(NOT HEADLESS) |
|||
if ("${TARGET_PLATFORM}" STREQUAL "w64") |
|||
cmake_policy(SET CMP0020 NEW) |
|||
endif () |
|||
|
|||
add_subdirectory(libqethereum) |
|||
add_subdirectory(alethzero) |
|||
add_subdirectory(third) |
|||
if(QTQML) |
|||
#add_subdirectory(iethxi) |
|||
#add_subdirectory(walleth) // resurect once we want to submit ourselves to QML. |
|||
endif() |
|||
endif() |
|||
if (JSONRPC) |
|||
add_subdirectory(libweb3jsonrpc) |
|||
endif() |
|||
|
|||
set(CMAKE_INCLUDE_CURRENT_DIR ON) |
|||
set(SRC_LIST BuildInfo.h) |
|||
add_subdirectory(secp256k1) |
|||
add_subdirectory(libp2p) |
|||
add_subdirectory(libdevcrypto) |
|||
add_subdirectory(libwhisper) |
|||
|
|||
add_subdirectory(libethcore) |
|||
add_subdirectory(libevm) |
|||
add_subdirectory(libethereum) |
|||
|
|||
add_subdirectory(libwebthree) |
|||
add_subdirectory(test) |
|||
add_subdirectory(eth) |
|||
if("x${CMAKE_BUILD_TYPE}" STREQUAL "xDebug") |
|||
add_subdirectory(exp) |
|||
endif () |
|||
|
|||
# TODO check msvc |
|||
if(NOT ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")) |
|||
add_subdirectory(neth) |
|||
endif () |
|||
|
|||
if (NOT HEADLESS) |
|||
|
|||
add_subdirectory(libjsqrc) |
|||
add_subdirectory(libqethereum) |
|||
add_subdirectory(alethzero) |
|||
add_subdirectory(third) |
|||
add_subdirectory(mix) |
|||
|
|||
endif() |
|||
|
|||
enable_testing() |
|||
add_test(NAME alltests WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/test COMMAND testeth) |
|||
|
|||
#unset(TARGET_PLATFORM CACHE) |
|||
|
|||
if (WIN32) |
|||
# packaging stuff |
|||
include(InstallRequiredSystemLibraries) |
|||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "ethereum") |
|||
set(CPACK_PACKAGE_VENDOR "ethereum.org") |
|||
set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md") |
|||
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") |
|||
set(CPACK_PACKAGE_VERSION "0.7") |
|||
set(CPACK_GENERATOR "NSIS") |
|||
# seems to be not working |
|||
# set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/alethzero/alethzero.bmp") |
|||
|
|||
# our stuff |
|||
set(CPACK_COMPONENT_ALETHZERO_GROUP "Applications") |
|||
set(CPACK_COMPONENT_THIRD_GROUP "Applications") |
|||
set(CPACK_COMPONENT_MIX_GROUP "Applications") |
|||
set(CPACK_COMPONENTS_ALL alethzero third mix) |
|||
|
|||
# nsis specific stuff |
|||
set(CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY} ethereum") |
|||
set(CPACK_NSIS_HELP_LINK "https://github.com/ethereum/cpp-ethereum") |
|||
set(CPACK_NSIS_URL_INFO_ABOUT "https://github.com/ethereum/cpp-ethereum") |
|||
set(CPACK_NSIS_CONTACT "ethereum.org") |
|||
set(CPACK_NSIS_MODIFY_PATH ON) |
|||
set(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}/alethzero/alethzero.ico") |
|||
set(CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}/alethzero/alethzero.ico") |
|||
|
|||
include(CPack) |
|||
endif (WIN32) |
|||
|
@ -1,100 +1,53 @@ |
|||
cmake_policy(SET CMP0015 NEW) |
|||
# let cmake autolink dependencies on windows |
|||
cmake_policy(SET CMP0020 NEW) |
|||
# this policy was introduced in cmake 3.0 |
|||
# remove if, once 3.0 will be used on unix |
|||
if (${CMAKE_MAJOR_VERSION} GREATER 2) |
|||
cmake_policy(SET CMP0043 OLD) |
|||
endif() |
|||
|
|||
set(CMAKE_INCLUDE_CURRENT_DIR ON) |
|||
aux_source_directory(. SRC_LIST) |
|||
include_directories(..) |
|||
|
|||
if (APPLE) |
|||
# Add homebrew path for qt5 |
|||
set(CMAKE_PREFIX_PATH /usr/local/opt/qt5) |
|||
include_directories(/usr/local/opt/qt5/include /usr/local/include) |
|||
elseif ("${TARGET_PLATFORM}" STREQUAL "w64") |
|||
set(SRC_LIST ${SRC_LIST} ../windows/qt_plugin_import.cpp) |
|||
include_directories(/usr/x86_64-w64-mingw32/include /usr/x86_64-w64-mingw32/include/QtCore /usr/x86_64-w64-mingw32/include/QtGui /usr/x86_64-w64-mingw32/include/QtQuick /usr/x86_64-w64-mingw32/include/QtQml /usr/x86_64-w64-mingw32/include/QtNetwork /usr/x86_64-w64-mingw32/include/QtWidgets /usr/x86_64-w64-mingw32/include/QtWebKit /usr/x86_64-w64-mingw32/include/QtWebKitWidgets) |
|||
elseif (UNIX) |
|||
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ";$ENV{QTDIR}/lib/cmake") |
|||
endif () |
|||
|
|||
find_package(Qt5Core REQUIRED) |
|||
find_package(Qt5Gui REQUIRED) |
|||
find_package(Qt5Quick REQUIRED) |
|||
find_package(Qt5Qml REQUIRED) |
|||
find_package(Qt5Network REQUIRED) |
|||
find_package(Qt5Widgets REQUIRED) |
|||
find_package(Qt5WebKit REQUIRED) |
|||
find_package(Qt5WebKitWidgets REQUIRED) |
|||
include_directories(${JSON_RPC_CPP_INCLUDE_DIRS}) |
|||
include_directories(..) |
|||
|
|||
qt5_wrap_ui(ui_Main.h Main.ui) |
|||
|
|||
# Set name of binary and add_executable() |
|||
if (APPLE) |
|||
set(EXECUTEABLE AlethZero) |
|||
set(BIN_INSTALL_DIR ".") |
|||
set(DOC_INSTALL_DIR ".") |
|||
|
|||
set(PROJECT_VERSION "${ETH_VERSION}") |
|||
set(MACOSX_BUNDLE_INFO_STRING "${PROJECT_NAME} ${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_NAME} ${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_LONG_VERSION_STRING "${PROJECT_NAME} ${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_COPYRIGHT "${PROJECT_COPYRIGHT_YEAR} ${PROJECT_VENDOR}") |
|||
set(MACOSX_BUNDLE_GUI_IDENTIFIER "${PROJECT_DOMAIN_SECOND}.${PROJECT_DOMAIN_FIRST}") |
|||
set(MACOSX_BUNDLE_BUNDLE_NAME ${EXECUTEABLE}) |
|||
set(MACOSX_BUNDLE_ICON_FILE alethzero) |
|||
include(BundleUtilities) |
|||
|
|||
add_executable(${EXECUTEABLE} MACOSX_BUNDLE alethzero.icns Main.ui ${SRC_LIST}) |
|||
set_target_properties(${EXECUTEABLE} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/EthereumMacOSXBundleInfo.plist.in") |
|||
SET_SOURCE_FILES_PROPERTIES(${EXECUTEABLE} PROPERTIES MACOSX_PACKAGE_LOCATION MacOS) |
|||
SET_SOURCE_FILES_PROPERTIES(${MACOSX_BUNDLE_ICON_FILE}.icns PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") |
|||
|
|||
else () |
|||
set(EXECUTEABLE alethzero) |
|||
add_executable(${EXECUTEABLE} Main.ui ${SRC_LIST}) |
|||
endif () |
|||
|
|||
qt5_use_modules(${EXECUTEABLE} Core)# Gui Widgets Network WebKit WebKitWidgets) |
|||
target_link_libraries(${EXECUTEABLE} webthree qethereum ethereum evm ethcore devcrypto secp256k1 gmp ${CRYPTOPP_LS} serpent lll evmface devcore) |
|||
file(GLOB HEADERS "*.h") |
|||
|
|||
if (APPLE) |
|||
# First have qt5 install plugins and frameworks |
|||
add_custom_command(TARGET ${EXECUTEABLE} POST_BUILD |
|||
COMMAND /usr/local/opt/qt5/bin/macdeployqt ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${EXECUTEABLE}.app |
|||
WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) |
|||
|
|||
# This tool and next will inspect linked libraries in order to determine which dependencies are required |
|||
if (${CMAKE_CFG_INTDIR} STREQUAL ".") |
|||
set(APP_BUNDLE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${EXECUTEABLE}.app") |
|||
else () |
|||
set(APP_BUNDLE_PATH "${CMAKE_CURRENT_BINARY_DIR}/\$ENV{CONFIGURATION}/${EXECUTEABLE}.app") |
|||
endif () |
|||
install(CODE " |
|||
include(BundleUtilities) |
|||
set(BU_CHMOD_BUNDLE_ITEMS 1) |
|||
fixup_bundle(\"${APP_BUNDLE_PATH}\" \"${BUNDLELIBS}\" \"../libqethereum ../libethereum ../secp256k1\") |
|||
" COMPONENT RUNTIME ) |
|||
# Cleanup duplicate libs from macdeployqt |
|||
install(CODE " |
|||
file(GLOB LINGER_RM \"${APP_BUNDLE_PATH}/Contents/Frameworks/*.dylib\") |
|||
if (LINGER_RM) |
|||
file(REMOVE \${LINGER_RM}) |
|||
endif () |
|||
") |
|||
elseif ("${TARGET_PLATFORM}" STREQUAL "w64") |
|||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-keep-inline-dllexport -static-libgcc -static-libstdc++ -static") |
|||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-s -Wl,-subsystem,windows -mthreads -L/usr/x86_64-w64-mingw32/plugins/platforms") |
|||
target_link_libraries(${EXECUTEABLE} gcc) |
|||
target_link_libraries(${EXECUTEABLE} mingw32 qtmain mswsock iphlpapi qwindows shlwapi Qt5PlatformSupport opengl32 gdi32 comdlg32 oleaut32 imm32 winmm ole32 uuid ws2_32) |
|||
target_link_libraries(${EXECUTEABLE} boost_system-mt-s) |
|||
target_link_libraries(${EXECUTEABLE} boost_filesystem-mt-s) |
|||
target_link_libraries(${EXECUTEABLE} boost_thread_win32-mt-s) |
|||
target_link_libraries(${EXECUTEABLE} crypt32) |
|||
target_link_libraries(${EXECUTEABLE} Qt5PlatformSupport) |
|||
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS) |
|||
elseif (UNIX) |
|||
set(EXECUTABLE AlethZero) |
|||
else () |
|||
target_link_libraries(${EXECUTEABLE} boost_system) |
|||
target_link_libraries(${EXECUTEABLE} boost_filesystem) |
|||
find_package(Threads REQUIRED) |
|||
target_link_libraries(${EXECUTEABLE} ${CMAKE_THREAD_LIBS_INIT}) |
|||
install( TARGETS ${EXECUTEABLE} RUNTIME DESTINATION bin ) |
|||
set(EXECUTABLE alethzero) |
|||
endif () |
|||
|
|||
# eth_add_executable is defined in cmake/EthExecutableHelper.cmake |
|||
eth_add_executable(${EXECUTABLE} |
|||
ICON alethzero |
|||
UI_RESOURCES alethzero.icns Main.ui |
|||
WIN_RESOURCES alethzero.rc |
|||
) |
|||
|
|||
add_dependencies(${EXECUTABLE} BuildInfo.h) |
|||
|
|||
target_link_libraries(${EXECUTABLE} Qt5::Core) |
|||
target_link_libraries(${EXECUTABLE} webthree) |
|||
target_link_libraries(${EXECUTABLE} qethereum) |
|||
target_link_libraries(${EXECUTABLE} ethereum) |
|||
target_link_libraries(${EXECUTABLE} evm) |
|||
target_link_libraries(${EXECUTABLE} ethcore) |
|||
target_link_libraries(${EXECUTABLE} devcrypto) |
|||
target_link_libraries(${EXECUTABLE} secp256k1) |
|||
target_link_libraries(${EXECUTABLE} serpent) |
|||
target_link_libraries(${EXECUTABLE} lll) |
|||
target_link_libraries(${EXECUTABLE} solidity) |
|||
target_link_libraries(${EXECUTABLE} evmcore) |
|||
target_link_libraries(${EXECUTABLE} devcore) |
|||
target_link_libraries(${EXECUTABLE} web3jsonrpc) |
|||
target_link_libraries(${EXECUTABLE} jsqrc) |
|||
|
|||
# eth_install_executable is defined in cmake/EthExecutableHelper.cmake |
|||
eth_install_executable(${EXECUTABLE}) |
|||
|
|||
|
File diff suppressed because it is too large
@ -0,0 +1,38 @@ |
|||
/*
|
|||
This file is part of cpp-ethereum. |
|||
|
|||
cpp-ethereum is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
cpp-ethereum is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file OurWebThreeStubServer.h
|
|||
* @author Gav Wood <i@gavwood.com> |
|||
* @date 2014 |
|||
*/ |
|||
|
|||
#include <QtCore/QObject> |
|||
#include <libdevcore/CommonJS.h> |
|||
#include <libdevcrypto/Common.h> |
|||
#include <libweb3jsonrpc/WebThreeStubServer.h> |
|||
|
|||
class OurWebThreeStubServer: public QObject, public WebThreeStubServer |
|||
{ |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
OurWebThreeStubServer(jsonrpc::AbstractServerConnector& _conn, dev::WebThreeDirect& _web3, std::vector<dev::KeyPair> const& _accounts); |
|||
|
|||
virtual std::string shh_newIdentity() override; |
|||
|
|||
signals: |
|||
void onNewId(QString _s); |
|||
}; |
After Width: | Height: | Size: 361 KiB |
@ -0,0 +1 @@ |
|||
APP_ICON ICON DISCARDABLE "alethzero.ico" |
@ -0,0 +1,27 @@ |
|||
#!/usr/bin/python |
|||
# cpp-ethereum build script |
|||
# to be used from CI server, or to build locally |
|||
# uses python instead of bash script for better cross-platform support |
|||
|
|||
# TODO Initial version. Needs much more improvements |
|||
|
|||
import argparse |
|||
import os |
|||
import subprocess |
|||
|
|||
def build_dependencies(): |
|||
if os.path.exists("extdep"): |
|||
os.chdir("extdep") |
|||
if not os.path.exists("build"): |
|||
os.makedirs("build") |
|||
os.chdir("build") |
|||
subprocess.check_call(["cmake", ".."]) |
|||
subprocess.check_call("make") |
|||
|
|||
parser = argparse.ArgumentParser() |
|||
parser.add_argument("cmd", help="what to build") |
|||
|
|||
args = parser.parse_args() |
|||
if args.cmd == "dep": |
|||
build_dependencies() |
|||
|
@ -0,0 +1,39 @@ |
|||
# Set necessary compile and link flags |
|||
|
|||
# C++11 check and activation |
|||
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") |
|||
|
|||
set(CMAKE_CXX_FLAGS "-std=c++11 -Wall -Wno-unknown-pragmas -Wextra -DSHAREDLIB -fPIC") |
|||
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -DETH_DEBUG") |
|||
set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG -DETH_RELEASE") |
|||
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -DETH_RELEASE") |
|||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DETH_DEBUG") |
|||
set(ETH_SHARED 1) |
|||
|
|||
execute_process( |
|||
COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) |
|||
if (NOT (GCC_VERSION VERSION_GREATER 4.7 OR GCC_VERSION VERSION_EQUAL 4.7)) |
|||
message(FATAL_ERROR "${PROJECT_NAME} requires g++ 4.7 or greater.") |
|||
endif () |
|||
|
|||
elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") |
|||
|
|||
set(CMAKE_CXX_FLAGS "-std=c++11 -Wall -Wno-unknown-pragmas -Wextra -DSHAREDLIB -fPIC") |
|||
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -DETH_DEBUG") |
|||
set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG -DETH_RELEASE") |
|||
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -DETH_RELEASE") |
|||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DETH_DEBUG") |
|||
set(ETH_SHARED 1) |
|||
|
|||
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") |
|||
|
|||
# specify Exception Handling Model in msvc |
|||
set(CMAKE_C_FLAGS "/EHsc") |
|||
set(CMAKE_CXX_FLAGS "/EHsc") |
|||
# windows likes static |
|||
set(ETH_STATIC 1) |
|||
|
|||
else () |
|||
message(WARNING "Your compiler is not tested, if you run into any issues, we'd welcome any patches.") |
|||
endif () |
|||
|
@ -0,0 +1,148 @@ |
|||
# all dependencies that are not directly included in the cpp-ethereum distribution are defined here |
|||
# for this to work, download the dependency via the cmake script in extdep or install them manually! |
|||
|
|||
# by defining this variable, cmake will look for dependencies first in our own repository before looking in system paths like /usr/local/ ... |
|||
# this must be set to point to the same directory as $ETH_DEPENDENCY_INSTALL_DIR in /extdep directory |
|||
string(TOLOWER ${CMAKE_SYSTEM_NAME} _system_name) |
|||
set (ETH_DEPENDENCY_INSTALL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/extdep/install/${_system_name}") |
|||
set (CMAKE_PREFIX_PATH ${ETH_DEPENDENCY_INSTALL_DIR}) |
|||
|
|||
# Qt5 requires opengl |
|||
# TODO use proper version of windows SDK (32 vs 64) |
|||
# TODO make it possible to use older versions of windows SDK (7.0+ should also work) |
|||
# TODO it windows SDK is NOT FOUND, throw ERROR |
|||
if (WIN32) |
|||
set (CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "C:/Program Files/Windows Kits/8.1/Lib/winv6.3/um/x86") |
|||
message(" - Found windows 8.1 SDK") |
|||
#set (CMAKE_PREFIX_PATH "C:/Program Files/Windows Kits/8.1/Lib/winv6.3/um/x64") |
|||
endif() |
|||
|
|||
# homebrew installs qts in opt |
|||
if (APPLE) |
|||
set (CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/usr/local/opt/qt5") |
|||
endif() |
|||
|
|||
# Dependencies must have a version number, to ensure reproducible build. The version provided here is the one that is in the extdep repository. If you use system libraries, version numbers may be different. |
|||
|
|||
find_package (CryptoPP 5.6.2 EXACT REQUIRED) |
|||
message(" - CryptoPP header: ${CRYPTOPP_INCLUDE_DIRS}") |
|||
message(" - CryptoPP lib : ${CRYPTOPP_LIBRARIES}") |
|||
|
|||
find_package (LevelDB REQUIRED) |
|||
message(" - LevelDB header: ${LEVELDB_INCLUDE_DIRS}") |
|||
message(" - LevelDB lib: ${LEVELDB_LIBRARIES}") |
|||
|
|||
# TODO the Jsoncpp package does not yet check for correct version number |
|||
find_package (Jsoncpp 0.60 REQUIRED) |
|||
message(" - Jsoncpp header: ${JSONCPP_INCLUDE_DIRS}") |
|||
message(" - Jsoncpp lib : ${JSONCPP_LIBRARIES}") |
|||
|
|||
# TODO the JsonRpcCpp package does not yet check for correct version number |
|||
# json-rpc-cpp support is currently not mandatory |
|||
# TODO make headless client optional |
|||
# TODO get rid of -DETH_JSONRPC |
|||
if (JSONRPC) |
|||
|
|||
find_package (JsonRpcCpp 0.3.2) |
|||
if (NOT JSON_RPC_CPP_FOUND) |
|||
message (FATAL_ERROR "JSONRPC 0.3.2. not found") |
|||
endif() |
|||
message (" - json-rpc-cpp header: ${JSON_RPC_CPP_INCLUDE_DIRS}") |
|||
message (" - json-rpc-cpp lib : ${JSON_RPC_CPP_LIBRARIES}") |
|||
add_definitions(-DETH_JSONRPC) |
|||
|
|||
endif() #JSONRPC |
|||
|
|||
# TODO readline package does not yet check for correct version number |
|||
# TODO make readline package dependent on cmake options |
|||
# TODO get rid of -DETH_READLINE |
|||
find_package (Readline 6.3.8) |
|||
if (READLINE_FOUND) |
|||
message (" - readline header: ${READLINE_INCLUDE_DIRS}") |
|||
message (" - readline lib : ${READLINE_LIBRARIES}") |
|||
add_definitions(-DETH_READLINE) |
|||
endif () |
|||
|
|||
# TODO miniupnpc package does not yet check for correct version number |
|||
# TODO make miniupnpc package dependent on cmake options |
|||
# TODO get rid of -DMINIUPNPC |
|||
find_package (Miniupnpc 1.8.2013) |
|||
if (MINIUPNPC_FOUND) |
|||
message (" - miniupnpc header: ${MINIUPNPC_INCLUDE_DIRS}") |
|||
message (" - miniupnpc lib : ${MINIUPNPC_LIBRARIES}") |
|||
add_definitions(-DETH_MINIUPNPC) |
|||
endif() |
|||
|
|||
# TODO gmp package does not yet check for correct version number |
|||
# TODO it is also not required in msvc build |
|||
find_package (Gmp 6.0.0) |
|||
if (GMP_FOUND) |
|||
message(" - gmp Header: ${GMP_INCLUDE_DIRS}") |
|||
message(" - gmp lib : ${GMP_LIBRARIES}") |
|||
endif() |
|||
|
|||
# curl is only requried for tests |
|||
# TODO specify min curl version, on windows we are currently using 7.29 |
|||
find_package (CURL) |
|||
message(" - curl header: ${CURL_INCLUDE_DIRS}") |
|||
message(" - curl lib : ${CURL_LIBRARIES}") |
|||
|
|||
# do not compile GUI |
|||
if (NOT HEADLESS) |
|||
|
|||
# we need json rpc to build alethzero |
|||
if (NOT JSON_RPC_CPP_FOUND) |
|||
message (FATAL_ERROR "JSONRPC is required for GUI client") |
|||
endif() |
|||
|
|||
# find all of the Qt packages |
|||
# remember to use 'Qt' instead of 'QT', cause unix is case sensitive |
|||
# TODO make headless client optional |
|||
find_package (Qt5Core REQUIRED) |
|||
find_package (Qt5Gui REQUIRED) |
|||
find_package (Qt5Quick REQUIRED) |
|||
find_package (Qt5Qml REQUIRED) |
|||
find_package (Qt5Network REQUIRED) |
|||
find_package (Qt5Widgets REQUIRED) |
|||
find_package (Qt5WebKit REQUIRED) |
|||
find_package (Qt5WebKitWidgets REQUIRED) |
|||
|
|||
# we need to find path to macdeployqt on mac |
|||
if (APPLE) |
|||
set (MACDEPLOYQT_APP ${Qt5Core_DIR}/../../../bin/macdeployqt) |
|||
message(" - macdeployqt path: ${MACDEPLOYQT_APP}") |
|||
endif() |
|||
|
|||
endif() #HEADLESS |
|||
|
|||
# use multithreaded boost libraries, with -mt suffix |
|||
set(Boost_USE_MULTITHREADED ON) |
|||
|
|||
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") |
|||
|
|||
# TODO hanlde other msvc versions or it will fail find them |
|||
set(Boost_COMPILER -vc120) |
|||
# use static boost libraries *.lib |
|||
set(Boost_USE_STATIC_LIBS ON) |
|||
|
|||
elseif (APPLE) |
|||
|
|||
# use static boost libraries *.a |
|||
set(Boost_USE_STATIC_LIBS ON) |
|||
|
|||
elseif (UNIX) |
|||
# use dynamic boost libraries .dll |
|||
set(Boost_USE_STATIC_LIBS OFF) |
|||
|
|||
endif() |
|||
|
|||
find_package(Boost 1.54.0 REQUIRED COMPONENTS thread date_time system regex chrono filesystem unit_test_framework program_options) |
|||
|
|||
message(" - boost header: ${Boost_INCLUDE_DIRS}") |
|||
message(" - boost lib : ${Boost_LIBRARIES}") |
|||
|
|||
if (APPLE) |
|||
link_directories(/usr/local/lib) |
|||
include_directories(/usr/local/include) |
|||
endif() |
|||
|
@ -0,0 +1,152 @@ |
|||
# |
|||
# this function requires the following variables to be specified: |
|||
# ETH_VERSION |
|||
# PROJECT_NAME |
|||
# PROJECT_VERSION |
|||
# PROJECT_COPYRIGHT_YEAR |
|||
# PROJECT_VENDOR |
|||
# PROJECT_DOMAIN_SECOND |
|||
# PROJECT_DOMAIN_FIRST |
|||
# SRC_LIST |
|||
# HEADERS |
|||
# |
|||
# params: |
|||
# ICON |
|||
# |
|||
|
|||
macro(eth_add_executable EXECUTABLE) |
|||
set (extra_macro_args ${ARGN}) |
|||
set (options) |
|||
set (one_value_args ICON) |
|||
set (multi_value_args UI_RESOURCES WIN_RESOURCES) |
|||
cmake_parse_arguments (ETH_ADD_EXECUTABLE "${options}" "${one_value_args}" "${multi_value_args}" "${extra_macro_args}") |
|||
|
|||
if (APPLE) |
|||
|
|||
add_executable(${EXECUTABLE} MACOSX_BUNDLE ${SRC_LIST} ${HEADERS} ${ETH_ADD_EXECUTABLE_UI_RESOURCES}) |
|||
set(PROJECT_VERSION "${ETH_VERSION}") |
|||
set(MACOSX_BUNDLE_INFO_STRING "${PROJECT_NAME} ${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_NAME} ${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_LONG_VERSION_STRING "${PROJECT_NAME} ${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_COPYRIGHT "${PROJECT_COPYRIGHT_YEAR} ${PROJECT_VENDOR}") |
|||
set(MACOSX_BUNDLE_GUI_IDENTIFIER "${PROJECT_DOMAIN_SECOND}.${PROJECT_DOMAIN_FIRST}") |
|||
set(MACOSX_BUNDLE_BUNDLE_NAME ${EXECUTABLE}) |
|||
set(MACOSX_BUNDLE_ICON_FILE ${ETH_ADD_EXECUTABLE_ICON}) |
|||
set_target_properties(${EXECUTABLE} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/EthereumMacOSXBundleInfo.plist.in") |
|||
set_source_files_properties(${EXECUTABLE} PROPERTIES MACOSX_PACKAGE_LOCATION MacOS) |
|||
set_source_files_properties(${MACOSX_BUNDLE_ICON_FILE}.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) |
|||
|
|||
else () |
|||
add_executable(${EXECUTABLE} ${ETH_ADD_EXECUTABLE_UI_RESOURCES} ${ETH_ADD_EXECUTABLE_WIN_RESOURCES} ${SRC_LIST} ${HEADERS}) |
|||
endif() |
|||
|
|||
endmacro() |
|||
|
|||
# |
|||
# this function requires the following variables to be specified: |
|||
# ETH_DEPENDENCY_INSTALL_DIR |
|||
# |
|||
# params: |
|||
# QMLDIR |
|||
# |
|||
|
|||
macro(eth_install_executable EXECUTABLE) |
|||
|
|||
set (extra_macro_args ${ARGN}) |
|||
set (options) |
|||
set (one_value_args QMLDIR) |
|||
set (multi_value_args) |
|||
cmake_parse_arguments (ETH_INSTALL_EXECUTABLE "${options}" "${one_value_args}" "${multi_value_args}" "${extra_macro_args}") |
|||
|
|||
if (ETH_INSTALL_EXECUTABLE_QMLDIR) |
|||
if (APPLE) |
|||
set(eth_qml_dir "-qmldir=${ETH_INSTALL_EXECUTABLE_QMLDIR}") |
|||
elseif (WIN32) |
|||
set(eth_qml_dir --qmldir ${ETH_INSTALL_EXECUTABLE_QMLDIR}) |
|||
endif() |
|||
message(STATUS "${EXECUTABLE} qmldir: ${eth_qml_dir}") |
|||
endif() |
|||
|
|||
if (APPLE) |
|||
# First have qt5 install plugins and frameworks |
|||
add_custom_command(TARGET ${EXECUTABLE} POST_BUILD |
|||
COMMAND ${MACDEPLOYQT_APP} ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${EXECUTABLE}.app ${eth_qml_dir} |
|||
WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} |
|||
) |
|||
|
|||
# This tool and next will inspect linked libraries in order to determine which dependencies are required |
|||
if (${CMAKE_CFG_INTDIR} STREQUAL ".") |
|||
set(APP_BUNDLE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${EXECUTABLE}.app") |
|||
else () |
|||
set(APP_BUNDLE_PATH "${CMAKE_CURRENT_BINARY_DIR}/\$ENV{CONFIGURATION}/${EXECUTABLE}.app") |
|||
endif () |
|||
|
|||
# TODO check, how fixup_bundle works and if it is required |
|||
install(CODE " |
|||
include(BundleUtilities) |
|||
set(BU_CHMOD_BUNDLE_ITEMS 1) |
|||
fixup_bundle(\"${APP_BUNDLE_PATH}\" \"${BUNDLELIBS}\" \"../libqethereum ../libethereum ../secp256k1\") |
|||
" COMPONENT RUNTIME ) |
|||
# Cleanup duplicate libs from macdeployqt |
|||
install(CODE " |
|||
file(GLOB LINGER_RM \"${APP_BUNDLE_PATH}/Contents/Frameworks/*.dylib\") |
|||
if (LINGER_RM) |
|||
file(REMOVE \${LINGER_RM}) |
|||
endif () |
|||
") |
|||
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") |
|||
|
|||
# copy all dlls to executable directory |
|||
# TODO improve that by copying only required dlls |
|||
file (GLOB DLLS ${ETH_DEPENDENCY_INSTALL_DIR}/bin/*.dll) |
|||
|
|||
foreach(DLL ${DLLS}) |
|||
add_custom_command(TARGET ${EXECUTABLE} POST_BUILD |
|||
COMMAND cmake -E copy "${DLL}" "$<TARGET_FILE_DIR:${EXECUTABLE}>" |
|||
) |
|||
endforeach() |
|||
|
|||
add_custom_command(TARGET ${EXECUTABLE} POST_BUILD |
|||
COMMAND cmake -E copy_directory |
|||
"${ETH_DEPENDENCY_INSTALL_DIR}/plugins/platforms" |
|||
$<TARGET_FILE_DIR:${EXECUTABLE}>/platforms |
|||
) |
|||
|
|||
# ugly way, improve that |
|||
add_custom_command(TARGET ${EXECUTABLE} POST_BUILD |
|||
COMMAND cmake -E copy_directory |
|||
"${ETH_DEPENDENCY_INSTALL_DIR}/qml" |
|||
$<TARGET_FILE_DIR:${EXECUTABLE}> |
|||
) |
|||
|
|||
install( FILES ${DLLS} |
|||
DESTINATION bin |
|||
COMPONENT ${EXECUTABLE} |
|||
) |
|||
|
|||
install( DIRECTORY ${ETH_DEPENDENCY_INSTALL_DIR}/plugins/platforms |
|||
DESTINATION bin |
|||
COMPONENT ${EXECUTABLE} |
|||
) |
|||
|
|||
file (GLOB QMLS ${ETH_DEPENDENCY_INSTALL_DIR}/qml/*) |
|||
foreach(QML ${QMLS}) |
|||
install( DIRECTORY ${QML} |
|||
DESTINATION bin |
|||
COMPONENT ${EXECUTABLE} |
|||
) |
|||
endforeach() |
|||
|
|||
install( TARGETS ${EXECUTABLE} RUNTIME |
|||
DESTINATION bin |
|||
COMPONENT ${EXECUTABLE} |
|||
) |
|||
|
|||
else() |
|||
install( TARGETS ${EXECUTABLE} RUNTIME DESTINATION bin) |
|||
endif () |
|||
|
|||
endmacro() |
|||
|
|||
|
@ -0,0 +1,49 @@ |
|||
# Find CURL |
|||
# |
|||
# Find the curl includes and library |
|||
# |
|||
# if you nee to add a custom library search path, do it via via CMAKE_PREFIX_PATH |
|||
# |
|||
# This module defines |
|||
# CURL_INCLUDE_DIRS, where to find header, etc. |
|||
# CURL_LIBRARIES, the libraries needed to use curl. |
|||
# CURL_FOUND, If false, do not try to use curl. |
|||
|
|||
# only look in default directories |
|||
find_path( |
|||
CURL_INCLUDE_DIR |
|||
NAMES curl/curl.h |
|||
DOC "curl include dir" |
|||
) |
|||
|
|||
find_library( |
|||
CURL_LIBRARY |
|||
# names from cmake's FindCURL |
|||
NAMES curl curllib libcurl_imp curllib_static libcurl |
|||
DOC "curl library" |
|||
) |
|||
|
|||
set(CURL_INCLUDE_DIRS ${CURL_INCLUDE_DIR}) |
|||
set(CURL_LIBRARIES ${CURL_LIBRARY}) |
|||
|
|||
# debug library on windows |
|||
# same naming convention as in qt (appending debug library with d) |
|||
# boost is using the same "hack" as us with "optimized" and "debug" |
|||
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") |
|||
find_library( |
|||
CURL_LIBRARY_DEBUG |
|||
NAMES curld libcurld |
|||
DOC "curl debug library" |
|||
) |
|||
|
|||
set(CURL_LIBRARIES optimized ${CURL_LIBRARIES} debug ${CURL_LIBRARY_DEBUG}) |
|||
|
|||
endif() |
|||
|
|||
# handle the QUIETLY and REQUIRED arguments and set CURL_FOUND to TRUE |
|||
# if all listed variables are TRUE, hide their existence from configuration view |
|||
include(FindPackageHandleStandardArgs) |
|||
find_package_handle_standard_args(CURL DEFAULT_MSG |
|||
CURL_INCLUDE_DIR CURL_LIBRARY) |
|||
mark_as_advanced (CURL_INCLUDE_DIR CURL_LIBRARY) |
|||
|
@ -0,0 +1,108 @@ |
|||
# Module for locating the Crypto++ encryption library. |
|||
# |
|||
# Customizable variables: |
|||
# CRYPTOPP_ROOT_DIR |
|||
# This variable points to the CryptoPP root directory. On Windows the |
|||
# library location typically will have to be provided explicitly using the |
|||
# -D command-line option. The directory should include the include/cryptopp, |
|||
# lib and/or bin sub-directories. |
|||
# |
|||
# Read-only variables: |
|||
# CRYPTOPP_FOUND |
|||
# Indicates whether the library has been found. |
|||
# |
|||
# CRYPTOPP_INCLUDE_DIRS |
|||
# Points to the CryptoPP include directory. |
|||
# |
|||
# CRYPTOPP_LIBRARIES |
|||
# Points to the CryptoPP libraries that should be passed to |
|||
# target_link_libararies. |
|||
# |
|||
# |
|||
# Copyright (c) 2012 Sergiu Dotenco |
|||
# |
|||
# Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
# of this software and associated documentation files (the "Software"), to deal |
|||
# in the Software without restriction, including without limitation the rights |
|||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
# copies of the Software, and to permit persons to whom the Software is |
|||
# furnished to do so, subject to the following conditions: |
|||
# |
|||
# The above copyright notice and this permission notice shall be included in all |
|||
# copies or substantial portions of the Software. |
|||
# |
|||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
# SOFTWARE. |
|||
|
|||
INCLUDE (FindPackageHandleStandardArgs) |
|||
|
|||
FIND_PATH (CRYPTOPP_ROOT_DIR |
|||
NAMES cryptopp/cryptlib.h include/cryptopp/cryptlib.h |
|||
PATHS ENV CRYPTOPPROOT |
|||
DOC "CryptoPP root directory") |
|||
|
|||
# Re-use the previous path: |
|||
FIND_PATH (CRYPTOPP_INCLUDE_DIR |
|||
NAMES cryptopp/cryptlib.h |
|||
HINTS ${CRYPTOPP_ROOT_DIR} |
|||
PATH_SUFFIXES include |
|||
DOC "CryptoPP include directory") |
|||
|
|||
FIND_LIBRARY (CRYPTOPP_LIBRARY_DEBUG |
|||
NAMES cryptlibd cryptoppd |
|||
HINTS ${CRYPTOPP_ROOT_DIR} |
|||
PATH_SUFFIXES lib |
|||
DOC "CryptoPP debug library") |
|||
|
|||
FIND_LIBRARY (CRYPTOPP_LIBRARY_RELEASE |
|||
NAMES cryptlib cryptopp |
|||
HINTS ${CRYPTOPP_ROOT_DIR} |
|||
PATH_SUFFIXES lib |
|||
DOC "CryptoPP release library") |
|||
|
|||
IF (CRYPTOPP_LIBRARY_DEBUG AND CRYPTOPP_LIBRARY_RELEASE) |
|||
SET (CRYPTOPP_LIBRARY |
|||
optimized ${CRYPTOPP_LIBRARY_RELEASE} |
|||
debug ${CRYPTOPP_LIBRARY_DEBUG} CACHE DOC "CryptoPP library") |
|||
ELSEIF (CRYPTOPP_LIBRARY_RELEASE) |
|||
SET (CRYPTOPP_LIBRARY ${CRYPTOPP_LIBRARY_RELEASE} CACHE DOC |
|||
"CryptoPP library") |
|||
ENDIF (CRYPTOPP_LIBRARY_DEBUG AND CRYPTOPP_LIBRARY_RELEASE) |
|||
|
|||
IF (CRYPTOPP_INCLUDE_DIR) |
|||
SET (_CRYPTOPP_VERSION_HEADER ${CRYPTOPP_INCLUDE_DIR}/cryptopp/config.h) |
|||
|
|||
IF (EXISTS ${_CRYPTOPP_VERSION_HEADER}) |
|||
FILE (STRINGS ${_CRYPTOPP_VERSION_HEADER} _CRYPTOPP_VERSION_TMP REGEX |
|||
"^#define CRYPTOPP_VERSION[ \t]+[0-9]+$") |
|||
|
|||
STRING (REGEX REPLACE |
|||
"^#define CRYPTOPP_VERSION[ \t]+([0-9]+)" "\\1" _CRYPTOPP_VERSION_TMP |
|||
${_CRYPTOPP_VERSION_TMP}) |
|||
|
|||
STRING (REGEX REPLACE "([0-9]+)[0-9][0-9]" "\\1" CRYPTOPP_VERSION_MAJOR |
|||
${_CRYPTOPP_VERSION_TMP}) |
|||
STRING (REGEX REPLACE "[0-9]([0-9])[0-9]" "\\1" CRYPTOPP_VERSION_MINOR |
|||
${_CRYPTOPP_VERSION_TMP}) |
|||
STRING (REGEX REPLACE "[0-9][0-9]([0-9])" "\\1" CRYPTOPP_VERSION_PATCH |
|||
${_CRYPTOPP_VERSION_TMP}) |
|||
|
|||
SET (CRYPTOPP_VERSION_COUNT 3) |
|||
SET (CRYPTOPP_VERSION |
|||
${CRYPTOPP_VERSION_MAJOR}.${CRYPTOPP_VERSION_MINOR}.${CRYPTOPP_VERSION_PATCH}) |
|||
ENDIF (EXISTS ${_CRYPTOPP_VERSION_HEADER}) |
|||
ENDIF (CRYPTOPP_INCLUDE_DIR) |
|||
|
|||
SET (CRYPTOPP_INCLUDE_DIRS ${CRYPTOPP_INCLUDE_DIR}) |
|||
SET (CRYPTOPP_LIBRARIES ${CRYPTOPP_LIBRARY}) |
|||
|
|||
MARK_AS_ADVANCED (CRYPTOPP_INCLUDE_DIR CRYPTOPP_LIBRARY CRYPTOPP_LIBRARY_DEBUG |
|||
CRYPTOPP_LIBRARY_RELEASE) |
|||
|
|||
FIND_PACKAGE_HANDLE_STANDARD_ARGS (CryptoPP REQUIRED_VARS |
|||
CRYPTOPP_INCLUDE_DIR CRYPTOPP_LIBRARY VERSION_VAR CRYPTOPP_VERSION) |
@ -0,0 +1,34 @@ |
|||
# Find gmp |
|||
# |
|||
# Find the gmp includes and library |
|||
# |
|||
# if you nee to add a custom library search path, do it via via CMAKE_PREFIX_PATH |
|||
# |
|||
# This module defines |
|||
# GMP_INCLUDE_DIRS, where to find header, etc. |
|||
# GMP_LIBRARIES, the libraries needed to use gmp. |
|||
# GMP_FOUND, If false, do not try to use gmp. |
|||
|
|||
# only look in default directories |
|||
find_path( |
|||
GMP_INCLUDE_DIR |
|||
NAMES gmp.h |
|||
DOC "gmp include dir" |
|||
) |
|||
|
|||
find_library( |
|||
GMP_LIBRARY |
|||
NAMES gmp |
|||
DOC "gmp library" |
|||
) |
|||
|
|||
set(GMP_INCLUDE_DIRS ${GMP_INCLUDE_DIR}) |
|||
set(GMP_LIBRARIES ${GMP_LIBRARY}) |
|||
|
|||
# handle the QUIETLY and REQUIRED arguments and set GMP_FOUND to TRUE |
|||
# if all listed variables are TRUE, hide their existence from configuration view |
|||
include(FindPackageHandleStandardArgs) |
|||
find_package_handle_standard_args(gmp DEFAULT_MSG |
|||
GMP_INCLUDE_DIR GMP_LIBRARY) |
|||
mark_as_advanced (GMP_INCLUDE_DIR GMP_LIBRARY) |
|||
|
@ -0,0 +1,99 @@ |
|||
# Find json-rcp-cpp |
|||
# |
|||
# Find the json-rpc-cpp includes and library |
|||
# |
|||
# if you nee to add a custom library search path, do it via via CMAKE_PREFIX_PATH |
|||
# |
|||
# This module defines |
|||
# JSON_RCP_CPP_INCLUDE_DIRS, where to find header, etc. |
|||
# JSON_RCP_CPP_LIBRARIES, the libraries needed to use json-rpc-cpp. |
|||
# JSON_RPC_CPP_SERVER_LIBRARIES, the libraries needed to use json-rpc-cpp-server |
|||
# JSON_RPC_CPP_CLIENT_LIBRARIES, the libraries needed to use json-rpc-cpp-client |
|||
# JSON_RCP_CPP_FOUND, If false, do not try to use json-rpc-cpp. |
|||
|
|||
# only look in default directories |
|||
find_path( |
|||
JSON_RPC_CPP_INCLUDE_DIR |
|||
NAMES jsonrpccpp/server.h |
|||
PATH_SUFFIXES jsonrpc |
|||
DOC "json-rpc-cpp include dir" |
|||
) |
|||
|
|||
find_library( |
|||
JSON_RPC_CPP_COMMON_LIBRARY |
|||
NAMES jsonrpccpp-common |
|||
DOC "json-rpc-cpp common library" |
|||
) |
|||
|
|||
find_library( |
|||
JSON_RPC_CPP_SERVER_LIBRARY |
|||
NAMES jsonrpccpp-server |
|||
DOC "json-rpc-cpp server library" |
|||
) |
|||
|
|||
find_library( |
|||
JSON_RPC_CPP_CLIENT_LIBRARY |
|||
NAMES jsonrpccpp-client |
|||
DOC "json-rpc-cpp client library" |
|||
) |
|||
|
|||
# these are the variables to be uses by the calling script |
|||
set (JSON_RPC_CPP_INCLUDE_DIRS ${JSON_RPC_CPP_INCLUDE_DIR}) |
|||
set (JSON_RPC_CPP_LIBRARIES ${JSON_RPC_CPP_COMMON_LIBRARY} ${JSON_RPC_CPP_SERVER_LIBRARY} ${JSON_RPC_CPP_CLIENT_LIBRARY}) |
|||
set (JSON_RPC_CPP_SERVER_LIBRARIES ${JSON_RPC_CPP_COMMON_LIBRARY} ${JSON_RPC_CPP_SERVER_LIBRARY}) |
|||
set (JSON_RPC_CPP_CLIENT_LIBRARIES ${JSON_RPC_CPP_COMMON_LIBRARY} ${JSON_RPC_CPP_CLIENT_LIBRARY}) |
|||
|
|||
# debug library on windows |
|||
# same naming convention as in qt (appending debug library with d) |
|||
# boost is using the same "hack" as us with "optimized" and "debug" |
|||
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") |
|||
find_library( |
|||
JSON_RPC_CPP_COMMON_LIBRARY_DEBUG |
|||
NAMES jsonrpccpp-commond |
|||
DOC "json-rpc-cpp common debug library" |
|||
) |
|||
|
|||
find_library( |
|||
JSON_RPC_CPP_SERVER_LIBRARY_DEBUG |
|||
NAMES jsonrpccpp-serverd |
|||
DOC "json-rpc-cpp server debug library" |
|||
) |
|||
|
|||
find_library( |
|||
JSON_RPC_CPP_CLIENT_LIBRARY_DEBUG |
|||
NAMES jsonrpccpp-clientd |
|||
DOC "json-rpc-cpp client debug library" |
|||
) |
|||
|
|||
set (JSON_RPC_CPP_LIBRARIES |
|||
optimized ${JSON_RPC_CPP_COMMON_LIBRARY} |
|||
optimized ${JSON_RPC_CPP_SERVER_LIBRARY} |
|||
optimized ${JSON_RPC_CPP_CLIENT_LIBRARY} |
|||
debug ${JSON_RPC_CPP_COMMON_LIBRARY_DEBUG} |
|||
debug ${JSON_RPC_CPP_SERVER_LIBRARY_DEBUG} |
|||
debug ${JSON_RPC_CPP_CLIENT_LIBRARY_DEBUG} |
|||
) |
|||
|
|||
set (JSON_RPC_CPP_SERVER_LIBRARIES |
|||
optimized ${JSON_RPC_CPP_COMMON_LIBRARY} |
|||
optimized ${JSON_RPC_CPP_SERVER_LIBRARY} |
|||
debug ${JSON_RPC_CPP_COMMON_LIBRARY_DEBUG} |
|||
debug ${JSON_RPC_CPP_SERVER_LIBRARY_DEBUG} |
|||
) |
|||
|
|||
set (JSON_RPC_CPP_CLIENT_LIBRARIES |
|||
optimized ${JSON_RPC_CPP_COMMON_LIBRARY} |
|||
optimized ${JSON_RPC_CPP_CLIENT_LIBRARY} |
|||
debug ${JSON_RPC_CPP_COMMON_LIBRARY_DEBUG} |
|||
debug ${JSON_RPC_CPP_CLIENT_LIBRARY_DEBUG} |
|||
) |
|||
|
|||
endif() |
|||
|
|||
# handle the QUIETLY and REQUIRED arguments and set JSON_RPC_CPP_FOUND to TRUE |
|||
# if all listed variables are TRUE, hide their existence from configuration view |
|||
include(FindPackageHandleStandardArgs) |
|||
find_package_handle_standard_args(json_rpc_cpp DEFAULT_MSG |
|||
JSON_RPC_CPP_COMMON_LIBRARY JSON_RPC_CPP_SERVER_LIBRARY JSON_RPC_CPP_CLIENT_LIBRARY JSON_RPC_CPP_INCLUDE_DIR) |
|||
mark_as_advanced (JSON_RPC_CPP_COMMON_LIBRARY JSON_RPC_CPP_SERVER_LIBRARY JSON_RPC_CPP_CLIENT_LIBRARY JSON_RPC_CPP_INCLUDE_DIR) |
|||
|
@ -0,0 +1,48 @@ |
|||
# Find jsoncpp |
|||
# |
|||
# Find the jsoncpp includes and library |
|||
# |
|||
# if you nee to add a custom library search path, do it via via CMAKE_PREFIX_PATH |
|||
# |
|||
# This module defines |
|||
# JSONCPP_INCLUDE_DIRS, where to find header, etc. |
|||
# JSONCPP_LIBRARIES, the libraries needed to use jsoncpp. |
|||
# JSONCPP_FOUND, If false, do not try to use jsoncpp. |
|||
|
|||
# only look in default directories |
|||
find_path( |
|||
JSONCPP_INCLUDE_DIR |
|||
NAMES jsoncpp/json/json.h |
|||
DOC "jsoncpp include dir" |
|||
) |
|||
|
|||
find_library( |
|||
JSONCPP_LIBRARY |
|||
NAMES jsoncpp |
|||
DOC "jsoncpp library" |
|||
) |
|||
|
|||
set(JSONCPP_INCLUDE_DIRS ${JSONCPP_INCLUDE_DIR}) |
|||
set(JSONCPP_LIBRARIES ${JSONCPP_LIBRARY}) |
|||
|
|||
# debug library on windows |
|||
# same naming convention as in qt (appending debug library with d) |
|||
# boost is using the same "hack" as us with "optimized" and "debug" |
|||
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") |
|||
find_library( |
|||
JSONCPP_LIBRARY_DEBUG |
|||
NAMES jsoncppd |
|||
DOC "jsoncpp debug library" |
|||
) |
|||
|
|||
set(JSONCPP_LIBRARIES optimized ${JSONCPP_LIBRARIES} debug ${JSONCPP_LIBRARY_DEBUG}) |
|||
|
|||
endif() |
|||
|
|||
# handle the QUIETLY and REQUIRED arguments and set JSONCPP_FOUND to TRUE |
|||
# if all listed variables are TRUE, hide their existence from configuration view |
|||
include(FindPackageHandleStandardArgs) |
|||
find_package_handle_standard_args(jsoncpp DEFAULT_MSG |
|||
JSONCPP_INCLUDE_DIR JSONCPP_LIBRARY) |
|||
mark_as_advanced (JSONCPP_INCLUDE_DIR JSONCPP_LIBRARY) |
|||
|
@ -0,0 +1,48 @@ |
|||
# Find leveldb |
|||
# |
|||
# Find the leveldb includes and library |
|||
# |
|||
# if you nee to add a custom library search path, do it via via CMAKE_PREFIX_PATH |
|||
# |
|||
# This module defines |
|||
# LEVELDB_INCLUDE_DIRS, where to find header, etc. |
|||
# LEVELDB_LIBRARIES, the libraries needed to use leveldb. |
|||
# LEVELDB_FOUND, If false, do not try to use leveldb. |
|||
|
|||
# only look in default directories |
|||
find_path( |
|||
LEVELDB_INCLUDE_DIR |
|||
NAMES leveldb/db.h |
|||
DOC "leveldb include dir" |
|||
) |
|||
|
|||
find_library( |
|||
LEVELDB_LIBRARY |
|||
NAMES leveldb |
|||
DOC "leveldb library" |
|||
) |
|||
|
|||
set(LEVELDB_INCLUDE_DIRS ${LEVELDB_INCLUDE_DIR}) |
|||
set(LEVELDB_LIBRARIES ${LEVELDB_LIBRARY}) |
|||
|
|||
# debug library on windows |
|||
# same naming convention as in qt (appending debug library with d) |
|||
# boost is using the same "hack" as us with "optimized" and "debug" |
|||
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") |
|||
find_library( |
|||
LEVELDB_LIBRARY_DEBUG |
|||
NAMES leveldbd |
|||
DOC "leveldb debug library" |
|||
) |
|||
|
|||
set(LEVELDB_LIBRARIES optimized ${LEVELDB_LIBRARIES} debug ${LEVELDB_LIBRARY_DEBUG}) |
|||
|
|||
endif() |
|||
|
|||
# handle the QUIETLY and REQUIRED arguments and set LEVELDB_FOUND to TRUE |
|||
# if all listed variables are TRUE, hide their existence from configuration view |
|||
include(FindPackageHandleStandardArgs) |
|||
find_package_handle_standard_args(leveldb DEFAULT_MSG |
|||
LEVELDB_INCLUDE_DIR LEVELDB_LIBRARY) |
|||
mark_as_advanced (LEVELDB_INCLUDE_DIR LEVELDB_LIBRARY) |
|||
|
@ -0,0 +1,34 @@ |
|||
# Find miniupnpc |
|||
# |
|||
# Find the miniupnpc includes and library |
|||
# |
|||
# if you nee to add a custom library search path, do it via via CMAKE_PREFIX_PATH |
|||
# |
|||
# This module defines |
|||
# MINIUPNPC_INCLUDE_DIRS, where to find header, etc. |
|||
# MINIUPNPC_LIBRARIES, the libraries needed to use gmp. |
|||
# MINIUPNPC_FOUND, If false, do not try to use gmp. |
|||
|
|||
# only look in default directories |
|||
find_path( |
|||
MINIUPNPC_INCLUDE_DIR |
|||
NAMES miniupnpc/miniupnpc.h |
|||
DOC "miniupnpc include dir" |
|||
) |
|||
|
|||
find_library( |
|||
MINIUPNPC_LIBRARY |
|||
NAMES miniupnpc |
|||
DOC "miniupnpc library" |
|||
) |
|||
|
|||
set(MINIUPNPC_INCLUDE_DIRS ${MINIUPNPC_INCLUDE_DIR}) |
|||
set(MINIUPNPC_LIBRARIES ${MINIUPNPC_LIBRARY}) |
|||
|
|||
# handle the QUIETLY and REQUIRED arguments and set MINIUPNPC_FOUND to TRUE |
|||
# if all listed variables are TRUE, hide their existence from configuration view |
|||
include(FindPackageHandleStandardArgs) |
|||
find_package_handle_standard_args(miniupnpc DEFAULT_MSG |
|||
MINIUPNPC_INCLUDE_DIR MINIUPNPC_LIBRARY) |
|||
mark_as_advanced (MINIUPNPC_INCLUDE_DIR MINIUPNPC_LIBRARY) |
|||
|
@ -0,0 +1,34 @@ |
|||
# Find readline |
|||
# |
|||
# Find the readline includes and library |
|||
# |
|||
# if you nee to add a custom library search path, do it via via CMAKE_PREFIX_PATH |
|||
# |
|||
# This module defines |
|||
# READLINE_INCLUDE_DIRS, where to find header, etc. |
|||
# READLINE_LIBRARIES, the libraries needed to use readline. |
|||
# READLINE_FOUND, If false, do not try to use readline. |
|||
|
|||
# only look in default directories |
|||
find_path( |
|||
READLINE_INCLUDE_DIR |
|||
NAMES readline/readline.h |
|||
DOC "readling include dir" |
|||
) |
|||
|
|||
find_library( |
|||
READLINE_LIBRARY |
|||
NAMES readline |
|||
DOC "readline library" |
|||
) |
|||
|
|||
set(READLINE_INCLUDE_DIRS ${READLINE_INCLUDE_DIR}) |
|||
set(READLINE_LIBRARIES ${READLINE_LIBRARY}) |
|||
|
|||
# handle the QUIETLY and REQUIRED arguments and set READLINE_FOUND to TRUE |
|||
# if all listed variables are TRUE, hide their existence from configuration view |
|||
include(FindPackageHandleStandardArgs) |
|||
find_package_handle_standard_args(readline DEFAULT_MSG |
|||
READLINE_INCLUDE_DIR READLINE_LIBRARY) |
|||
mark_as_advanced (READLINE_INCLUDE_DIR READLINE_LIBRARY) |
|||
|
@ -1,379 +0,0 @@ |
|||
var bigInt = (function () { |
|||
var base = 10000000, logBase = 7; |
|||
var sign = { |
|||
positive: false, |
|||
negative: true |
|||
}; |
|||
|
|||
var normalize = function (first, second) { |
|||
var a = first.value, b = second.value; |
|||
var length = a.length > b.length ? a.length : b.length; |
|||
for (var i = 0; i < length; i++) { |
|||
a[i] = a[i] || 0; |
|||
b[i] = b[i] || 0; |
|||
} |
|||
for (var i = length - 1; i >= 0; i--) { |
|||
if (a[i] === 0 && b[i] === 0) { |
|||
a.pop(); |
|||
b.pop(); |
|||
} else break; |
|||
} |
|||
if (!a.length) a = [0], b = [0]; |
|||
first.value = a; |
|||
second.value = b; |
|||
}; |
|||
|
|||
var parse = function (text, first) { |
|||
if (typeof text === "object") return text; |
|||
text += ""; |
|||
var s = sign.positive, value = []; |
|||
if (text[0] === "-") { |
|||
s = sign.negative; |
|||
text = text.slice(1); |
|||
} |
|||
var base = 10; |
|||
if (text.slice(0, 2) == "0x") { |
|||
base = 16; |
|||
text = text.slice(2); |
|||
} |
|||
else { |
|||
var texts = text.split("e"); |
|||
if (texts.length > 2) throw new Error("Invalid integer"); |
|||
if (texts[1]) { |
|||
var exp = texts[1]; |
|||
if (exp[0] === "+") exp = exp.slice(1); |
|||
exp = parse(exp); |
|||
if (exp.lesser(0)) throw new Error("Cannot include negative exponent part for integers"); |
|||
while (exp.notEquals(0)) { |
|||
texts[0] += "0"; |
|||
exp = exp.prev(); |
|||
} |
|||
} |
|||
text = texts[0]; |
|||
} |
|||
if (text === "-0") text = "0"; |
|||
text = text.toUpperCase(); |
|||
var isValid = (base == 16 ? /^[0-9A-F]*$/ : /^[0-9]+$/).test(text); |
|||
if (!isValid) throw new Error("Invalid integer"); |
|||
if (base == 16) { |
|||
var val = bigInt(0); |
|||
while (text.length) { |
|||
v = text.charCodeAt(0) - 48; |
|||
if (v > 9) |
|||
v -= 7; |
|||
text = text.slice(1); |
|||
val = val.times(16).plus(v); |
|||
} |
|||
return val; |
|||
} |
|||
else { |
|||
while (text.length) { |
|||
var divider = text.length > logBase ? text.length - logBase : 0; |
|||
value.push(+text.slice(divider)); |
|||
text = text.slice(0, divider); |
|||
} |
|||
var val = bigInt(value, s); |
|||
if (first) normalize(first, val); |
|||
return val; |
|||
} |
|||
}; |
|||
|
|||
var goesInto = function (a, b) { |
|||
var a = bigInt(a, sign.positive), b = bigInt(b, sign.positive); |
|||
if (a.equals(0)) throw new Error("Cannot divide by 0"); |
|||
var n = 0; |
|||
do { |
|||
var inc = 1; |
|||
var c = bigInt(a.value, sign.positive), t = c.times(10); |
|||
while (t.lesser(b)) { |
|||
c = t; |
|||
inc *= 10; |
|||
t = t.times(10); |
|||
} |
|||
while (c.lesserOrEquals(b)) { |
|||
b = b.minus(c); |
|||
n += inc; |
|||
} |
|||
} while (a.lesserOrEquals(b)); |
|||
|
|||
return { |
|||
remainder: b.value, |
|||
result: n |
|||
}; |
|||
}; |
|||
|
|||
var bigInt = function (value, s) { |
|||
var self = { |
|||
value: value, |
|||
sign: s |
|||
}; |
|||
var o = { |
|||
value: value, |
|||
sign: s, |
|||
negate: function (m) { |
|||
var first = m || self; |
|||
return bigInt(first.value, !first.sign); |
|||
}, |
|||
abs: function (m) { |
|||
var first = m || self; |
|||
return bigInt(first.value, sign.positive); |
|||
}, |
|||
add: function (n, m) { |
|||
var s, first = self, second; |
|||
if (m) (first = parse(n)) && (second = parse(m)); |
|||
else second = parse(n, first); |
|||
s = first.sign; |
|||
if (first.sign !== second.sign) { |
|||
first = bigInt(first.value, sign.positive); |
|||
second = bigInt(second.value, sign.positive); |
|||
return s === sign.positive ? |
|||
o.subtract(first, second) : |
|||
o.subtract(second, first); |
|||
} |
|||
normalize(first, second); |
|||
var a = first.value, b = second.value; |
|||
var result = [], |
|||
carry = 0; |
|||
for (var i = 0; i < a.length || carry > 0; i++) { |
|||
var sum = (a[i] || 0) + (b[i] || 0) + carry; |
|||
carry = sum >= base ? 1 : 0; |
|||
sum -= carry * base; |
|||
result.push(sum); |
|||
} |
|||
return bigInt(result, s); |
|||
}, |
|||
plus: function (n, m) { |
|||
return o.add(n, m); |
|||
}, |
|||
subtract: function (n, m) { |
|||
var first = self, second; |
|||
if (m) (first = parse(n)) && (second = parse(m)); |
|||
else second = parse(n, first); |
|||
if (first.sign !== second.sign) return o.add(first, o.negate(second)); |
|||
if (first.sign === sign.negative) return o.subtract(o.negate(second), o.negate(first)); |
|||
if (o.compare(first, second) === -1) return o.negate(o.subtract(second, first)); |
|||
var a = first.value, b = second.value; |
|||
var result = [], |
|||
borrow = 0; |
|||
for (var i = 0; i < a.length; i++) { |
|||
var tmp = a[i] - borrow; |
|||
borrow = tmp < b[i] ? 1 : 0; |
|||
var minuend = (borrow * base) + tmp - b[i]; |
|||
result.push(minuend); |
|||
} |
|||
return bigInt(result, sign.positive); |
|||
}, |
|||
minus: function (n, m) { |
|||
return o.subtract(n, m); |
|||
}, |
|||
multiply: function (n, m) { |
|||
var s, first = self, second; |
|||
if (m) (first = parse(n)) && (second = parse(m)); |
|||
else second = parse(n, first); |
|||
s = first.sign !== second.sign; |
|||
var a = first.value, b = second.value; |
|||
var resultSum = []; |
|||
for (var i = 0; i < a.length; i++) { |
|||
resultSum[i] = []; |
|||
var j = i; |
|||
while (j--) { |
|||
resultSum[i].push(0); |
|||
} |
|||
} |
|||
var carry = 0; |
|||
for (var i = 0; i < a.length; i++) { |
|||
var x = a[i]; |
|||
for (var j = 0; j < b.length || carry > 0; j++) { |
|||
var y = b[j]; |
|||
var product = y ? (x * y) + carry : carry; |
|||
carry = product > base ? Math.floor(product / base) : 0; |
|||
product -= carry * base; |
|||
resultSum[i].push(product); |
|||
} |
|||
} |
|||
var max = -1; |
|||
for (var i = 0; i < resultSum.length; i++) { |
|||
var len = resultSum[i].length; |
|||
if (len > max) max = len; |
|||
} |
|||
var result = [], carry = 0; |
|||
for (var i = 0; i < max || carry > 0; i++) { |
|||
var sum = carry; |
|||
for (var j = 0; j < resultSum.length; j++) { |
|||
sum += resultSum[j][i] || 0; |
|||
} |
|||
carry = sum > base ? Math.floor(sum / base) : 0; |
|||
sum -= carry * base; |
|||
result.push(sum); |
|||
} |
|||
return bigInt(result, s); |
|||
}, |
|||
times: function (n, m) { |
|||
return o.multiply(n, m); |
|||
}, |
|||
divmod: function (n, m) { |
|||
var s, first = self, second; |
|||
if (m) (first = parse(n)) && (second = parse(m)); |
|||
else second = parse(n, first); |
|||
s = first.sign !== second.sign; |
|||
if (bigInt(first.value, first.sign).equals(0)) return { |
|||
quotient: bigInt([0], sign.positive), |
|||
remainder: bigInt([0], sign.positive) |
|||
}; |
|||
if (second.equals(0)) throw new Error("Cannot divide by zero"); |
|||
var a = first.value, b = second.value; |
|||
var result = [], remainder = []; |
|||
for (var i = a.length - 1; i >= 0; i--) { |
|||
var n = [a[i]].concat(remainder); |
|||
var quotient = goesInto(b, n); |
|||
result.push(quotient.result); |
|||
remainder = quotient.remainder; |
|||
} |
|||
result.reverse(); |
|||
return { |
|||
quotient: bigInt(result, s), |
|||
remainder: bigInt(remainder, first.sign) |
|||
}; |
|||
}, |
|||
divide: function (n, m) { |
|||
return o.divmod(n, m).quotient; |
|||
}, |
|||
over: function (n, m) { |
|||
return o.divide(n, m); |
|||
}, |
|||
mod: function (n, m) { |
|||
return o.divmod(n, m).remainder; |
|||
}, |
|||
pow: function (n, m) { |
|||
var first = self, second; |
|||
if (m) (first = parse(n)) && (second = parse(m)); |
|||
else second = parse(n, first); |
|||
var a = first, b = second; |
|||
if (b.lesser(0)) return ZERO; |
|||
if (b.equals(0)) return ONE; |
|||
var result = bigInt(a.value, a.sign); |
|||
|
|||
if (b.mod(2).equals(0)) { |
|||
var c = result.pow(b.over(2)); |
|||
return c.times(c); |
|||
} else { |
|||
return result.times(result.pow(b.minus(1))); |
|||
} |
|||
}, |
|||
next: function (m) { |
|||
var first = m || self; |
|||
return o.add(first, 1); |
|||
}, |
|||
prev: function (m) { |
|||
var first = m || self; |
|||
return o.subtract(first, 1); |
|||
}, |
|||
compare: function (n, m) { |
|||
var first = self, second; |
|||
if (m) (first = parse(n)) && (second = parse(m, first)); |
|||
else second = parse(n, first); |
|||
normalize(first, second); |
|||
if (first.value.length === 1 && second.value.length === 1 && first.value[0] === 0 && second.value[0] === 0) return 0; |
|||
if (second.sign !== first.sign) return first.sign === sign.positive ? 1 : -1; |
|||
var multiplier = first.sign === sign.positive ? 1 : -1; |
|||
var a = first.value, b = second.value; |
|||
for (var i = a.length - 1; i >= 0; i--) { |
|||
if (a[i] > b[i]) return 1 * multiplier; |
|||
if (b[i] > a[i]) return -1 * multiplier; |
|||
} |
|||
return 0; |
|||
}, |
|||
compareAbs: function (n, m) { |
|||
var first = self, second; |
|||
if (m) (first = parse(n)) && (second = parse(m, first)); |
|||
else second = parse(n, first); |
|||
first.sign = second.sign = sign.positive; |
|||
return o.compare(first, second); |
|||
}, |
|||
equals: function (n, m) { |
|||
return o.compare(n, m) === 0; |
|||
}, |
|||
notEquals: function (n, m) { |
|||
return !o.equals(n, m); |
|||
}, |
|||
lesser: function (n, m) { |
|||
return o.compare(n, m) < 0; |
|||
}, |
|||
greater: function (n, m) { |
|||
return o.compare(n, m) > 0; |
|||
}, |
|||
greaterOrEquals: function (n, m) { |
|||
return o.compare(n, m) >= 0; |
|||
}, |
|||
lesserOrEquals: function (n, m) { |
|||
return o.compare(n, m) <= 0; |
|||
}, |
|||
isPositive: function (m) { |
|||
var first = m || self; |
|||
return first.sign === sign.positive; |
|||
}, |
|||
isNegative: function (m) { |
|||
var first = m || self; |
|||
return first.sign === sign.negative; |
|||
}, |
|||
isEven: function (m) { |
|||
var first = m || self; |
|||
return first.value[0] % 2 === 0; |
|||
}, |
|||
isOdd: function (m) { |
|||
var first = m || self; |
|||
return first.value[0] % 2 === 1; |
|||
}, |
|||
toString: function (m) { |
|||
var first = m || self; |
|||
var str = "", len = first.value.length; |
|||
while (len--) { |
|||
if (first.value[len].toString().length === 8) str += first.value[len]; |
|||
else str += (base.toString() + first.value[len]).slice(-logBase); |
|||
} |
|||
while (str[0] === "0") { |
|||
str = str.slice(1); |
|||
} |
|||
if (!str.length) str = "0"; |
|||
var s = (first.sign === sign.positive || str == "0") ? "" : "-"; |
|||
return s + str; |
|||
}, |
|||
toHex: function (m) { |
|||
var first = m || self; |
|||
var str = ""; |
|||
var l = this.abs(); |
|||
while (l > 0) { |
|||
var qr = l.divmod(256); |
|||
var b = qr.remainder.toJSNumber(); |
|||
str = (b >> 4).toString(16) + (b & 15).toString(16) + str; |
|||
l = qr.quotient; |
|||
} |
|||
return (this.isNegative() ? "-" : "") + "0x" + str; |
|||
}, |
|||
toJSNumber: function (m) { |
|||
return +o.toString(m); |
|||
}, |
|||
valueOf: function (m) { |
|||
return o.toJSNumber(m); |
|||
} |
|||
}; |
|||
return o; |
|||
}; |
|||
|
|||
var ZERO = bigInt([0], sign.positive); |
|||
var ONE = bigInt([1], sign.positive); |
|||
var MINUS_ONE = bigInt([1], sign.negative); |
|||
|
|||
var fnReturn = function (a) { |
|||
if (typeof a === "undefined") return ZERO; |
|||
return parse(a); |
|||
}; |
|||
fnReturn.zero = ZERO; |
|||
fnReturn.one = ONE; |
|||
fnReturn.minusOne = MINUS_ONE; |
|||
return fnReturn; |
|||
})(); |
|||
|
|||
if (typeof module !== "undefined") { |
|||
module.exports = bigInt; |
|||
} |
@ -1,49 +1,33 @@ |
|||
cmake_policy(SET CMP0015 NEW) |
|||
set(CMAKE_AUTOMOC OFF) |
|||
|
|||
aux_source_directory(. SRC_LIST) |
|||
|
|||
include_directories(${Boost_INCLUDE_DIRS}) |
|||
include_directories(${JSON_RPC_CPP_INCLUDE_DIRS}) |
|||
include_directories(..) |
|||
link_directories(../libethcore) |
|||
link_directories(../libwebthree) |
|||
|
|||
set(EXECUTABLE eth) |
|||
|
|||
add_executable(${EXECUTABLE} ${SRC_LIST}) |
|||
file(GLOB HEADERS "*.h") |
|||
|
|||
target_link_libraries(${EXECUTABLE} webthree) |
|||
target_link_libraries(${EXECUTABLE} secp256k1) |
|||
target_link_libraries(${EXECUTABLE} gmp) |
|||
if(MINIUPNPC_LS) |
|||
target_link_libraries(${EXECUTABLE} ${MINIUPNPC_LS}) |
|||
endif() |
|||
target_link_libraries(${EXECUTABLE} ${LEVELDB_LS}) |
|||
target_link_libraries(${EXECUTABLE} ${CRYPTOPP_LS}) |
|||
if(JSONRPC_LS) |
|||
target_link_libraries(${EXECUTABLE} ${JSONRPC_LS}) |
|||
add_executable(${EXECUTABLE} ${SRC_LIST} ${HEADERS}) |
|||
|
|||
add_dependencies(${EXECUTABLE} BuildInfo.h) |
|||
|
|||
target_link_libraries(${EXECUTABLE} ${Boost_REGEX_LIBRARIES}) |
|||
target_link_libraries(${EXECUTABLE} ${Boost_DATE_TIME_LIBRARIES}) |
|||
|
|||
if (READLINE_FOUND) |
|||
target_link_libraries(${EXECUTABLE} ${READLINE_LIBRARIES}) |
|||
endif() |
|||
if(READLINE_LS) |
|||
target_link_libraries(${EXECUTABLE} ${READLINE_LS}) |
|||
|
|||
if (JSONRPC) |
|||
target_link_libraries(${EXECUTABLE} web3jsonrpc) |
|||
endif() |
|||
|
|||
if ("${TARGET_PLATFORM}" STREQUAL "w64") |
|||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++") |
|||
target_link_libraries(${EXECUTABLE} boost_system-mt-s) |
|||
target_link_libraries(${EXECUTABLE} boost_filesystem-mt-s) |
|||
target_link_libraries(${EXECUTABLE} boost_thread_win32-mt-s) |
|||
target_link_libraries(${EXECUTABLE} gcc) |
|||
target_link_libraries(${EXECUTABLE} gdi32) |
|||
target_link_libraries(${EXECUTABLE} ws2_32) |
|||
target_link_libraries(${EXECUTABLE} mswsock) |
|||
target_link_libraries(${EXECUTABLE} shlwapi) |
|||
target_link_libraries(${EXECUTABLE} iphlpapi) |
|||
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS) |
|||
elseif (UNIX) |
|||
else () |
|||
target_link_libraries(${EXECUTABLE} boost_system) |
|||
target_link_libraries(${EXECUTABLE} boost_filesystem) |
|||
find_package(Threads REQUIRED) |
|||
target_link_libraries(${EXECUTABLE} ${CMAKE_THREAD_LIBS_INIT}) |
|||
endif () |
|||
target_link_libraries(${EXECUTABLE} webthree) |
|||
target_link_libraries(${EXECUTABLE} secp256k1) |
|||
|
|||
install( TARGETS ${EXECUTABLE} DESTINATION bin ) |
|||
|
|||
|
@ -1,66 +0,0 @@ |
|||
/*
|
|||
This file is part of cpp-ethereum. |
|||
|
|||
cpp-ethereum is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
cpp-ethereum is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file CommonJS.cpp
|
|||
* @authors: |
|||
* Gav Wood <i@gavwood.com> |
|||
* @date 2014 |
|||
*/ |
|||
|
|||
#include "CommonJS.h" |
|||
using namespace std; |
|||
using namespace dev; |
|||
using namespace dev::eth; |
|||
|
|||
bytes dev::eth::jsToBytes(string const& _s) |
|||
{ |
|||
if (_s.substr(0, 2) == "0x") |
|||
// Hex
|
|||
return fromHex(_s.substr(2)); |
|||
else if (_s.find_first_not_of("0123456789") == string::npos) |
|||
// Decimal
|
|||
return toCompactBigEndian(bigint(_s)); |
|||
else |
|||
// Binary
|
|||
return asBytes(_s); |
|||
} |
|||
|
|||
string dev::eth::jsPadded(string const& _s, unsigned _l, unsigned _r) |
|||
{ |
|||
bytes b = jsToBytes(_s); |
|||
while (b.size() < _l) |
|||
b.insert(b.begin(), 0); |
|||
while (b.size() < _r) |
|||
b.push_back(0); |
|||
return asString(b).substr(b.size() - max(_l, _r)); |
|||
} |
|||
|
|||
string dev::eth::jsPadded(string const& _s, unsigned _l) |
|||
{ |
|||
if (_s.substr(0, 2) == "0x" || _s.find_first_not_of("0123456789") == string::npos) |
|||
// Numeric: pad to right
|
|||
return jsPadded(_s, _l, _l); |
|||
else |
|||
// Text: pad to the left
|
|||
return jsPadded(_s, 0, _l); |
|||
} |
|||
|
|||
string dev::eth::jsUnpadded(string _s) |
|||
{ |
|||
auto p = _s.find_last_not_of((char)0); |
|||
_s.resize(p == string::npos ? 0 : (p + 1)); |
|||
return _s; |
|||
} |
@ -1,217 +0,0 @@ |
|||
/*
|
|||
This file is part of cpp-ethereum. |
|||
|
|||
cpp-ethereum is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
cpp-ethereum is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file EthStubServer.cpp
|
|||
* @authors: |
|||
* Gav Wood <i@gavwood.com> |
|||
* @date 2014 |
|||
*/ |
|||
|
|||
#if ETH_JSONRPC |
|||
#include "EthStubServer.h" |
|||
#include <libevmface/Instruction.h> |
|||
#include <liblll/Compiler.h> |
|||
#include <libethereum/Client.h> |
|||
#include <libwebthree/WebThree.h> |
|||
#include "CommonJS.h" |
|||
using namespace std; |
|||
using namespace dev; |
|||
using namespace dev::eth; |
|||
|
|||
EthStubServer::EthStubServer(jsonrpc::AbstractServerConnector* _conn, WebThreeDirect& _web3): |
|||
AbstractEthStubServer(_conn), |
|||
m_web3(_web3) |
|||
{ |
|||
} |
|||
|
|||
//only works with a json spec that doesn't have notifications for now
|
|||
Json::Value EthStubServer::procedures() |
|||
{ |
|||
Json::Value ret; |
|||
|
|||
for (auto proc: this->GetProtocolHanlder()->GetProcedures()) |
|||
{ |
|||
Json::Value proc_j; |
|||
|
|||
proc_j[proc.second->GetProcedureType() == 0 ? "method" : "notification"] = proc.first; |
|||
|
|||
Json::Value params_j; |
|||
for (auto params: proc.second->GetParameters()) |
|||
params_j[params.first] = jsontypeToValue(params.second); |
|||
proc_j["params"] = params_j; |
|||
|
|||
proc_j["returns"] = jsontypeToValue(proc.second->GetReturnType()); |
|||
|
|||
ret.append(proc_j); |
|||
} |
|||
return ret; |
|||
} |
|||
|
|||
dev::eth::Client& EthStubServer::ethereum() const |
|||
{ |
|||
return *m_web3.ethereum(); |
|||
} |
|||
|
|||
std::string EthStubServer::coinbase() |
|||
{ |
|||
return toJS(ethereum().address()); |
|||
} |
|||
|
|||
std::string EthStubServer::balanceAt(std::string const& _a) |
|||
{ |
|||
return toJS(ethereum().balanceAt(jsToAddress(_a), 0)); |
|||
} |
|||
|
|||
Json::Value EthStubServer::check(Json::Value const& _as) |
|||
{ |
|||
// TODO
|
|||
// if (ethereum().changed())
|
|||
return _as; |
|||
/* else
|
|||
{ |
|||
Json::Value ret; |
|||
ret.resize(0); |
|||
return ret; |
|||
}*/ |
|||
} |
|||
|
|||
std::string EthStubServer::create(const std::string& _bCode, const std::string& _sec, const std::string& _xEndowment, const std::string& _xGas, const std::string& _xGasPrice) |
|||
{ |
|||
Address ret = ethereum().transact(jsToSecret(_sec), jsToU256(_xEndowment), jsToBytes(_bCode), jsToU256(_xGas), jsToU256(_xGasPrice)); |
|||
return toJS(ret); |
|||
} |
|||
|
|||
std::string EthStubServer::lll(const std::string& _s) |
|||
{ |
|||
return "0x" + toHex(dev::eth::compileLLL(_s)); |
|||
} |
|||
|
|||
std::string EthStubServer::gasPrice() |
|||
{ |
|||
return "100000000000000"; |
|||
} |
|||
|
|||
bool EthStubServer::isContractAt(const std::string& _a) |
|||
{ |
|||
return ethereum().codeAt(jsToAddress(_a), 0).size(); |
|||
} |
|||
|
|||
bool EthStubServer::isListening() |
|||
{ |
|||
return m_web3.haveNetwork(); |
|||
} |
|||
|
|||
bool EthStubServer::isMining() |
|||
{ |
|||
return ethereum().isMining(); |
|||
} |
|||
|
|||
std::string EthStubServer::key() |
|||
{ |
|||
if (!m_keys.size()) |
|||
return std::string(); |
|||
return toJS(m_keys[0].sec()); |
|||
} |
|||
|
|||
Json::Value EthStubServer::keys() |
|||
{ |
|||
Json::Value ret; |
|||
for (auto i: m_keys) |
|||
ret.append(toJS(i.secret())); |
|||
return ret; |
|||
} |
|||
|
|||
int EthStubServer::peerCount() |
|||
{ |
|||
return m_web3.peerCount(); |
|||
} |
|||
|
|||
std::string EthStubServer::storageAt(const std::string& _a, const std::string& x) |
|||
{ |
|||
return toJS(ethereum().stateAt(jsToAddress(_a), jsToU256(x), 0)); |
|||
} |
|||
|
|||
std::string EthStubServer::stateAt(const std::string& _a, const std::string& x, const std::string& s) |
|||
{ |
|||
return toJS(ethereum().stateAt(jsToAddress(_a), jsToU256(x), std::atol(s.c_str()))); |
|||
} |
|||
|
|||
Json::Value EthStubServer::transact(const std::string& _aDest, const std::string& _bData, const std::string& _sec, const std::string& _xGas, const std::string& _xGasPrice, const std::string& _xValue) |
|||
{ |
|||
ethereum().transact(jsToSecret(_sec), jsToU256(_xValue), jsToAddress(_aDest), jsToBytes(_bData), jsToU256(_xGas), jsToU256(_xGasPrice)); |
|||
return Json::Value(); |
|||
} |
|||
|
|||
std::string EthStubServer::txCountAt(const std::string& _a) |
|||
{ |
|||
return toJS(ethereum().countAt(jsToAddress(_a), 0)); |
|||
} |
|||
|
|||
std::string EthStubServer::secretToAddress(const std::string& _a) |
|||
{ |
|||
return toJS(KeyPair(jsToSecret(_a)).address()); |
|||
} |
|||
|
|||
Json::Value EthStubServer::lastBlock() |
|||
{ |
|||
return blockJson(""); |
|||
} |
|||
|
|||
Json::Value EthStubServer::block(const std::string& _hash) |
|||
{ |
|||
return blockJson(_hash); |
|||
} |
|||
|
|||
Json::Value EthStubServer::blockJson(const std::string& _hash) |
|||
{ |
|||
Json::Value res; |
|||
auto const& bc = ethereum().blockChain(); |
|||
|
|||
auto b = _hash.length() ? bc.block(h256(_hash)) : bc.block(); |
|||
|
|||
auto bi = BlockInfo(b); |
|||
res["number"] = boost::lexical_cast<string>(bi.number); |
|||
res["hash"] = boost::lexical_cast<string>(bi.hash); |
|||
res["parentHash"] = boost::lexical_cast<string>(bi.parentHash); |
|||
res["sha3Uncles"] = boost::lexical_cast<string>(bi.sha3Uncles); |
|||
res["coinbaseAddress"] = boost::lexical_cast<string>(bi.coinbaseAddress); |
|||
res["stateRoot"] = boost::lexical_cast<string>(bi.stateRoot); |
|||
res["transactionsRoot"] = boost::lexical_cast<string>(bi.transactionsRoot); |
|||
res["minGasPrice"] = boost::lexical_cast<string>(bi.minGasPrice); |
|||
res["gasLimit"] = boost::lexical_cast<string>(bi.gasLimit); |
|||
res["gasUsed"] = boost::lexical_cast<string>(bi.gasUsed); |
|||
res["difficulty"] = boost::lexical_cast<string>(bi.difficulty); |
|||
res["timestamp"] = boost::lexical_cast<string>(bi.timestamp); |
|||
res["nonce"] = boost::lexical_cast<string>(bi.nonce); |
|||
|
|||
return res; |
|||
} |
|||
|
|||
Json::Value EthStubServer::jsontypeToValue(int _jsontype) |
|||
{ |
|||
switch (_jsontype) |
|||
{ |
|||
case jsonrpc::JSON_STRING: return ""; //Json::stringValue segfault, fuck knows why
|
|||
case jsonrpc::JSON_BOOLEAN: return Json::booleanValue; |
|||
case jsonrpc::JSON_INTEGER: return Json::intValue; |
|||
case jsonrpc::JSON_REAL: return Json::realValue; |
|||
case jsonrpc::JSON_OBJECT: return Json::objectValue; |
|||
case jsonrpc::JSON_ARRAY: return Json::arrayValue; |
|||
default: return Json::nullValue; |
|||
} |
|||
} |
|||
|
|||
#endif |
@ -1,66 +0,0 @@ |
|||
/*
|
|||
This file is part of cpp-ethereum. |
|||
|
|||
cpp-ethereum is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
cpp-ethereum is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file EthStubServer.h
|
|||
* @author Gav Wood <i@gavwood.com> |
|||
* @date 2014 |
|||
*/ |
|||
|
|||
#pragma once |
|||
|
|||
#include <iostream> |
|||
#include <jsonrpc/rpc.h> |
|||
#include <libdevcrypto/Common.h> |
|||
#pragma GCC diagnostic push |
|||
#pragma GCC diagnostic ignored "-Wunused-parameter" |
|||
#include "abstractethstubserver.h" |
|||
#pragma GCC diagnostic pop |
|||
|
|||
namespace dev { class WebThreeDirect; namespace eth { class Client; } class KeyPair; } |
|||
|
|||
class EthStubServer: public AbstractEthStubServer |
|||
{ |
|||
public: |
|||
EthStubServer(jsonrpc::AbstractServerConnector* _conn, dev::WebThreeDirect& _web3); |
|||
|
|||
virtual Json::Value procedures(); |
|||
virtual std::string balanceAt(std::string const& _a); |
|||
virtual Json::Value check(Json::Value const& _as); |
|||
virtual std::string coinbase(); |
|||
virtual std::string create(const std::string& bCode, const std::string& sec, const std::string& xEndowment, const std::string& xGas, const std::string& xGasPrice); |
|||
virtual std::string gasPrice(); |
|||
virtual bool isContractAt(const std::string& a); |
|||
virtual bool isListening(); |
|||
virtual bool isMining(); |
|||
virtual std::string key(); |
|||
virtual Json::Value keys(); |
|||
virtual int peerCount(); |
|||
virtual std::string storageAt(const std::string& a, const std::string& x); |
|||
virtual std::string stateAt(const std::string& a, const std::string& x, const std::string& s); |
|||
virtual Json::Value transact(const std::string& aDest, const std::string& bData, const std::string& sec, const std::string& xGas, const std::string& xGasPrice, const std::string& xValue); |
|||
virtual std::string txCountAt(const std::string& a); |
|||
virtual std::string secretToAddress(const std::string& a); |
|||
virtual Json::Value lastBlock(); |
|||
virtual std::string lll(const std::string& s); |
|||
virtual Json::Value block(const std::string&); |
|||
void setKeys(std::vector<dev::KeyPair> _keys) { m_keys = _keys; } |
|||
private: |
|||
dev::eth::Client& ethereum() const; |
|||
dev::WebThreeDirect& m_web3; |
|||
std::vector<dev::KeyPair> m_keys; |
|||
Json::Value jsontypeToValue(int); |
|||
Json::Value blockJson(const std::string&); |
|||
}; |
@ -1,162 +0,0 @@ |
|||
/**
|
|||
* THIS FILE IS GENERATED BY jsonrpcstub, DO NOT CHANGE IT!!!!! |
|||
*/ |
|||
|
|||
#ifndef _ABSTRACTETHSTUBSERVER_H_ |
|||
#define _ABSTRACTETHSTUBSERVER_H_ |
|||
|
|||
#include <jsonrpc/rpc.h> |
|||
|
|||
class AbstractEthStubServer : public jsonrpc::AbstractServer<AbstractEthStubServer> |
|||
{ |
|||
public: |
|||
AbstractEthStubServer(jsonrpc::AbstractServerConnector* conn) : |
|||
jsonrpc::AbstractServer<AbstractEthStubServer>(conn) |
|||
{ |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("balanceAt", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_STRING, "a",jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::balanceAtI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("block", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_OBJECT, "a",jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::blockI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("check", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_ARRAY, "a",jsonrpc::JSON_ARRAY, NULL), &AbstractEthStubServer::checkI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("coinbase", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::coinbaseI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("create", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_STRING, "bCode",jsonrpc::JSON_STRING,"sec",jsonrpc::JSON_STRING,"xEndowment",jsonrpc::JSON_STRING,"xGas",jsonrpc::JSON_STRING,"xGasPrice",jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::createI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("gasPrice", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::gasPriceI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("isContractAt", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_BOOLEAN, "a",jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::isContractAtI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("isListening", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_BOOLEAN, NULL), &AbstractEthStubServer::isListeningI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("isMining", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_BOOLEAN, NULL), &AbstractEthStubServer::isMiningI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("key", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::keyI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("keys", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_ARRAY, NULL), &AbstractEthStubServer::keysI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("lastBlock", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_OBJECT, NULL), &AbstractEthStubServer::lastBlockI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("lll", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_STRING, "s",jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::lllI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("peerCount", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_INTEGER, NULL), &AbstractEthStubServer::peerCountI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("procedures", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_ARRAY, NULL), &AbstractEthStubServer::proceduresI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("secretToAddress", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_STRING, "a",jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::secretToAddressI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("storageAt", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_STRING, "a",jsonrpc::JSON_STRING,"x",jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::storageAtI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("stateAt", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_STRING, "a",jsonrpc::JSON_STRING,"x",jsonrpc::JSON_STRING,"s",jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::stateAtI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("transact", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_OBJECT, "aDest",jsonrpc::JSON_STRING,"bData",jsonrpc::JSON_STRING,"sec",jsonrpc::JSON_STRING,"xGas",jsonrpc::JSON_STRING,"xGasPrice",jsonrpc::JSON_STRING,"xValue",jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::transactI); |
|||
this->bindAndAddMethod(new jsonrpc::Procedure("txCountAt", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_STRING, "a",jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::txCountAtI); |
|||
|
|||
} |
|||
|
|||
inline virtual void balanceAtI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->balanceAt(request["a"].asString()); |
|||
} |
|||
|
|||
inline virtual void blockI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->block(request["a"].asString()); |
|||
} |
|||
|
|||
inline virtual void checkI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->check(request["a"]); |
|||
} |
|||
|
|||
inline virtual void coinbaseI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->coinbase(); |
|||
} |
|||
|
|||
inline virtual void createI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->create(request["bCode"].asString(), request["sec"].asString(), request["xEndowment"].asString(), request["xGas"].asString(), request["xGasPrice"].asString()); |
|||
} |
|||
|
|||
inline virtual void gasPriceI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->gasPrice(); |
|||
} |
|||
|
|||
inline virtual void isContractAtI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->isContractAt(request["a"].asString()); |
|||
} |
|||
|
|||
inline virtual void isListeningI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->isListening(); |
|||
} |
|||
|
|||
inline virtual void isMiningI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->isMining(); |
|||
} |
|||
|
|||
inline virtual void keyI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->key(); |
|||
} |
|||
|
|||
inline virtual void keysI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->keys(); |
|||
} |
|||
|
|||
inline virtual void lastBlockI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->lastBlock(); |
|||
} |
|||
|
|||
inline virtual void lllI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->lll(request["s"].asString()); |
|||
} |
|||
|
|||
inline virtual void peerCountI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->peerCount(); |
|||
} |
|||
|
|||
inline virtual void proceduresI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->procedures(); |
|||
} |
|||
|
|||
inline virtual void secretToAddressI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->secretToAddress(request["a"].asString()); |
|||
} |
|||
|
|||
inline virtual void storageAtI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->storageAt(request["a"].asString(), request["x"].asString()); |
|||
} |
|||
|
|||
inline virtual void stateAtI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->stateAt(request["a"].asString(), request["x"].asString(), request["s"].asString()); |
|||
} |
|||
|
|||
inline virtual void transactI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->transact(request["aDest"].asString(), request["bData"].asString(), request["sec"].asString(), request["xGas"].asString(), request["xGasPrice"].asString(), request["xValue"].asString()); |
|||
} |
|||
|
|||
inline virtual void txCountAtI(const Json::Value& request, Json::Value& response) |
|||
{ |
|||
response = this->txCountAt(request["a"].asString()); |
|||
} |
|||
|
|||
|
|||
virtual std::string balanceAt(const std::string& a) = 0; |
|||
virtual Json::Value block(const std::string& a) = 0; |
|||
virtual Json::Value check(const Json::Value& a) = 0; |
|||
virtual std::string coinbase() = 0; |
|||
virtual std::string create(const std::string& bCode, const std::string& sec, const std::string& xEndowment, const std::string& xGas, const std::string& xGasPrice) = 0; |
|||
virtual std::string gasPrice() = 0; |
|||
virtual bool isContractAt(const std::string& a) = 0; |
|||
virtual bool isListening() = 0; |
|||
virtual bool isMining() = 0; |
|||
virtual std::string key() = 0; |
|||
virtual Json::Value keys() = 0; |
|||
virtual Json::Value lastBlock() = 0; |
|||
virtual std::string lll(const std::string& s) = 0; |
|||
virtual int peerCount() = 0; |
|||
virtual Json::Value procedures() = 0; |
|||
virtual std::string secretToAddress(const std::string& a) = 0; |
|||
virtual std::string storageAt(const std::string& a, const std::string& x) = 0; |
|||
virtual std::string stateAt(const std::string& a, const std::string& x, const std::string& b) = 0; |
|||
virtual Json::Value transact(const std::string& aDest, const std::string& bData, const std::string& sec, const std::string& xGas, const std::string& xGasPrice, const std::string& xValue) = 0; |
|||
virtual std::string txCountAt(const std::string& a) = 0; |
|||
|
|||
}; |
|||
#endif //_ABSTRACTETHSTUBSERVER_H_
|
@ -1,137 +0,0 @@ |
|||
if (typeof(window.eth) === "undefined") |
|||
{ |
|||
if (typeof(require) !== "undefined") |
|||
require( ['ethString'], function() {} ) |
|||
else if (typeof(String.prototype.pad) === "undefined") |
|||
{ |
|||
var scriptTag = document.getElementsByTagName('script'); |
|||
scriptTag = scriptTag[scriptTag.length - 1]; |
|||
var scriptPath = scriptTag.src; |
|||
var path = scriptPath.substr(0, scriptPath.lastIndexOf( '/' )); |
|||
var start = '<script src="' + path + '/'; |
|||
var slash = '"><'+'/script>'; |
|||
document.write(start + 'BigInteger.js' + slash); |
|||
document.write(start + 'ethString.js' + slash); |
|||
} |
|||
|
|||
var spec = [ |
|||
{ "method": "procedures", "params": null, "order": [], "returns": [] }, |
|||
{ "method": "coinbase", "params": null, "order": [], "returns" : "" }, |
|||
{ "method": "isListening", "params": null, "order": [], "returns" : false }, |
|||
{ "method": "isMining", "params": null, "order": [], "returns" : false }, |
|||
{ "method": "gasPrice", "params": null, "order": [], "returns" : "" }, |
|||
{ "method": "key", "params": null, "order": [], "returns" : "" }, |
|||
{ "method": "keys", "params": null, "order": [], "returns" : [] }, |
|||
{ "method": "peerCount", "params": null, "order": [], "returns" : 0 }, |
|||
{ "method": "balanceAt", "params": { "a": "" }, "order": ["a"], "returns" : "" }, |
|||
{ "method": "storageAt", "params": { "a": "", "x": "" }, "order": ["a", "x"], "returns" : "" }, |
|||
{ "method": "stateAt", "params": { "a": "", "x": "", "s": "" }, "order": ["a", "x", "s"], "returns" : "" }, |
|||
{ "method": "txCountAt", "params": { "a": "" },"order": ["a"], "returns" : "" }, |
|||
{ "method": "isContractAt", "params": { "a": "" }, "order": ["a"], "returns" : false }, |
|||
{ "method": "create", "params": { "sec": "", "xEndowment": "", "bCode": "", "xGas": "", "xGasPrice": "" }, "order": ["sec", "xEndowment", "bCode", "xGas", "xGasPrice"] , "returns": "" }, |
|||
{ "method": "transact", "params": { "sec": "", "xValue": "", "aDest": "", "bData": "", "xGas": "", "xGasPrice": "" }, "order": ["sec", "xValue", "aDest", "bData", "xGas", "xGasPrice"], "returns": {} }, |
|||
{ "method": "secretToAddress", "params": { "a": "" }, "order": ["a"], "returns" : "" }, |
|||
{ "method": "lll", "params": { "s": "" }, "order": ["s"], "returns" : "" } |
|||
]; |
|||
|
|||
window.eth = (function ethScope() { |
|||
var m_reqId = 0 |
|||
var ret = {} |
|||
function reformat(m, d) { return m == "lll" ? d.bin() : d; } |
|||
function reqSync(m, p) { |
|||
var req = { "jsonrpc": "2.0", "method": m, "params": p, "id": m_reqId } |
|||
m_reqId++ |
|||
var request = new XMLHttpRequest(); |
|||
request.open("POST", "http://localhost:8080", false) |
|||
// console.log("Sending " + JSON.stringify(req))
|
|||
request.send(JSON.stringify(req)) |
|||
return reformat(m, JSON.parse(request.responseText).result) |
|||
} |
|||
function reqAsync(m, p, f) { |
|||
var req = { "jsonrpc": "2.0", "method": m, "params": p, "id": m_reqId } |
|||
m_reqId++ |
|||
var request = new XMLHttpRequest(); |
|||
request.open("POST", "http://localhost:8080", true) |
|||
request.send(JSON.stringify(req)) |
|||
request.onreadystatechange = function() { |
|||
if (request.readyState === 4) |
|||
f(reformat(m, JSON.parse(request.responseText).result)) |
|||
}; |
|||
} |
|||
function isEmpty(obj) { |
|||
for (var prop in obj) |
|||
if (obj.hasOwnProperty(prop)) |
|||
return false |
|||
return true |
|||
} |
|||
|
|||
var m_watching = {}; |
|||
|
|||
for (si in spec) (function(s) { |
|||
var m = s.method; |
|||
var am = "get" + m.slice(0, 1).toUpperCase() + m.slice(1); |
|||
var getParams = function(a) { |
|||
var p = s.params ? {} : null; |
|||
if (m == "stateAt") |
|||
if (a.length == 2) |
|||
a[2] = "0"; |
|||
else |
|||
a[2] = String(a[2]); |
|||
for (j in s.order) |
|||
p[s.order[j]] = (s.order[j][0] === "b") ? a[j].unbin() : a[j]; |
|||
return p |
|||
}; |
|||
if (m == "create" || m == "transact") |
|||
ret[m] = function() { return reqAsync(m, getParams(arguments), arguments[s.order.length]) } |
|||
else |
|||
{ |
|||
ret[am] = function() { return reqAsync(m, getParams(arguments), arguments[s.order.length]) } |
|||
if (s.params) |
|||
ret[m] = function() { return reqSync(m, getParams(arguments)) } |
|||
else |
|||
Object.defineProperty(ret, m, { |
|||
get: function() { return reqSync(m, {}); }, |
|||
set: function(v) {} |
|||
}) |
|||
} |
|||
})(spec[si]); |
|||
|
|||
ret.check = function(force) { |
|||
if (!force && isEmpty(m_watching)) |
|||
return |
|||
var watching = []; |
|||
for (var w in m_watching) |
|||
watching.push(w) |
|||
var changed = reqSync("check", { "a": watching } ); |
|||
// console.log("Got " + JSON.stringify(changed));
|
|||
for (var c in changed) |
|||
m_watching[changed[c]]() |
|||
var that = this; |
|||
setTimeout(function() { that.check() }, 12000) |
|||
} |
|||
|
|||
ret.watch = function(a, fx, f) { |
|||
var old = isEmpty(m_watching) |
|||
if (f) |
|||
m_watching[a + fx] = f |
|||
else |
|||
m_watching[a] = fx |
|||
(f ? f : fx)() |
|||
if (isEmpty(m_watching) != old) |
|||
this.check() |
|||
} |
|||
ret.unwatch = function(f, fx) { |
|||
delete m_watching[fx ? f + fx : f]; |
|||
} |
|||
ret.newBlock = function(f) { |
|||
var old = isEmpty(m_watching) |
|||
m_watching[""] = f |
|||
f() |
|||
if (isEmpty(m_watching) != old) |
|||
this.check() |
|||
} |
|||
return ret; |
|||
}()); |
|||
|
|||
} |
|||
|
@ -1,62 +0,0 @@ |
|||
if (typeof(require) !== "undefined") |
|||
require( ['BigInteger'], function() {} ) |
|||
else if (typeof(bigInt) === "undefined") |
|||
alert("You need to have included BigInteger.js for eth to work.") |
|||
|
|||
String.prototype.pad = function(l, r) { |
|||
if (r === null) { |
|||
r = l |
|||
if (!(this.substr(0, 2) == "0x" || /^\d+$/.test(this))) |
|||
l = 0 |
|||
} |
|||
var ret = this.bin(); |
|||
while (ret.length < l) |
|||
ret = "\0" + ret |
|||
while (ret.length < r) |
|||
ret = ret + "\0" |
|||
return ret; |
|||
} |
|||
|
|||
String.prototype.unpad = function() { |
|||
var i = this.length; |
|||
while (i && this[i - 1] == "\0") |
|||
--i |
|||
return this.substr(0, i) |
|||
} |
|||
|
|||
String.prototype.bin = function() { |
|||
if (this.substr(0, 2) == "0x") { |
|||
bytes = [] |
|||
var i = 2; |
|||
// Check if it's odd - pad with a zero if so.
|
|||
if (this.length % 2) |
|||
bytes.push(parseInt(this.substr(i++, 1), 16)) |
|||
for (; i < this.length - 1; i += 2) |
|||
bytes.push(parseInt(this.substr(i, 2), 16)); |
|||
return String.fromCharCode.apply(String, bytes); |
|||
} else if (/^\d+$/.test(this)) |
|||
return bigInt(this.substr(0)).toHex().bin() |
|||
|
|||
// Otherwise we'll return the "String" object instead of an actual string
|
|||
return this.substr(0, this.length) |
|||
} |
|||
|
|||
String.prototype.unbin = function() { |
|||
var i, l, o = ''; |
|||
for(i = 0, l = this.length; i < l; i++) { |
|||
var n = this.charCodeAt(i).toString(16); |
|||
o += n.length < 2 ? '0' + n : n; |
|||
} |
|||
|
|||
return "0x" + o; |
|||
} |
|||
|
|||
String.prototype.dec = function() { |
|||
return bigInt(this.substr(0)).toString() |
|||
} |
|||
|
|||
String.prototype.hex = function() { |
|||
return bigInt(this.substr(0)).toHex() |
|||
} |
|||
|
|||
|
@ -1,24 +0,0 @@ |
|||
[ |
|||
{ "method": "procedures", "params": null, "order": [], "returns": [] }, |
|||
{ "method": "coinbase", "params": null, "order": [], "returns" : "" }, |
|||
{ "method": "isListening", "params": null, "order": [], "returns" : false }, |
|||
{ "method": "isMining", "params": null, "order": [], "returns" : false }, |
|||
{ "method": "gasPrice", "params": null, "order": [], "returns" : "" }, |
|||
{ "method": "key", "params": null, "order": [], "returns" : "" }, |
|||
{ "method": "keys", "params": null, "order": [], "returns" : [] }, |
|||
{ "method": "peerCount", "params": null, "order": [], "returns" : 0 }, |
|||
{ "method": "balanceAt", "params": { "a": "" }, "order": ["a"], "returns" : "" }, |
|||
{ "method": "storageAt", "params": { "a": "", "x": "" }, "order": ["a", "x"], "returns" : "" }, |
|||
{ "method": "txCountAt", "params": { "a": "" },"order": ["a"], "returns" : "" }, |
|||
{ "method": "isContractAt", "params": { "a": "" }, "order": ["a"], "returns" : false }, |
|||
{ "method": "create", "params": { "sec": "", "xEndowment": "", "bCode": "", "xGas": "", "xGasPrice": "" }, "order": ["sec", "xEndowment", "bCode", "xGas", "xGasPrice"] , "returns": "" }, |
|||
{ "method": "transact", "params": { "sec": "", "xValue": "", "aDest": "", "bData": "", "xGas": "", "xGasPrice": "" }, "order": ["sec", "xValue", "aDest", "bData", "xGas", "xGasPrice"], "returns": {} }, |
|||
{ "method": "secretToAddress", "params": { "a": "" }, "order": ["a"], "returns" : "" }, |
|||
{ "method": "lll", "params": { "s": "" }, "order": ["s"], "returns" : "" } |
|||
, |
|||
{ "method": "check", "params": { "a": [] }, "order": ["a"], "returns" : [] }, |
|||
{ "method": "lastBlock", "params": null, "order": [], "returns": {}}, |
|||
{ "method": "block", "params": {"a":""}, "order": ["a"], "returns": {}} |
|||
] |
|||
|
|||
|
@ -0,0 +1,55 @@ |
|||
cmake_minimum_required(VERSION 2.8.12) |
|||
|
|||
include(ExternalProject) |
|||
include(CMakeParseArguments) |
|||
include(eth_download.cmake) |
|||
|
|||
# all dependencies will be installed into this directory, separated by platform |
|||
string(TOLOWER ${CMAKE_SYSTEM_NAME} _system_name) |
|||
set(ETH_DEPENDENCY_INSTALL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/install/${_system_name}") |
|||
set(ETH_DEPENDENCY_SERVER "http://poc-7.ethdev.com/precompiled/${_system_name}") |
|||
file(MAKE_DIRECTORY ${ETH_DEPENDENCY_INSTALL_DIR}/lib) |
|||
file(MAKE_DIRECTORY ${ETH_DEPENDENCY_INSTALL_DIR}/include) |
|||
file(MAKE_DIRECTORY ${ETH_DEPENDENCY_INSTALL_DIR}/bin) |
|||
|
|||
if (ETH_COMPILE) |
|||
# json-rpc-cpp and its dependencies |
|||
include(compile/jsoncpp.cmake) |
|||
include(compile/argtable2.cmake) |
|||
include(compile/curl.cmake) |
|||
include(compile/json-rpc-cpp.cmake) |
|||
|
|||
# qt and its dependencies |
|||
include(compile/icu.cmake) |
|||
include(compile/jom.cmake) |
|||
include(compile/qt.cmake) |
|||
|
|||
# leveldb and its dependencies |
|||
include(compile/snappy.cmake) |
|||
include(compile/leveldb.cmake) |
|||
|
|||
# cryptopp |
|||
include(compile/cryptopp.cmake) |
|||
|
|||
# boost |
|||
include(compile/boost.cmake) |
|||
else() |
|||
eth_download(jsoncpp) |
|||
eth_download(json-rpc-cpp OSX_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/scripts/json-rpc-cpp_osx.sh) |
|||
|
|||
if (APPLE) |
|||
eth_download(snappy OSX_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/scripts/snappy_osx.sh) |
|||
endif() |
|||
|
|||
eth_download(leveldb OSX_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/scripts/leveldb_osx.sh) |
|||
eth_download(qt) |
|||
eth_download(cryptopp) |
|||
eth_download(boost) |
|||
eth_download(curl) |
|||
|
|||
endif() |
|||
|
|||
# will be re-eanbled later |
|||
# include(miniupnpc.cmake) |
|||
# if install phase of extep fails, even if libs are already created, the ethereum install will fail |
|||
|
@ -0,0 +1,16 @@ |
|||
# cpp-ethereum external dependencies |
|||
|
|||
**This is Work-in-Progress!** |
|||
|
|||
This directory hosts the external libraries that are needed to build cpp-ethereum. |
|||
|
|||
To automatically download, build, and link libraries, do |
|||
``` |
|||
cd extdep; mkdir build; cd build; cmake ..; make |
|||
``` |
|||
this will take some time. |
|||
|
|||
|
|||
To check which libraries are already included, check `CMakeLists.txt`. Other libraries still need to be fetched via the system's package manager. |
|||
|
|||
Libraries will be installed in `cpp-ethereum/extdep/install/<platform-name>` |
@ -0,0 +1,9 @@ |
|||
# hacky way to resolve nested dependencies - needed for json-rpc-cpp |
|||
find_library(CURL_LIBRARY NAMES curl |
|||
PATHS |
|||
${ETH_DEPENDENCY_INSTALL_DIR}/lib |
|||
) |
|||
|
|||
set(CURL_LIBRARIES ${CURL_LIBRARY}) |
|||
set(CURL_INCLUDE_DIRS ${ETH_DEPENDENCY_INSTALL_DIR}/include) |
|||
|
@ -0,0 +1,13 @@ |
|||
if (APPLE) |
|||
|
|||
elseif (WIN32) |
|||
ExternalProject_Add(argtable2 |
|||
GIT_REPOSITORY https://github.com/debris/argtable.git |
|||
GIT_TAG master |
|||
BINARY_DIR argtable2-prefix/src/argtable2 |
|||
CONFIGURE_COMMAND cmake . |
|||
BUILD_COMMAND devenv argtable2.sln /build release |
|||
INSTALL_COMMAND cmd /c cp src/Release/argtable2.lib ${ETH_DEPENDENCY_INSTALL_DIR}/lib && cp src/argtable2.h ${ETH_DEPENDENCY_INSTALL_DIR}/include |
|||
) |
|||
else() |
|||
endif() |
@ -0,0 +1,19 @@ |
|||
if (APPLE) |
|||
|
|||
elseif (WIN32) |
|||
set(boost_address_model) |
|||
# on windows 64: |
|||
# set(boost_address_model address-model=64) |
|||
|
|||
set(boost_targets --with-filesystem --with-system --with-thread --with-date_time --with-regex --with-test --with-chrono --with-program_options) |
|||
ExternalProject_Add(boost |
|||
URL http://downloads.sourceforge.net/project/boost/boost/1.55.0/boost_1_55_0.tar.gz |
|||
BINARY_DIR boost-prefix/src/boost |
|||
CONFIGURE_COMMAND ./bootstrap.bat |
|||
BUILD_COMMAND ./b2.exe -j4 --build-type=complete link=static runtime-link=shared variant=debug,release threading=multi ${boost_addressModel} ${boost_targets} install --prefix=${ETH_DEPENDENCY_INSTALL_DIR} |
|||
INSTALL_COMMAND cmake -E rename ${ETH_DEPENDENCY_INSTALL_DIR}/include/boost-1_55/boost ${ETH_DEPENDENCY_INSTALL_DIR}/include/boost |
|||
) |
|||
else() |
|||
|
|||
endif() |
|||
|
@ -0,0 +1,33 @@ |
|||
# CryptoPP does not have good cross-platform support, there exist several different other projects to make it work ... |
|||
|
|||
# TODO the OS X build throws a lot of warnings, but compiles fine |
|||
if (APPLE) |
|||
ExternalProject_Add(cryptopp |
|||
URL https://downloads.sourceforge.net/project/cryptopp/cryptopp/5.6.2/cryptopp562.zip |
|||
BINARY_DIR cryptopp-prefix/src/cryptopp |
|||
CONFIGURE_COMMAND "" |
|||
BUILD_COMMAND make CXX=clang++ CXXFLAGS=-DCRYPTOPP_DISABLE_ASM |
|||
INSTALL_COMMAND make install PREFIX=${ETH_DEPENDENCY_INSTALL_DIR} |
|||
) |
|||
elseif (WIN32) |
|||
file(MAKE_DIRECTORY ${ETH_DEPENDENCY_INSTALL_DIR}/include/cryptopp) |
|||
|
|||
ExternalProject_Add(cryptopp |
|||
SVN_REPOSITORY http://svn.code.sf.net/p/cryptopp/code/trunk/c5 |
|||
SVN_REVISION -r "541" |
|||
BINARY_DIR cryptopp-prefix/src/cryptopp |
|||
CONFIGURE_COMMAND devenv cryptest.sln /upgrade |
|||
BUILD_COMMAND devenv cryptest.sln /build release |
|||
INSTALL_COMMAND cmd /c cp Win32/DLL_Output/Release/cryptopp.dll ${ETH_DEPENDENCY_INSTALL_DIR}/lib && cp Win32/DLL_Output/Release/cryptopp.lib ${ETH_DEPENDENCY_INSTALL_DIR}/lib && cp *.h ${ETH_DEPENDENCY_INSTALL_DIR}/include/cryptopp |
|||
) |
|||
# on Linux, the default Makefile does not work. |
|||
else() |
|||
ExternalProject_Add(cryptopp |
|||
URL https://github.com/mmoss/cryptopp/archive/v5.6.2.zip |
|||
BINARY_DIR cryptopp-prefix/src/cryptopp |
|||
CONFIGURE_COMMAND "" |
|||
BUILD_COMMAND scons --shared --prefix=${ETH_DEPENDENCY_INSTALL_DIR} |
|||
INSTALL_COMMAND "" |
|||
) |
|||
endif() |
|||
|
@ -0,0 +1,29 @@ |
|||
if (APPLE) |
|||
ExternalProject_Add(curl |
|||
URL http://curl.haxx.se/download/curl-7.38.0.tar.bz2 |
|||
BINARY_DIR curl-prefix/src/curl |
|||
CONFIGURE_COMMAND ./configure --with-darwinssl --prefix=${ETH_DEPENDENCY_INSTALL_DIR} --exec-prefix=${ETH_DEPENDENCY_INSTALL_DIR} |
|||
BUILD_COMMAND make -j 3 |
|||
INSTALL_COMMAND make install |
|||
) |
|||
elseif (WIN32) |
|||
ExternalProject_Add(curl |
|||
GIT_REPOSITORY https://github.com/debris/libcurl-7.29 |
|||
GIT_TAG master |
|||
BINARY_DIR curl-prefix/src/curl |
|||
CONFIGURE_COMMAND "" |
|||
BUILD_COMMAND "" |
|||
INSTALL_COMMAND cmd /c cp lib/release/libcurl.lib ${ETH_DEPENDENCY_INSTALL_DIR}/lib && cp -R include/curl ${ETH_DEPENDENCY_INSTALL_DIR}/include |
|||
) |
|||
|
|||
else() |
|||
ExternalProject_Add(curl |
|||
URL http://curl.haxx.se/download/curl-7.38.0.tar.bz2 |
|||
BINARY_DIR curl-prefix/src/curl |
|||
CONFIGURE_COMMAND CONFIG_CMD ./configure --prefix=${ETH_DEPENDENCY_INSTALL_DIR} --exec-prefix=${ETH_DEPENDENCY_INSTALL_DIR} |
|||
BUILD_COMMAND make -j 3 |
|||
INSTALL_COMMAND make install |
|||
) |
|||
|
|||
endif() |
|||
|
@ -0,0 +1,17 @@ |
|||
if (APPLE) |
|||
|
|||
elseif (WIN32) |
|||
ExternalProject_Add(icu |
|||
GIT_REPOSITORY https://github.com/debris/icu-win32.git |
|||
GIT_TAG master |
|||
BINARY_DIR icu-prefix/src/icu |
|||
CONFIGURE_COMMAND "" |
|||
BUILD_COMMAND "" |
|||
INSTALL_COMMAND cmake -E copy_directory . ${ETH_DEPENDENCY_INSTALL_DIR} |
|||
) |
|||
|
|||
else() |
|||
|
|||
endif() |
|||
|
|||
|
@ -0,0 +1,16 @@ |
|||
if (APPLE) |
|||
|
|||
|
|||
elseif (WIN32) |
|||
ExternalProject_Add(jom |
|||
URL http://download.qt-project.org/official_releases/jom/jom.zip |
|||
BINARY_DIR jom-prefix/src/jom |
|||
CONFIGURE_COMMAND "" |
|||
BUILD_COMMAND "" |
|||
INSTALL_COMMAND cmake -E copy jom.exe ${ETH_DEPENDENCY_INSTALL_DIR}/bin |
|||
) |
|||
|
|||
else() |
|||
|
|||
endif() |
|||
|
@ -0,0 +1,40 @@ |
|||
# json-rpc-cpp is under heavy development, not yet stable, and multiplatform builds are not yet available. |
|||
# DO NOT MESS WITH THESE SETTINGS! IF YOU HAVE TO MAKE CHANGES HERE, CONSULT sven@ethdev.com BEFOREHAND!! |
|||
|
|||
# DO NOT CHANGE ANYTHING HERE! |
|||
if(APPLE) |
|||
ExternalProject_Add(json-rpc-cpp |
|||
# DEPENDS argtable2 jsoncpp |
|||
# DEPENDS curl # re-enable later, when we build curl again |
|||
GIT_REPOSITORY https://github.com/cinemast/libjson-rpc-cpp.git |
|||
GIT_TAG v0.3.2 |
|||
BINARY_DIR json-rpc-cpp-prefix/src/json-rpc-cpp |
|||
CONFIGURE_COMMAND cmake -DCMAKE_INSTALL_PREFIX=${ETH_DEPENDENCY_INSTALL_DIR} -DCMAKE_MODULE_PATH:PATH=${CMAKE_CURRENT_SOURCE_DIR}/cmake -DETH_DEPENDENCY_INSTALL_DIR:PATH=${ETH_DEPENDENCY_INSTALL_DIR} -DCMAKE_BUILD_TYPE=None -DCMAKE_FIND_FRAMEWORK=LAST -Wno-dev . |
|||
BUILD_COMMAND make -j 3 |
|||
INSTALL_COMMAND make install && ${CMAKE_CURRENT_SOURCE_DIR}/scripts/json-rpc-cpp_osx.sh . ${ETH_DEPENDENCY_INSTALL_DIR} |
|||
) |
|||
|
|||
elseif (WIN32) |
|||
ExternalProject_Add(json-rpc-cpp |
|||
DEPENDS argtable2 jsoncpp curl |
|||
GIT_REPOSITORY https://github.com/debris/libjson-rpc-cpp.git |
|||
GIT_TAG windows |
|||
BINARY_DIR json-rpc-cpp-prefix/src/json-rpc-cpp |
|||
CONFIGURE_COMMAND cmake -DCMAKE_PREFIX_PATH=${ETH_DEPENDENCY_INSTALL_DIR} -DCURL_LIBRARIES=${ETH_DEPENDENCY_INSTALL_DIR}/lib/libcurl.lib . |
|||
BUILD_COMMAND devenv libjson-rpc-cpp.sln /build release |
|||
INSTALL_COMMAND cmd /c cp lib/Release/* ${ETH_DEPENDENCY_INSTALL_DIR}/lib && cp -R src/jsonrpccpp ${ETH_DEPENDENCY_INSTALL_DIR}/include |
|||
) |
|||
else() |
|||
ExternalProject_Add(json-rpc-cpp |
|||
# DEPENDS argtable2 jsoncpp |
|||
# DEPENDS curl # re-enable later, when we build curl again |
|||
GIT_REPOSITORY https://github.com/cinemast/libjson-rpc-cpp.git |
|||
GIT_TAG v0.3.2 |
|||
BINARY_DIR json-rpc-cpp-prefix/src/json-rpc-cpp |
|||
CONFIGURE_COMMAND cmake -DCMAKE_INSTALL_PREFIX=${ETH_DEPENDENCY_INSTALL_DIR} -DCMAKE_MODULE_PATH:PATH=${CMAKE_CURRENT_SOURCE_DIR}/cmake -DETH_DEPENDENCY_INSTALL_DIR:PATH=${ETH_DEPENDENCY_INSTALL_DIR} -DCMAKE_BUILD_TYPE=None -DCMAKE_FIND_FRAMEWORK=LAST . |
|||
BUILD_COMMAND make -j 3 |
|||
INSTALL_COMMAND make install |
|||
) |
|||
|
|||
endif() |
|||
|
@ -0,0 +1,16 @@ |
|||
if (APPLE) |
|||
|
|||
elseif (WIN32) |
|||
|
|||
file(MAKE_DIRECTORY ${ETH_DEPENDENCY_INSTALL_DIR}/include/jsoncpp) |
|||
ExternalProject_Add(jsoncpp |
|||
GIT_REPOSITORY https://github.com/open-source-parsers/jsoncpp |
|||
GIT_TAG svn-import |
|||
BINARY_DIR jsoncpp-prefix/src/jsoncpp |
|||
CONFIGURE_COMMAND cmake . |
|||
BUILD_COMMAND devenv jsoncpp.sln /build release |
|||
INSTALL_COMMAND cmd /c cp lib/Release/jsoncpp.lib ${ETH_DEPENDENCY_INSTALL_DIR}/lib && cp -R include/json ${ETH_DEPENDENCY_INSTALL_DIR}/include/jsoncpp |
|||
) |
|||
|
|||
else() |
|||
endif() |
@ -0,0 +1,23 @@ |
|||
if (APPLE) |
|||
ExternalProject_Add(leveldb |
|||
#DEPENDS snappy |
|||
URL https://leveldb.googlecode.com/files/leveldb-1.15.0.tar.gz |
|||
BINARY_DIR leveldb-prefix/src/leveldb |
|||
#CONFIGURE_COMMAND patch < ${CMAKE_CURRENT_SOURCE_DIR}/compile/leveldb_osx.patch |
|||
CONFIGURE_COMMAND "" |
|||
BUILD_COMMAND export ETH_DEPENDENCY_INSTALL_DIR=${ETH_DEPENDENCY_INSTALL_DIR} && make -j 3 |
|||
INSTALL_COMMAND cp -rf include/leveldb ${ETH_DEPENDENCY_INSTALL_DIR}/include/ && cp libleveldb.a ${ETH_DEPENDENCY_INSTALL_DIR}/lib && cp libleveldb.dylib.1.15 ${ETH_DEPENDENCY_INSTALL_DIR}/lib/libleveldb.dylib |
|||
) |
|||
elseif (WIN32) |
|||
ExternalProject_Add(leveldb |
|||
GIT_REPOSITORY https://github.com/debris/leveldb-win32.git |
|||
GIT_TAG master |
|||
BINARY_DIR leveldb-prefix/src/leveldb |
|||
CONFIGURE_COMMAND "" |
|||
BUILD_COMMAND "" |
|||
INSTALL_COMMAND cmd /c cp lib/LibLevelDB.lib ${ETH_DEPENDENCY_INSTALL_DIR}/lib/leveldb.lib && cp -R include/leveldb ${ETH_DEPENDENCY_INSTALL_DIR}/include |
|||
) |
|||
else() |
|||
|
|||
endif() |
|||
|
@ -0,0 +1,18 @@ |
|||
--- Makefile 2014-11-07 00:54:05.000000000 +0100
|
|||
+++ MakefilePatch 2014-11-07 00:56:59.000000000 +0100
|
|||
@@ -17,11 +17,11 @@
|
|||
# this file is generated by the previous line to set build flags and sources |
|||
include build_config.mk |
|||
|
|||
-CFLAGS += -I. -I./include $(PLATFORM_CCFLAGS) $(OPT)
|
|||
-CXXFLAGS += -I. -I./include $(PLATFORM_CXXFLAGS) $(OPT)
|
|||
+CFLAGS += -I. -I./include $(PLATFORM_CCFLAGS) $(OPT)
|
|||
+CXXFLAGS += -I. -I./include $(PLATFORM_CXXFLAGS) $(OPT) -DSNAPPY -I$(ETH_DEPENDENCY_INSTALL_DIR)/include
|
|||
|
|||
-LDFLAGS += $(PLATFORM_LDFLAGS)
|
|||
-LIBS += $(PLATFORM_LIBS)
|
|||
+LDFLAGS += $(PLATFORM_LDFLAGS) -L$(ETH_DEPENDENCY_INSTALL_DIR)/lib
|
|||
+LIBS += $(PLATFORM_LIBS) -lsnappy
|
|||
|
|||
LIBOBJECTS = $(SOURCES:.cc=.o) |
|||
MEMENVOBJECTS = $(MEMENV_SOURCES:.cc=.o) |
@ -0,0 +1,32 @@ |
|||
if (APPLE) |
|||
ExternalProject_add(qt |
|||
URL http://qtmirror.ics.com/pub/qtproject/official_releases/qt/5.3/5.3.2/single/qt-everywhere-opensource-src-5.3.2.tar.gz |
|||
BINARY_DIR qt-prefix/src/qt |
|||
PATCH_COMMAND patch -d qtmultimedia/src/plugins/avfoundation/mediaplayer < ${CMAKE_CURRENT_SOURCE_DIR}/compile/qt_osx.patch |
|||
CONFIGURE_COMMAND ./configure -prefix ${ETH_DEPENDENCY_INSTALL_DIR} -system-zlib -qt-libpng -qt-libjpeg -confirm-license -opensource -nomake tests -release -nomake examples -no-xcb -arch x86_64 |
|||
BUILD_COMMAND make |
|||
INSTALL_COMMAND make install |
|||
) |
|||
elseif(WIN32) |
|||
ExternalProject_Add(qt |
|||
DEPENDS icu jom |
|||
URL http://qtmirror.ics.com/pub/qtproject/official_releases/qt/5.3/5.3.2/single/qt-everywhere-opensource-src-5.3.2.tar.gz |
|||
BINARY_DIR qt-prefix/src/qt |
|||
UPDATE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/compile/qt_tools.bat |
|||
#PATCH_COMMAND cmake -E copy ${CMAKE_CURRENT_SOURCE_DIR}/compile/qt_configure.bat qtbase/configure.bat |
|||
CONFIGURE_COMMAND configure -prefix ${ETH_DEPENDENCY_INSTALL_DIR} -opensource -confirm-license -release -opengl desktop -platform win32-msvc2013 -icu -I ${ETH_DEPENDENCY_INSTALL_DIR}/include -L ${ETH_DEPENDENCY_INSTALL_DIR}/lib -nomake tests -nomake examples |
|||
BUILD_COMMAND nmake |
|||
INSTALL_COMMAND nmake install |
|||
) |
|||
|
|||
ExternalProject_Add_Step(qt configure_paths |
|||
COMMAND set PATH=${ETH_DEPENDENCY_INSTALL_DIR}/bin;%cd%/gnuwin32/bin;%cd%/qtbase/bin;%PATH% |
|||
DEPENDEES patch |
|||
DEPENDERS configure |
|||
) |
|||
|
|||
else() |
|||
|
|||
endif() |
|||
|
|||
|
@ -0,0 +1,111 @@ |
|||
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
|||
:: |
|||
:: Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). |
|||
:: Contact: http://www.qt-project.org/legal |
|||
:: |
|||
:: This file is part of the tools applications of the Qt Toolkit. |
|||
:: |
|||
:: $QT_BEGIN_LICENSE:LGPL$ |
|||
:: Commercial License Usage |
|||
:: Licensees holding valid commercial Qt licenses may use this file in |
|||
:: accordance with the commercial license agreement provided with the |
|||
:: Software or, alternatively, in accordance with the terms contained in |
|||
:: a written agreement between you and Digia. For licensing terms and |
|||
:: conditions see http://qt.digia.com/licensing. For further information |
|||
:: use the contact form at http://qt.digia.com/contact-us. |
|||
:: |
|||
:: GNU Lesser General Public License Usage |
|||
:: Alternatively, this file may be used under the terms of the GNU Lesser |
|||
:: General Public License version 2.1 as published by the Free Software |
|||
:: Foundation and appearing in the file LICENSE.LGPL included in the |
|||
:: packaging of this file. Please review the following information to |
|||
:: ensure the GNU Lesser General Public License version 2.1 requirements |
|||
:: will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
|||
:: |
|||
:: In addition, as a special exception, Digia gives you certain additional |
|||
:: rights. These rights are described in the Digia Qt LGPL Exception |
|||
:: version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
|||
:: |
|||
:: GNU General Public License Usage |
|||
:: Alternatively, this file may be used under the terms of the GNU |
|||
:: General Public License version 3.0 as published by the Free Software |
|||
:: Foundation and appearing in the file LICENSE.GPL included in the |
|||
:: packaging of this file. Please review the following information to |
|||
:: ensure the GNU General Public License version 3.0 requirements will be |
|||
:: met: http://www.gnu.org/copyleft/gpl.html. |
|||
:: |
|||
:: |
|||
:: $QT_END_LICENSE$ |
|||
:: |
|||
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
|||
|
|||
@echo off |
|||
set QTSRC=%~dp0 |
|||
set QTDIR=%CD% |
|||
::if not exist %QTSRC%\.gitignore goto sconf |
|||
echo Please wait while bootstrapping configure ... |
|||
|
|||
for %%C in (cl.exe icl.exe g++.exe perl.exe) do set %%C=%%~$PATH:C |
|||
|
|||
if "%perl.exe%" == "" ( |
|||
echo Perl not found in PATH. Aborting. >&2 |
|||
exit /b 1 |
|||
) |
|||
if not exist mkspecs ( |
|||
md mkspecs |
|||
if errorlevel 1 goto exit |
|||
) |
|||
perl %QTSRC%bin\syncqt.pl -minimal -module QtCore -outdir %QTDIR% %QTSRC% |
|||
if errorlevel 1 goto exit |
|||
|
|||
if not exist tools\configure ( |
|||
md tools\configure |
|||
if errorlevel 1 goto exit |
|||
) |
|||
cd tools\configure |
|||
if errorlevel 1 goto exit |
|||
|
|||
echo #### Generated by configure.bat - DO NOT EDIT! ####> Makefile |
|||
echo/>> Makefile |
|||
for /f "tokens=3 usebackq" %%V in (`findstr QT_VERSION_STR %QTSRC%\src\corelib\global\qglobal.h`) do @echo QTVERSION = %%~V>> Makefile |
|||
if not "%cl.exe%" == "" ( |
|||
echo CXX = cl>>Makefile |
|||
echo EXTRA_CXXFLAGS =>>Makefile |
|||
rem This must have a trailing space. |
|||
echo QTSRC = %QTSRC% >> Makefile |
|||
set tmpl=win32 |
|||
set make=nmake |
|||
) else if not "%icl.exe%" == "" ( |
|||
echo CXX = icl>>Makefile |
|||
echo EXTRA_CXXFLAGS = /Zc:forScope>>Makefile |
|||
rem This must have a trailing space. |
|||
echo QTSRC = %QTSRC% >> Makefile |
|||
set tmpl=win32 |
|||
set make=nmake |
|||
) else if not "%g++.exe%" == "" ( |
|||
echo CXX = g++>>Makefile |
|||
echo EXTRA_CXXFLAGS =>>Makefile |
|||
rem This must NOT have a trailing space. |
|||
echo QTSRC = %QTSRC:\=/%>> Makefile |
|||
set tmpl=mingw |
|||
set make=mingw32-make |
|||
) else ( |
|||
echo No suitable compiler found in PATH. Aborting. >&2 |
|||
cd ..\.. |
|||
exit /b 1 |
|||
) |
|||
echo/>> Makefile |
|||
type %QTSRC%tools\configure\Makefile.%tmpl% >> Makefile |
|||
|
|||
%make% |
|||
if errorlevel 1 (cd ..\.. & exit /b 1) |
|||
|
|||
cd ..\.. |
|||
|
|||
:conf |
|||
configure.exe -srcdir %QTSRC% %* |
|||
goto exit |
|||
|
|||
:sconf |
|||
%QTSRC%\configure.exe %* |
|||
:exit |
@ -0,0 +1,11 @@ |
|||
--- avfmediaplayersession.mm 2014-09-11 12:48:26.000000000 +0200
|
|||
+++ avfmediaplayersessionPatch.mm 2014-12-01 12:53:14.000000000 +0100
|
|||
@@ -295,7 +295,7 @@
|
|||
//AVPlayerItem "status" property value observer. |
|||
if (context == AVFMediaPlayerSessionObserverStatusObservationContext) |
|||
{ |
|||
- AVPlayerStatus status = [[change objectForKey:NSKeyValueChangeNewKey] integerValue];
|
|||
+ AVPlayerStatus status = (AVPlayerStatus)[[change objectForKey:NSKeyValueChangeNewKey] integerValue];
|
|||
switch (status) |
|||
{ |
|||
//Indicates that the status of the player is not yet known because |
@ -0,0 +1,2 @@ |
|||
rem : import VC environment vars |
|||
call "%VS120COMNTOOLS%\..\..\VC\vcvarsall.bat" x86 |
@ -0,0 +1,14 @@ |
|||
if (APPLE) |
|||
ExternalProject_Add(snappy |
|||
URL https://snappy.googlecode.com/files/snappy-1.1.1.tar.gz |
|||
BINARY_DIR snappy-prefix/src/snappy |
|||
CONFIGURE_COMMAND ./configure --disable-dependency-tracking --prefix=${ETH_DEPENDENCY_INSTALL_DIR} |
|||
BUILD_COMMAND "" |
|||
INSTALL_COMMAND make install |
|||
) |
|||
elseif(WIN32) |
|||
|
|||
else() |
|||
|
|||
endif() |
|||
|
@ -0,0 +1,74 @@ |
|||
# this macro requires the following variables to be specified: |
|||
# |
|||
# ETH_DEPENDENCY_SERVER - server from which dependencies should be downloaded |
|||
# ETH_DEPENDENCY_INSTALL_DIR - install location for all dependencies |
|||
# |
|||
# usage: |
|||
# |
|||
# eth_download("json-rpc-cpp") |
|||
# eth_download("json-rpc-cpp" VERSION "0.3.2") |
|||
# |
|||
# params: |
|||
# VERSION - exact version we want to use |
|||
# OSX_SCRIPT - script which will be executed on apple in install phase |
|||
# UNIX_SCRIPT - script which will be executed on unix in install phase |
|||
# WIN_SCRIPT - script which will be executed on win in install phase |
|||
|
|||
# OSX_SCRIPT, WIN_SCRIPT, UNIX_SCRIPT are taking 2 params: |
|||
# $1 is package_source, |
|||
# $2 is ETH_DEPENDENCY_INSTALL_DIR |
|||
# |
|||
# parsing arguments |
|||
# http://www.cmake.org/cmake/help/v3.0/module/CMakeParseArguments.html |
|||
# |
|||
# for macos you may need to specify OSX_SCRIPT with install_name_tool to fix dylib |
|||
# http://stackoverflow.com/questions/2985315/using-install-name-tool-whats-going-wrong |
|||
# |
|||
# TODO: |
|||
# check if install_command is handling symlinks correctly on linux and windows |
|||
|
|||
macro(eth_download eth_package_name) |
|||
|
|||
set (extra_macro_args ${ARGN}) |
|||
set (options) |
|||
set (one_value_args VERSION OSX_SCRIPT UNIX_SCRIPT WIN_SCRIPT) |
|||
set (multi_value_args) |
|||
cmake_parse_arguments (ETH_DOWNLOAD "${options}" "${one_value_args}" "${multi_value_args}" ${extra_macro_args}) |
|||
|
|||
if (ETH_DOWNLOAD_VERSION) |
|||
set(eth_tar_name "${eth_package_name}-${ETH_DOWNLOAD_VERSION}.tar.gz") |
|||
else() |
|||
set(eth_tar_name "${eth_package_name}.tar.gz") |
|||
endif() |
|||
|
|||
message(STATUS "download path for ${eth_package_name} is : ${ETH_DEPENDENCY_SERVER}/${eth_tar_name}") |
|||
|
|||
# we need that to copy symlinks |
|||
# see http://superuser.com/questions/138587/how-to-copy-symbolic-links |
|||
if (APPLE) |
|||
set (eth_package_copy cp -a . ${ETH_DEPENDENCY_INSTALL_DIR}) |
|||
set (eth_package_install ${ETH_DOWNLOAD_OSX_SCRIPT}) |
|||
elseif (UNIX) |
|||
set (eth_package_copy cp -a . ${ETH_DEPENDENCY_INSTALL_DIR}) |
|||
set (eth_package_install ${ETH_DOWNLOAD_UNIX_SCRIPT}) |
|||
else () |
|||
set (eth_package_copy cmake -E copy_directory . ${ETH_DEPENDENCY_INSTALL_DIR}) |
|||
set (eth_package_install ${ETH_DOWNLOAD_WIN_SCRIPT}) |
|||
endif() |
|||
|
|||
if (eth_package_install) |
|||
message(STATUS "install script: ${eth_package_install}") |
|||
set (eth_package_install ${eth_package_install} . ${ETH_DEPENDENCY_INSTALL_DIR}) |
|||
else () |
|||
set (eth_package_install echo 0) # cause empty string is not handled properly |
|||
endif() |
|||
|
|||
ExternalProject_Add(${eth_package_name} |
|||
URL ${ETH_DEPENDENCY_SERVER}/${eth_tar_name} |
|||
BINARY_DIR ${eth_package_name}-prefix/src/${eth_package_name} |
|||
CONFIGURE_COMMAND "" |
|||
BUILD_COMMAND ${eth_package_copy} |
|||
INSTALL_COMMAND ${eth_package_install} |
|||
) |
|||
endmacro() |
|||
|
@ -0,0 +1,11 @@ |
|||
# TODO this file is not used yet, but will be in future |
|||
include(ExternalProject) |
|||
|
|||
ExternalProject_Add(miniupnpc |
|||
URL http://miniupnp.tuxfamily.org/files/download.php?file=miniupnpc-1.9.20141027.tar.gz |
|||
BINARY_DIR miniupnpc-prefix/src/miniupnpc |
|||
CONFIGURE_COMMAND "" |
|||
BUILD_COMMAND make -j 3 |
|||
INSTALL_COMMAND make install INSTALLPREFIX=${ETH_DEPENDENCY_INSTALL_DIR} |
|||
) |
|||
|
@ -0,0 +1,29 @@ |
|||
#!/bin/bash |
|||
|
|||
ETH_DEPENDENCY_SOURCE_DIR=$1 |
|||
ETH_DEPENDENCY_INSTALL_DIR=$2 |
|||
|
|||
OLD_COMMON_DYLIB="libjsonrpccpp-common.0.dylib" |
|||
|
|||
COMMON_DYLIB=${ETH_DEPENDENCY_INSTALL_DIR}/lib/libjsonrpccpp-common.0.dylib |
|||
SERVER_DYLIB=${ETH_DEPENDENCY_INSTALL_DIR}/lib/libjsonrpccpp-server.0.dylib |
|||
CLIENT_DYLIB=${ETH_DEPENDENCY_INSTALL_DIR}/lib/libjsonrpccpp-client.0.dylib |
|||
|
|||
# fix bin |
|||
STAB_EXEC=${ETH_DEPENDENCY_INSTALL_DIR}/bin/jsonrpcstub |
|||
install_name_tool -change ${OLD_COMMON_DYLIB} ${COMMON_DYLIB} ${STAB_EXEC} |
|||
|
|||
# fix common |
|||
install_name_tool -id ${COMMON_DYLIB} ${COMMON_DYLIB} |
|||
|
|||
# fix server |
|||
install_name_tool -id ${SERVER_DYLIB} ${SERVER_DYLIB} |
|||
install_name_tool -change ${OLD_COMMON_DYLIB} ${COMMON_DYLIB} ${SERVER_DYLIB} |
|||
|
|||
# fix client |
|||
install_name_tool -id ${CLIENT_DYLIB} ${CLIENT_DYLIB} |
|||
install_name_tool -change ${OLD_COMMON_DYLIB} ${COMMON_DYLIB} ${CLIENT_DYLIB} |
|||
|
|||
# TODO fix argtable and jsoncpp once they are downloaded as dependencies |
|||
|
|||
|
@ -0,0 +1,12 @@ |
|||
#!/bin/bash |
|||
|
|||
ETH_DEPENDENCY_SOURCE_DIR=$1 |
|||
ETH_DEPENDENCY_INSTALL_DIR=$2 |
|||
|
|||
OLD_SNAPPY_DYLIB="/Users/marekkotewicz/ethereum/cpp-ethereum/extdep/install/darwin/lib/libsnappy.1.dylib" |
|||
SNAPPY_DYLIB=${ETH_DEPENDENCY_INSTALL_DIR}/lib/libsnappy.dylib |
|||
LEVELDB_DYLIB=${ETH_DEPENDENCY_INSTALL_DIR}/lib/libleveldb.dylib |
|||
|
|||
install_name_tool -id ${LEVELDB_DYLIB} ${LEVELDB_DYLIB} |
|||
install_name_tool -change ${OLD_SNAPPY_DYLIB} ${SNAPPY_DYLIB} ${LEVELDB_DYLIB} |
|||
|
@ -0,0 +1,8 @@ |
|||
#!/bin/bash |
|||
|
|||
ETH_DEPENDENCY_SOURCE_DIR=$1 |
|||
ETH_DEPENDENCY_INSTALL_DIR=$2 |
|||
|
|||
SNAPPY_DYLIB=${ETH_DEPENDENCY_INSTALL_DIR}/lib/libsnappy.dylib |
|||
install_name_tool -id ${SNAPPY_DYLIB} ${SNAPPY_DYLIB} |
|||
|
@ -1,117 +0,0 @@ |
|||
cmake_policy(SET CMP0015 NEW) |
|||
|
|||
if ("${TARGET_PLATFORM}" STREQUAL "w64") |
|||
cmake_policy(SET CMP0020 NEW) |
|||
endif () |
|||
|
|||
|
|||
set(CMAKE_INCLUDE_CURRENT_DIR ON) |
|||
aux_source_directory(. SRC_LIST) |
|||
|
|||
include_directories(..) |
|||
link_directories(../libethcore) |
|||
link_directories(../libethereum) |
|||
link_directories(../libqethereum) |
|||
|
|||
# Find Qt5 for Apple and update src_list for windows |
|||
if (APPLE) |
|||
# homebrew defaults to qt4 and installs qt5 as 'keg-only' |
|||
# which places it into /usr/local/opt insteadof /usr/local. |
|||
|
|||
set(CMAKE_PREFIX_PATH /usr/local/opt/qt5) |
|||
include_directories(/usr/local/opt/qt5/include /usr/local/include) |
|||
elseif ("${TARGET_PLATFORM}" STREQUAL "w64") |
|||
set(SRC_LIST ${SRC_LIST} ../windows/qt_plugin_import.cpp) |
|||
elseif (UNIX) |
|||
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ";$ENV{QTDIR}/lib/cmake") |
|||
endif () |
|||
|
|||
|
|||
find_package(Qt5Widgets REQUIRED) |
|||
find_package(Qt5Gui REQUIRED) |
|||
find_package(Qt5Quick REQUIRED) |
|||
find_package(Qt5Qml REQUIRED) |
|||
find_package(Qt5Network REQUIRED) |
|||
qt5_wrap_ui(ui_Main.h Main.ui) |
|||
qt5_add_resources(RESOURCE_ADDED Resources.qrc) |
|||
|
|||
# Set name of binary and add_executable() |
|||
if (APPLE) |
|||
set(EXECUTEABLE IEthXi) |
|||
set(CMAKE_INSTALL_PREFIX ./) |
|||
set(BIN_INSTALL_DIR ".") |
|||
set(DOC_INSTALL_DIR ".") |
|||
|
|||
set(PROJECT_VERSION "${ETH_VERSION}") |
|||
set(MACOSX_BUNDLE_INFO_STRING "${PROJECT_NAME} ${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_NAME} ${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_LONG_VERSION_STRING "${PROJECT_NAME} ${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_COPYRIGHT "${PROJECT_COPYRIGHT_YEAR} ${PROJECT_VENDOR}") |
|||
set(MACOSX_BUNDLE_GUI_IDENTIFIER "${PROJECT_DOMAIN_SECOND}.${PROJECT_DOMAIN_FIRST}") |
|||
set(MACOSX_BUNDLE_BUNDLE_NAME ${EXECUTEABLE}) |
|||
include(BundleUtilities) |
|||
|
|||
add_executable(${EXECUTEABLE} MACOSX_BUNDLE Main.ui ${RESOURCE_ADDED} ${SRC_LIST}) |
|||
else () |
|||
set(EXECUTEABLE iethxi) |
|||
add_executable(${EXECUTEABLE} Main.ui ${RESOURCE_ADDED} ${SRC_LIST}) |
|||
endif () |
|||
|
|||
qt5_use_modules(${EXECUTEABLE} Core Gui Widgets Network Quick Qml) |
|||
target_link_libraries(${EXECUTEABLE} qethereum ethereum secp256k1 ${CRYPTOPP_LS}) |
|||
|
|||
if (APPLE) |
|||
if (${ADDFRAMEWORKS}) |
|||
set_target_properties(${EXECUTEABLE} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/EthereumMacOSXBundleInfo.plist.in") |
|||
endif () |
|||
|
|||
SET_SOURCE_FILES_PROPERTIES(${EXECUTEABLE} PROPERTIES MACOSX_PACKAGE_LOCATION MacOS) |
|||
|
|||
# This is a workaround for when the build-type defaults to Debug, and when a multi-config generator like xcode is used, where the type |
|||
# will not be set but defaults to release. |
|||
set(generator_lowercase "${CMAKE_GENERATOR}") |
|||
string(TOLOWER "${CMAKE_GENERATOR}" generator_lowercase) |
|||
if ("${generator_lowercase}" STREQUAL "xcode") |
|||
# TODO: Not sure how to resolve this. Possibly \${TARGET_BUILD_DIR} |
|||
set(binary_build_dir "${CMAKE_CURRENT_BINARY_DIR}/Debug") |
|||
else () |
|||
set(binary_build_dir "${CMAKE_CURRENT_BINARY_DIR}") |
|||
endif () |
|||
|
|||
set(APPS ${binary_build_dir}/${EXECUTEABLE}.app) |
|||
|
|||
# This tool and the next will automatically looked at the linked libraries in order to determine what dependencies are required. Thus, target_link_libaries only needs to add ethereum and secp256k1 (above) |
|||
install(CODE " |
|||
include(BundleUtilities) |
|||
set(BU_CHMOD_BUNDLE_ITEMS 1) |
|||
fixup_bundle(\"${APPS}\" \"${BUNDLELIBS}\" \"../libqethereum ../libethereum ../secp256k1\") |
|||
" COMPONENT RUNTIME ) |
|||
|
|||
if (${ADDFRAMEWORKS}) |
|||
add_custom_target(addframeworks ALL |
|||
COMMAND /usr/local/opt/qt5/bin/macdeployqt ${binary_build_dir}/${EXECUTEABLE}.app |
|||
WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} |
|||
DEPENDS ${PROJECT_NAME} |
|||
) |
|||
endif () |
|||
|
|||
elseif ("${TARGET_PLATFORM}" STREQUAL "w64") |
|||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-keep-inline-dllexport -static-libgcc -static-libstdc++ -static") |
|||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-s -Wl,-subsystem,windows -mthreads -L/usr/x86_64-w64-mingw32/plugins/platforms") |
|||
target_link_libraries(${EXECUTEABLE} gcc) |
|||
target_link_libraries(${EXECUTEABLE} mingw32 qtmain mswsock iphlpapi qwindows shlwapi Qt5PlatformSupport gdi32 comdlg32 oleaut32 imm32 winmm ole32 uuid ws2_32) |
|||
target_link_libraries(${EXECUTEABLE} boost_system-mt-s) |
|||
target_link_libraries(${EXECUTEABLE} boost_filesystem-mt-s) |
|||
target_link_libraries(${EXECUTEABLE} boost_thread_win32-mt-s) |
|||
target_link_libraries(${EXECUTEABLE} Qt5PlatformSupport) |
|||
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS) |
|||
elseif (UNIX) |
|||
else () |
|||
target_link_libraries(${EXECUTEABLE} boost_system) |
|||
target_link_libraries(${EXECUTEABLE} boost_filesystem) |
|||
find_package(Threads REQUIRED) |
|||
target_link_libraries(${EXECUTEABLE} ${CMAKE_THREAD_LIBS_INIT}) |
|||
install( TARGETS ${EXECUTEABLE} RUNTIME DESTINATION bin ) |
|||
endif () |
|||
|
@ -1,38 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
|||
<plist version="1.0"> |
|||
<dict> |
|||
<key>CFBundleDevelopmentRegion</key> |
|||
<string>English</string> |
|||
<key>CFBundleExecutable</key> |
|||
<string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string> |
|||
<key>CFBundleGetInfoString</key> |
|||
<string>${MACOSX_BUNDLE_INFO_STRING}</string> |
|||
<key>CFBundleIconFile</key> |
|||
<string>${MACOSX_BUNDLE_ICON_FILE}</string> |
|||
<key>CFBundleIdentifier</key> |
|||
<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string> |
|||
<key>CFBundleInfoDictionaryVersion</key> |
|||
<string>6.0</string> |
|||
<key>CFBundleLongVersionString</key> |
|||
<string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string> |
|||
<key>CFBundleName</key> |
|||
<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string> |
|||
<key>CFBundlePackageType</key> |
|||
<string>APPL</string> |
|||
<key>CFBundleShortVersionString</key> |
|||
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string> |
|||
<key>CFBundleSignature</key> |
|||
<string>????</string> |
|||
<key>CFBundleVersion</key> |
|||
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string> |
|||
<key>CSResourcesFileMapped</key> |
|||
<true/> |
|||
<key>LSRequiresCarbon</key> |
|||
<true/> |
|||
<key>NSHumanReadableCopyright</key> |
|||
<string>${MACOSX_BUNDLE_COPYRIGHT}</string> |
|||
<key>NSHighResolutionCapable</key> |
|||
<true/> |
|||
</dict> |
|||
</plist> |
@ -1,168 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<ui version="4.0"> |
|||
<class>Main</class> |
|||
<widget class="QMainWindow" name="Main"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>0</x> |
|||
<y>0</y> |
|||
<width>562</width> |
|||
<height>488</height> |
|||
</rect> |
|||
</property> |
|||
<property name="windowTitle"> |
|||
<string>Walleth</string> |
|||
</property> |
|||
<property name="dockNestingEnabled"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="dockOptions"> |
|||
<set>QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks|QMainWindow::VerticalTabs</set> |
|||
</property> |
|||
<property name="sizeGripEnabled" stdset="0"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<widget class="QWidget" name="centralwidget"> |
|||
<layout class="QVBoxLayout" name="verticalLayout"> |
|||
<property name="leftMargin"> |
|||
<number>0</number> |
|||
</property> |
|||
<property name="topMargin"> |
|||
<number>0</number> |
|||
</property> |
|||
<property name="rightMargin"> |
|||
<number>0</number> |
|||
</property> |
|||
<property name="bottomMargin"> |
|||
<number>0</number> |
|||
</property> |
|||
<item> |
|||
<layout class="QHBoxLayout" name="fullDisplay"> |
|||
<item> |
|||
<widget class="QLabel" name="balance"> |
|||
<property name="text"> |
|||
<string>0 wei</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QLabel" name="peerCount"> |
|||
<property name="text"> |
|||
<string>0 peers</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QLabel" name="blockCount"> |
|||
<property name="text"> |
|||
<string>1 block</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
<widget class="QMenuBar" name="menubar"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>0</x> |
|||
<y>0</y> |
|||
<width>562</width> |
|||
<height>25</height> |
|||
</rect> |
|||
</property> |
|||
<widget class="QMenu" name="menu_File"> |
|||
<property name="title"> |
|||
<string>&File</string> |
|||
</property> |
|||
<addaction name="quit"/> |
|||
</widget> |
|||
<widget class="QMenu" name="menu_Network"> |
|||
<property name="title"> |
|||
<string>&Network</string> |
|||
</property> |
|||
<addaction name="upnp"/> |
|||
<addaction name="net"/> |
|||
<addaction name="connect"/> |
|||
</widget> |
|||
<widget class="QMenu" name="menu_Tools"> |
|||
<property name="title"> |
|||
<string>T&ools</string> |
|||
</property> |
|||
<addaction name="mine"/> |
|||
<addaction name="create"/> |
|||
<addaction name="preview"/> |
|||
</widget> |
|||
<widget class="QMenu" name="menu_Help"> |
|||
<property name="title"> |
|||
<string>&Help</string> |
|||
</property> |
|||
<addaction name="about"/> |
|||
</widget> |
|||
<addaction name="menu_File"/> |
|||
<addaction name="menu_Network"/> |
|||
<addaction name="menu_Tools"/> |
|||
<addaction name="menu_Help"/> |
|||
</widget> |
|||
<widget class="QStatusBar" name="statusbar"/> |
|||
<action name="quit"> |
|||
<property name="text"> |
|||
<string>&Quit</string> |
|||
</property> |
|||
</action> |
|||
<action name="upnp"> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="checked"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="text"> |
|||
<string>Use &UPnP</string> |
|||
</property> |
|||
</action> |
|||
<action name="connect"> |
|||
<property name="text"> |
|||
<string>&Connect to Peer...</string> |
|||
</property> |
|||
</action> |
|||
<action name="net"> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="text"> |
|||
<string>Enable &Network</string> |
|||
</property> |
|||
</action> |
|||
<action name="mine"> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="text"> |
|||
<string>&Mine</string> |
|||
</property> |
|||
</action> |
|||
<action name="create"> |
|||
<property name="text"> |
|||
<string>&New Address</string> |
|||
</property> |
|||
</action> |
|||
<action name="about"> |
|||
<property name="text"> |
|||
<string>&About...</string> |
|||
</property> |
|||
</action> |
|||
<action name="preview"> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="text"> |
|||
<string>&Preview</string> |
|||
</property> |
|||
</action> |
|||
</widget> |
|||
<layoutdefault spacing="6" margin="11"/> |
|||
<resources/> |
|||
<connections/> |
|||
</ui> |
@ -1,59 +0,0 @@ |
|||
#include <QtNetwork/QNetworkReply> |
|||
#include <QtQuick/QQuickView> |
|||
#include <QtQml/QQmlContext> |
|||
#include <QtQml/QQmlEngine> |
|||
#include <QtQml/QtQml> |
|||
#include <QtWidgets/QMessageBox> |
|||
#include <QtWidgets/QInputDialog> |
|||
#include <QtGui/QClipboard> |
|||
#include <QtCore/QtCore> |
|||
#include <libethcore/FileSystem.h> |
|||
#include <libethcore/Dagger.h> |
|||
#include <libevmface/Instruction.h> |
|||
#include <libethereum/Client.h> |
|||
#include <libethereum/EthereumHost.h> |
|||
#include "BuildInfo.h" |
|||
#include "MainWin.h" |
|||
#include "ui_Main.h" |
|||
using namespace std; |
|||
using namespace eth; |
|||
|
|||
Main::Main(QWidget *parent) : |
|||
QObject(parent) |
|||
{ |
|||
/* qRegisterMetaType<eth::u256>("eth::u256");
|
|||
qRegisterMetaType<eth::KeyPair>("eth::KeyPair"); |
|||
qRegisterMetaType<eth::Secret>("eth::Secret"); |
|||
qRegisterMetaType<eth::Address>("eth::Address"); |
|||
qRegisterMetaType<QmlAccount*>("QmlAccount*"); |
|||
qRegisterMetaType<QmlEthereum*>("QmlEthereum*"); |
|||
|
|||
qmlRegisterType<QmlEthereum>("org.ethereum", 1, 0, "Ethereum"); |
|||
qmlRegisterType<QmlAccount>("org.ethereum", 1, 0, "Account"); |
|||
qmlRegisterSingletonType<QmlU256Helper>("org.ethereum", 1, 0, "Balance", QmlEthereum::constructU256Helper); |
|||
qmlRegisterSingletonType<QmlKeyHelper>("org.ethereum", 1, 0, "Key", QmlEthereum::constructKeyHelper); |
|||
*/ |
|||
/*
|
|||
ui->librariesView->setModel(m_libraryMan); |
|||
ui->graphsView->setModel(m_graphMan); |
|||
*/ |
|||
|
|||
|
|||
|
|||
|
|||
// QQmlContext* context = m_view->rootContext();
|
|||
// context->setContextProperty("u256", new U256Helper(this));
|
|||
} |
|||
|
|||
Main::~Main() |
|||
{ |
|||
} |
|||
|
|||
// extra bits needed to link on VS
|
|||
#ifdef _MSC_VER |
|||
|
|||
// include moc file, ofuscated to hide from automoc
|
|||
#include\ |
|||
"moc_MainWin.cpp" |
|||
|
|||
#endif |
@ -1,18 +0,0 @@ |
|||
#ifndef MAIN_H |
|||
#define MAIN_H |
|||
|
|||
#include <QtQml/QQmlApplicationEngine> |
|||
|
|||
class Main: public QObject |
|||
{ |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
explicit Main(QWidget *parent = 0); |
|||
~Main(); |
|||
|
|||
private: |
|||
QQmlApplicationEngine* m_view; |
|||
}; |
|||
|
|||
#endif // MAIN_H
|
@ -1,5 +0,0 @@ |
|||
<RCC> |
|||
<qresource prefix="/"> |
|||
<file>Simple.qml</file> |
|||
</qresource> |
|||
</RCC> |
@ -1,9 +0,0 @@ |
|||
import QtQuick.Controls 1.1 |
|||
|
|||
ApplicationWindow { |
|||
title: "My App" |
|||
Button { |
|||
text: "Push Me" |
|||
anchors.centerIn: parent |
|||
} |
|||
} |
@ -1,9 +0,0 @@ |
|||
#include <QtQml/QQmlApplicationEngine> |
|||
#include <QtWidgets/QApplication> |
|||
|
|||
int main(int argc, char *argv[]) |
|||
{ |
|||
QApplication a(argc, argv); |
|||
QQmlApplicationEngine app(QUrl("qrc:/Simple.qml")); |
|||
return a.exec(); |
|||
} |
@ -1,8 +0,0 @@ |
|||
#pragma once |
|||
|
|||
#include "Common.h" |
|||
#include "CommonData.h" |
|||
#include "CommonIO.h" |
|||
#include "FixedHash.h" |
|||
#include "Log.h" |
|||
#include "RLP.h" |
@ -0,0 +1,117 @@ |
|||
/*
|
|||
This file is part of cpp-ethereum. |
|||
|
|||
cpp-ethereum is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
cpp-ethereum is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file CommonJS.cpp
|
|||
* @authors: |
|||
* Gav Wood <i@gavwood.com> |
|||
* Marek Kotewicz <marek@ethdev.com> |
|||
* @date 2014 |
|||
*/ |
|||
|
|||
#include "CommonJS.h" |
|||
|
|||
namespace dev |
|||
{ |
|||
|
|||
bytes jsToBytes(std::string const& _s) |
|||
{ |
|||
if (_s.substr(0, 2) == "0x") |
|||
// Hex
|
|||
return fromHex(_s.substr(2)); |
|||
else if (_s.find_first_not_of("0123456789") == std::string::npos) |
|||
// Decimal
|
|||
return toCompactBigEndian(bigint(_s)); |
|||
else |
|||
return bytes(); |
|||
} |
|||
|
|||
bytes padded(bytes _b, unsigned _l) |
|||
{ |
|||
while (_b.size() < _l) |
|||
_b.insert(_b.begin(), 0); |
|||
while (_b.size() < _l) |
|||
_b.push_back(0); |
|||
return asBytes(asString(_b).substr(_b.size() - std::max(_l, _l))); |
|||
} |
|||
|
|||
bytes unpadded(bytes _b) |
|||
{ |
|||
auto p = asString(_b).find_last_not_of((char)0); |
|||
_b.resize(p == std::string::npos ? 0 : (p + 1)); |
|||
return _b; |
|||
} |
|||
|
|||
std::string prettyU256(u256 _n) |
|||
{ |
|||
unsigned inc = 0; |
|||
std::string raw; |
|||
std::ostringstream s; |
|||
if (!(_n >> 64)) |
|||
s << " " << (uint64_t)_n << " (0x" << (uint64_t)_n << ")"; |
|||
else if (!~(_n >> 64)) |
|||
s << " " << (int64_t)_n << " (0x" << (int64_t)_n << ")"; |
|||
else if ((_n >> 160) == 0) |
|||
{ |
|||
Address a = right160(_n); |
|||
|
|||
std::string n = a.abridged(); |
|||
if (n.empty()) |
|||
s << "0x" << a; |
|||
else |
|||
s << n << "(0x" << a.abridged() << ")"; |
|||
} |
|||
else if ((raw = fromRaw((h256)_n, &inc)).size()) |
|||
return "\"" + raw + "\"" + (inc ? " + " + std::to_string(inc) : ""); |
|||
else |
|||
s << "" << (h256)_n; |
|||
return s.str(); |
|||
} |
|||
|
|||
std::string fromRaw(h256 _n, unsigned* _inc) |
|||
{ |
|||
if (_n) |
|||
{ |
|||
std::string s((char const*)_n.data(), 32); |
|||
auto l = s.find_first_of('\0'); |
|||
if (!l) |
|||
return ""; |
|||
if (l != std::string::npos) |
|||
{ |
|||
auto p = s.find_first_not_of('\0', l); |
|||
if (!(p == std::string::npos || (_inc && p == 31))) |
|||
return ""; |
|||
if (_inc) |
|||
*_inc = (byte)s[31]; |
|||
s.resize(l); |
|||
} |
|||
for (auto i: s) |
|||
if (i < 32) |
|||
return ""; |
|||
return s; |
|||
} |
|||
return ""; |
|||
} |
|||
|
|||
Address fromString(std::string const& _sn) |
|||
{ |
|||
if (_sn.size() == 40) |
|||
return Address(fromHex(_sn)); |
|||
else |
|||
return Address(); |
|||
} |
|||
|
|||
|
|||
} |
@ -1,10 +0,0 @@ |
|||
#ifdef _MSC_VER |
|||
#include "All.h" |
|||
#include "Common.cpp" |
|||
#include "CommonData.cpp" |
|||
#include "CommonIO.cpp" |
|||
#include "FixedHash.cpp" |
|||
#include "Guards.cpp" |
|||
#include "Log.cpp" |
|||
#include "RLP.cpp" |
|||
#endif |
@ -0,0 +1,121 @@ |
|||
/* Copyright (c) 2013, Scott Tsai
|
|||
* |
|||
* All rights reserved. |
|||
* |
|||
* Redistribution and use in source and binary forms, with or without |
|||
* modification, are permitted provided that the following conditions are met: |
|||
* |
|||
* 1. Redistributions of source code must retain the above copyright notice, |
|||
* this list of conditions and the following disclaimer. |
|||
* 2. Redistributions in binary form must reproduce the above copyright notice, |
|||
* this list of conditions and the following disclaimer in the documentation |
|||
* and/or other materials provided with the distribution. |
|||
* |
|||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
|||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|||
* POSSIBILITY OF SUCH DAMAGE. |
|||
*/ |
|||
|
|||
#ifndef DEBUG_BREAK_H |
|||
#define DEBUG_BREAK_H |
|||
|
|||
#ifdef _MSC_VER |
|||
|
|||
#define debug_break __debugbreak |
|||
|
|||
#else |
|||
|
|||
#include <signal.h> |
|||
#include <unistd.h> |
|||
#include <sys/syscall.h> |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
enum { |
|||
/* gcc optimizers consider code after __builtin_trap() dead.
|
|||
* Making __builtin_trap() unsuitable for breaking into the debugger */ |
|||
DEBUG_BREAK_PREFER_BUILTIN_TRAP_TO_SIGTRAP = 0, |
|||
}; |
|||
|
|||
#if defined(__i386__) || defined(__x86_64__) |
|||
enum { HAVE_TRAP_INSTRUCTION = 1, }; |
|||
__attribute__((gnu_inline, always_inline)) |
|||
static void __inline__ trap_instruction(void) |
|||
{ |
|||
__asm__ volatile("int $0x03"); |
|||
} |
|||
#elif defined(__thumb__) |
|||
enum { HAVE_TRAP_INSTRUCTION = 1, }; |
|||
/* FIXME: handle __THUMB_INTERWORK__ */ |
|||
__attribute__((gnu_inline, always_inline)) |
|||
static void __inline__ trap_instruction(void) |
|||
{ |
|||
/* See 'arm-linux-tdep.c' in GDB source.
|
|||
* Both instruction sequences below works. */ |
|||
#if 1 |
|||
/* 'eabi_linux_thumb_le_breakpoint' */ |
|||
__asm__ volatile(".inst 0xde01"); |
|||
#else |
|||
/* 'eabi_linux_thumb2_le_breakpoint' */ |
|||
__asm__ volatile(".inst.w 0xf7f0a000"); |
|||
#endif |
|||
|
|||
/* Known problem:
|
|||
* After a breakpoint hit, can't stepi, step, or continue in GDB. |
|||
* 'step' stuck on the same instruction. |
|||
* |
|||
* Workaround: a new GDB command, |
|||
* 'debugbreak-step' is defined in debugbreak-gdb.py |
|||
* that does: |
|||
* (gdb) set $instruction_len = 2 |
|||
* (gdb) tbreak *($pc + $instruction_len) |
|||
* (gdb) jump *($pc + $instruction_len) |
|||
*/ |
|||
} |
|||
#elif defined(__arm__) && !defined(__thumb__) |
|||
enum { HAVE_TRAP_INSTRUCTION = 1, }; |
|||
__attribute__((gnu_inline, always_inline)) |
|||
static void __inline__ trap_instruction(void) |
|||
{ |
|||
/* See 'arm-linux-tdep.c' in GDB source,
|
|||
* 'eabi_linux_arm_le_breakpoint' */ |
|||
__asm__ volatile(".inst 0xe7f001f0"); |
|||
/* Has same known problem and workaround
|
|||
* as Thumb mode */ |
|||
} |
|||
#else |
|||
enum { HAVE_TRAP_INSTRUCTION = 0, }; |
|||
#endif |
|||
|
|||
__attribute__((gnu_inline, always_inline)) |
|||
static void __inline__ debug_break(void) |
|||
{ |
|||
if (HAVE_TRAP_INSTRUCTION) { |
|||
trap_instruction(); |
|||
} else if (DEBUG_BREAK_PREFER_BUILTIN_TRAP_TO_SIGTRAP) { |
|||
/* raises SIGILL on Linux x86{,-64}, to continue in gdb:
|
|||
* (gdb) handle SIGILL stop nopass |
|||
* */ |
|||
__builtin_trap(); |
|||
} else { |
|||
raise(SIGTRAP); |
|||
} |
|||
} |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
|
|||
#endif |
|||
|
|||
#endif |
@ -0,0 +1,60 @@ |
|||
/*
|
|||
This file is part of cpp-ethereum. |
|||
|
|||
cpp-ethereum is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
cpp-ethereum is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file AES.cpp
|
|||
* @author Alex Leverington <nessence@gmail.com> |
|||
* @date 2014 |
|||
*/ |
|||
|
|||
#include "CryptoPP.h" |
|||
#include "AES.h" |
|||
|
|||
using namespace std; |
|||
using namespace dev; |
|||
using namespace dev::crypto; |
|||
using namespace dev::crypto::aes; |
|||
using namespace CryptoPP; |
|||
|
|||
struct aes::Aes128Ctr |
|||
{ |
|||
Aes128Ctr(h128 _k) |
|||
{ |
|||
mode.SetKeyWithIV(_k.data(), sizeof(h128), Nonce::get().data()); |
|||
} |
|||
CTR_Mode<AES>::Encryption mode; |
|||
}; |
|||
|
|||
Stream::Stream(StreamType, h128 _ckey): |
|||
m_cSecret(_ckey) |
|||
{ |
|||
cryptor = new Aes128Ctr(_ckey); |
|||
} |
|||
|
|||
Stream::~Stream() |
|||
{ |
|||
delete cryptor; |
|||
} |
|||
|
|||
void Stream::update(bytesRef) |
|||
{ |
|||
|
|||
} |
|||
|
|||
size_t Stream::streamOut(bytes&) |
|||
{ |
|||
return 0; |
|||
} |
|||
|
@ -0,0 +1,89 @@ |
|||
/*
|
|||
This file is part of cpp-ethereum. |
|||
|
|||
cpp-ethereum is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
cpp-ethereum is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file AES.h
|
|||
* @author Alex Leverington <nessence@gmail.com> |
|||
* @date 2014 |
|||
* |
|||
* AES |
|||
* todo: use openssl |
|||
*/ |
|||
|
|||
#pragma once |
|||
|
|||
#include <atomic> |
|||
#include "Common.h" |
|||
|
|||
namespace dev |
|||
{ |
|||
namespace crypto |
|||
{ |
|||
namespace aes |
|||
{ |
|||
|
|||
struct Aes128Ctr; |
|||
enum StreamType { Encrypt, Decrypt }; |
|||
|
|||
/**
|
|||
* @brief Encrypted stream |
|||
*/ |
|||
class Stream |
|||
{ |
|||
public: |
|||
// streamtype maybe irrelevant w/ctr
|
|||
Stream(StreamType _t, h128 _ckey); |
|||
~Stream(); |
|||
|
|||
virtual void update(bytesRef io_bytes); |
|||
|
|||
/// Move ciphertext to _bytes.
|
|||
virtual size_t streamOut(bytes& o_bytes); |
|||
|
|||
private: |
|||
Stream(Stream const&) = delete; |
|||
Stream& operator=(Stream const&) = delete; |
|||
|
|||
h128 m_cSecret; |
|||
bytes m_text; |
|||
|
|||
Aes128Ctr* cryptor; |
|||
}; |
|||
|
|||
|
|||
/**
|
|||
* @brief Encrypted stream with inband SHA3 mac at specific interval. |
|||
*/ |
|||
class AuthenticatedStream: public Stream |
|||
{ |
|||
public: |
|||
AuthenticatedStream(StreamType _t, h128 _ckey, h128 _mackey, unsigned _interval): Stream(_t, _ckey), m_macSecret(_mackey) { m_macInterval = _interval; } |
|||
|
|||
AuthenticatedStream(StreamType _t, Secret const& _s, unsigned _interval): Stream(_t, h128(_s)), m_macSecret(FixedHash<16>((byte const*)_s.data()+16,h128::ConstructFromPointer)) { m_macInterval = _interval; } |
|||
|
|||
/// Adjust mac interval. Next mac will be xored with value.
|
|||
void adjustInterval(unsigned _interval) { m_macInterval = _interval; } |
|||
|
|||
private: |
|||
AuthenticatedStream(AuthenticatedStream const&) = delete; |
|||
AuthenticatedStream& operator=(AuthenticatedStream const&) = delete; |
|||
|
|||
std::atomic<unsigned> m_macInterval; |
|||
h128 m_macSecret; |
|||
}; |
|||
|
|||
} |
|||
} |
|||
} |
@ -1,9 +0,0 @@ |
|||
#pragma once |
|||
|
|||
#include "Common.h" |
|||
#include "FileSystem.h" |
|||
#include "MemoryDB.h" |
|||
#include "OverlayDB.h" |
|||
#include "SHA3.h" |
|||
#include "TrieCommon.h" |
|||
#include "TrieDB.h" |
@ -0,0 +1,232 @@ |
|||
/*
|
|||
This file is part of cpp-ethereum. |
|||
|
|||
cpp-ethereum is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
cpp-ethereum is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file CryptoPP.cpp
|
|||
* @author Alex Leverington <nessence@gmail.com> |
|||
* @date 2014 |
|||
*/ |
|||
|
|||
#include "CryptoPP.h" |
|||
|
|||
using namespace std; |
|||
using namespace dev; |
|||
using namespace dev::crypto; |
|||
using namespace CryptoPP; |
|||
|
|||
static_assert(dev::Secret::size == 32, "Secret key must be 32 bytes."); |
|||
static_assert(dev::Public::size == 64, "Public key must be 64 bytes."); |
|||
static_assert(dev::Signature::size == 65, "Signature must be 65 bytes."); |
|||
|
|||
void Secp256k1::encrypt(Public const& _k, bytes& io_cipher) |
|||
{ |
|||
ECIES<ECP>::Encryptor e; |
|||
initializeDLScheme(_k, e); |
|||
|
|||
size_t plen = io_cipher.size(); |
|||
bytes ciphertext; |
|||
ciphertext.resize(e.CiphertextLength(plen)); |
|||
|
|||
{ |
|||
lock_guard<mutex> l(x_rng); |
|||
e.Encrypt(m_rng, io_cipher.data(), plen, ciphertext.data()); |
|||
} |
|||
|
|||
memset(io_cipher.data(), 0, io_cipher.size()); |
|||
io_cipher = std::move(ciphertext); |
|||
} |
|||
|
|||
void Secp256k1::decrypt(Secret const& _k, bytes& io_text) |
|||
{ |
|||
CryptoPP::ECIES<CryptoPP::ECP>::Decryptor d; |
|||
initializeDLScheme(_k, d); |
|||
|
|||
if (!io_text.size()) |
|||
{ |
|||
io_text.resize(1); |
|||
io_text[0] = 0; |
|||
} |
|||
|
|||
size_t clen = io_text.size(); |
|||
bytes plain; |
|||
plain.resize(d.MaxPlaintextLength(io_text.size())); |
|||
|
|||
DecodingResult r; |
|||
{ |
|||
lock_guard<mutex> l(x_rng); |
|||
r = d.Decrypt(m_rng, io_text.data(), clen, plain.data()); |
|||
} |
|||
|
|||
if (!r.isValidCoding) |
|||
{ |
|||
io_text.clear(); |
|||
return; |
|||
} |
|||
|
|||
io_text.resize(r.messageLength); |
|||
io_text = std::move(plain); |
|||
} |
|||
|
|||
Signature Secp256k1::sign(Secret const& _k, bytesConstRef _message) |
|||
{ |
|||
return sign(_k, sha3(_message)); |
|||
} |
|||
|
|||
Signature Secp256k1::sign(Secret const& _key, h256 const& _hash) |
|||
{ |
|||
// assumption made by signing alogrithm
|
|||
asserts(m_q == m_qs); |
|||
|
|||
Signature sig; |
|||
|
|||
Integer k(kdf(_key, _hash).data(), 32); |
|||
if (k == 0) |
|||
BOOST_THROW_EXCEPTION(InvalidState()); |
|||
k = 1 + (k % (m_qs - 1)); |
|||
|
|||
ECP::Point rp; |
|||
Integer r; |
|||
{ |
|||
lock_guard<mutex> l(x_params); |
|||
rp = m_params.ExponentiateBase(k); |
|||
r = m_params.ConvertElementToInteger(rp); |
|||
} |
|||
sig[64] = 0; |
|||
// sig[64] = (r >= m_q) ? 2 : 0;
|
|||
|
|||
Integer kInv = k.InverseMod(m_q); |
|||
Integer z(_hash.asBytes().data(), 32); |
|||
Integer s = (kInv * (Integer(_key.asBytes().data(), 32)*r + z)) % m_q; |
|||
if (r == 0 || s == 0) |
|||
BOOST_THROW_EXCEPTION(InvalidState()); |
|||
|
|||
// if (s > m_qs)
|
|||
// {
|
|||
// s = m_q - s;
|
|||
// if (sig[64])
|
|||
// sig[64] ^= 1;
|
|||
// }
|
|||
|
|||
sig[64] |= rp.y.IsOdd() ? 1 : 0; |
|||
r.Encode(sig.data(), 32); |
|||
s.Encode(sig.data() + 32, 32); |
|||
return sig; |
|||
} |
|||
|
|||
bool Secp256k1::verify(Signature const& _signature, bytesConstRef _message) |
|||
{ |
|||
return !!recover(_signature, _message); |
|||
} |
|||
|
|||
bool Secp256k1::verify(Public const& _p, Signature const& _sig, bytesConstRef _message, bool _hashed) |
|||
{ |
|||
// todo: verify w/o recovery (if faster)
|
|||
return _p == _hashed ? recover(_sig, _message) : recover(_sig, sha3(_message).ref()); |
|||
} |
|||
|
|||
Public Secp256k1::recover(Signature _signature, bytesConstRef _message) |
|||
{ |
|||
Public recovered; |
|||
|
|||
Integer r(_signature.data(), 32); |
|||
Integer s(_signature.data()+32, 32); |
|||
// cryptopp encodes sign of y as 0x02/0x03 instead of 0/1 or 27/28
|
|||
byte encodedpoint[33]; |
|||
encodedpoint[0] = _signature[64]|2; |
|||
memcpy(&encodedpoint[1], _signature.data(), 32); |
|||
|
|||
ECP::Element x; |
|||
{ |
|||
lock_guard<mutex> l(x_curve); |
|||
m_curve.DecodePoint(x, encodedpoint, 33); |
|||
if (!m_curve.VerifyPoint(x)) |
|||
return recovered; |
|||
} |
|||
|
|||
// if (_signature[64] & 2)
|
|||
// {
|
|||
// r += m_q;
|
|||
// lock_guard<mutex> l(x_params);
|
|||
// if (r >= m_params.GetMaxExponent())
|
|||
// return recovered;
|
|||
// }
|
|||
|
|||
Integer z(_message.data(), 32); |
|||
Integer rn = r.InverseMod(m_q); |
|||
Integer u1 = m_q - (rn.Times(z)).Modulo(m_q); |
|||
Integer u2 = (rn.Times(s)).Modulo(m_q); |
|||
|
|||
ECP::Point p; |
|||
byte recoveredbytes[65]; |
|||
{ |
|||
lock_guard<mutex> l(x_curve); |
|||
// todo: make generator member
|
|||
p = m_curve.CascadeMultiply(u2, x, u1, m_params.GetSubgroupGenerator()); |
|||
m_curve.EncodePoint(recoveredbytes, p, false); |
|||
} |
|||
memcpy(recovered.data(), &recoveredbytes[1], 64); |
|||
return recovered; |
|||
} |
|||
|
|||
bool Secp256k1::verifySecret(Secret const& _s, Public& _p) |
|||
{ |
|||
DL_PrivateKey_EC<ECP> k; |
|||
k.Initialize(m_params, secretToExponent(_s)); |
|||
if (!k.Validate(m_rng, 3)) |
|||
return false; |
|||
|
|||
DL_PublicKey_EC<CryptoPP::ECP> pub; |
|||
k.MakePublicKey(pub); |
|||
if (!k.Validate(m_rng, 3)) |
|||
return false; |
|||
|
|||
exportPublicKey(pub, _p); |
|||
return true; |
|||
} |
|||
|
|||
void Secp256k1::agree(Secret const& _s, Public const& _r, h256& o_s) |
|||
{ |
|||
ECDH<ECP>::Domain d(m_oid); |
|||
assert(d.AgreedValueLength() == sizeof(o_s)); |
|||
byte remote[65] = {0x04}; |
|||
memcpy(&remote[1], _r.data(), 64); |
|||
assert(d.Agree(o_s.data(), _s.data(), remote)); |
|||
} |
|||
|
|||
void Secp256k1::exportPublicKey(CryptoPP::DL_PublicKey_EC<CryptoPP::ECP> const& _k, Public& o_p) |
|||
{ |
|||
bytes prefixedKey(_k.GetGroupParameters().GetEncodedElementSize(true)); |
|||
|
|||
{ |
|||
lock_guard<mutex> l(x_params); |
|||
m_params.GetCurve().EncodePoint(prefixedKey.data(), _k.GetPublicElement(), false); |
|||
assert(Public::size + 1 == _k.GetGroupParameters().GetEncodedElementSize(true)); |
|||
} |
|||
|
|||
memcpy(o_p.data(), &prefixedKey[1], Public::size); |
|||
} |
|||
|
|||
void Secp256k1::exponentToPublic(Integer const& _e, Public& o_p) |
|||
{ |
|||
CryptoPP::DL_PublicKey_EC<CryptoPP::ECP> pk; |
|||
|
|||
{ |
|||
lock_guard<mutex> l(x_params); |
|||
pk.Initialize(m_params, m_params.ExponentiateBase(_e)); |
|||
} |
|||
|
|||
exportPublicKey(pk, o_p); |
|||
} |
|||
|
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue