diff --git a/build/BUILD_NOTES.md b/build/BUILD_NOTES.md new file mode 100644 index 00000000..17bf90e2 --- /dev/null +++ b/build/BUILD_NOTES.md @@ -0,0 +1,51 @@ +Build notes +=========== + +Common build/install process: + + git clone https://github.com/PrivacySolutions/i2pd.git + cd i2pd/build + cmake -DCMAKE_BUILD_TYPE=Release . + make + make install + +Available cmake options: + +* CMAKE_BUILD_TYPE -- build profile (Debug/Release) +* WITH_AESNI -- AES-NI support (ON/OFF) +* WITH_HARDENING -- enable hardening features (ON/OFF) (gcc only) + +Debian +------ + +Required "-dev" packages: + +* cmake +* libboost-filesystem-dev +* libboost-program-options-dev +* libboost-regex-dev +* libboost-system-dev +* libcrypto++-dev + +FreeBSD +------- + +Branch 9.X has gcc v4.2, that knows nothing about required c++11 standart. + +Required ports: + +* devel/cmake +* devel/boost-libs +* lang/gcc47 # or later version +* security/cryptopp + +To use newer compiler you should set these variables: + + export CC=/usr/local/bin/gcc47 + export CXX=/usr/local/bin/g++47 + +Replace "47" with your actual gcc version + +Branch 10.X has more reliable clang version, that can finally build i2pd, +but i still recommend to use gcc, otherwise you will fight it's bugs by +your own. diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 85f4f2ec..f41e5d5c 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -1,135 +1,123 @@ cmake_minimum_required ( VERSION 2.8 ) -project ( i2pd ) +project ( "i2pd" ) -# Default build is Debug -set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall") -#set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall") - -set ( SRC_DIR ".." ) -set ( INC_DIR ".." ) - - -add_definitions ( "-std=c++0x -Wall" ) - -set ( SOURCES - CryptoConst.cpp - AddressBook.cpp - Garlic.cpp - HTTPServer.cpp - i2p.cpp - Identity.cpp - Log.cpp - NTCPSession.cpp - RouterContext.cpp - SSU.cpp - SSUData.cpp - TransitTunnel.cpp - Tunnel.cpp - TunnelGateway.cpp - UPnP.cpp - base64.cpp - HTTPProxy.cpp - I2NPProtocol.cpp - LeaseSet.cpp - NetDb.cpp - Reseed.cpp - RouterInfo.cpp - Streaming.cpp - Transports.cpp - TunnelEndpoint.cpp - TunnelPool.cpp - util.cpp - aes.cpp - Daemon.cpp - SOCKS.cpp - I2PTunnel.cpp -) +# configurale options +option(WITH_AESNI "Use AES-NI instructions set" OFF) +option(WITH_HARDENING "Use hardening compiler flags" OFF) -set ( HEADERS - CryptoConst.h - AddressBook.h - Garlic.h - HTTPServer.h - Identity.h - Log.h - NTCPSession.h - RouterContext.h - SSU.h - SSUData.h - TransitTunnel.h - Tunnel.h - TunnelGateway.h - UPnP.h - base64.h - HTTPProxy.h - I2NPProtocol.h - LeaseSet.h - NetDb.h - Reseed.h - RouterInfo.h - Streaming.h - Transports.h - TunnelEndpoint.h - TunnelPool.h - util.h - aes.h - Daemon.h - SOCKS.h - I2PTunnel.h - version.h - Signature.h +# paths +set ( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules" ) +set ( CMAKE_SOURCE_DIR ".." ) + +set (SOURCES + "${CMAKE_SOURCE_DIR}/AddressBook.cpp" + "${CMAKE_SOURCE_DIR}/CryptoConst.cpp" + "${CMAKE_SOURCE_DIR}/Daemon.cpp" + "${CMAKE_SOURCE_DIR}/Garlic.cpp" + "${CMAKE_SOURCE_DIR}/HTTPProxy.cpp" + "${CMAKE_SOURCE_DIR}/HTTPServer.cpp" + "${CMAKE_SOURCE_DIR}/I2NPProtocol.cpp" + "${CMAKE_SOURCE_DIR}/I2PTunnel.cpp" + "${CMAKE_SOURCE_DIR}/Identity.cpp" + "${CMAKE_SOURCE_DIR}/LeaseSet.cpp" + "${CMAKE_SOURCE_DIR}/Log.cpp" + "${CMAKE_SOURCE_DIR}/NTCPSession.cpp" + "${CMAKE_SOURCE_DIR}/NetDb.cpp" + "${CMAKE_SOURCE_DIR}/Reseed.cpp" + "${CMAKE_SOURCE_DIR}/RouterContext.cpp" + "${CMAKE_SOURCE_DIR}/RouterInfo.cpp" + "${CMAKE_SOURCE_DIR}/SOCKS.cpp" + "${CMAKE_SOURCE_DIR}/SSU.cpp" + "${CMAKE_SOURCE_DIR}/SSUData.cpp" + "${CMAKE_SOURCE_DIR}/Streaming.cpp" + "${CMAKE_SOURCE_DIR}/TransitTunnel.cpp" + "${CMAKE_SOURCE_DIR}/Tunnel.cpp" + "${CMAKE_SOURCE_DIR}/TunnelGateway.cpp" + "${CMAKE_SOURCE_DIR}/Transports.cpp" + "${CMAKE_SOURCE_DIR}/TunnelEndpoint.cpp" + "${CMAKE_SOURCE_DIR}/TunnelPool.cpp" + "${CMAKE_SOURCE_DIR}/UPnP.cpp" + "${CMAKE_SOURCE_DIR}/aes.cpp" + "${CMAKE_SOURCE_DIR}/base64.cpp" + "${CMAKE_SOURCE_DIR}/i2p.cpp" + "${CMAKE_SOURCE_DIR}/util.cpp" ) -if (WIN32) - list (APPEND SOURCES DeamonWin32.cpp) +file (GLOB HEADERS "${CMAKE_SOURCE_DIR}/*.h") + +# MSVS grouping +source_group ("Header Files" FILES ${HEADERS}) +source_group ("Source Files" FILES ${SOURCES}) + +# Default build is Debug +if (CMAKE_BUILD_TYPE STREQUAL "Release") + add_definitions( "-pedantic" ) else () - list (APPEND SOURCES DaemonLinux.cpp) + set(CMAKE_BUILD_TYPE Debug) endif () +# compiler flags customization (by vendor) +add_definitions ( "-Wall -Wextra" ) +if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + add_definitions( "-std=c++11" ) + if (WITH_HARDENING) + add_definitions( "-D_FORTIFY_SOURCE=2" ) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wformat -Wformat-security -Werror=format-security" ) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector --param ssp-buffer-size=4" ) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIE -pie" ) + endif () +elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + add_definitions( "-std=c++11" ) +endif () +# compiler flags customization (by system) +if (CMAKE_SYSTEM_NAME STREQUAL "Linux") + list (APPEND SOURCES "../DaemonLinux.cpp") +elseif (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + list (APPEND SOURCES "../DaemonLinux.cpp") + # "'sleep_for' is not a member of 'std::this_thread'" in gcc 4.7/4.8 + add_definitions( "-D_GLIBCXX_USE_NANOSLEEP=1" ) +elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows") + list (APPEND SOURCES "../DaemonWin32.cpp") +endif () -source_group ("Header Files" FILES ${HEADERS}) -source_group ("Source Files" FILES ${SOURCES}) - -set ( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules" ) +if (WITH_AESNI) + add_definitions ( "-maes -DAESNI" ) +endif() +# libraries find_package ( Threads REQUIRED ) find_package ( Boost COMPONENTS system filesystem regex program_options REQUIRED ) - -find_package ( CryptoPP REQUIRED ) - -# Check for libraries if(NOT DEFINED Boost_INCLUDE_DIRS) - message(FATAL_ERROR "Boost is not found, or your boost version was bellow 1.46. Please download Boost!") - return() + message(SEND_ERROR "Boost is not found, or your boost version was bellow 1.46. Please download Boost!") endif() +find_package ( CryptoPP REQUIRED ) if(NOT DEFINED CRYPTO++_INCLUDE_DIR) - message(FATAL_ERROR "Could not find Crypto++. Please download and install it first!") - return() + message(SEND_ERROR "Could not find Crypto++. Please download and install it first!") endif() +# load includes +include_directories( ${Boost_INCLUDE_DIRS} ${CRYPTO++_INCLUDE_DIR}) -# End checks - +# show summary +message(STATUS "---------------------------------------") +message(STATUS "Build type : ${CMAKE_BUILD_TYPE}") +message(STATUS "Compiler vendor : ${CMAKE_CXX_COMPILER_ID}") +message(STATUS "Compiler path : ${CMAKE_CXX_COMPILER}") +message(STATUS "Install prefix: : ${CMAKE_INSTALL_PREFIX}") +message(STATUS "Options:") +message(STATUS " AESNI : ${WITH_AESNI}") +message(STATUS " HARDENING : ${WITH_HARDENING}") +message(STATUS "---------------------------------------") -include_directories ( ${Boost_INCLUDE_DIRS} ${CRYPTO++_INCLUDE_DIR}) +add_executable ( ${PROJECT_NAME} ${SOURCES} ) - -unset ( TMP ) -foreach ( src ${SOURCES} ) - list ( APPEND TMP "${SRC_DIR}/${src}" ) -endforeach () -set ( SOURCES ${TMP} ) - -unset ( TMP ) -foreach ( hdr ${HEADERS} ) - list ( APPEND TMP "${INC_DIR}/${hdr}" ) -endforeach () -set ( HEADERS ${TMP} ) - - -add_executable ( ${PROJECT_NAME} WIN32 ${HEADERS} ${SOURCES} ) +if (WITH_HARDENING AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "-z relro -z now" ) +endif () target_link_libraries( ${PROJECT_NAME} ${Boost_LIBRARIES} ${CRYPTO++_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ) + +install(TARGETS i2pd RUNTIME DESTINATION "bin")