Blame CMakeLists.txt

Packit 12c978
cmake_minimum_required(VERSION 2.8.12)
Packit 12c978
project(rabbitmq-c "C")
Packit 12c978
Packit 12c978
# Enable MACOSX_RPATH by default. See: cmake --help-policy CMP0042
Packit 12c978
if (POLICY CMP0042)
Packit 12c978
  cmake_policy(SET CMP0042 NEW)
Packit 12c978
endif()
Packit 12c978
Packit 12c978
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
Packit 12c978
Packit 12c978
# Follow all steps below in order to calculate new ABI version when updating the library
Packit 12c978
# NOTE: THIS IS UNRELATED to the actual project version
Packit 12c978
#
Packit 12c978
# 1. If the library source code has changed at all since the last update, then increment revision
Packit 12c978
# 2. If any interfaces have been added, removed, or changed since the last update, increment current and set revision to 0.
Packit 12c978
# 3. If any interfaces have been added since the last public release, then increment age.
Packit 12c978
# 4. If any interfaces have been removed since the last public release, then set age to 0.
Packit 12c978
Packit 12c978
set(RMQ_SOVERSION_CURRENT   7)
Packit 12c978
set(RMQ_SOVERSION_REVISION  0)
Packit 12c978
set(RMQ_SOVERSION_AGE       3)
Packit 12c978
Packit 12c978
math(EXPR RMQ_SOVERSION_MAJOR "${RMQ_SOVERSION_CURRENT} - ${RMQ_SOVERSION_AGE}")
Packit 12c978
math(EXPR RMQ_SOVERSION_MINOR "${RMQ_SOVERSION_AGE}")
Packit 12c978
math(EXPR RMQ_SOVERSION_PATCH "${RMQ_SOVERSION_REVISION}")
Packit 12c978
Packit 12c978
set(RMQ_VERSION ${RMQ_SOVERSION_MAJOR}.${RMQ_SOVERSION_MINOR}.${RMQ_SOVERSION_PATCH})
Packit 12c978
set(RMQ_SOVERSION ${RMQ_SOVERSION_MAJOR})
Packit 12c978
Packit 12c978
file(STRINGS librabbitmq/amqp.h _API_VERSION_MAJOR REGEX "^#define AMQP_VERSION_MAJOR [0-9]+$")
Packit 12c978
file(STRINGS librabbitmq/amqp.h _API_VERSION_MINOR REGEX "^#define AMQP_VERSION_MINOR [0-9]+$")
Packit 12c978
file(STRINGS librabbitmq/amqp.h _API_VERSION_PATCH REGEX "^#define AMQP_VERSION_PATCH [0-9]+$")
Packit 12c978
Packit 12c978
string(REGEX MATCH "[0-9]+" _API_VERSION_MAJOR ${_API_VERSION_MAJOR})
Packit 12c978
string(REGEX MATCH "[0-9]+" _API_VERSION_MINOR ${_API_VERSION_MINOR})
Packit 12c978
string(REGEX MATCH "[0-9]+" _API_VERSION_PATCH ${_API_VERSION_PATCH})
Packit 12c978
Packit 12c978
# VERSION to match what is in autotools
Packit 12c978
set(VERSION ${_API_VERSION_MAJOR}.${_API_VERSION_MINOR}.${_API_VERSION_PATCH})
Packit 12c978
Packit 12c978
if (CMAKE_GENERATOR MATCHES ".*(Make|Ninja).*"
Packit 12c978
    AND NOT CMAKE_BUILD_TYPE)
Packit 12c978
  set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
Packit 12c978
  message(STATUS "CMAKE_BUILD_TYPE not specified. Creating ${CMAKE_BUILD_TYPE} build")
