CMakeLists.txt 32.9 KB
Newer Older
1 2
# CMake build script for ZeroMQ

3 4 5 6 7
cmake_minimum_required (VERSION 2.8.12)
project (ZeroMQ)

list (INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR}")

8 9 10
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=gnu++11" COMPILER_SUPPORTS_CXX11)
if(COMPILER_SUPPORTS_CXX11)
11
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
12 13 14 15
endif()
include(CheckCCompilerFlag)
CHECK_C_COMPILER_FLAG("-std=gnu11" COMPILER_SUPPORTS_C11)
if(COMPILER_SUPPORTS_C11)
16
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11")
17 18
endif()

19 20 21
# Will be used to add flags to pkg-config useful when apps want to statically link
set (pkg_config_libs_private "")

22 23 24 25
option (WITH_OPENPGM "Build with support for OpenPGM" OFF)
option (WITH_VMCI "Build with support for VMware VMCI socket" OFF)

if (APPLE)
26
    option (ZMQ_BUILD_FRAMEWORK "Build as OS X framework" OFF)
27 28 29 30 31 32 33 34 35 36 37 38
endif ()

# Select curve encryption library, defaults to tweetnacl
# To use libsodium instead, use --with-libsodium (must be installed)
# To disable curve, use --disable-curve

option (WITH_LIBSODIUM "Use libsodium instead of built-in tweetnacl" OFF)
option (ENABLE_CURVE "Enable CURVE security" ON)

if (NOT ENABLE_CURVE)
    message (STATUS "CURVE security is disabled")

39
elseif (WITH_LIBSODIUM)
40 41 42 43 44 45
    find_package (Sodium)
    if (SODIUM_FOUND)
        message (STATUS "Using libsodium for CURVE security")
        include_directories (${SODIUM_INCLUDE_DIRS})

        # On Solaris, libsodium depends on libssp
