diff --git a/CMakeLists.txt b/CMakeLists.txt index a8c580d8f..011c6a59b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required (VERSION 2.8) set(CMAKE_LEGACY_CYGWIN_WIN32 0) # Remove when CMake >= 2.8.4 is required +set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") include (CheckFunctionExists) include (CheckStructHasMember) @@ -8,6 +9,7 @@ set (HAVE_CMAKE true) project (task) set (PROJECT_VERSION "2.5.2") +include (CXXSniffer) OPTION (ENABLE_SYNC "Enable 'task sync' support" ON) @@ -18,82 +20,6 @@ else (ENABLE_SYNC) message (WARNING "ENABLE_SYNC=OFF. Not building sync support.") endif (ENABLE_SYNC) -message ("CMAKE_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}") - -include (CheckCXXCompilerFlag) - -# NOTE: If we are to actually use C++11 features, we should either require -# a compiler that supports the -std=c++11 flag or check for the -# features used. -# Relying on -std=c++0x or even -std=gnu++0x is highly volatile. - -CHECK_CXX_COMPILER_FLAG("-std=c++11" _HAS_CXX11) -CHECK_CXX_COMPILER_FLAG("-std=c++0x" _HAS_CXX0X) -CHECK_CXX_COMPILER_FLAG("-std=gnu++0x" _HAS_GNU0X) - -if (_HAS_CXX11) - set (_CXX11_FLAGS "-std=c++11") -elseif (_HAS_CXX0X) - message (WARNING "Enabling -std=c++0x draft compile flag. Your compiler does not support the standard '-std=c++11' option. Consider upgrading.") - set (_CXX11_FLAGS "-std=c++0x") -elseif (_HAS_GNU0X) - message (WARNING "Enabling -std=gnu++0x draft compile flag. Your compiler does not support the standard '-std=c++11' option. Consider upgrading.") - set (_CXX11_FLAGS "-std=gnu++0x") -else (_HAS_CXX11) - message (FATAL_ERROR "C++11 support missing. Try upgrading your C++ compiler. If you have a good reason for using an outdated compiler, please let us know at support@taskwarrior.org.") -endif (_HAS_CXX11) - -if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") - set (_CXX11_FLAGS "${_CXX11_FLAGS} -stdlib=libc++") -endif (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") - -if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") - set (LINUX true) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - set (DARWIN true) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "kFreeBSD") - set (KFREEBSD true) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") - set (FREEBSD true) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") - set (OPENBSD true) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "NetBSD") - set (NETBSD true) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "SunOS") - set (SOLARIS true) -elseif (${CMAKE_SYSTEM_NAME} STREQUAL "GNU") - set (GNUHURD true) -elseif (${CMAKE_SYSTEM_NAME} STREQUAL "CYGWIN") - set (CYGWIN true) - # NOTE: Not setting -std=gnu++0x leads to compile errors even with - # GCC 4.8.3, and debugging those leads to insanity. Adding this - # workaround instead of fixing Cygwin. - set (_CXX11_FLAGS "-std=gnu++0x") -else (${CMAKE_SYSTEM_NAME} MATCHES "Linux") - set (UNKNOWN true) -endif (${CMAKE_SYSTEM_NAME} MATCHES "Linux") - -set (CMAKE_CXX_FLAGS "${_CXX11_FLAGS} ${CMAKE_CXX_FLAGS}") - -set (CMAKE_CXX_FLAGS "-Wall -Wsign-compare -Wreturn-type ${CMAKE_CXX_FLAGS}") - -if (NETBSD) - # Since readline, etc likely to be in /usr/pkg/lib, not standard library - # Otherwise will remove links during install - set (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) -endif (NETBSD) - -if (FREEBSD) -SET (TASK_MAN1DIR man/man1 CACHE STRING "Installation directory for man pages, section 1") -SET (TASK_MAN5DIR man/man5 CACHE STRING "Installation directory for man pages, section 5") -else (FREEBSD) -SET (TASK_MAN1DIR share/man/man1 CACHE STRING "Installation directory for man pages, section 1") -SET (TASK_MAN5DIR share/man/man5 CACHE STRING "Installation directory for man pages, section 5") -endif (FREEBSD) -SET (TASK_DOCDIR share/doc/task CACHE STRING "Installation directory for doc files") -SET (TASK_RCDIR "${TASK_DOCDIR}/rc" CACHE STRING "Installation directory for configuration files") -SET (TASK_BINDIR bin CACHE STRING "Installation directory for the binary") - message ("-- Looking for SHA1 references") if (EXISTS ${CMAKE_SOURCE_DIR}/.git/index) set (HAVE_COMMIT true) @@ -113,6 +39,17 @@ set (PACKAGE_TARNAME "${PACKAGE}") set (PACKAGE_VERSION "${VERSION}") set (PACKAGE_STRING "${PACKAGE} ${VERSION}") +if (FREEBSD) +SET (TASK_MAN1DIR man/man1 CACHE STRING "Installation directory for man pages, section 1") +SET (TASK_MAN5DIR man/man5 CACHE STRING "Installation directory for man pages, section 5") +else (FREEBSD) +SET (TASK_MAN1DIR share/man/man1 CACHE STRING "Installation directory for man pages, section 1") +SET (TASK_MAN5DIR share/man/man5 CACHE STRING "Installation directory for man pages, section 5") +endif (FREEBSD) +SET (TASK_DOCDIR share/doc/task CACHE STRING "Installation directory for doc files") +SET (TASK_RCDIR "${TASK_DOCDIR}/rc" CACHE STRING "Installation directory for configuration files") +SET (TASK_BINDIR bin CACHE STRING "Installation directory for the binary") + if (USE_GNUTLS) message ("-- Looking for GnuTLS") find_package (GnuTLS) diff --git a/cmake/CXXSniffer.cmake b/cmake/CXXSniffer.cmake new file mode 100644 index 000000000..96062263b --- /dev/null +++ b/cmake/CXXSniffer.cmake @@ -0,0 +1,51 @@ +message ("-- Configuring C++11") +message ("-- System: ${CMAKE_SYSTEM_NAME}") + +include (CheckCXXCompilerFlag) + +# NOTE: Phase out -std=gnu++0x and --std=c++0x as soon as realistically possible. +CHECK_CXX_COMPILER_FLAG("-std=c++11" _HAS_CXX11) +CHECK_CXX_COMPILER_FLAG("-std=c++0x" _HAS_CXX0X) +CHECK_CXX_COMPILER_FLAG("-std=gnu++0x" _HAS_GNU0X) + +if (_HAS_CXX11) + set (_CXX11_FLAGS "-std=c++11") +elseif (_HAS_CXX0X) + message (WARNING "Enabling -std=c++0x draft compile flag. Your compiler does not support the standard '-std=c++11' option. Consider upgrading.") + set (_CXX11_FLAGS "-std=c++0x") +elseif (_HAS_GNU0X) + message (WARNING "Enabling -std=gnu++0x draft compile flag. Your compiler does not support the standard '-std=c++11' option. Consider upgrading.") + set (_CXX11_FLAGS "-std=gnu++0x") +else (_HAS_CXX11) + message (FATAL_ERROR "C++11 support missing. Try upgrading your C++ compiler. If you have a good reason for using an outdated compiler, please let us know at support@taskwarrior.org.") +endif (_HAS_CXX11) + +if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + set (LINUX true) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set (DARWIN true) + set (_CXX11_FLAGS "${_CXX11_FLAGS} -stdlib=libc++") +elseif (${CMAKE_SYSTEM_NAME} MATCHES "kFreeBSD") + set (KFREEBSD true) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + set (FREEBSD true) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") + set (OPENBSD true) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "NetBSD") + set (NETBSD true) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "SunOS") + set (SOLARIS true) +elseif (${CMAKE_SYSTEM_NAME} STREQUAL "GNU") + set (GNUHURD true) +elseif (${CMAKE_SYSTEM_NAME} STREQUAL "CYGWIN") + set (CYGWIN true) + # NOTE: Not setting -std=gnu++0x leads to compile errors even with + # GCC 4.8.3, and debugging those leads to insanity. Adding this + # workaround instead of fixing Cygwin. + set (_CXX11_FLAGS "-std=gnu++0x") +else (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + set (UNKNOWN true) +endif (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + +set (CMAKE_CXX_FLAGS "${_CXX11_FLAGS} ${CMAKE_CXX_FLAGS}") +set (CMAKE_CXX_FLAGS "-Wall -Wextra -Wsign-compare -Wreturn-type ${CMAKE_CXX_FLAGS}")