Packit 12c978
endif()
Packit 12c978
Packit 12c978
include(TestCInline)
Packit 12c978
include(CheckSymbolExists)
Packit 12c978
include(CheckLibraryExists)
Packit 12c978
include(CMakePushCheckState)
Packit 12c978
include(GNUInstallDirs)
Packit 12c978
include(CheckCCompilerFlag)
Packit 12c978
Packit 12c978
# Detect if we need to link against a socket library:
Packit 12c978
cmake_push_check_state()
Packit 12c978
if (WIN32)
Packit 12c978
  # Always use WinSock2 on Windows
Packit 12c978
  set(SOCKET_LIBRARIES ws2_32)
Packit 12c978
else ()
Packit 12c978
  # Is it in the default link?
Packit 12c978
  check_symbol_exists(getaddrinfo "sys/types.h;sys/socket.h;netdb.h" HAVE_GETADDRINFO)
Packit 12c978
  if (NOT (HAVE_GETADDRINFO EQUAL 1))
Packit 12c978
    SET(CMAKE_REQUIRED_LIBRARIES "socket")
Packit 12c978
    check_symbol_exists(getaddrinfo "sys/types.h;sys/socket.h;netdb.h" HAVE_GETADDRINFO2)
Packit 12c978
    if (HAVE_GETADDRINFO2 EQUAL 1)
Packit 12c978
      set(SOCKET_LIBRARIES socket)
Packit 12c978
    else ()
Packit 12c978
      SET(CMAKE_REQUIRED_LIBRARIES "socket;nsl")
Packit 12c978
      check_symbol_exists(getaddrinfo "sys/types.h;sys/socket.h;netdb.h" HAVE_GETADDRINFO3)
Packit 12c978
      if (HAVE_GETADDRINFO3 EQUAL 1)
Packit 12c978
        set(SOCKET_LIBRARIES socket nsl)
Packit 12c978
      else ()
Packit 12c978
        message(FATAL_ERROR "Cannot find name resolution library (containing symbol getaddrinfo)")
Packit 12c978
      endif ()
Packit 12c978
    endif ()
Packit 12c978
  endif ()
Packit 12c978
Packit 12c978
  set(CMAKE_REQUIRED_LIBRARIES ${SOCKET_LIBRARIES})
Packit 12c978
  check_symbol_exists(socket "sys/types.h;sys/socket.h" HAVE_SOCKET)
Packit 12c978
  if (NOT HAVE_SOCKET EQUAL 1)
Packit 12c978
    set(CMAKE_REQUIRED_LIBRARIES socket ${SOCKET_LIBRARIES})
Packit 12c978
    check_symbol_exists(socket "sys/types.h;sys/socket.h" HAVE_SOCKET2)
Packit 12c978
    if (HAVE_SOCKET2 EQUAL 1)
Packit 12c978
      set(SOCKET_LIBRARIES socket ${SOCKET_LIBRARIES})
Packit 12c978
    else ()
Packit 12c978
      set(CMAKE_REQUIRED_LIBRARIES socket nsl ${SOCKET_LIBRARIES})
Packit 12c978
      check_symbol_exists(socket "sys/types.h;sys/socket.h" HAVE_SOCKET3)
Packit 12c978
      if (HAVE_SOCKET3 EQUAL 1)
Packit 12c978
        set(SOCKET_LIBRARIES socket nsl ${SOCKET_LIBRARIES})
Packit 12c978
      else ()
Packit 12c978
        message(FATAL_ERROR "Cannot find socket library (containing symbol socket)")
Packit 12c978
      endif ()
Packit 12c978
    endif ()
Packit 12c978
  endif ()
Packit 12c978
endif ()
Packit 12c978
cmake_pop_check_state()
Packit 12c978
Packit 12c978
cmake_push_check_state()
Packit 12c978
set(CMAKE_REQUIRED_LIBRARIES ${SOCKET_LIBRARIES})
Packit 12c978
check_symbol_exists(poll poll.h HAVE_POLL)
Packit 12c978
if (NOT HAVE_POLL)
Packit 12c978
  if (WIN32)
Packit 12c978
    set(HAVE_SELECT 1)
Packit 12c978
  else()
Packit 12c978
    check_symbol_exists(select sys/select.h HAVE_SELECT)