46
        if (${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
47 48
            target_link_libraries (libzmq ssp)
        endif ()
49
        set (ZMQ_USE_LIBSODIUM 1)
50
        set (ZMQ_HAVE_CURVE 1)
51
        set (pkg_config_libs_private "${pkg_config_libs_private} -lsodium")
52 53 54 55 56 57 58
    else ()
        message (FATAL_ERROR
            "libsodium is not installed. Install it, then run CMake again")
    endif ()

else ()
    message (STATUS "Using tweetnacl for CURVE security")
59 60 61
    list (APPEND sources ${CMAKE_CURRENT_SOURCE_DIR}/src/tweetnacl.c)
    set (ZMQ_USE_TWEETNACL 1)
    set (ZMQ_HAVE_CURVE 1)
62 63
endif ()

64 65 66 67 68 69 70 71 72 73 74 75 76 77
set(SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")

if (EXISTS "${SOURCE_DIR}/.git")
    OPTION (ENABLE_DRAFTS "Build and install draft classes and methods" ON)
else ()
    OPTION (ENABLE_DRAFTS "Build and install draft classes and methods" OFF)
endif ()
IF (ENABLE_DRAFTS)
    ADD_DEFINITIONS (-DZMQ_BUILD_DRAFT_API)
    set (pkg_config_defines "-DZMQ_BUILD_DRAFT_API=1")
ELSE (ENABLE_DRAFTS)
    set (pkg_config_defines "")
ENDIF (ENABLE_DRAFTS)

78 79 80 81 82
option (WITH_MILITANT "Enable militant assertions" OFF)
if (WITH_MILITANT)
    add_definitions(-DZMQ_ACT_MILITANT)
endif()

83
set (POLLER "" CACHE STRING "Choose polling system. valid values are
84
                            kqueue, epoll, devpoll, pollset, poll or select [default=autodetect]")
85

86 87 88 89 90 91 92 93 94
include (CheckFunctionExists)
include (CheckTypeSize)

if (POLLER STREQUAL "")
    set (CMAKE_REQUIRED_INCLUDES sys/event.h)
    check_function_exists (kqueue HAVE_KQUEUE)
    set (CMAKE_REQUIRED_INCLUDES)
    if (HAVE_KQUEUE)
        set (POLLER "kqueue")
95
    endif()
96 97 98 99 100 101 102 103
endif ()

if (POLLER STREQUAL "")
    set (CMAKE_REQUIRED_INCLUDES sys/epoll.h)
    check_function_exists (epoll_create HAVE_EPOLL)
    set (CMAKE_REQUIRED_INCLUDES)
    if (HAVE_EPOLL)
        set (POLLER "epoll")
104 105 106 107
        check_function_exists (epoll_create1 HAVE_EPOLL_CLOEXEC)
        if (HAVE_EPOLL_CLOEXEC)
            set (ZMQ_USE_EPOLL_CLOEXEC 1)
        endif ()
108 109 110 111 112 113 114 115 116 117 118 119
    endif ()
endif ()

if (POLLER STREQUAL "")
    set (CMAKE_REQUIRED_INCLUDES sys/devpoll.h)
    check_type_size ("struct pollfd" DEVPOLL)
    set (CMAKE_REQUIRED_INCLUDES)
    if (HAVE_DEVPOLL)
        set (POLLER "devpoll")
    endif ()
endif ()

120 121 122 123 124 125 126 127 128
if (POLLER STREQUAL "")
    set (CMAKE_REQUIRED_INCLUDES sys/pollset.h)
    check_function_exists (pollset_create HAVE_POLLSET)
    set (CMAKE_REQUIRED_INCLUDES)
    if (HAVE_POLLSET)
        set (POLLER "pollset")
    endif()
endif ()

129 130 131 132 133 134 135 136
if (POLLER STREQUAL "")
    set (CMAKE_REQUIRED_INCLUDES poll.h)
    check_function_exists (poll HAVE_POLL)
    set (CMAKE_REQUIRED_INCLUDES)
    if (HAVE_POLL)
        set (POLLER "poll")
    endif ()
endif ()
137

138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
if (POLLER STREQUAL "")
    if (WIN32)
        set (CMAKE_REQUIRED_INCLUDES winsock2.h)
        set (HAVE_SELECT 1)
    else ()
        set (CMAKE_REQUIRED_INCLUDES sys/select.h)
        check_function_exists (select HAVE_SELECT)
        set (CMAKE_REQUIRED_INCLUDES)
    endif ()
    if (HAVE_SELECT)
        set (POLLER "select")
    else ()
        message (FATAL_ERROR
            "Could not autodetect polling method")
    endif ()
endif ()
154

155 156 157
if (POLLER STREQUAL "kqueue"
 OR POLLER STREQUAL "epoll"
 OR POLLER STREQUAL "devpoll"
158
 OR POLLER STREQUAL "pollset"
159 160 161 162 163 164 165 166
 OR POLLER STREQUAL "poll"
 OR POLLER STREQUAL "select")
    message (STATUS "Detected ${POLLER} polling method")
    string (TOUPPER ${POLLER} UPPER_POLLER)
    set (ZMQ_USE_${UPPER_POLLER} 1)
else ()
    message (FATAL_ERROR "Invalid polling method")
endif ()
167

168 169
set (ZMQ_CMAKE_MODULES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/builds/cmake/Modules)
list (APPEND CMAKE_MODULE_PATH ${ZMQ_CMAKE_MODULES_DIR})
170

171 172 173 174 175 176 177 178 179 180
include (TestZMQVersion)
include (ZMQSourceRunChecks)
include (CheckIncludeFiles)
include (CheckLibraryExists)
include (CheckCCompilerFlag)
include (CheckCXXCompilerFlag)
include (CheckCSourceCompiles)
include (CheckCSourceRuns)
include (CMakeDependentOption)
include (CheckCXXSymbolExists)
181

182 183 184 185
check_include_files (ifaddrs.h ZMQ_HAVE_IFADDRS)
check_include_files (windows.h ZMQ_HAVE_WINDOWS)
check_include_files (sys/uio.h ZMQ_HAVE_UIO)
check_include_files (sys/eventfd.h ZMQ_HAVE_EVENTFD)
186 187 188
if (ZMQ_HAVE_EVENTFD)
  zmq_check_efd_cloexec ()
endif ()
189

190 191 192 193
check_library_exists (ws2_32 fopen "" HAVE_WS2_32) # TODO: Why doesn't something logical like WSAStartup work?
check_library_exists (ws2 fopen "" HAVE_WS2)
check_library_exists (rpcrt4 fopen "" HAVE_RPCRT4) # UuidCreateSequential
check_library_exists (iphlpapi fopen "" HAVE_IPHLAPI) # GetAdaptersAddresses
194

195 196
check_cxx_symbol_exists (SO_PEERCRED sys/socket.h ZMQ_HAVE_SO_PEERCRED)
check_cxx_symbol_exists (LOCAL_PEERCRED sys/socket.h ZMQ_HAVE_LOCAL_PEERCRED)
197

198
find_library (RT_LIBRARY rt)
199

200
find_package (Threads)
Matt Arsenault's avatar
Matt Arsenault committed
201

202

203 204 205 206 207 208 209 210
if (WIN32 AND NOT CYGWIN)
  if (NOT HAVE_WS2_32 AND NOT HAVE_WS2)
    message (FATAL_ERROR "Cannot link to ws2_32 or ws2")
  endif ()

  if (NOT HAVE_RPCRT4)
    message (FATAL_ERROR "Cannot link to rpcrt4")
  endif ()
211

212 213 214 215
  if (NOT HAVE_IPHLAPI)
    message (FATAL_ERROR "Cannot link to iphlapi")
  endif ()
endif ()
216

217 218 219
set (CMAKE_REQUIRED_LIBRARIES rt)
check_function_exists (clock_gettime HAVE_CLOCK_GETTIME)
set (CMAKE_REQUIRED_LIBRARIES)
220

221 222 223
set (CMAKE_REQUIRED_INCLUDES unistd.h)
check_function_exists (fork HAVE_FORK)
set (CMAKE_REQUIRED_INCLUDES)
Frank's avatar
Frank committed
224

225 226 227
set (CMAKE_REQUIRED_INCLUDES sys/time.h)
check_function_exists (gethrtime HAVE_GETHRTIME)
set (CMAKE_REQUIRED_INCLUDES)
228

229 230 231 232
set (CMAKE_REQUIRED_INCLUDES stdlib.h)
check_function_exists (mkdtemp HAVE_MKDTEMP)
set (CMAKE_REQUIRED_INCLUDES)

233
add_definitions (-D_REENTRANT -D_THREAD_SAFE)
234
add_definitions (-DZMQ_CUSTOM_PLATFORM_HPP)
235

236
option (ENABLE_EVENTFD "Enable/disable eventfd" ZMQ_HAVE_EVENTFD)
237

238 239
macro (zmq_check_cxx_flag_prepend flag)
  check_cxx_compiler_flag ("${flag}" HAVE_FLAG_${flag})
240

241 242 243 244
  if (HAVE_FLAG_${flag})
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}")
  endif ()
endmacro ()
245 246


247 248
if (MSVC)
  zmq_check_cxx_flag_prepend ("/W3")
249

250 251 252 253 254 255 256 257
  if (MSVC_IDE)
    set (MSVC_TOOLSET "-${CMAKE_VS_PLATFORM_TOOLSET}")
  else ()
    set (MSVC_TOOLSET "")
  endif ()
else ()
  zmq_check_cxx_flag_prepend ("-Wall")
endif ()
258

259 260 261
if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  zmq_check_cxx_flag_prepend ("-Wextra")
endif ()
262

263 264 265
#   TODO: why is -Wno-long-long defined differently than in configure.ac?
zmq_check_cxx_flag_prepend ("-Wno-long-long")
zmq_check_cxx_flag_prepend ("-Wno-uninitialized")
266

267 268
option (LIBZMQ_PEDANTIC "" ON)
option (LIBZMQ_WERROR "" OFF)
269

270 271
if (LIBZMQ_PEDANTIC)
  zmq_check_cxx_flag_prepend ("-pedantic")
272

273 274 275
  if (${CMAKE_CXX_COMPILER_ID} MATCHES "Intel")
    zmq_check_cxx_flag_prepend ("-strict-ansi")
  endif ()
276

277 278 279 280
  if (${CMAKE_CXX_COMPILER_ID} MATCHES "SunPro")
    zmq_check_cxx_flag_prepend ("-compat=5")
  endif ()
endif ()
281

282 283 284 285
if (LIBZMQ_WERROR)
  zmq_check_cxx_flag_prepend ("-Werror")
  zmq_check_cxx_flag_prepend ("-errwarn=%all")
endif ()
286 287


288 289 290
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^sparc")
  zmq_check_cxx_flag_prepend ("-mcpu=v9")
endif ()
291

292 293 294
if (${CMAKE_CXX_COMPILER_ID} MATCHES "SunPro")
  zmq_check_cxx_flag_prepend ("-features=zla")
endif ()
295

296

297 298 299
if (CMAKE_SYSTEM_NAME MATCHES "SunOS" OR CMAKE_SYSTEM_NAME MATCHES "NetBSD")
  message (STATUS "Checking whether atomic operations can be used")
  check_c_source_compiles (
300 301 302
  "
   #include <atomic.h>

303
    int main ()
304 305
    {
      uint32_t value;
306
      atomic_cas_32 (&value, 0, 0);
307 308 309 310 311
      return 0;
    }
    "
    HAVE_ATOMIC_H)

312 313 314 315
  if (NOT HAVE_ATOMIC_H)
    set (ZMQ_FORCE_MUTEXES 1)
  endif ()
endif ()
316 317 318


#-----------------------------------------------------------------------------
319 320 321 322 323 324
zmq_check_sock_cloexec ()
zmq_check_so_keepalive ()
zmq_check_tcp_keepcnt ()
zmq_check_tcp_keepidle ()
zmq_check_tcp_keepintvl ()
zmq_check_tcp_keepalive ()
325
zmq_check_tcp_tipc ()
326
zmq_check_pthread_setname ()
327 328


329
if (    CMAKE_SYSTEM_NAME MATCHES "Linux"
330 331 332
    OR CMAKE_SYSTEM_NAME MATCHES "GNU/kFreeBSD"
    OR CMAKE_SYSTEM_NAME MATCHES "GNU/Hurd"
    OR CYGWIN)
333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
  add_definitions (-D_GNU_SOURCE)
elseif (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
  add_definitions (-D__BSD_VISIBLE)
elseif (CMAKE_SYSTEM_NAME MATCHES "NetBSD")
  add_definitions (-D_NETBSD_SOURCE)
elseif (CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
  add_definitions (-D_OPENBSD_SOURCE)
elseif (CMAKE_SYSTEM_NAME MATCHES "SunOS")
  add_definitions (-D_PTHREADS)
elseif (CMAKE_SYSTEM_NAME MATCHES "HP-UX")
  add_definitions (-D_POSIX_C_SOURCE=200112L)
  zmq_check_cxx_flag_prepend (-Ae)
elseif (CMAKE_SYSTEM_NAME MATCHES "Darwin")
  add_definitions (-D_DARWIN_C_SOURCE)
endif ()

set (CMAKE_PYTHON_VERSION 2.7 2.6 2.5 2.4)
find_package (PythonInterp)
find_package (AsciiDoc)

cmake_dependent_option (WITH_DOC "Build Reference Guide documentation (requires DocBook)" ON
354
                       "PYTHONINTERP_FOUND;ASCIIDOC_FOUND" OFF)
355

356 357 358 359 360 361 362 363
if (MSVC)
  if (WITH_OPENPGM)
    #   set (OPENPGM_ROOT "" CACHE PATH "Location of OpenPGM")
    set (OPENPGM_VERSION_MAJOR 5)
    set (OPENPGM_VERSION_MINOR 2)
    set (OPENPGM_VERSION_MICRO 122)
    if (CMAKE_CL_64)
      find_path (OPENPGM_ROOT include/pgm/pgm.h
364 365 366
                PATHS
                "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Miru\\OpenPGM ${OPENPGM_VERSION_MAJOR}.${OPENPGM_VERSION_MINOR}.${OPENPGM_VERSION_MICRO}]"
                NO_DEFAULT_PATH
367 368 369 370
               )
      message (STATUS "OpenPGM x64 detected - ${OPENPGM_ROOT}")
    else ()
      find_path (OPENPGM_ROOT include/pgm/pgm.h
371 372 373 374
                PATHS
                "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Miru\\OpenPGM ${OPENPGM_VERSION_MAJOR}.${OPENPGM_VERSION_MINOR}.${OPENPGM_VERSION_MICRO}]"
                "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Miru\\OpenPGM ${OPENPGM_VERSION_MAJOR}.${OPENPGM_VERSION_MINOR}.${OPENPGM_VERSION_MICRO}]"
                NO_DEFAULT_PATH
375 376 377 378 379 380
               )
      message (STATUS "OpenPGM x86 detected - ${OPENPGM_ROOT}")
    endif (CMAKE_CL_64)
    set (OPENPGM_INCLUDE_DIRS ${OPENPGM_ROOT}/include)
    set (OPENPGM_LIBRARY_DIRS ${OPENPGM_ROOT}/lib)
    set (OPENPGM_LIBRARIES
381 382
      optimized libpgm${MSVC_TOOLSET}-mt-${OPENPGM_VERSION_MAJOR}_${OPENPGM_VERSION_MINOR}_${OPENPGM_VERSION_MICRO}.lib
      debug libpgm${MSVC_TOOLSET}-mt-gd-${OPENPGM_VERSION_MAJOR}_${OPENPGM_VERSION_MINOR}_${OPENPGM_VERSION_MICRO}.lib)
383 384 385
  endif ()
else ()
  if (WITH_OPENPGM)
386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405
    #  message (FATAL_ERROR "WITH_OPENPGM not implemented")
    
    if (NOT OPENPGM_PKGCONFIG_NAME)
      SET (OPENPGM_PKGCONFIG_NAME "openpgm-5.2")
    endif(NOT OPENPGM_PKGCONFIG_NAME)
    
    SET (OPENPGM_PKGCONFIG_NAME ${OPENPGM_PKGCONFIG_NAME} CACHE STRING 
      "Name pkg-config shall use to find openpgm libraries and include paths"
      FORCE )
    
    find_package(PkgConfig)
    pkg_check_modules (OPENPGM  ${OPENPGM_PKGCONFIG_NAME})

    if (OPENPGM_FOUND)
        message (STATUS ${OPENPGM_PKGCONFIG_NAME}" found")
    else ()
        message (FATAL_ERROR
            ${OPENPGM_PKGCONFIG_NAME}"  not found. openpgm is searchd via `pkg-config ${OPENPGM_PKGCONFIG_NAME}`. Consider providing a valid OPENPGM_PKGCONFIG_NAME")
    endif ()

406
    # DSO symbol visibility for openpgm
407
    if (HAVE_FLAG_VISIBILITY_HIDDEN)
408

409
    elseif (HAVE_FLAG_LDSCOPE_HIDDEN)
410
    
411 412 413
    endif ()
  endif ()
endif ()
414

415 416 417 418

#-----------------------------------------------------------------------------
# force off-tree build

419 420
if (${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR})
message (FATAL_ERROR "CMake generation is not allowed within the source directory!
421 422
Remove the CMakeCache.txt file and try again from another folder, e.g.:

423
   rm CMakeCache.txt
424 425 426 427
   mkdir cmake-make
   cd cmake-make
   cmake ..
")
428
endif ()
429 430 431 432

#-----------------------------------------------------------------------------
# default to Release build

433
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
434 435
  # CMAKE_BUILD_TYPE is not used for multi-configuration generators like Visual Studio/XCode
  # which instead use CMAKE_CONFIGURATION_TYPES
436
  set (CMAKE_BUILD_TYPE Release CACHE STRING
437 438
      "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
      FORCE)
439
endif ()
440

441 442
set (EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/bin)
set (LIBRARY_OUTPUT_PATH  ${CMAKE_CURRENT_BINARY_DIR}/lib)
Doron Somech's avatar
Doron Somech committed
443

444 445 446
#-----------------------------------------------------------------------------
# platform specifics

xantares's avatar
xantares committed
447
if (WIN32)
448 449
    #   Socket limit is 16K (can be raised arbitrarily)
    add_definitions (-DFD_SETSIZE=16384)
450
    add_definitions (-D_CRT_SECURE_NO_WARNINGS)
451
    add_definitions (-D_WINSOCK_DEPRECATED_NO_WARNINGS)
xantares's avatar
xantares committed
452
endif ()
453

454
if (MSVC)
455
  # Parallel make.
456
  set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
457

458 459
  # Optimization flags.
  # http://msdn.microsoft.com/en-us/magazine/cc301698.aspx
460 461 462 463 464 465 466
  if (NOT ${CMAKE_BUILD_TYPE} MATCHES "Debug")
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GL")
    set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LTCG")
    set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LTCG")
    set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /LTCG")
  endif ()
endif ()
467 468


469 470 471
#-----------------------------------------------------------------------------
# source files

472
set (cxx-sources
473
        precompiled.cpp
474
        address.cpp
somdoron's avatar
somdoron committed
475
        client.cpp
476 477
        clock.cpp
        ctx.cpp
478 479
        curve_client.cpp
        curve_server.cpp
480 481
        dealer.cpp
        devpoll.cpp
482
        dgram.cpp
483 484 485 486 487 488 489 490 491 492 493 494 495
        dist.cpp
        epoll.cpp
        err.cpp
        fq.cpp
        io_object.cpp
        io_thread.cpp
        ip.cpp
        ipc_address.cpp
        ipc_connecter.cpp
        ipc_listener.cpp
        kqueue.cpp
        lb.cpp
        mailbox.cpp
496
        mailbox_safe.cpp
497
        mechanism.cpp
Frank's avatar
Frank committed
498
        metadata.cpp
499 500 501 502 503
        msg.cpp
        mtrie.cpp
        object.cpp
        options.cpp
        own.cpp
504
        null_mechanism.cpp
505 506 507 508 509
        pair.cpp
        pgm_receiver.cpp
        pgm_sender.cpp
        pgm_socket.cpp
        pipe.cpp
510 511
        plain_client.cpp
        plain_server.cpp
512 513
        poll.cpp
        poller_base.cpp
514
        pollset.cpp
515 516 517 518 519 520 521 522 523 524 525 526
        proxy.cpp
        pub.cpp
        pull.cpp
        push.cpp
        random.cpp
        raw_encoder.cpp
        raw_decoder.cpp
        reaper.cpp
        rep.cpp
        req.cpp
        router.cpp
        select.cpp
somdoron's avatar
somdoron committed
527
        server.cpp
528 529 530
        session_base.cpp
        signaler.cpp
        socket_base.cpp
Richard Newton's avatar
Richard Newton committed
531 532
        socks.cpp
        socks_connecter.cpp
Richard Newton's avatar
Richard Newton committed
533
        stream.cpp
534 535 536 537 538 539 540 541 542 543
        stream_engine.cpp
        sub.cpp
        tcp.cpp
        tcp_address.cpp
        tcp_connecter.cpp
        tcp_listener.cpp
        thread.cpp
        trie.cpp
        v1_decoder.cpp
        v1_encoder.cpp
544 545
        v2_decoder.cpp
        v2_encoder.cpp
546 547 548
        xpub.cpp
        xsub.cpp
        zmq.cpp
Jens Auer's avatar
Jens Auer committed
549
        zmq_utils.cpp
550
        decoder_allocators.cpp
551
        socket_poller.cpp
somdoron's avatar
somdoron committed
552
        timers.cpp
somdoron's avatar
somdoron committed
553 554
        config.hpp
        radio.cpp
555 556
        dish.cpp
        udp_engine.cpp
somdoron's avatar
somdoron committed
557 558 559
        udp_address.cpp
        scatter.cpp
        gather.cpp)
Matt Arsenault's avatar
Matt Arsenault committed
560

561
set (rc-sources version.rc)
Matt Arsenault's avatar
Matt Arsenault committed
562

563
if (MINGW)
Matt Arsenault's avatar
Matt Arsenault committed
564
  # Generate the right type when using -m32 or -m64
565 566 567 568
  macro (set_rc_arch rc_target)
    set (CMAKE_RC_COMPILER_INIT windres)
    enable_language (RC)
    set (CMAKE_RC_COMPILE_OBJECT
Maarten Ditzel's avatar
Maarten Ditzel committed
569
        "<CMAKE_RC_COMPILER> <FLAGS> -O coff --target=${rc_target} <DEFINES> -i <SOURCE> -o <OBJECT>")
570
  endmacro ()
Matt Arsenault's avatar
Matt Arsenault committed
571

572 573
  if (NOT CMAKE_SYSTEM_PROCESSOR)
    set (CMAKE_SYSTEM_PROCESSOR ${CMAKE_HOST_SYSTEM_PROCESSOR})
574 575
  endif ()

576
  if (    CMAKE_SYSTEM_PROCESSOR MATCHES "i386"
577 578 579
      OR CMAKE_SYSTEM_PROCESSOR MATCHES "i486"
      OR CMAKE_SYSTEM_PROCESSOR MATCHES "i586"
      OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686"
Matt Arsenault's avatar
Matt Arsenault committed
580
     # This also happens on x86_64 systems...what a worthless variable
581 582 583
      OR CMAKE_SYSTEM_PROCESSOR MATCHES "x86"
      OR CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64"
      OR CMAKE_SYSTEM_PROCESSOR MATCHES "amd64")
Matt Arsenault's avatar
Matt Arsenault committed
584

585 586 587 588 589 590 591
    if (CMAKE_SIZEOF_VOID_P EQUAL 8)
      set_rc_arch ("pe-x86-64")
    else ()
      set_rc_arch ("pe-i386")
    endif ()
  endif ()
endif ()
Matt Arsenault's avatar
Matt Arsenault committed
592

593
include_directories (include ${CMAKE_CURRENT_BINARY_DIR})
Min RK's avatar
Min RK committed
594 595
set (public_headers include/zmq.h
                    include/zmq_utils.h)
Matt Arsenault's avatar
Matt Arsenault committed
596

597
set (readme-docs AUTHORS
Matt Arsenault's avatar
Matt Arsenault committed
598 599
                COPYING
                COPYING.LESSER
600
                NEWS)
601 602 603 604

#-----------------------------------------------------------------------------
# optional modules

605 606 607 608 609 610
if (WITH_OPENPGM)
  add_definitions (-DZMQ_HAVE_OPENPGM)
  include_directories (${OPENPGM_INCLUDE_DIRS})
  link_directories (${OPENPGM_LIBRARY_DIRS})
  set (OPTIONAL_LIBRARIES ${OPENPGM_LIBRARIES})
endif (WITH_OPENPGM)
611

612 613 614 615 616
if (WITH_VMCI)
    add_definitions (-DZMQ_HAVE_VMCI)
    include_directories (${VMCI_INCLUDE_DIRS})
    list (APPEND cxx-sources vmci_address.cpp vmci_connecter.cpp vmci_listener.cpp vmci.cpp)
endif (WITH_VMCI)
Ilya Kulakov's avatar
Ilya Kulakov committed
617

618 619
if (ZMQ_HAVE_TIPC)
    add_definitions (-DZMQ_HAVE_TIPC)
620
    list (APPEND cxx-sources tipc_address.cpp tipc_connecter.cpp tipc_listener.cpp)
621 622
endif (ZMQ_HAVE_TIPC)

623 624 625
#-----------------------------------------------------------------------------
# source generators

626 627 628
foreach (source ${cxx-sources})
  list (APPEND sources ${CMAKE_CURRENT_SOURCE_DIR}/src/${source})
endforeach ()
629

630 631 632 633
foreach (source ${rc-sources})
  list (APPEND sources ${CMAKE_CURRENT_BINARY_DIR}/${source})
  configure_file (${CMAKE_CURRENT_SOURCE_DIR}/src/${source}.in ${CMAKE_CURRENT_BINARY_DIR}/${source})
endforeach ()
Frank's avatar
Frank committed
634

635 636 637
#   Delete any src/platform.hpp left by configure
file (REMOVE ${CMAKE_CURRENT_SOURCE_DIR}/src/platform.hpp)

638 639
configure_file (${CMAKE_CURRENT_SOURCE_DIR}/builds/cmake/platform.hpp.in ${CMAKE_CURRENT_BINARY_DIR}/platform.hpp)
list (APPEND sources ${CMAKE_CURRENT_BINARY_DIR}/platform.hpp)
640

641 642
configure_file (${CMAKE_CURRENT_SOURCE_DIR}/src/libzmq.pc.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/libzmq.pc @ONLY)
set (zmq-pkgconfig ${CMAKE_CURRENT_BINARY_DIR}/libzmq.pc)
643

644 645 646
if (NOT ZMQ_BUILD_FRAMEWORK)
  install (FILES ${CMAKE_CURRENT_BINARY_DIR}/libzmq.pc DESTINATION lib/pkgconfig)
endif ()
647

648 649 650 651 652 653
if (MSVC)
  if (CMAKE_CL_64)
    set (nsis-template ${CMAKE_CURRENT_SOURCE_DIR}/builds/cmake/NSIS.template64.in)
  else ()
    set (nsis-template ${CMAKE_CURRENT_SOURCE_DIR}/builds/cmake/NSIS.template32.in)
  endif ()
654

655
  add_custom_command (
Matt Arsenault's avatar
Matt Arsenault committed
656 657 658 659 660 661 662
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/NSIS.template.in
    COMMAND ${CMAKE_COMMAND}
    ARGS -E
    copy
    ${nsis-template}
    ${CMAKE_CURRENT_BINARY_DIR}/NSIS.template.in
    DEPENDS ${nsis-template})
663 664 665 666 667 668
endif ()

file (MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc)
file (GLOB docs RELATIVE ${CMAKE_CURRENT_BINARY_DIR}/ "${CMAKE_CURRENT_SOURCE_DIR}/doc/*.txt")
set (html-docs)
foreach (txt ${docs})
669
  string (REGEX REPLACE ".*/(.*)\\.txt" "\\1.html" html ${txt})
670 671 672
  set (src ${txt})
  set (dst doc/${html})
  add_custom_command (
673 674 675 676 677 678
    OUTPUT  ${dst}
    COMMAND ${PYTHON_EXECUTABLE}
    ARGS    -x
    ${ASCIIDOC_EXECUTABLE}
    -d manpage
    -b xhtml11
679 680
    -f ${CMAKE_CURRENT_SOURCE_DIR}/doc/asciidoc.conf
    -azmq_version=${ZMQ_VERSION}
681 682
    -o ${dst}
    ${src}
683 684
    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${src}
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
685
    COMMENT "Generating ${html}")
686 687 688 689
  if (WITH_DOC)
    list (APPEND html-docs ${CMAKE_CURRENT_BINARY_DIR}/${dst})
  endif ()
endforeach ()
690

691 692
if (ZMQ_BUILD_FRAMEWORK)
  add_custom_command (
693 694 695 696 697
    TARGET libzmq
    POST_BUILD
    COMMAND ${CMAKE_COMMAND}
    ARGS -E make_directory "${CMAKE_LIBRARY_OUTPUT_PATH}/ZeroMQ.framework/Versions/${ZMQ_VERSION}/MacOS"
    COMMENT "Perf tools")
698
endif ()
699

700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719
if (MSVC)
    # default for all sources is to use precompiled headers
    foreach(source ${sources})
        set_source_files_properties(${source}
            PROPERTIES
            COMPILE_FLAGS "/Yuprecompiled.hpp"
            )
    endforeach()
    # create precompiled header
    set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/src/precompiled.cpp
        PROPERTIES
        COMPILE_FLAGS "/Ycprecompiled.hpp"
        )
    # C and C++ can not use the same precompiled header
    set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/src/tweetnacl.c
        PROPERTIES
        COMPILE_FLAGS "/Y-"
        )
endif ()

720 721 722 723

#-----------------------------------------------------------------------------
# output

724 725 726 727
if (MSVC)
  add_library (libzmq SHARED ${sources} ${public_headers} ${html-docs} ${readme-docs} ${CMAKE_CURRENT_BINARY_DIR}/NSIS.template.in)
  target_link_libraries (libzmq ${OPTIONAL_LIBRARIES})
  set_target_properties (libzmq PROPERTIES
728
    PUBLIC_HEADER "${public_headers}"
729
    RELEASE_POSTFIX "${MSVC_TOOLSET}-mt-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}"
730
    RELWITHDEBINFO_POSTFIX "${MSVC_TOOLSET}-mt-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}"
731
    DEBUG_POSTFIX "${MSVC_TOOLSET}-mt-gd-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}"
732 733
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin"
    COMPILE_DEFINITIONS "DLL_EXPORT")
734 735
  add_library (libzmq-static STATIC ${sources})
  set_target_properties (libzmq-static PROPERTIES
736
    PUBLIC_HEADER "${public_headers}"
737
    RELEASE_POSTFIX "${MSVC_TOOLSET}-mt-s-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}"
738
    RELWITHDEBINFO_POSTFIX "${MSVC_TOOLSET}-mt-s-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}"
739
    DEBUG_POSTFIX "${MSVC_TOOLSET}-mt-sgd-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}"
740
    COMPILE_FLAGS "/DZMQ_STATIC"
741
    OUTPUT_NAME "libzmq")
742 743
else ()
    add_library (libzmq SHARED ${sources} ${public_headers} ${html-docs} ${readme-docs} ${zmq-pkgconfig})
744
    # NOTE: the SOVERSION MUST be the same as the one generated by libtool!
745
    set_target_properties (libzmq PROPERTIES
746 747 748
                          COMPILE_DEFINITIONS "DLL_EXPORT"
                          PUBLIC_HEADER "${public_headers}"
                          VERSION ${ZMQ_VERSION}
749
                          SOVERSION "5.1.3"
750 751
                          OUTPUT_NAME "libzmq"
                          PREFIX "")
752 753
    if (ZMQ_BUILD_FRAMEWORK)
      set_target_properties (libzmq PROPERTIES
Doron Somech's avatar
Doron Somech committed
754 755 756
                            FRAMEWORK TRUE
                            MACOSX_FRAMEWORK_IDENTIFIER "org.zeromq.libzmq"
                            MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${ZMQ_VERSION}
757
                            MACOSX_FRAMEWORK_BUNDLE_VERSION ${ZMQ_VERSION})
758
      set_source_files_properties (${html-docs} PROPERTIES
Doron Somech's avatar
Doron Somech committed
759
                                  MACOSX_PACKAGE_LOCATION doc)
760
      set_source_files_properties (${readme-docs} PROPERTIES
Doron Somech's avatar
Doron Somech committed
761
                                  MACOSX_PACKAGE_LOCATION etc)
762
      set_source_files_properties (${zmq-pkgconfig} PROPERTIES
Doron Somech's avatar
Doron Somech committed
763
                                  MACOSX_PACKAGE_LOCATION lib/pkgconfig)
764 765 766
    endif ()
    add_library (libzmq-static STATIC ${sources} ${public_headers} ${html-docs} ${readme-docs} ${zmq-pkgconfig})
    set_target_properties (libzmq-static PROPERTIES
767
      PUBLIC_HEADER "${public_headers}"
768
      COMPILE_DEFINITIONS "ZMQ_STATIC"
769
      OUTPUT_NAME "libzmq"
770
      PREFIX "")
771
endif ()
772

773
target_link_libraries (libzmq ${CMAKE_THREAD_LIBS_INIT})
774

775 776 777 778 779 780 781 782
if (SODIUM_FOUND)
  target_link_libraries (libzmq ${SODIUM_LIBRARIES})
endif ()
if (HAVE_WS2_32)
  target_link_libraries (libzmq ws2_32)
elseif (HAVE_WS2)
  target_link_libraries (libzmq ws2)
endif ()
783

784 785 786
if (HAVE_RPCRT4)
  target_link_libraries (libzmq rpcrt4)
endif ()
787

788 789 790
if (HAVE_IPHLAPI)
  target_link_libraries (libzmq iphlpapi)
endif ()
791

792 793 794
if (RT_LIBRARY)
  target_link_libraries (libzmq ${RT_LIBRARY})
endif ()
795

796
set (perf-tools local_lat
797 798 799 800 801 802
               remote_lat
               local_thr
               remote_thr
               inproc_lat
               inproc_thr)

803 804 805 806 807
if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug") # Why?
option (WITH_PERF_TOOL "Build with perf-tools" ON)
else ()
option (WITH_PERF_TOOL "Build with perf-tools" OFF)
endif ()
808

809 810 811
if (WITH_PERF_TOOL)
  foreach (perf-tool ${perf-tools})
    add_executable (${perf-tool} perf/${perf-tool}.cpp)
812
    target_link_libraries (${perf-tool} libzmq ${OPTIONAL_LIBRARIES})
813

814 815 816
    if (RT_LIBRARY)
      target_link_libraries (${perf-tool} ${RT_LIBRARY})
    endif ()
817

818
    if (ZMQ_BUILD_FRAMEWORK)
Doron Somech's avatar
Doron Somech committed
819
      # Copy perf-tools binaries into Framework
820
      add_custom_command (
Doron Somech's avatar
Doron Somech committed
821 822 823 824 825 826
        TARGET libzmq ${perf-tool}
        POST_BUILD
        COMMAND ${CMAKE_COMMAND}
        ARGS -E copy "$<TARGET_FILE:${perf-tool}>" "${LIBRARY_OUTPUT_PATH}/ZeroMQ.framework/Versions/${ZMQ_VERSION_STRING}/MacOS/${perf-tool}"
        VERBATIM
        COMMENT "Perf tools")
827 828
    else ()
      install (TARGETS ${perf-tool}
Doron Somech's avatar
Doron Somech committed
829 830
              RUNTIME DESTINATION bin
              COMPONENT PerfTools)
831 832 833
    endif ()
  endforeach ()
endif ()
834

835 836 837
#-----------------------------------------------------------------------------
# tests

838
set (ZMQ_BUILD_TESTS ON CACHE BOOL "Build the tests for ZeroMQ")
839

840 841 842 843
if (ZMQ_BUILD_TESTS)
  enable_testing () # Enable testing only works in root scope
  ADD_SUBDIRECTORY (tests)
endif ()
844

845 846
#-----------------------------------------------------------------------------
# installer
847

848 849
include(GNUInstallDirs)

850 851
if (MSVC)
  install (TARGETS libzmq libzmq-static
852 853 854
          ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
          LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
          PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
Doron Somech's avatar
Doron Somech committed
855
          COMPONENT SDK)
856 857
  if (CMAKE_BUILD_TYPE STREQUAL "Debug")
    install (TARGETS libzmq libzmq-static
858 859 860
            RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
            PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
861
            COMPONENT SDK)
862 863
    if (NOT CMAKE_PDB_OUTPUT_DIRECTORY)
      install (FILES ${CMAKE_CURRENT_BINARY_DIR}/bin/libzmq${MSVC_TOOLSET}-mt-gd-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}.pdb DESTINATION lib
Doron Somech's avatar
Doron Somech committed
864
            COMPONENT SDK)
865 866 867
    endif ()
  else ()
    install (TARGETS libzmq
868 869
            RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
            PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
Doron Somech's avatar
Doron Somech committed
870
            COMPONENT Runtime)
871 872 873
  endif ()
else ()
  install (TARGETS libzmq libzmq-static
874 875 876
          RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
          ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
          LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
Doron Somech's avatar
Doron Somech committed
877
          FRAMEWORK DESTINATION "Library/Frameworks"
878
          PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
879
endif ()
880

881
# install (FILES ${public_headers}
Doron Somech's avatar
Doron Somech committed
882 883
#          DESTINATION include
#          COMPONENT SDK)
884

885 886 887
#if (NOT ZMQ_BUILD_FRAMEWORK)
#  file (GLOB private_headers "${CMAKE_CURRENT_SOURCE_DIR}/src/*.hpp")
#  install (FILES ${sources} ${private_headers} DESTINATION src/zmq
xantares's avatar
xantares committed
888
#          COMPONENT SourceCode)
889
#endif ()
890

891 892
foreach (readme ${readme-docs})
  configure_file (${CMAKE_CURRENT_SOURCE_DIR}/${readme} ${CMAKE_CURRENT_BINARY_DIR}/${readme}.txt)
893

894
  if (NOT ZMQ_BUILD_FRAMEWORK)
895
    install (FILES ${CMAKE_CURRENT_BINARY_DIR}/${readme}.txt DESTINATION share/zmq)
896 897
  endif ()
endforeach ()
898

899 900 901 902 903
if (WITH_DOC)
  if (NOT ZMQ_BUILD_FRAMEWORK)
    install (FILES ${html-docs} DESTINATION doc/zmq COMPONENT RefGuide)
  endif ()
endif ()
Doron Somech's avatar
Doron Somech committed
904

905 906
include(CMakePackageConfigHelpers)

907 908 909 910 911
if (MSVC)
  string(TOUPPER "${CMAKE_BUILD_TYPE}" U_CMAKE_BUILD_TYPE)
  get_property(libzmq_pf TARGET libzmq PROPERTY ${U_CMAKE_BUILD_TYPE}_POSTFIX)
  set(libzmq_file libzmq${libzmq_pf}${CMAKE_LINK_LIBRARY_SUFFIX})
  get_property(libzmq_static_pf TARGET libzmq-static PROPERTY ${U_CMAKE_BUILD_TYPE}_POSTFIX)
912
  set(libzmq_static_file libzmq${libzmq_static_pf}${CMAKE_LINK_LIBRARY_SUFFIX})
913 914
else()
  set(libzmq_file libzmq${CMAKE_SHARED_LIBRARY_SUFFIX})
915
  set(libzmq_static_file libzmq${CMAKE_STATIC_LIBRARY_SUFFIX})
916
endif()
917 918 919 920 921 922 923 924 925 926 927 928 929 930

# GNUInstallDirs "DATADIR" wrong here; CMake search path wants "share".
set(ZEROMQ_CMAKECONFIG_INSTALL_DIR "share/cmake/${PROJECT_NAME}" CACHE STRING "install path for ZeroMQConfig.cmake")

configure_package_config_file(${PROJECT_NAME}Config.cmake.in
                              "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
                              INSTALL_DESTINATION ${ZEROMQ_CMAKECONFIG_INSTALL_DIR})
write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
                                 VERSION ${ZMQ_VERSION_MAJOR}.${ZMQ_VERSION_MINOR}.${ZMQ_VERSION_PATCH}
                                 COMPATIBILITY AnyNewerVersion)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
              ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
              DESTINATION ${ZEROMQ_CMAKECONFIG_INSTALL_DIR})

931 932
option(ENABLE_CPACK "Enables cpack rules" ON)
if (MSVC AND ENABLE_CPACK)
933
  include (InstallRequiredSystemLibraries)
Doron Somech's avatar
Doron Somech committed
934

935 936 937 938 939
  if (CMAKE_CL_64)
    set (arch_name "x64")
  else ()
    set (arch_name "x86")
  endif ()
Doron Somech's avatar
Doron Somech committed
940

941 942
  set (CPACK_NSIS_DISPLAY_NAME "ZeroMQ ${ZMQ_VERSION_MAJOR}.${ZMQ_VERSION_MINOR}.${ZMQ_VERSION_PATCH} (${arch_name})")
  set (CPACK_PACKAGE_FILE_NAME "ZeroMQ-${ZMQ_VERSION_MAJOR}.${ZMQ_VERSION_MINOR}.${ZMQ_VERSION_PATCH}-${arch_name}")
Doron Somech's avatar
Doron Somech committed
943 944 945 946

  # TODO: I think this part was intended to be used when running cpack
  # separately from cmake but I don't know how that works.
  #
947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971
  # macro (add_crt_version version)
  #   set (rel_dir "${CMAKE_CURRENT_BINARY_DIR}/build/${arch_name}/${version};ZeroMQ;ALL;/")
  #   set (debug_dir "${CMAKE_CURRENT_BINARY_DIR}/debug/${arch_name}/${version};ZeroMQ;ALL;/")
  #   if (EXISTS ${rel_dir})
  #     list (APPEND CPACK_INSTALL_CMAKE_PROJECTS ${rel_dir})
  #   endif ()

  #   if (EXISTS ${debug_dir})
  #     list (APPEND CPACK_INSTALL_CMAKE_PROJECTS ${rel_dir})
  #   endmacro ()
  # endmacro ()

  # add_crt_version (v110)
  # add_crt_version (v100)
  # add_crt_version (v90)

  set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_BINARY_DIR}")
  set (CPACK_GENERATOR "NSIS")
  set (CPACK_PACKAGE_NAME "ZeroMQ")
  set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "ZeroMQ lightweight messaging kernel")
  set (CPACK_PACKAGE_VENDOR "Miru")
  set (CPACK_NSIS_CONTACT "Steven McCoy <Steven.McCoy@miru.hk>")
  set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_BINARY_DIR}\\\\COPYING.txt")
