Browse Source

Merge pull request #98 from hagen-i2p/better-cmakelists

Better cmakelists
pull/99/head
orignal 10 years ago
parent
commit
cda52beb08
  1. 51
      build/BUILD_NOTES.md
  2. 204
      build/CMakeLists.txt

51
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 <more options> .
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.

204
build/CMakeLists.txt

@ -1,135 +1,123 @@
cmake_minimum_required ( VERSION 2.8 ) cmake_minimum_required ( VERSION 2.8 )
project ( i2pd ) project ( "i2pd" )
# Default build is Debug # configurale options
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall") option(WITH_AESNI "Use AES-NI instructions set" OFF)
#set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall") option(WITH_HARDENING "Use hardening compiler flags" OFF)
set ( SRC_DIR ".." )
set ( INC_DIR ".." )
# paths
add_definitions ( "-std=c++0x -Wall" ) set ( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules" )
set ( CMAKE_SOURCE_DIR ".." )
set (SOURCES set (SOURCES
CryptoConst.cpp "${CMAKE_SOURCE_DIR}/AddressBook.cpp"
AddressBook.cpp "${CMAKE_SOURCE_DIR}/CryptoConst.cpp"
Garlic.cpp "${CMAKE_SOURCE_DIR}/Daemon.cpp"
HTTPServer.cpp "${CMAKE_SOURCE_DIR}/Garlic.cpp"
i2p.cpp "${CMAKE_SOURCE_DIR}/HTTPProxy.cpp"
Identity.cpp "${CMAKE_SOURCE_DIR}/HTTPServer.cpp"
Log.cpp "${CMAKE_SOURCE_DIR}/I2NPProtocol.cpp"
NTCPSession.cpp "${CMAKE_SOURCE_DIR}/I2PTunnel.cpp"
RouterContext.cpp "${CMAKE_SOURCE_DIR}/Identity.cpp"
SSU.cpp "${CMAKE_SOURCE_DIR}/LeaseSet.cpp"
SSUData.cpp "${CMAKE_SOURCE_DIR}/Log.cpp"
TransitTunnel.cpp "${CMAKE_SOURCE_DIR}/NTCPSession.cpp"
Tunnel.cpp "${CMAKE_SOURCE_DIR}/NetDb.cpp"
TunnelGateway.cpp "${CMAKE_SOURCE_DIR}/Reseed.cpp"
UPnP.cpp "${CMAKE_SOURCE_DIR}/RouterContext.cpp"
base64.cpp "${CMAKE_SOURCE_DIR}/RouterInfo.cpp"
HTTPProxy.cpp "${CMAKE_SOURCE_DIR}/SOCKS.cpp"
I2NPProtocol.cpp "${CMAKE_SOURCE_DIR}/SSU.cpp"
LeaseSet.cpp "${CMAKE_SOURCE_DIR}/SSUData.cpp"
NetDb.cpp "${CMAKE_SOURCE_DIR}/Streaming.cpp"
Reseed.cpp "${CMAKE_SOURCE_DIR}/TransitTunnel.cpp"
RouterInfo.cpp "${CMAKE_SOURCE_DIR}/Tunnel.cpp"
Streaming.cpp "${CMAKE_SOURCE_DIR}/TunnelGateway.cpp"
Transports.cpp "${CMAKE_SOURCE_DIR}/Transports.cpp"
TunnelEndpoint.cpp "${CMAKE_SOURCE_DIR}/TunnelEndpoint.cpp"
TunnelPool.cpp "${CMAKE_SOURCE_DIR}/TunnelPool.cpp"
util.cpp "${CMAKE_SOURCE_DIR}/UPnP.cpp"
aes.cpp "${CMAKE_SOURCE_DIR}/aes.cpp"
Daemon.cpp "${CMAKE_SOURCE_DIR}/base64.cpp"
SOCKS.cpp "${CMAKE_SOURCE_DIR}/i2p.cpp"
I2PTunnel.cpp "${CMAKE_SOURCE_DIR}/util.cpp"
) )
set ( HEADERS file (GLOB HEADERS "${CMAKE_SOURCE_DIR}/*.h")
CryptoConst.h
AddressBook.h # MSVS grouping
Garlic.h source_group ("Header Files" FILES ${HEADERS})
HTTPServer.h source_group ("Source Files" FILES ${SOURCES})
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) # Default build is Debug
list (APPEND SOURCES DeamonWin32.cpp) if (CMAKE_BUILD_TYPE STREQUAL "Release")
add_definitions( "-pedantic" )
else () else ()
list (APPEND SOURCES DaemonLinux.cpp) set(CMAKE_BUILD_TYPE Debug)
endif () 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}) if (WITH_AESNI)
source_group ("Source Files" FILES ${SOURCES}) add_definitions ( "-maes -DAESNI" )
endif()
set ( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules" )
# libraries
find_package ( Threads REQUIRED ) find_package ( Threads REQUIRED )
find_package ( Boost COMPONENTS system filesystem regex program_options REQUIRED ) find_package ( Boost COMPONENTS system filesystem regex program_options REQUIRED )
find_package ( CryptoPP REQUIRED )
# Check for libraries
if(NOT DEFINED Boost_INCLUDE_DIRS) if(NOT DEFINED Boost_INCLUDE_DIRS)
message(FATAL_ERROR "Boost is not found, or your boost version was bellow 1.46. Please download Boost!") message(SEND_ERROR "Boost is not found, or your boost version was bellow 1.46. Please download Boost!")
return()
endif() endif()
find_package ( CryptoPP REQUIRED )
if(NOT DEFINED CRYPTO++_INCLUDE_DIR) if(NOT DEFINED CRYPTO++_INCLUDE_DIR)
message(FATAL_ERROR "Could not find Crypto++. Please download and install it first!") message(SEND_ERROR "Could not find Crypto++. Please download and install it first!")
return()
endif() endif()
# load includes
# End checks
include_directories( ${Boost_INCLUDE_DIRS} ${CRYPTO++_INCLUDE_DIR}) include_directories( ${Boost_INCLUDE_DIRS} ${CRYPTO++_INCLUDE_DIR})
# show summary
unset ( TMP ) message(STATUS "---------------------------------------")
foreach ( src ${SOURCES} ) message(STATUS "Build type : ${CMAKE_BUILD_TYPE}")
list ( APPEND TMP "${SRC_DIR}/${src}" ) message(STATUS "Compiler vendor : ${CMAKE_CXX_COMPILER_ID}")
endforeach () message(STATUS "Compiler path : ${CMAKE_CXX_COMPILER}")
set ( SOURCES ${TMP} ) message(STATUS "Install prefix: : ${CMAKE_INSTALL_PREFIX}")
message(STATUS "Options:")
unset ( TMP ) message(STATUS " AESNI : ${WITH_AESNI}")
foreach ( hdr ${HEADERS} ) message(STATUS " HARDENING : ${WITH_HARDENING}")
list ( APPEND TMP "${INC_DIR}/${hdr}" ) message(STATUS "---------------------------------------")
endforeach ()
set ( HEADERS ${TMP} ) add_executable ( ${PROJECT_NAME} ${SOURCES} )
if (WITH_HARDENING AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
add_executable ( ${PROJECT_NAME} WIN32 ${HEADERS} ${SOURCES} ) 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} ) target_link_libraries( ${PROJECT_NAME} ${Boost_LIBRARIES} ${CRYPTO++_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} )
install(TARGETS i2pd RUNTIME DESTINATION "bin")

Loading…
Cancel
Save