Packit 12c978
  endif()
Packit 12c978
  if (NOT HAVE_SELECT)
Packit 12c978
    message(FATAL_ERROR "rabbitmq-c requires poll() or select() to be available")
Packit 12c978
  endif()
Packit 12c978
endif()
Packit 12c978
cmake_pop_check_state()
Packit 12c978
Packit 12c978
check_library_exists(rt clock_gettime "time.h" CLOCK_GETTIME_NEEDS_LIBRT)
Packit 12c978
check_library_exists(rt posix_spawnp "spawn.h" POSIX_SPAWNP_NEEDS_LIBRT)
Packit 12c978
if (CLOCK_GETTIME_NEEDS_LIBRT OR POSIX_SPAWNP_NEEDS_LIBRT)
Packit 12c978
  set(LIBRT rt)
Packit 12c978
endif()
Packit 12c978
Packit 12c978
option(ENABLE_SSL_SUPPORT "Enable SSL support" ON)
Packit 12c978
Packit 12c978
if (ENABLE_SSL_SUPPORT)
Packit 12c978
  find_package(OpenSSL 0.9.8 REQUIRED)
Packit 12c978
Packit 12c978
  cmake_push_check_state()
Packit 12c978
  set(THREADS_PREFER_PTHREAD_FLAG ON)
Packit 12c978
  find_package(Threads REQUIRED)
Packit 12c978
  cmake_pop_check_state()
Packit 12c978
endif()
Packit 12c978
Packit 12c978
if (MSVC)
Packit 12c978
  set(CMAKE_C_FLAGS "/W4 /nologo ${CMAKE_C_FLAGS}")
Packit 12c978
elseif (CMAKE_C_COMPILER_ID MATCHES ".*Clang")
Packit 12c978
  set(CMAKE_C_FLAGS "-Wall -Wextra -Wstrict-prototypes -Wno-unused-function -fno-common -fvisibility=hidden ${CMAKE_C_FLAGS}")
Packit 12c978
elseif (CMAKE_COMPILER_IS_GNUCC)
Packit 12c978
  set(RMQ_C_FLAGS "-Wall -Wextra -Wstrict-prototypes -Wno-unused-function -fno-common")
Packit 12c978
  execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
Packit 12c978
  if (GCC_VERSION VERSION_GREATER 4.0 OR GCC_VERSION VERSION_EQUAL 4.0)
Packit 12c978
      set(RMQ_C_FLAGS "${RMQ_C_FLAGS} -fvisibility=hidden")
Packit 12c978
  endif()
Packit 12c978
  set(CMAKE_C_FLAGS "${RMQ_C_FLAGS} ${CMAKE_C_FLAGS}")
Packit 12c978
endif ()
Packit 12c978
Packit 12c978
CHECK_C_COMPILER_FLAG("-std=gnu90" HAVE_GNU90)
Packit 12c978
if (HAVE_GNU90)
Packit 12c978
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu90")
Packit 12c978
else()
Packit 12c978
  CHECK_C_COMPILER_FLAG("-std=c90" HAVE_C90)
Packit 12c978
  if (HAVE_C90)
Packit 12c978
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c90")
Packit 12c978
  endif()
Packit 12c978
endif()
Packit 12c978
Packit 12c978
option(REGENERATE_AMQP_FRAMING "Regenerate amqp_framing.h/amqp_framing.c sources (for developer use)" OFF)
Packit 12c978
mark_as_advanced(REGENERATE_AMQP_FRAMING)
Packit 12c978
Packit 12c978
if (REGENERATE_AMQP_FRAMING)
Packit 12c978
  find_package(PythonInterp)
Packit 12c978
  if (NOT PYTHONINTERP_FOUND)
Packit 12c978
    message(FATAL_ERROR "REGENERATE_AMQP_FRAMING requires Python to be available")
Packit 12c978
  endif ()
Packit 12c978
Packit 12c978
  #Determine Python Version:
Packit 12c978
  if(PYTHON_EXECUTABLE)
