# cmake global
cmake_minimum_required ( VERSION 2.8.12 )
project ( ethereum )
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 )
set ( BUNDLE "none" CACHE STRING "Predefined bundle of software to build (none, full, user, tests, minimal)." )
option ( SOLIDITY "Build the Solidity language components" ON )
option ( SERPENT "Build the Serpent language components" ON )
option ( TOOLS "Build the tools components" ON )
option ( NCURSES "Build the NCurses components" ON )
option ( GUI "Build GUI components (AlethZero, Mix)" ON )
option ( TESTS "Build the tests." ON )
option ( EVMJIT "Build just-in-time compiler for EVM code (requires LLVM)" OFF )
option ( ETHASHCL "Build in support for GPU mining via OpenCL" 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 ( )
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 } "
- 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 ( BUNDLE "minimal" )
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 ( USENPM )
eth_format_option ( PROFILING )
eth_format_option ( SOLIDITY )
eth_format_option ( GUI )
eth_format_option ( TESTS )
eth_format_option ( TOOLS )
eth_format_option ( ETHASHCL )
eth_format_option_on_decent_platform ( SERPENT )
eth_format_option_on_decent_platform ( NCURSES )
if ( GUI )
set ( JSONRPC ON )
endif ( )
if ( BUNDLE STREQUAL "minimal" )
set ( SERPENT OFF )
set ( SOLIDITY OFF )
set ( USENPM OFF )
set ( GUI OFF )
set ( NCURSES 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 ( NCURSES ${ DECENT_PLATFORM } )
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 ( NCURSES OFF )
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 ( NCURSES 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 ( NCURSES ${ DECENT_PLATFORM } )
set ( TOOLS ON )
set ( TESTS OFF )
endif ( )
# Default CMAKE_BUILD_TYPE to "Release".
set ( CMAKE_BUILD_TYPE CACHE STRING "Release" )
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 ( "-- FATDB Full database exploring ${FATDB}" )
message ( "-- JSONRPC JSON-RPC support ${JSONRPC}" )
message ( "-- USENPM Javascript source building ${USENPM}" )
message ( "------------------------------------------------------------- components" )
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 ( "-- NCURSES Build NCurses components ${NCURSES}" )
message ( "-- TESTS Build tests ${TESTS}" )
message ( "-- ETHASHCL Build OpenCL components (experimental!) ${ETHASHCL}" )
message ( "-- EVMJIT Build LLVM-based JIT EVM (experimental!) ${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 ( EVMJIT )
set ( EVMJIT_CPP TRUE ) # include CPP-JIT connector
add_subdirectory ( evmjit )
endif ( )
add_subdirectory ( libdevcore )
add_subdirectory ( libevmcore )
add_subdirectory ( libevmasm )
add_subdirectory ( liblll )
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 )
add_subdirectory ( libweb3jsonrpc )
endif ( )
add_subdirectory ( secp256k1 )
add_subdirectory ( libp2p )
add_subdirectory ( libdevcrypto )
add_subdirectory ( libwhisper )
add_subdirectory ( libethash )
if ( ETHASHCL )
add_subdirectory ( libethash-cl )
endif ( )
add_subdirectory ( libethcore )
add_subdirectory ( libevm )
add_subdirectory ( libethereum )
add_subdirectory ( libwebthree )
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 ( ethminer )
add_subdirectory ( eth )
if ( "x${CMAKE_BUILD_TYPE}" STREQUAL "xDebug" )
add_subdirectory ( exp )
endif ( )
endif ( )
if ( NCURSES )
add_subdirectory ( neth )
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 ( )
#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 )