| # ------------------------------------------------------------------------------ |
| # MADlib CMake Build Script |
| # ------------------------------------------------------------------------------ |
| |
| # -- Initializations that need to run even before project() |
| |
| # For Solaris, we want to use the Sun compiler |
| # See http://www.cmake.org/Bug/view.php?id=8530 |
| set(CMAKE_GENERATOR_CC suncc gcc) |
| set(CMAKE_GENERATOR_CXX sunCC g++) |
| |
| # -- CMake setup --------------------------------------------------------------- |
| |
| project(MADlib) |
| |
| # FindPostgreSQL.cmake needs at least 2.8.3. We are on the safe side and require |
| # the minimum version tested, which is 2.8.4. |
| cmake_minimum_required(VERSION 2.8.4 FATAL_ERROR) |
| |
| include(ExternalProject) |
| include(CheckCXXCompilerFlag) |
| |
| # -- Local definitions (filenames, paths, etc.) -------------------------------- |
| |
| # The default MADlib root directory should be "/usr/local/madlib" and not |
| # "/usr/local" (which is the CMake default) |
| if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) |
| set(CMAKE_INSTALL_PREFIX "/usr/local/madlib" CACHE PATH |
| "Install path prefix, prepended onto install directories." FORCE |
| ) |
| endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) |
| |
| set(MADLIB_VERSION_YML ${CMAKE_CURRENT_SOURCE_DIR}/src/config/Version.yml) |
| |
| set(MAD_THIRD_PARTY ${CMAKE_BINARY_DIR}/third_party) |
| |
| # Set the directory for tools needed during build time |
| set(MAD_BUILD_TOOLS ${CMAKE_CURRENT_SOURCE_DIR}/cmake) |
| |
| set(EXTERNALPROJECT_LIST_SEPARATOR "~!~") |
| |
| if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") |
| set(LINUX TRUE) |
| endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") |
| |
| if(${CMAKE_SYSTEM_NAME} MATCHES "SunOS") |
| set(SOLARIS TRUE) |
| endif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS") |
| |
| if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") |
| set(FREEBSD TRUE) |
| endif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") |
| |
| if(NOT CMAKE_BUILD_TYPE) |
| set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING |
| "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." |
| FORCE) |
| endif(NOT CMAKE_BUILD_TYPE) |
| |
| if(CMAKE_COMPILER_IS_GNUCC) |
| # Let's store the gcc version in a variable |
| execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion |
| OUTPUT_VARIABLE GNUCC_VERSION |
| OUTPUT_STRIP_TRAILING_WHITESPACE) |
| |
| # A useful summary of warning options can be found here: |
| # http://developer.apple.com/tools/xcode/compilercodewarnings.html |
| # Note: gcc does not implicitly set _POSIX_C_SOURCE or _XOPEN_SOURCE |
| # when using -std=c99. |
| # http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_02_01_01 |
| # We specify that we are POSIX.1-2001 compliant and XSI-conforming. We only |
| # need to specify _XOPEN_SOURCE as _POSIX_C_SOURCE will be set implicitly. |
| set(CMAKE_C_FLAGS "-std=c99 -D_GLIBCXX_USE_CXX11_ABI=0 -pedantic -Wall -Wextra -Wno-clobbered -D_XOPEN_SOURCE=600" |
| CACHE STRING |
| "Flags used by the compiler during all build types." FORCE) |
| if((CMAKE_C_COMPILER_VERSION VERSION_EQUAL 5.0) OR (CMAKE_C_COMPILER_VERSION VERSION_GREATER 5.0)) |
| # Versions 5+ fail with the "Release" build type i.e. when optimization |
| # level is -O3 or greater. |
| add_compile_options("-O2") |
| endif() |
| |
| # See comments below for C++: |
| # Weird enough, the following property is set only for C++ but not for C |
| # http://stackoverflow.com/questions/3371127/use-isystem-instead-of-i-with-cmake |
| set(CMAKE_INCLUDE_SYSTEM_FLAG_C "-isystem ") |
| elseif(CMAKE_C_COMPILER_ID STREQUAL "SunPro") |
| set(CMAKE_C_FLAGS "-xc99=%all") |
| endif() |
| |
| if(CMAKE_COMPILER_IS_GNUCXX) |
| # Let's store the gcc version in a variable |
| execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion |
| OUTPUT_VARIABLE GNUCXX_VERSION |
| OUTPUT_STRIP_TRAILING_WHITESPACE) |
| |
| # This flag is specific for i386 and x86-64 families |
| # https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/i386-and-x86-64-Options.html |
| CHECK_CXX_COMPILER_FLAG(-mno-sse2 SSE_DISABLE_OPTIONS_AVAILABLE) |
| if (SSE_DISABLE_OPTIONS_AVAILABLE) |
| set(SSE_DISABLE_OPTIONS "-mno-sse2") |
| endif() |
| |
| # We need the 1998 standard plus amendments (ISO/IEC 14882:2003) plus TR1 |
| # Unfortunately, we only get this with gnu++98 |
| # Special notes: |
| # - long long is not part of the C++ 1998/2003 standard, but it is such a |
| # common (and useful) extension that we do not want to hear warnings about |
| # it. |
| set(CMAKE_CXX_FLAGS "-std=gnu++98 -D_GLIBCXX_USE_CXX11_ABI=0 -fdiagnostics-show-option -Wall -Wextra -pedantic -Wconversion -Wno-long-long -Wno-clobbered ${SSE_DISABLE_OPTIONS} -fstrict-aliasing" |
| CACHE STRING |
| "Flags used by the compiler during all build types." FORCE) |
| |
| if((CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 5.0) OR (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 5.0)) |
| # Versions 5+ fail with the "Release" build type i.e. when optimization |
| # level is -O3 or greater. |
| add_compile_options("-O2") |
| endif() |
| # We want to include some header files as system header files in order to |
| # disable warnings. However, on Mac OS X, a CMake variable is not set |
| # correctly on Mac OS X. http://www.cmake.org/Bug/view.php?id=10837 |
| if(APPLE) |
| set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-isystem ") |
| endif(APPLE) |
| elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") |
| set(CMAKE_CXX_FLAGS "-stdlib=libstdc++") |
| endif(CMAKE_COMPILER_IS_GNUCXX) |
| |
| # force a `m4_' prefix to all builtins |
| if(FREEBSD) |
| set(M4_ARGUMENTS "-P") |
| else() |
| set(M4_ARGUMENTS "--prefix-builtins") |
| endif() |
| |
| # -- Local includes ------------------------------------------------------------ |
| |
| list(APPEND CMAKE_MODULE_PATH |
| "${MAD_BUILD_TOOLS}") |
| |
| # -- Include all parts --------------------------------------------------------- |
| |
| include(Utils) |
| include(LinuxUtils) |
| include(OSXUtils) |
| include(Options) |
| |
| # -- Get madlib version info ---------------------------------------------------- |
| # Read and parse Version.yml file |
| file(READ "${MADLIB_VERSION_YML}" _MADLIB_VERSION_CONTENTS) |
| string(REGEX REPLACE "^.*version:[ \t]*([^\n]*)\n.*" "\\1" MADLIB_VERSION_STRING "${_MADLIB_VERSION_CONTENTS}") |
| |
| string(REPLACE "-" "_" MADLIB_VERSION_STRING_NO_HYPHEN "${MADLIB_VERSION_STRING}") |
| |
| string(REGEX REPLACE "([0-9]+).*" "\\1" MADLIB_VERSION_MAJOR "${MADLIB_VERSION_STRING}") |
| string(REGEX REPLACE "[0-9]+\\.([0-9]+).*" "\\1" MADLIB_VERSION_MINOR "${MADLIB_VERSION_STRING}") |
| if("${MADLIB_VERSION_STRING}" MATCHES "[0-9]+\\.[0-9]+\\.([0-9]+).*") |
| string(REGEX REPLACE "[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" MADLIB_VERSION_PATCH "${MADLIB_VERSION_STRING}") |
| else() |
| set(MADLIB_VERSION_PATCH 0) |
| endif() |
| |
| # Save build time |
| execute_process( |
| COMMAND date -u |
| OUTPUT_VARIABLE MADLIB_BUILD_TIME |
| OUTPUT_STRIP_TRAILING_WHITESPACE) |
| # Save git revision |
| execute_process( |
| COMMAND git describe |
| WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} |
| OUTPUT_VARIABLE MADLIB_GIT_REVISION |
| ERROR_QUIET |
| RESULT_VARIABLE _RESULT |
| OUTPUT_STRIP_TRAILING_WHITESPACE) |
| if(NOT _RESULT EQUAL 0) |
| set(MADLIB_GIT_REVISION "unknown") |
| endif(NOT _RESULT EQUAL 0) |
| if(CMAKE_COMPILER_IS_GNUCC) |
| set(MADLIB_C_COMPILER "gcc ${GNUCC_VERSION}") |
| else(CMAKE_COMPILER_IS_GNUCC) |
| set(MADLIB_C_COMPILER ${CMAKE_C_COMPILER_ID}) |
| endif(CMAKE_COMPILER_IS_GNUCC) |
| if(CMAKE_COMPILER_IS_GNUCXX) |
| set(MADLIB_CXX_COMPILER "g++ ${GNUCC_VERSION}") |
| else(CMAKE_COMPILER_IS_GNUCXX) |
| set(MADLIB_CXX_COMPILER ${CMAKE_CXX_COMPILER_ID}) |
| endif(CMAKE_COMPILER_IS_GNUCXX) |
| |
| # -- Third-party dependencies: Find m4 ----------------------------------------- |
| # Unfortunately, we currently rely on GNU m4 due to option --prefix-builtins, |
| # which is not POSIX-standardized. |
| if(SOLARIS) |
| # Solaris ships GNU m4 as gm4, so we want to use that |
| find_program(M4_BINARY gm4 |
| PATHS /usr/sfw/bin |
| DOC "Path to the GNU m4 preprocessor." |
| ) |
| else() |
| find_program(M4_BINARY m4 |
| PATHS /usr/local/bin /usr/bin /bin /opt/local/bin |
| DOC "Path to the GNU m4 preprocessor." |
| ) |
| endif() |
| |
| if(NOT M4_BINARY) |
| message(FATAL_ERROR "Cannot find the m4 preprocessor.") |
| endif(NOT M4_BINARY) |
| |
| # -- Install Read-me files and license directory ------------------------------- |
| |
| install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/licenses" |
| DESTINATION . |
| COMPONENT core |
| PATTERN ".DS_Store" EXCLUDE |
| ) |
| install( |
| FILES |
| "${CMAKE_CURRENT_SOURCE_DIR}/README.md" |
| "${CMAKE_CURRENT_SOURCE_DIR}/RELEASE_NOTES" |
| DESTINATION doc |
| COMPONENT core |
| ) |
| install( |
| FILES |
| "${CMAKE_CURRENT_SOURCE_DIR}/NOTICE" |
| "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE" |
| DESTINATION . |
| COMPONENT core |
| ) |
| |
| |
| # -- Add subdirectories -------------------------------------------------------- |
| |
| add_subdirectory(src) |
| |
| # if(CMAKE_COMPILER_IS_GNUCC AND CMAKE_COMPILER_IS_GNUCXX) |
| #e.g., Clang/Clang++ does not work |
| # endif(CMAKE_COMPILER_IS_GNUCC AND CMAKE_COMPILER_IS_GNUCXX) |
| add_subdirectory(doc) |
| add_subdirectory(deploy) |
| |
| # -- Install path for specific madlib version ---------------------------------- |
| set(CMAKE_MADLIB_ROOT "${CMAKE_INSTALL_PREFIX}") |
| set(CMAKE_INSTALL_PREFIX "${CMAKE_MADLIB_ROOT}/Versions/${MADLIB_VERSION_STRING}") |
| |
| # Move bin to old_bin if upgrading from V0.6 or earlier version |
| # below script finds a directory named 'bin' and copies to 'old_bin' ignoring |
| # any error messages (eg. if 'bin' does not exist) |
| install(CODE " |
| EXECUTE_PROCESS( |
| COMMAND find ${CMAKE_MADLIB_ROOT}/bin -type d -exec cp -RPf {} ${CMAKE_MADLIB_ROOT}/old_bin \; |
| ERROR_FILE /dev/null |
| )" |
| ) |
| # remove the 'bin' directory to replace with symbolic link |
| install(CODE " |
| EXECUTE_PROCESS( |
| COMMAND find ${CMAKE_MADLIB_ROOT}/bin -depth -type d -exec rm -r {} \; |
| ERROR_FILE /dev/null |
| )" |
| ) |
| |
| # Move doc to old_doc if upgrading from V0.6 or earlier version |
| install(CODE " |
| EXECUTE_PROCESS( |
| COMMAND find ${CMAKE_MADLIB_ROOT}/doc -type d -exec cp -RPf {} ${CMAKE_MADLIB_ROOT}/old_doc \; |
| ERROR_FILE /dev/null |
| )" |
| ) |
| install(CODE " |
| EXECUTE_PROCESS( |
| COMMAND find ${CMAKE_MADLIB_ROOT}/doc -depth -type d -exec rm -r {} \; |
| ERROR_FILE /dev/null |
| )" |
| ) |
| |
| install(CODE " |
| EXECUTE_PROCESS(COMMAND ln -nsf |
| ${CMAKE_INSTALL_PREFIX} |
| ${CMAKE_MADLIB_ROOT}/Current |
| )" |
| ) |
| |
| # Create symlink bin |
| install(CODE " |
| EXECUTE_PROCESS(COMMAND ln -nsf |
| ${CMAKE_MADLIB_ROOT}/Current/bin |
| ${CMAKE_MADLIB_ROOT}/bin |
| )" |
| ) |
| |
| # Create symlink doc |
| install(CODE " |
| EXECUTE_PROCESS(COMMAND ln -nsf |
| ${CMAKE_MADLIB_ROOT}/Current/doc |
| ${CMAKE_MADLIB_ROOT}/doc |
| ) |
| ") |
| |