6bee34e4a6
The previous code was assuming Apple == Clang. This change should both enable LTO when using gcc on Apple and fix Clang when using it on other platforms.
144 lines
6.3 KiB
CMake
144 lines
6.3 KiB
CMake
cmake_minimum_required(VERSION 2.8.6)
|
|
|
|
set(VERSION "0.1")
|
|
# $Format:Packaged from commit %H%nset(COMMIT %h)%nset(REFS "%d")$
|
|
|
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
|
set(CMAKE_CONFIGURATION_TYPES "Debug;Release")
|
|
enable_testing()
|
|
|
|
function(set_static_flags)
|
|
if (NOT APPLE)
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")
|
|
endif()
|
|
endfunction(set_static_flags)
|
|
|
|
include_directories(src contrib/epee/include external "${CMAKE_BINARY_DIR}/version")
|
|
|
|
if(APPLE)
|
|
include_directories(SYSTEM /usr/include/malloc)
|
|
endif()
|
|
|
|
set(STATIC ${MSVC} CACHE BOOL "Link libraries statically")
|
|
|
|
if (UNIX AND NOT APPLE)
|
|
# Note that at the time of this writing the -Wstrict-prototypes flag added below will make this fail
|
|
find_package(Threads REQUIRED)
|
|
endif()
|
|
|
|
if(MSVC)
|
|
add_definitions("/bigobj /MP /W3 /GS- /D_CRT_SECURE_NO_WARNINGS /wd4996 /wd4345 /D_WIN32_WINNT=0x0600 /DWIN32_LEAN_AND_MEAN /DGTEST_HAS_TR1_TUPLE=0 /FIinline_c.h /D__SSE4_1__")
|
|
# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Dinline=__inline")
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:10485760")
|
|
if(STATIC)
|
|
foreach(VAR CMAKE_C_FLAGS_DEBUG CMAKE_CXX_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELEASE)
|
|
string(REPLACE "/MD" "/MT" ${VAR} "${${VAR}}")
|
|
endforeach()
|
|
endif()
|
|
include_directories(SYSTEM src/platform/msc)
|
|
else()
|
|
set(ARCH native CACHE STRING "CPU to build for: -march value or default")
|
|
if("${ARCH}" STREQUAL "default")
|
|
set(ARCH_FLAG "")
|
|
else()
|
|
set(ARCH_FLAG "-march=${ARCH}")
|
|
endif()
|
|
set(WARNINGS "-Wall -Wextra -Wpointer-arith -Wundef -Wvla -Wwrite-strings -Werror -Wno-error=extra -Wno-error=deprecated-declarations -Wno-error=sign-compare -Wno-error=strict-aliasing -Wno-error=type-limits -Wno-unused-parameter -Wno-error=unused-variable -Wno-error=undef -Wno-error=uninitialized")
|
|
if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
|
set(WARNINGS "${WARNINGS} -Wno-error=mismatched-tags -Wno-error=null-conversion -Wno-overloaded-shift-op-parentheses -Wno-error=shift-count-overflow -Wno-error=tautological-constant-out-of-range-compare -Wno-error=unused-private-field -Wno-error=unneeded-internal-declaration")
|
|
else()
|
|
set(WARNINGS "${WARNINGS} -Wlogical-op -Wno-error=maybe-uninitialized")
|
|
endif()
|
|
# Since gcc 4.9 the LTO format is non-standard (slim), so we need the gcc-specific ar and ranlib binaries
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9.0))
|
|
set(CMAKE_AR "gcc-ar")
|
|
set(CMAKE_RANLIB "gcc-ranlib")
|
|
endif()
|
|
if(MINGW)
|
|
set(WARNINGS "${WARNINGS} -Wno-error=unused-value")
|
|
set(MINGW_FLAG "-DWIN32_LEAN_AND_MEAN")
|
|
include_directories(SYSTEM src/platform/mingw)
|
|
else()
|
|
set(MINGW_FLAG "")
|
|
endif()
|
|
set(C_WARNINGS "-Waggregate-return -Wnested-externs -Wold-style-definition -Wstrict-prototypes")
|
|
set(CXX_WARNINGS "-Wno-reorder -Wno-missing-field-initializers")
|
|
try_compile(STATIC_ASSERT_RES "${CMAKE_CURRENT_BINARY_DIR}/static-assert" "${CMAKE_CURRENT_SOURCE_DIR}/utils/test-static-assert.c" COMPILE_DEFINITIONS "-std=c11")
|
|
if(STATIC_ASSERT_RES)
|
|
set(STATIC_ASSERT_FLAG "")
|
|
else()
|
|
set(STATIC_ASSERT_FLAG "-Dstatic_assert=_Static_assert")
|
|
endif()
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11 -D_GNU_SOURCE ${MINGW_FLAG} ${STATIC_ASSERT_FLAG} ${WARNINGS} ${C_WARNINGS} ${ARCH_FLAG} -maes")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -D_GNU_SOURCE ${MINGW_FLAG} ${WARNINGS} ${CXX_WARNINGS} ${ARCH_FLAG} -maes")
|
|
if(APPLE)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGTEST_HAS_TR1_TUPLE=0")
|
|
endif()
|
|
if(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT (CMAKE_C_COMPILER_VERSION VERSION_LESS 4.8))
|
|
set(DEBUG_FLAGS "-g3 -Og")
|
|
else()
|
|
set(DEBUG_FLAGS "-g3 -O0")
|
|
endif()
|
|
set(RELEASE_FLAGS "-Ofast -DNDEBUG -Wno-unused-variable")
|
|
if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
|
# There is a clang bug that does not allow to compile code that uses AES-NI intrinsics if -flto is enabled
|
|
set(RELEASE_FLAGS "${RELEASE_FLAGS} -flto")
|
|
endif()
|
|
#if(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT MINGW)
|
|
# set(RELEASE_FLAGS "${RELEASE_FLAGS} -fno-fat-lto-objects")
|
|
#endif()
|
|
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${DEBUG_FLAGS}")
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${DEBUG_FLAGS}")
|
|
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${RELEASE_FLAGS}")
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${RELEASE_FLAGS}")
|
|
if(STATIC AND NOT APPLE)
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")
|
|
endif()
|
|
endif()
|
|
|
|
if(STATIC)
|
|
set(Boost_USE_STATIC_LIBS ON)
|
|
set(Boost_USE_STATIC_RUNTIME ON)
|
|
endif()
|
|
find_package(Boost 1.53 REQUIRED COMPONENTS system filesystem thread date_time chrono regex serialization program_options)
|
|
if((${Boost_MAJOR_VERSION} EQUAL 1) AND (${Boost_MINOR_VERSION} EQUAL 54))
|
|
message(SEND_ERROR "Boost version 1.54 is unsupported, more details are available here http://goo.gl/RrCFmA")
|
|
endif()
|
|
include_directories(SYSTEM ${Boost_INCLUDE_DIRS})
|
|
if(MINGW)
|
|
set(Boost_LIBRARIES "${Boost_LIBRARIES};ws2_32;mswsock")
|
|
elseif(APPLE)
|
|
set(Boost_LIBRARIES "${Boost_LIBRARIES}")
|
|
elseif(NOT MSVC)
|
|
set(Boost_LIBRARIES "${Boost_LIBRARIES};rt;pthread")
|
|
endif()
|
|
|
|
set(COMMIT_ID_IN_VERSION ON CACHE BOOL "Include commit ID in version")
|
|
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/version")
|
|
if (NOT COMMIT_ID_IN_VERSION)
|
|
set(VERSION "${VERSION}-unknown")
|
|
configure_file("src/version.h.in" "version/version.h")
|
|
add_custom_target(version ALL)
|
|
elseif(DEFINED COMMIT)
|
|
string(REPLACE "." "\\." VERSION_RE "${VERSION}")
|
|
if(NOT REFS MATCHES "(\\(|, )tag: v${VERSION_RE}(\\)|, )")
|
|
set(VERSION "${VERSION}-g${COMMIT}")
|
|
endif()
|
|
configure_file("src/version.h.in" "version/version.h")
|
|
add_custom_target(version ALL)
|
|
else()
|
|
find_package(Git QUIET)
|
|
if(Git_FOUND OR GIT_FOUND)
|
|
message(STATUS "Found Git: ${GIT_EXECUTABLE}")
|
|
add_custom_target(version ALL "${CMAKE_COMMAND}" "-D" "VERSION=${VERSION}" "-D" "GIT=${GIT_EXECUTABLE}" "-D" "TO=${CMAKE_BINARY_DIR}/version/version.h" "-P" "src/version.cmake" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
|
|
else()
|
|
message(STATUS "WARNING: Git was not found!")
|
|
set(VERSION "${VERSION}-unknown")
|
|
configure_file("src/version.h.in" "version/version.h")
|
|
add_custom_target(version ALL)
|
|
endif()
|
|
endif()
|
|
|
|
add_subdirectory(external)
|
|
add_subdirectory(src)
|
|
add_subdirectory(tests)
|