Packit 12c978
    execute_process(COMMAND "${PYTHON_EXECUTABLE}" -c
Packit 12c978
      "import sys; sys.stdout.write(';'.join([str(x) for x in sys.version_info[:3]]))"
Packit 12c978
      OUTPUT_VARIABLE _VERSION
Packit 12c978
      RESULT_VARIABLE _PYTHON_VERSION_RESULT
Packit 12c978
      ERROR_QUIET)
Packit 12c978
    if(NOT _PYTHON_VERSION_RESULT)
Packit 12c978
      string(REPLACE ";" "." PYTHON_VERSION_STRING "${_VERSION}")
Packit 12c978
      list(GET _VERSION 0 PYTHON_VERSION_MAJOR)
Packit 12c978
      list(GET _VERSION 1 PYTHON_VERSION_MINOR)
Packit 12c978
      list(GET _VERSION 2 PYTHON_VERSION_PATCH)
Packit 12c978
      if(PYTHON_VERSION_PATCH EQUAL 0)
Packit 12c978
        # it's called "Python 2.7", not "2.7.0"
Packit 12c978
        string(REGEX REPLACE "\\.0$" "" PYTHON_VERSION_STRING "${PYTHON_VERSION_STRING}")
Packit 12c978
      endif()
Packit 12c978
    else()
Packit 12c978
      # sys.version predates sys.version_info, so use that
Packit 12c978
      execute_process(COMMAND "${PYTHON_EXECUTABLE}" -c "import sys; sys.stdout.write(sys.version)"
Packit 12c978
        OUTPUT_VARIABLE _VERSION
Packit 12c978
        RESULT_VARIABLE _PYTHON_VERSION_RESULT
Packit 12c978
        ERROR_QUIET)
Packit 12c978
      if(NOT _PYTHON_VERSION_RESULT)
Packit 12c978
        string(REGEX REPLACE " .*" "" PYTHON_VERSION_STRING "${_VERSION}")
Packit 12c978
        string(REGEX REPLACE "^([0-9]+)\\.[0-9]+.*" "\\1" PYTHON_VERSION_MAJOR "${PYTHON_VERSION_STRING}")
Packit 12c978
        string(REGEX REPLACE "^[0-9]+\\.([0-9])+.*" "\\1" PYTHON_VERSION_MINOR "${PYTHON_VERSION_STRING}")
Packit 12c978
        if(PYTHON_VERSION_STRING MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+.*")
Packit 12c978
          string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" PYTHON_VERSION_PATCH "${PYTHON_VERSION_STRING}")
Packit 12c978
        else()
Packit 12c978
          set(PYTHON_VERSION_PATCH "0")
Packit 12c978
        endif()
Packit 12c978
      else()
Packit 12c978
        # sys.version was first documented for Python 1.5, so assume
Packit 12c978
        # this is older.
Packit 12c978
        set(PYTHON_VERSION_STRING "1.4")
Packit 12c978
        set(PYTHON_VERSION_MAJOR "1")
Packit 12c978
        set(PYTHON_VERSION_MAJOR "4")
Packit 12c978
        set(PYTHON_VERSION_MAJOR "0")
Packit 12c978
      endif()
Packit 12c978
    endif()
Packit 12c978
    unset(_PYTHON_VERSION_RESULT)
Packit 12c978
    unset(_VERSION)
Packit 12c978
  endif(PYTHON_EXECUTABLE)
Packit 12c978
Packit 12c978
  # If we're running v3.x look for a 2to3 utility
Packit 12c978
  if (PYTHON_VERSION_MAJOR GREATER 2)
Packit 12c978
    get_filename_component(PYTHON_EXE_DIR ${PYTHON_EXECUTABLE} PATH)
Packit 12c978
    find_program(PYTHON_2TO3_EXECUTABLE
Packit 12c978
      NAMES 2to3
Packit 12c978
      HINTS ${PYTHON_EXE_DIR}
Packit 12c978
      )
Packit 12c978
Packit 12c978
    if ("PYTHON_2TO3_EXECUTABLE-NOTFOUND" STREQUAL PYTHON_2TO3_EXECUTABLE)
Packit 12c978
      message(FATAL_ERROR "Unable to find 2to3 python utility, specify python 2.7 or specify 2to3 utility")
Packit 12c978
    endif ()
Packit 12c978
  endif (PYTHON_VERSION_MAJOR GREATER 2)
Packit 12c978
Packit 12c978
Packit 12c978
  #check for json or simplejson
Packit 12c978
  execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import json"
Packit 12c978
    RESULT_VARIABLE CHECK_PYTHON_JSON_FAILED
Packit 12c978
  )
