From 1204a5e507cd23acf94ba9c10e2016626ce98425 Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 17 Sep 2014 00:16:39 +0000 Subject: [PATCH 1/6] * better CMakeLists --- build/CMakeLists.txt | 207 ++++++++++++++++++++----------------------- 1 file changed, 96 insertions(+), 111 deletions(-) diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 85f4f2ec..0dddde71 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -1,135 +1,120 @@ 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") +# configurale options +option(WITH_AESNI "Use AES-NI instructions set" OFF) +option(WITH_HARDENING "Use hardening compiler flags" OFF) -set ( SRC_DIR ".." ) -set ( INC_DIR ".." ) +# paths +set ( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules" ) +set ( CMAKE_SOURCE_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 +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" ) -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 -) - -if (WIN32) - list (APPEND SOURCES DeamonWin32.cpp) -else () - list (APPEND SOURCES DaemonLinux.cpp) -endif () - - +file (GLOB HEADERS "${CMAKE_SOURCE_DIR}/*.h") +# MSVS grouping source_group ("Header Files" FILES ${HEADERS}) source_group ("Source Files" FILES ${SOURCES}) -set ( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules" ) +# Default build is Debug +if (CMAKE_BUILD_TYPE STREQUAL "Release") + add_definitions( "-pedantic" ) +else () + 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++0x" ) + 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") +elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows") + list (APPEND SOURCES "../DaemonWin32.cpp") +endif () + +if (WITH_AESNI) + add_definitions ( "-maes -DAESNI" ) +endif() + +# libraries find_package ( Threads REQUIRED ) find_package ( Boost COMPONENTS system filesystem regex program_options REQUIRED ) +if(NOT DEFINED Boost_INCLUDE_DIRS) + message(SEND_ERROR "Boost is not found, or your boost version was bellow 1.46. Please download Boost!") +endif() 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() -endif() - 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 : ${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 "---------------------------------------") +add_executable ( ${PROJECT_NAME} ${SOURCES} ) -include_directories ( ${Boost_INCLUDE_DIRS} ${CRYPTO++_INCLUDE_DIR}) - - -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) + 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") From 136bca38cb71256cdeab2338ac230b68aeadd913 Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 17 Sep 2014 03:00:18 +0000 Subject: [PATCH 2/6] * update summary --- build/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 0dddde71..4fba7532 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -102,7 +102,8 @@ include_directories( ${Boost_INCLUDE_DIRS} ${CRYPTO++_INCLUDE_DIR}) # show summary message(STATUS "---------------------------------------") message(STATUS "Build type : ${CMAKE_BUILD_TYPE}") -message(STATUS "Compiler : ${CMAKE_CXX_COMPILER}") +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}") From d08a08acb31012adb837291fa0ecb81b2b66d35f Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 17 Sep 2014 03:30:12 +0000 Subject: [PATCH 3/6] * fix -std= option for gcc --- build/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 4fba7532..a45117a5 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -59,7 +59,7 @@ endif () # compiler flags customization (by vendor) add_definitions ( "-Wall -Wextra" ) if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - add_definitions( "-std=c++0x" ) + 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" ) From 90d4d09ca2e0eab60b903503c08a342cf20ad1c0 Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 17 Sep 2014 05:10:03 +0000 Subject: [PATCH 4/6] * freebsd build fixes --- build/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index a45117a5..ea02f4a6 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -75,6 +75,8 @@ 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 () From 2b43dfbfca3c00d78eb992b55d0546eb866469b5 Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 17 Sep 2014 05:12:05 +0000 Subject: [PATCH 5/6] + BUILD_NOTES.md --- build/BUILD_NOTES.md | 51 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 build/BUILD_NOTES.md 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. From 4685908ead71f93e0f180979af86a646ea0f838f Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 17 Sep 2014 06:03:16 +0000 Subject: [PATCH 6/6] * use hardening linker flags only with gcc --- build/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index ea02f4a6..f41e5d5c 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -114,7 +114,7 @@ message(STATUS "---------------------------------------") add_executable ( ${PROJECT_NAME} ${SOURCES} ) -if (WITH_HARDENING) +if (WITH_HARDENING AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "-z relro -z now" ) endif ()