From 1204a5e507cd23acf94ba9c10e2016626ce98425 Mon Sep 17 00:00:00 2001
From: hagen <hagen@mail.i2p>
Date: Wed, 17 Sep 2014 00:16:39 +0000
Subject: [PATCH] * 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")