#  set (CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_BINARY_DIR}\\\\README.txt")
#  set (CPACK_RESOURCE_FILE_WELCOME "${CMAKE_CURRENT_BINARY_DIR}\\\\WELCOME.txt")
Doron Somech's avatar
Doron Somech committed
972
  # There is a bug in NSI that does not handle full unix paths properly. Make
973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988
  # sure there is at least one set of four (4) backslashes.
  set (CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\installer.ico")
  set (CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\installer.ico")

  set (CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\branding.bmp")
  set (CPACK_NSIS_COMPRESSOR "/SOLID lzma")
  set (CPACK_PACKAGE_VERSION ${ZMQ_VERSION})
  set (CPACK_PACKAGE_VERSION_MAJOR ${ZMQ_VERSION_MAJOR})
  set (CPACK_PACKAGE_VERSION_MINOR ${ZMQ_VERSION_MINOR})
  set (CPACK_PACKAGE_VERSION_PATCH ${ZMQ_VERSION_PATCH})
#  set (CPACK_PACKAGE_INSTALL_DIRECTORY "ZMQ Install Directory")
#  set (CPACK_TEMPORARY_DIRECTORY "ZMQ Temporary CPack Directory")

  include (CPack)

  cpack_add_component_group (Development
Doron Somech's avatar
Doron Somech committed
989 990
    DISPLAY_NAME "ZeroMQ software development kit"
    EXPANDED)
991
  cpack_add_component (PerfTools
Doron Somech's avatar
Doron Somech committed
992 993
    DISPLAY_NAME "ZeroMQ performance tools"
    INSTALL_TYPES FullInstall DevInstall)
994
  cpack_add_component (SourceCode
Doron Somech's avatar
Doron Somech committed
995 996 997
    DISPLAY_NAME "ZeroMQ source code"
    DISABLED
    INSTALL_TYPES FullInstall)
998
  cpack_add_component (SDK
Doron Somech's avatar
Doron Somech committed
999 1000 1001
    DISPLAY_NAME "ZeroMQ headers and libraries"
    INSTALL_TYPES FullInstall DevInstall
    GROUP Development)
1002 1003
  if (WITH_DOC)
    cpack_add_component (RefGuide
Doron Somech's avatar
Doron Somech committed
1004 1005 1006
      DISPLAY_NAME "ZeroMQ reference guide"
      INSTALL_TYPES FullInstall DevInstall
      GROUP Development)
1007 1008
  endif ()
  cpack_add_component (Runtime
Doron Somech's avatar
Doron Somech committed
1009 1010 1011
    DISPLAY_NAME "ZeroMQ runtime files"
    REQUIRED
    INSTALL_TYPES FullInstall DevInstall MinInstall)
1012
  cpack_add_install_type (FullInstall
Doron Somech's avatar
Doron Somech committed
1013
    DISPLAY_NAME "Full install, including source code")
1014
  cpack_add_install_type (DevInstall
Doron Somech's avatar
Doron Somech committed
1015
    DISPLAY_NAME "Developer install, headers and libraries")
1016
  cpack_add_install_type (MinInstall
Doron Somech's avatar
Doron Somech committed
1017
    DISPLAY_NAME "Minimal install, runtime only")
1018
endif ()
Doron Somech's avatar
Doron Somech committed
1019 1020

# Export this for library to help build this as a sub-project
1021
set (ZEROMQ_LIBRARY libzmq CACHE STRING "ZeroMQ library")
Doron Somech's avatar
Doron Somech committed
1022 1023 1024

# Workaround for MSVS10 to avoid the Dialog Hell
# FIXME: This could be removed with future version of CMake.
1025 1026 1027 1028 1029 1030
if (MSVC_VERSION EQUAL 1600)
  set (ZMQ_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/ZeroMQ.sln")
  if (EXISTS "${ZMQ_SLN_FILENAME}")
    file (APPEND "${ZMQ_SLN_FILENAME}" "\n# This should be regenerated!\n")
  endif ()
endif ()