Packit 12c978
Packit 12c978
  if (CHECK_PYTHON_JSON_FAILED)
Packit 12c978
    execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import simplejson"
Packit 12c978
      RESULT_VARIABLE CHECK_PYTHON_SIMPLEJSON_FAILED
Packit 12c978
    )
Packit 12c978
Packit 12c978
    if (CHECK_PYTHON_SIMPLEJSON_FAILED)
Packit 12c978
      message(FATAL_ERROR "REGENERATE_AMQP_FRAMING requires a python with json or simplejson modules")
Packit 12c978
    endif (CHECK_PYTHON_SIMPLEJSON_FAILED)
Packit 12c978
  endif (CHECK_PYTHON_JSON_FAILED)
Packit 12c978
Packit 12c978
Packit 12c978
  find_path(AMQP_CODEGEN_DIR
Packit 12c978
    amqp_codegen.py
Packit 12c978
    PATHS ${CMAKE_CURRENT_SOURCE_DIR}/codegen
Packit 12c978
          ${CMAKE_CURRENT_SOURCE_DIR}/rabbitmq-codegen
Packit 12c978
          ${CMAKE_CURRENT_SOURCE_DIR}/../rabbitmq-codegen
Packit 12c978
          DOC "Path to directory containing amqp_codegen.py (rabbitmq-codegen)"
Packit 12c978
          NO_DEFAULT_PATH
Packit 12c978
          )
Packit 12c978
Packit 12c978
  if (AMQP_CODEGEN_DIR STREQUAL "AMQP_CODEGEN_DIR-NOTFOUND")
Packit 12c978
    message(SEND_ERROR "REGENERATE_AMQP_FRAMING requires the amqp_codegen.py script. If this is a git clone you can:\n\ngit submodule init\ngit submodule update\n\n Or set AMQP_CODEGEN_DIR to directory containing amqp_codegen.py")
Packit 12c978
  else ()
Packit 12c978
    message(STATUS "Found amqp_codegen.py in ${AMQP_CODEGEN_DIR}")
Packit 12c978
  endif()
Packit 12c978
endif (REGENERATE_AMQP_FRAMING)
Packit 12c978
Packit 12c978
find_package(POPT)
Packit 12c978
find_package(XmlTo)
Packit 12c978
find_package(Doxygen)
Packit 12c978
Packit 12c978
if (POPT_FOUND AND XmlTo_FOUND)
Packit 12c978
  set(DO_DOCS ON)
Packit 12c978
endif()
Packit 12c978
Packit 12c978
Packit 12c978
option(BUILD_SHARED_LIBS "Build rabbitmq-c as a shared library" ON)
Packit 12c978
option(BUILD_STATIC_LIBS "Build rabbitmq-c as a static library" ON)
Packit 12c978
Packit 12c978
option(BUILD_EXAMPLES "Build Examples" ON)
Packit 12c978
option(BUILD_TOOLS "Build Tools (requires POPT Library)" ${POPT_FOUND})
Packit 12c978
option(BUILD_TOOLS_DOCS "Build man pages for Tools (requires xmlto)" ${DO_DOCS})
Packit 12c978
option(BUILD_TESTS "Build tests (run tests with make test)" ON)
Packit 12c978
option(BUILD_API_DOCS "Build Doxygen API docs" ${DOXYGEN_FOUND})
Packit 12c978
Packit 12c978
if (NOT BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS)
Packit 12c978
    message(FATAL_ERROR "One or both of BUILD_SHARED_LIBS or BUILD_STATIC_LIBS must be set to ON to build")
