# cmake global
cmake_minimum_required ( VERSION 2.8.12 )
set ( PROJECT_VERSION "0.9.35" )
if ( ${ CMAKE_VERSION } VERSION_GREATER 3.0 )
cmake_policy ( SET CMP0048 NEW ) # allow VERSION argument in project()
project ( ethereum VERSION ${ PROJECT_VERSION } )
else ( )
project ( ethereum )
endif ( )
set ( CMAKE_AUTOMOC ON )
# link_directories interprate relative paths with respect to CMAKE_CURRENT_SOURCE_DIR
cmake_policy ( SET CMP0015 NEW )
# 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 )
# 3.1 and above
if ( ( ${ CMAKE_MAJOR_VERSION } GREATER 2 ) AND ( ${ CMAKE_MINOR_VERSION } GREATER 0 ) )
# implicitly dereference variables (deprecated in 3.1)
cmake_policy ( SET CMP0054 NEW )
endif ( )
list ( APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" )
######################################################################################################
# user defined, defaults
# Normally, set(...CACHE...) creates cache variables, but does not modify them.
option ( VMTRACE "VM tracing and run-time checks (useful for cross-implementation VM debugging)" OFF )
option ( PARANOID "Additional run-time checks" OFF )
option ( JSONRPC "Build with jsonprc. default on" ON )
option ( FATDB "Build with ability to list entries in the Trie. Doubles DB size, slows everything down, but good for looking at state diffs and trie contents." OFF )
option ( USENPM "Use npm to recompile ethereum.js if it was changed" OFF )
option ( PROFILING "Build in support for profiling" OFF )
option ( ROCKSDB "Use rocksdb rather than leveldb" OFF )
set ( BUNDLE "none" CACHE STRING "Predefined bundle of software to build (none, full, user, tests, minimal)." )
option ( MINER "Build the CLI miner component" ON )
option ( ETHKEY "Build the CLI key manager component" ON )
option ( SOLIDITY "Build the Solidity language components" ON )
option ( SERPENT "Build the Serpent language components" ON )
option ( TOOLS "Build the tools components" ON )
option ( GUI "Build GUI components (AlethZero, Mix)" ON )
option ( TESTS "Build the tests." ON )
option ( NOBOOST "No use of boost macros in test functions" OFF )
option ( EVMJIT "Build just-in-time compiler for EVM code (requires LLVM)" ON )
option ( ETHASHCL "Build in support for GPU mining via OpenCL" ON )
option ( JSCONSOLE "Build in javascript console" ON )
option ( FRONTIER "Build for Frontier network" OFF )
# propagates CMake configuration options to the compiler
function ( configureProject )
if ( PARANOID )
add_definitions ( -DETH_PARANOIA )
endif ( )
if ( VMTRACE )
add_definitions ( -DETH_VMTRACE )
endif ( )
if ( ETHASHCL )
add_definitions ( -DETH_ETHASHCL )
endif ( )
if ( EVMJIT )
add_definitions ( -DETH_EVMJIT )
endif ( )
if ( FATDB )
add_definitions ( -DETH_FATDB )
endif ( )
if ( SOLIDITY )
add_definitions ( -DETH_SOLIDITY )
endif ( )
if ( GUI )
add_definitions ( -DETH_GUI )
endif ( )
if ( CPUID_FOUND )
add_definitions ( -DETH_CPUID )
endif ( )
if ( CURL_FOUND )
add_definitions ( -DETH_CURL )
endif ( )
if ( NOBOOST )
add_definitions ( -DNOBOOST )
endif ( )
if ( FRONTIER )
add_definitions ( -DETH_FRONTIER )
endif ( )
add_definitions ( -DETH_TRUE )
endfunction ( )
set ( CPPETHEREUM 1 )
function ( createBuildInfo )
# Set build platform; to be written to BuildInfo.h
set ( ETH_BUILD_PLATFORM "${TARGET_PLATFORM}" )
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 ( )
set ( ETH_BUILD_PLATFORM "${ETH_BUILD_PLATFORM}/unknown" )
endif ( )
if ( EVMJIT )
set ( ETH_BUILD_PLATFORM "${ETH_BUILD_PLATFORM}/JIT" )
else ( )
set ( ETH_BUILD_PLATFORM "${ETH_BUILD_PLATFORM}/int" )
endif ( )
if ( PARANOID )
set ( ETH_BUILD_PLATFORM "${ETH_BUILD_PLATFORM}/PARA" )
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 "${CMAKE_CFG_INTDIR}" )
endif ( )
# Generate header file containing useful build information
add_custom_target ( BuildInfo.h ALL
W O R K I N G _ D I R E C T O R Y $ { C M A K E _ S O U R C E _ D I R }
C O M M A N D $ { C M A K E _ C O M M A N D } - D E T H _ S O U R C E _ D I R = " $ { C M A K E _ S O U R C E _ D I R } " - D E T H _ D S T _ D I R = " $ { C M A K E _ B I N A R Y _ D I R } "
- D E T H _ B U I L D _ T Y P E = " $ { _ c m a k e _ b u i l d _ t y p e } " - D E T H _ B U I L D _ P L A T F O R M = " $ { E T H _ B U I L D _ P L A T F O R M } "
- D P R O J E C T _ V E R S I O N = " $ { P R O J E C T _ V E R S I O N } "
- P " $ { E T H _ S C R I P T S _ D I R } / b u i l d i n f o . c m a k e "
)
include_directories ( ${ CMAKE_CURRENT_BINARY_DIR } )
set ( CMAKE_INCLUDE_CURRENT_DIR ON )
set ( SRC_LIST BuildInfo.h )
endfunction ( )
######################################################################################################
# Clear invalid option
if ( "${CMAKE_BUILD_TYPE}" STREQUAL "Release" )
if ( PARANOID )
message ( "Paranoia requires debug - disabling for release build." )
set ( PARANOID OFF )
endif ( )
if ( VMTRACE )
message ( "VM Tracing requires debug - disabling for release build." )
set ( VMTRACE OFF )
endif ( )
endif ( )
# Force chromium.
set ( ETH_HAVE_WEBENGINE 1 )
# Backwards compatibility
if ( HEADLESS )
message ( "*** WARNING: -DHEADLESS=1 option is DEPRECATED! Use -DBUNDLE=minimal or -DGUI=0" )
set ( GUI OFF )
endif ( )
# TODO: Abstract into something sensible and move into a function.
if ( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" )
set ( DECENT_PLATFORM OFF )
else ( )
set ( DECENT_PLATFORM ON )
endif ( )
macro ( eth_format_option O )
if ( ${ ${O } } )
set ( ${ O } ON )
else ( )
set ( ${ O } OFF )
endif ( )
endmacro ( )
macro ( eth_format_option_on_decent_platform O )
if ( ${ ${O } } )
set ( ${ O } ${ DECENT_PLATFORM } )
else ( )
set ( ${ O } OFF )
endif ( )
endmacro ( )
# Normalise build options
eth_format_option ( PARANOID )
eth_format_option ( VMTRACE )
eth_format_option ( EVMJIT )
eth_format_option ( FATDB )
eth_format_option ( JSONRPC )
eth_format_option ( MINER )
eth_format_option ( USENPM )
eth_format_option ( PROFILING )
eth_format_option ( SOLIDITY )
eth_format_option ( ROCKSDB )
eth_format_option ( GUI )
eth_format_option ( TESTS )
eth_format_option ( NOBOOST )
eth_format_option ( ROCKSDB )
eth_format_option ( TOOLS )
eth_format_option ( ETHKEY )
eth_format_option ( ETHASHCL )
eth_format_option ( JSCONSOLE )
eth_format_option ( FRONTIER )
eth_format_option_on_decent_platform ( SERPENT )
if ( JSCONSOLE )
set ( JSONRPC ON )
endif ( )
if ( GUI )
set ( JSONRPC ON )
endif ( )
# Default CMAKE_BUILD_TYPE to "Release".
set ( CMAKE_BUILD_TYPE CACHE STRING "Release" )
# note: The value "default" which provides the defaults is just a fake value
# which lets us keep the default values of all build options and is set at
# the beginning of this file.
if ( BUNDLE STREQUAL "minimal" )
set ( SERPENT OFF )
set ( SOLIDITY OFF )
set ( USENPM OFF )
set ( GUI OFF )
set ( TOOLS ON )
set ( TESTS OFF )
elseif ( BUNDLE STREQUAL "full" )
set ( SERPENT ${ DECENT_PLATFORM } )
set ( SOLIDITY ON )
set ( USENPM ON )
set ( GUI ON )
set ( TOOLS ON )
set ( TESTS ON )
set ( FATDB ON )
elseif ( BUNDLE STREQUAL "cli" )
set ( SERPENT ${ DECENT_PLATFORM } )
set ( SOLIDITY ON )
set ( USENPM ON )
set ( GUI OFF )
set ( TOOLS ON )
set ( TESTS ON )
set ( FATDB ON )
elseif ( BUNDLE STREQUAL "core" )
set ( SERPENT OFF )
set ( SOLIDITY ON )
set ( USENPM OFF )
set ( GUI ON )
set ( TOOLS ON )
set ( TESTS OFF )
set ( FATDB ON )
elseif ( BUNDLE STREQUAL "tests" )
set ( SERPENT ${ DECENT_PLATFORM } )
set ( SOLIDITY ON )
set ( USENPM OFF )
set ( GUI OFF )
set ( TOOLS OFF )
set ( TESTS ON )
set ( FATDB ON )
elseif ( BUNDLE STREQUAL "user" )
set ( SERPENT OFF )
set ( SOLIDITY OFF )
set ( USENPM OFF )
set ( GUI ON )
set ( TOOLS ON )
set ( TESTS OFF )
elseif ( BUNDLE STREQUAL "wallet" )
set ( SERPENT OFF )
set ( SOLIDITY OFF )
set ( USENPM OFF )
set ( GUI OFF )
set ( TOOLS OFF )
set ( TESTS OFF )
set ( ETHKEY ON )
set ( MINER OFF )
set ( ETHASHCL ON )
elseif ( BUNDLE STREQUAL "miner" )
set ( SERPENT OFF )
set ( SOLIDITY OFF )
set ( USENPM OFF )
set ( GUI OFF )
set ( TOOLS OFF )
set ( TESTS OFF )
set ( ETHKEY OFF )
set ( MINER ON )
set ( ETHASHCL ON )
elseif ( BUNDLE STREQUAL "default" ) # development builds
set ( SERPENT ${ DECENT_PLATFORM } )
set ( SOLIDITY ON )
set ( USENPM OFF )
set ( GUI ON )
set ( TOOLS ON )
set ( TESTS ON )
set ( FATDB ON )
set ( ETHASHCL ON )
set ( EVMJIT ON )
set ( JSCONSOLE ON )
set ( JSONRPC ON )
if ( "x${CMAKE_BUILD_TYPE}" STREQUAL "x" )
set ( CMAKE_BUILD_TYPE "RelWithDebInfo" )
endif ( )
elseif ( BUNDLE STREQUAL "release" ) # release builds
set ( SERPENT ${ DECENT_PLATFORM } )
set ( SOLIDITY ON )
set ( USENPM OFF )
set ( GUI ON )
set ( TOOLS ON )
set ( TESTS OFF )
set ( FATDB OFF )
set ( ETHASHCL ON )
set ( EVMJIT ON )
set ( JSCONSOLE ON )
set ( JSONRPC ON )
set ( FRONTIER ON )
endif ( )
if ( "x${CMAKE_BUILD_TYPE}" STREQUAL "x" )
set ( CMAKE_BUILD_TYPE "Release" )
endif ( )
# Default TARGET_PLATFORM to ${CMAKE_SYSTEM_NAME}
# change this once we support cross compiling
set ( TARGET_PLATFORM CACHE STRING ${ CMAKE_SYSTEM_NAME } )
if ( "x${TARGET_PLATFORM}" STREQUAL "x" )
set ( TARGET_PLATFORM ${ CMAKE_SYSTEM_NAME } )
endif ( )
include ( EthDependencies )
configureProject ( )
message ( "------------------------------------------------------------------------" )
message ( "-- CMake Version ${CMAKE_VERSION}" )
message ( "-- CMAKE_BUILD_TYPE Build type ${CMAKE_BUILD_TYPE}" )
message ( "-- TARGET_PLATFORM Target platform ${TARGET_PLATFORM}" )
message ( "-- BUNDLE Build bundle ${BUNDLE}" )
message ( "--------------------------------------------------------------- features" )
message ( "-- Chromium support ${ETH_HAVE_WEBENGINE}" )
message ( "-- Hardware identification support ${CPUID_FOUND}" )
message ( "-- HTTP Request support ${CURL_FOUND}" )
message ( "-- VMTRACE VM execution tracing ${VMTRACE}" )
message ( "-- PROFILING Profiling support ${PROFILING}" )
message ( "-- NOBOOST No BOOST macros in test functions ${NOBOOST}" )
message ( "-- FATDB Full database exploring ${FATDB}" )
message ( "-- JSONRPC JSON-RPC support ${JSONRPC}" )
message ( "-- USENPM Javascript source building ${USENPM}" )
message ( "-- ROCKSDB Prefer rocksdb to leveldb ${ROCKSDB}" )
message ( "-- FRONTIER Default to the Frontier network ${FRONTIER}" )
message ( "------------------------------------------------------------- components" )
message ( "-- MINER Build miner ${MINER}" )
message ( "-- ETHKEY Build wallet tools ${ETHKEY}" )
message ( "-- TOOLS Build basic tools ${TOOLS}" )
message ( "-- SOLIDITY Build Solidity language components ${SOLIDITY}" )
message ( "-- SERPENT Build Serpent language components ${SERPENT}" )
message ( "-- GUI Build GUI components ${GUI}" )
message ( "-- TESTS Build tests ${TESTS}" )
message ( "-- ETHASHCL Build OpenCL components ${ETHASHCL}" )
message ( "-- JSCONSOLE Build with javascript console ${JSCONSOLE}" )
message ( "-- EVMJIT Build LLVM-based JIT EVM ${EVMJIT}" )
message ( "------------------------------------------------------------------------" )
message ( "" )
set ( CMAKE_THREAD_LIBS_INIT pthread )
include ( EthCompilerSettings )
message ( "-- CXXFLAGS: ${CMAKE_CXX_FLAGS}" )
# this must be an include, as a function it would mess up with variable scope!
include ( EthExecutableHelper )
createBuildInfo ( )
if ( ROCKSDB AND ROCKSDB_FOUND )
set ( DB_INCLUDE_DIRS ${ ROCKSDB_INCLUDE_DIRS } )
set ( DB_LIBRARIES ${ ROCKSDB_LIBRARIES } )
add_definitions ( -DETH_ROCKSDB )
else ( )
set ( DB_INCLUDE_DIRS ${ LEVELDB_INCLUDE_DIRS } )
set ( DB_LIBRARIES ${ LEVELDB_LIBRARIES } )
endif ( )
if ( EVMJIT )
if ( NOT DEFINED LLVM_DIR )
if ( CMAKE_SYSTEM_NAME STREQUAL "Windows" )
set ( LLVM_DIR "${CMAKE_SOURCE_DIR}/extdep/install/windows/x64/share/llvm/cmake" )
elseif ( CMAKE_SYSTEM_NAME STREQUAL "Darwin" )
set ( LLVM_DIR "/usr/local/opt/llvm/share/llvm/cmake" )
endif ( )
endif ( )
set ( EVMJIT_CPP TRUE ) # include CPP-JIT connector
add_subdirectory ( evmjit )
if ( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" )
set ( EVMJIT_DLLS_LOCAL $< TARGET_FILE:evmjit > )
set ( EVMJIT_DLLS optimized ${ EVMJIT_DLLS_LOCAL } debug ${ EVMJIT_DLLS_LOCAL } )
endif ( )
endif ( )
if ( TOOLS OR GUI OR SOLIDITY OR TESTS )
set ( GENERAL 1 )
else ( )
set ( GENERAL 0 )
endif ( )
add_subdirectory ( libdevcore )
if ( GENERAL )
add_subdirectory ( libevmcore )
add_subdirectory ( libevmasm )
add_subdirectory ( liblll )
endif ( )
if ( SERPENT )
add_subdirectory ( libserpent )
add_subdirectory ( sc )
endif ( )
if ( SOLIDITY )
add_subdirectory ( libsolidity )
endif ( )
if ( TOOLS )
add_subdirectory ( lllc )
if ( SOLIDITY )
add_subdirectory ( solc )
endif ( )
endif ( )
if ( JSONRPC AND GENERAL )
add_subdirectory ( libweb3jsonrpc )
endif ( )
if ( JSCONSOLE )
add_subdirectory ( libjsengine )
add_subdirectory ( libjsconsole )
add_subdirectory ( ethconsole )
endif ( )
if ( NOT WIN32 )
add_definitions ( -DETH_HAVE_SECP256K1 )
add_subdirectory ( secp256k1 )
endif ( )
add_subdirectory ( libscrypt )
add_subdirectory ( libdevcrypto )
if ( GENERAL )
add_subdirectory ( libp2p )
add_subdirectory ( libwhisper )
endif ( )
if ( GENERAL OR MINER )
add_subdirectory ( libethash )
if ( ETHASHCL )
add_subdirectory ( libethash-cl )
endif ( )
endif ( )
add_subdirectory ( libethcore )
if ( GENERAL )
add_subdirectory ( libevm )
add_subdirectory ( libethereum )
add_subdirectory ( libwebthree )
endif ( )
if ( MINER OR TOOLS )
add_subdirectory ( ethminer )
endif ( )
if ( ETHKEY OR TOOLS )
add_subdirectory ( ethkey )
endif ( )
if ( TESTS )
add_subdirectory ( libtestutils )
add_subdirectory ( test )
if ( JSONRPC )
add_subdirectory ( ethrpctest )
endif ( )
endif ( )
if ( TOOLS )
add_subdirectory ( rlp )
add_subdirectory ( abi )
add_subdirectory ( ethvm )
add_subdirectory ( eth )
if ( "x${CMAKE_BUILD_TYPE}" STREQUAL "xDebug" )
add_subdirectory ( exp )
endif ( )
endif ( )
if ( GUI )
add_subdirectory ( libnatspec )
add_subdirectory ( libjsqrc )
if ( ETH_HAVE_WEBENGINE )
add_subdirectory ( alethzero )
# add_subdirectory(third) // reenable once not qtwebkit.
endif ( )
if ( SOLIDITY )
add_subdirectory ( mix )
endif ( )
endif ( )
if ( APPLE AND GUI )
add_custom_target ( appdmg
W O R K I N G _ D I R E C T O R Y $ { C M A K E _ S O U R C E _ D I R }
C O M M A N D $ { C M A K E _ C O M M A N D }
- D A P P _ D M G _ E X E = $ { E T H _ A P P _ D M G }
- D A P P _ D M G _ F I L E = a p p d m g . j s o n . i n
- D A P P _ D M G _ I C O N = " a l e t h z e r o / a l e t h z e r o . i c n s "
- D A P P _ D M G _ B A C K G R O U N D = " i n s t a l l - f o l d e r - b g . p n g "
- D E T H _ B U I L D _ D I R = " $ { C M A K E _ B I N A R Y _ D I R } "
- D E T H _ M I X _ A P P = " $ < T A R G E T _ F I L E _ D I R : m i x > "
- D E T H _ A L E T H Z E R O _ A P P = " $ < T A R G E T _ F I L E _ D I R : A l e t h Z e r o > "
- P " $ { E T H _ S C R I P T S _ D I R } / a p p d m g . c m a k e "
)
endif ( )
if ( WIN32 )
# packaging stuff
include ( InstallRequiredSystemLibraries )
set ( CPACK_PACKAGE_NAME "Ethereum (++)" )
set ( CPACK_PACKAGE_DESCRIPTION_SUMMARY "The Ethereum (++) Toolset" )
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 ${ PROJECT_VERSION } )
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_MIX_GROUP "Applications")
#set(CPACK_COMPONENT_SOLC_GROUP "CLI")
#set(CPACK_COMPONENT_ETH_GROUP "CLI")
#set(CPACK_COMPONENT_ETHMINER_GROUP "CLI")
#set(CPACK_COMPONENT_RLP_GROUP "CLI")
#set(CPACK_COMPONENT_ABI_GROUP "CLI")
#set(CPACK_COMPONENTS_ALL alethzero mix solc eth ethminer rlp abi)
# nsis specific stuff
if ( CMAKE_CL_64 )
set ( CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64" )
set ( CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION} (Win64)" )
else ( )
set ( CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES" )
set ( CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION}" )
endif ( )
set ( CPACK_NSIS_DISPLAY_NAME "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 )