diff --git a/CMakeLists.txt b/CMakeLists.txt index 8834d4d6..0b86b2c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,8 @@ cmake_minimum_required (VERSION 2.8.11) + +# don't use the built-in default configs +set (CMAKE_NOT_USING_CONFIG_FLAGS TRUE) + project (Hyperscan C CXX) set (HS_MAJOR_VERSION 4) @@ -6,6 +10,10 @@ set (HS_MINOR_VERSION 2) set (HS_PATCH_VERSION 0) set (HS_VERSION ${HS_MAJOR_VERSION}.${HS_MINOR_VERSION}.${HS_PATCH_VERSION}) +# since we are doing this manually, we only have three types +set (CMAKE_CONFIGURATION_TYPES "Debug;Release;RelWithDebInfo" + CACHE STRING "" FORCE) + string (TIMESTAMP BUILD_DATE "%Y-%m-%d") set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) @@ -24,7 +32,7 @@ find_package(PkgConfig QUIET) if (NOT CMAKE_BUILD_TYPE) message(STATUS "Default build type 'Release with debug info'") - set(CMAKE_BUILD_TYPE "RELWITHDEBINFO") + set(CMAKE_BUILD_TYPE RELWITHDEBINFO CACHE STRING "" FORCE ) else() string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE) message(STATUS "Build type ${CMAKE_BUILD_TYPE}") @@ -121,13 +129,7 @@ endif() CMAKE_DEPENDENT_OPTION(DUMP_SUPPORT "Dump code support; normally on, except in release builds" ON "NOT RELEASE_BUILD" OFF) -option(DISABLE_ASSERTS "Disable assert(); enabled in debug builds, disabled in release builds" FALSE) - -if (DISABLE_ASSERTS) - if (CMAKE_BUILD_TYPE STREQUAL "DEBUG") - add_definitions(-DNDEBUG) - endif() -endif() +CMAKE_DEPENDENT_OPTION(DISABLE_ASSERTS "Disable assert(); Asserts are enabled in debug builds, disabled in release builds" OFF "NOT RELEASE_BUILD" ON) option(WINDOWS_ICC "Use Intel C++ Compiler on Windows, default off, requires ICC to be set in project" OFF) @@ -139,18 +141,26 @@ if(MSVC OR MSVC_IDE) if (MSVC_VERSION LESS 1700) message(FATAL_ERROR "The project requires C++11 features.") else() + # set base flags + set(CMAKE_C_FLAGS "/DWIN32 /D_WINDOWS /W3") + set(CMAKE_C_FLAGS_DEBUG "/D_DEBUG /MDd /Zi /Od") + set(CMAKE_C_FLAGS_RELEASE "/MD /O2 /Ob2 /Oi") + set(CMAKE_C_FLAGS_RELWITHDEBINFO "/Zi /MD /O2 /Ob2 /Oi") + + set(CMAKE_CXX_FLAGS "/DWIN32 /D_WINDOWS /W3 /GR /EHsc") + set(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /MDd /Zi /Od") + set(CMAKE_CXX_FLAGS_RELEASE "/MD /O2 /Ob2 /Oi") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/Zi /MD /O2 /Ob2 /Oi") + if (WINDOWS_ICC) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Qstd=c99 /Qrestrict /QxHost /O3 /wd4267 /Qdiag-disable:remark") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Qstd=c++11 /Qrestrict /QxHost /O2 /wd4267 /wd4800 /Qdiag-disable:remark -DBOOST_DETAIL_NO_CONTAINER_FWD -D_SCL_SECURE_NO_WARNINGS") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Qstd=c99 /Qrestrict /QxHost /wd4267 /Qdiag-disable:remark") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Qstd=c++11 /Qrestrict /QxHost /wd4267 /wd4800 /Qdiag-disable:remark -DBOOST_DETAIL_NO_CONTAINER_FWD -D_SCL_SECURE_NO_WARNINGS") else() #TODO: don't hardcode arch - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /arch:AVX /O2 /wd4267") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX /O2 /wd4244 /wd4267 /wd4800 /wd2586 /wd1170 -DBOOST_DETAIL_NO_CONTAINER_FWD -D_SCL_SECURE_NO_WARNINGS") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /arch:AVX /wd4267") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX /wd4244 /wd4267 /wd4800 /wd2586 /wd1170 -DBOOST_DETAIL_NO_CONTAINER_FWD -D_SCL_SECURE_NO_WARNINGS") endif() - string(REGEX REPLACE "/RTC1" "" - CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}" ) - string(REGEX REPLACE "/RTC1" "" - CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" ) + endif() @@ -172,15 +182,33 @@ else() unset(_GXX_OUTPUT) endif() + if(OPTIMISE) + set(OPT_C_FLAG "-O3") + set(OPT_CXX_FLAG "-O2") + else() + set(OPT_C_FLAG "-O0") + set(OPT_CXX_FLAG "-O0") + endif(OPTIMISE) + + # set up base flags for build types + set(CMAKE_C_FLAGS_DEBUG "-g ${OPT_C_FLAG} -Werror") + set(CMAKE_C_FLAGS_RELWITHDEBINFO "-g ${OPT_C_FLAG}") + set(CMAKE_C_FLAGS_RELEASE "${OPT_C_FLAG}") + + set(CMAKE_CXX_FLAGS_DEBUG "-g ${OPT_CXX_FLAG} -Werror") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-g ${OPT_CXX_FLAG}") + set(CMAKE_CXX_FLAGS_RELEASE "${OPT_CXX_FLAG}") + + if (DISABLE_ASSERTS) + # usually true for release builds, false for debug + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNDEBUG") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNDEBUG") + endif() + + # set compiler flags - more are tested and added later set(EXTRA_C_FLAGS "-std=c99 -Wall -Wextra -Wshadow -Wcast-qual -fno-strict-aliasing") set(EXTRA_CXX_FLAGS "-std=c++11 -Wall -Wextra -Wshadow -Wswitch -Wreturn-type -Wcast-qual -Wno-deprecated -Wnon-virtual-dtor -fno-strict-aliasing") - if (NOT RELEASE_BUILD) - # -Werror is most useful during development, don't potentially break - # release builds - set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Werror") - set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Werror") - endif() if (NOT CMAKE_C_FLAGS MATCHES .*march.*) message(STATUS "Building for current host CPU") @@ -199,14 +227,6 @@ else() set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -fabi-version=0 -Wno-unused-local-typedefs -Wno-maybe-uninitialized") endif() - if(OPTIMISE) - set(EXTRA_C_FLAGS "-O3 ${EXTRA_C_FLAGS}") - set(EXTRA_CXX_FLAGS "-O2 ${EXTRA_CXX_FLAGS}") - else() - set(EXTRA_C_FLAGS "-O0 ${EXTRA_C_FLAGS}") - set(EXTRA_CXX_FLAGS "-O0 ${EXTRA_CXX_FLAGS}") - endif(OPTIMISE) - if (NOT(ARCH_IA32 AND RELEASE_BUILD)) set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -fno-omit-frame-pointer") set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -fno-omit-frame-pointer")