Packit 12c978
endif()
Packit 12c978
Packit 12c978
add_subdirectory(librabbitmq)
Packit 12c978
Packit 12c978
if (BUILD_EXAMPLES)
Packit 12c978
  add_subdirectory(examples)
Packit 12c978
endif ()
Packit 12c978
Packit 12c978
if (BUILD_TOOLS)
Packit 12c978
  if (POPT_FOUND)
Packit 12c978
    add_subdirectory(tools)
Packit 12c978
  else ()
Packit 12c978
    message(WARNING "POpt library was not found. Tools will not be built")
Packit 12c978
  endif ()
Packit 12c978
endif ()
Packit 12c978
Packit 12c978
if (BUILD_TESTS)
Packit 12c978
  if (NOT BUILD_STATIC_LIBS)
Packit 12c978
    message(FATAL_ERROR
Packit 12c978
      "Tests can only be built against static libraries "
Packit 12c978
      "(set BUILD_STATIC_LIBS=ON)")
Packit 12c978
  endif ()
Packit 12c978
  enable_testing()
Packit 12c978
  add_subdirectory(tests)
Packit 12c978
endif (BUILD_TESTS)
Packit 12c978
Packit 12c978
if (BUILD_API_DOCS)
Packit 12c978
  if (NOT DOXYGEN_FOUND)
Packit 12c978
    message(FATAL_ERROR "Doxygen is required to build the API documentation")
Packit 12c978
  endif ()
Packit 12c978
  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/docs/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/docs/Doxyfile @ONLY)
Packit 12c978
Packit 12c978
  add_custom_target(docs
Packit 12c978
    COMMAND ${DOXYGEN_EXECUTABLE}
Packit 12c978
    VERBATIM
Packit 12c978
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/docs
Packit 12c978
    DEPENDS rabbitmq
Packit 12c978
    COMMENT "Generating API documentation"
Packit 12c978
    SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/docs/Doxyfile.in
Packit 12c978
    )
Packit 12c978
endif ()
Packit 12c978
Packit 12c978
set(libs_private ${SOCKET_LIBRARIES} ${LIBRT})
Packit 12c978
if (ENABLE_SSL_SUPPORT)
Packit 12c978
  set(requires_private "openssl")
Packit 12c978
  set(libs_private ${libs_private} ${CMAKE_THREAD_LIBS_INIT})
Packit 12c978
endif()
Packit 12c978
Packit 12c978
set(prefix ${CMAKE_INSTALL_PREFIX})
Packit 12c978
set(exec_prefix "\${prefix}")
Packit 12c978
set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
Packit 12c978
set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
Packit 12c978
Packit 12c978
configure_file(cmake/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/librabbitmq/config.h)
Packit 12c978
configure_file(librabbitmq.pc.in ${CMAKE_CURRENT_BINARY_DIR}/librabbitmq.pc @ONLY)
Packit 12c978
Packit 12c978
install(FILES
Packit 12c978
  ${CMAKE_CURRENT_BINARY_DIR}/librabbitmq.pc
Packit 12c978
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
Packit 12c978
  )
Packit 12c978
Packit 12c978
if (BUILD_SHARED_LIBS)
Packit 12c978
  message(STATUS "Building rabbitmq as a shared library - yes")
Packit 12c978
else ()
Packit 12c978
  message(STATUS "Building rabbitmq as a shared library - no")
Packit 12c978
endif ()
Packit 12c978
Packit 12c978
if (BUILD_STATIC_LIBS)
Packit 12c978
  message(STATUS "Building rabbitmq as a static library - yes")
Packit 12c978
else ()
Packit 12c978
  message(STATUS "Building rabbitmq as a static library - no")
Packit 12c978
endif ()