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

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

6
list (INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}")
7

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
include (TestZMQVersion)
172 173 174
if (NOT CMAKE_CROSSCOMPILING)
  include (ZMQSourceRunChecks)
endif ()
175 176 177 178 179 180 181 182
include (CheckIncludeFiles)
include (CheckLibraryExists)
include (CheckCCompilerFlag)
include (CheckCXXCompilerFlag)
include (CheckCSourceCompiles)
include (CheckCSourceRuns)
include (CMakeDependentOption)
include (CheckCXXSymbolExists)
183

184 185
check_include_files (ifaddrs.h ZMQ_HAVE_IFADDRS)
check_include_files (windows.h ZMQ_HAVE_WINDOWS)
186 187 188 189
if( ${CMAKE_SYSTEM_NAME} STREQUAL "WindowsStore" AND ${CMAKE_SYSTEM_VERSION} STREQUAL "10.0")
  SET(ZMQ_HAVE_WINDOWS_UWP ON)
  ADD_DEFINITIONS(-D_WIN32_WINNT=_WIN32_WINNT_WIN10)
endif()
190 191
check_include_files (sys/uio.h ZMQ_HAVE_UIO)
check_include_files (sys/eventfd.h ZMQ_HAVE_EVENTFD)
192
if (ZMQ_HAVE_EVENTFD AND NOT CMAKE_CROSSCOMPILING)
193 194
  zmq_check_efd_cloexec ()
endif ()
195

196 197 198 199
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
200

201 202
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)
203

204
find_library (RT_LIBRARY rt)
205

206
find_package (Threads)
Matt Arsenault's avatar
Matt Arsenault committed
207

208

209 210 211 212 213 214 215 216
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 ()
217

218 219 220 221
  if (NOT HAVE_IPHLAPI)
    message (FATAL_ERROR "Cannot link to iphlapi")
  endif ()
endif ()
222

223 224 225
set (CMAKE_REQUIRED_LIBRARIES rt)
check_function_exists (clock_gettime HAVE_CLOCK_GETTIME)
set (CMAKE_REQUIRED_LIBRARIES)
226

227 228 229
set (CMAKE_REQUIRED_INCLUDES unistd.h)
check_function_exists (fork HAVE_FORK)
set (CMAKE_REQUIRED_INCLUDES)
Frank's avatar
Frank committed
230

231 232 233
set (CMAKE_REQUIRED_INCLUDES sys/time.h)
check_function_exists (gethrtime HAVE_GETHRTIME)
set (CMAKE_REQUIRED_INCLUDES)
234

235 236 237 238
set (CMAKE_REQUIRED_INCLUDES stdlib.h)
check_function_exists (mkdtemp HAVE_MKDTEMP)
set (CMAKE_REQUIRED_INCLUDES)

239
add_definitions (-D_REENTRANT -D_THREAD_SAFE)
240
add_definitions (-DZMQ_CUSTOM_PLATFORM_HPP)
241

242
option (ENABLE_EVENTFD "Enable/disable eventfd" ZMQ_HAVE_EVENTFD)
243

244 245
macro (zmq_check_cxx_flag_prepend flag)
  check_cxx_compiler_flag ("${flag}" HAVE_FLAG_${flag})
246

247 248 249 250
  if (HAVE_FLAG_${flag})
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}")
  endif ()
endmacro ()
251 252


253 254
if (MSVC)
  zmq_check_cxx_flag_prepend ("/W3")
255

256 257 258 259 260 261 262 263
  if (MSVC_IDE)
    set (MSVC_TOOLSET "-${CMAKE_VS_PLATFORM_TOOLSET}")
  else ()
    set (MSVC_TOOLSET "")
  endif ()
else ()
  zmq_check_cxx_flag_prepend ("-Wall")
endif ()
264

265 266 267
if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  zmq_check_cxx_flag_prepend ("-Wextra")
endif ()
268

269 270 271
#   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")
272

273 274
option (LIBZMQ_PEDANTIC "" ON)
option (LIBZMQ_WERROR "" OFF)
275

276 277
if (LIBZMQ_PEDANTIC)
  zmq_check_cxx_flag_prepend ("-pedantic")
278

279 280 281
  if (${CMAKE_CXX_COMPILER_ID} MATCHES "Intel")
    zmq_check_cxx_flag_prepend ("-strict-ansi")
  endif ()
282

283 284 285 286
  if (${CMAKE_CXX_COMPILER_ID} MATCHES "SunPro")
    zmq_check_cxx_flag_prepend ("-compat=5")
  endif ()
endif ()
287

288 289 290 291
if (LIBZMQ_WERROR)
  zmq_check_cxx_flag_prepend ("-Werror")
  zmq_check_cxx_flag_prepend ("-errwarn=%all")
endif ()
292 293


294 295 296
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^sparc")
  zmq_check_cxx_flag_prepend ("-mcpu=v9")
endif ()
297

298 299 300
if (${CMAKE_CXX_COMPILER_ID} MATCHES "SunPro")
  zmq_check_cxx_flag_prepend ("-features=zla")
endif ()
301

302

303 304 305
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 (
306 307 308
  "
   #include <atomic.h>

309
    int main ()
310 311
    {
      uint32_t value;
312
      atomic_cas_32 (&value, 0, 0);
313 314 315 316 317
      return 0;
    }
    "
    HAVE_ATOMIC_H)

318 319 320 321
  if (NOT HAVE_ATOMIC_H)
    set (ZMQ_FORCE_MUTEXES 1)
  endif ()
endif ()
322 323 324


#-----------------------------------------------------------------------------
325 326 327 328 329 330 331 332 333 334
if (NOT CMAKE_CROSSCOMPILING)
  zmq_check_sock_cloexec ()
  zmq_check_so_keepalive ()
  zmq_check_tcp_keepcnt ()
  zmq_check_tcp_keepidle ()
  zmq_check_tcp_keepintvl ()
  zmq_check_tcp_keepalive ()
  zmq_check_tcp_tipc ()
  zmq_check_pthread_setname ()
endif ()
335

336
if (    CMAKE_SYSTEM_NAME MATCHES "Linux"
337 338 339
    OR CMAKE_SYSTEM_NAME MATCHES "GNU/kFreeBSD"
    OR CMAKE_SYSTEM_NAME MATCHES "GNU/Hurd"
    OR CYGWIN)
340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360
  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
361
                       "PYTHONINTERP_FOUND;ASCIIDOC_FOUND" OFF)
362

363 364 365 366 367 368 369 370
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
371 372 373
                PATHS
                "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Miru\\OpenPGM ${OPENPGM_VERSION_MAJOR}.${OPENPGM_VERSION_MINOR}.${OPENPGM_VERSION_MICRO}]"
                NO_DEFAULT_PATH
374 375 376 377
               )
      message (STATUS "OpenPGM x64 detected - ${OPENPGM_ROOT}")
    else ()
      find_path (OPENPGM_ROOT include/pgm/pgm.h
378 379 380 381
                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
382 383 384 385 386 387
               )
      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
388 389
      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)
390 391 392
  endif ()
else ()
  if (WITH_OPENPGM)
393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412
    #  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 ()

413
    # DSO symbol visibility for openpgm
414
    if (HAVE_FLAG_VISIBILITY_HIDDEN)
415

416
    elseif (HAVE_FLAG_LDSCOPE_HIDDEN)
417
    
418 419 420
    endif ()
  endif ()
endif ()
421

422 423 424 425

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

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

430
   rm CMakeCache.txt
431 432 433 434
   mkdir cmake-make
   cd cmake-make
   cmake ..
")
435
endif ()
436 437 438 439

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

440
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
441 442
  # CMAKE_BUILD_TYPE is not used for multi-configuration generators like Visual Studio/XCode
  # which instead use CMAKE_CONFIGURATION_TYPES
443
  set (CMAKE_BUILD_TYPE Release CACHE STRING
444 445
      "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
      FORCE)
446
endif ()
447

448 449
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
450

451 452 453
#-----------------------------------------------------------------------------
# platform specifics

xantares's avatar
xantares committed
454
if (WIN32)
455 456
    #   Socket limit is 16K (can be raised arbitrarily)
    add_definitions (-DFD_SETSIZE=16384)
457
    add_definitions (-D_CRT_SECURE_NO_WARNINGS)
458
    add_definitions (-D_WINSOCK_DEPRECATED_NO_WARNINGS)
xantares's avatar
xantares committed
459
endif ()
460

461
if (MSVC)
462
  # Parallel make.
463
  set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
464

465 466
  # Optimization flags.
  # http://msdn.microsoft.com/en-us/magazine/cc301698.aspx
467 468 469 470 471 472 473
  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 ()
474 475


476 477 478
#-----------------------------------------------------------------------------
# source files

479
set (cxx-sources
480
        precompiled.cpp
481
        address.cpp
somdoron's avatar
somdoron committed
482
        client.cpp
483 484
        clock.cpp
        ctx.cpp
485 486
        curve_client.cpp
        curve_server.cpp
487 488
        dealer.cpp
        devpoll.cpp
489
        dgram.cpp
490 491 492 493 494 495 496 497 498 499 500 501 502
        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
503
        mailbox_safe.cpp
504
        mechanism.cpp
Frank's avatar
Frank committed
505
        metadata.cpp
506 507 508 509 510
        msg.cpp
        mtrie.cpp
        object.cpp
        options.cpp
        own.cpp
511
        null_mechanism.cpp
512 513 514 515 516
        pair.cpp
        pgm_receiver.cpp
        pgm_sender.cpp
        pgm_socket.cpp
        pipe.cpp
517 518
        plain_client.cpp
        plain_server.cpp
519 520
        poll.cpp
        poller_base.cpp
521
        pollset.cpp
522 523 524 525 526 527 528 529 530 531 532 533
        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
534
        server.cpp
535 536 537
        session_base.cpp
        signaler.cpp
        socket_base.cpp
Richard Newton's avatar
Richard Newton committed
538 539
        socks.cpp
        socks_connecter.cpp
Richard Newton's avatar
Richard Newton committed
540
        stream.cpp
541 542 543 544 545 546 547 548 549 550
        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
551 552
        v2_decoder.cpp
        v2_encoder.cpp
553 554 555
        xpub.cpp
        xsub.cpp
        zmq.cpp
Jens Auer's avatar
Jens Auer committed
556
        zmq_utils.cpp
557
        decoder_allocators.cpp
558
        socket_poller.cpp
somdoron's avatar
somdoron committed
559
        timers.cpp
somdoron's avatar
somdoron committed
560 561
        config.hpp
        radio.cpp
562 563
        dish.cpp
        udp_engine.cpp
somdoron's avatar
somdoron committed
564 565 566
        udp_address.cpp
        scatter.cpp
        gather.cpp)
Matt Arsenault's avatar
Matt Arsenault committed
567

568
set (rc-sources version.rc)
Matt Arsenault's avatar
Matt Arsenault committed
569

570
if (MINGW)
Matt Arsenault's avatar
Matt Arsenault committed
571
  # Generate the right type when using -m32 or -m64
572 573 574 575
  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
576
        "<CMAKE_RC_COMPILER> <FLAGS> -O coff --target=${rc_target} <DEFINES> -i <SOURCE> -o <OBJECT>")
577
  endmacro ()
Matt Arsenault's avatar
Matt Arsenault committed
578

579 580
  if (NOT CMAKE_SYSTEM_PROCESSOR)
    set (CMAKE_SYSTEM_PROCESSOR ${CMAKE_HOST_SYSTEM_PROCESSOR})
581 582
  endif ()

583
  if (    CMAKE_SYSTEM_PROCESSOR MATCHES "i386"
584 585 586
      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
587
     # This also happens on x86_64 systems...what a worthless variable
588 589 590
      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
591

592 593 594 595 596 597 598
    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
599

Min RK's avatar
Min RK committed
600 601
set (public_headers include/zmq.h
                    include/zmq_utils.h)
Matt Arsenault's avatar
Matt Arsenault committed
602

603
set (readme-docs AUTHORS
Matt Arsenault's avatar
Matt Arsenault committed
604 605
                COPYING
                COPYING.LESSER
606
                NEWS)
607 608 609 610

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

611 612 613 614 615 616
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)
617

618 619 620 621 622
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
623

624 625
if (ZMQ_HAVE_TIPC)
    add_definitions (-DZMQ_HAVE_TIPC)
626
    list (APPEND cxx-sources tipc_address.cpp tipc_connecter.cpp tipc_listener.cpp)
627 628
endif (ZMQ_HAVE_TIPC)

629 630 631
#-----------------------------------------------------------------------------
# source generators

632 633 634
foreach (source ${cxx-sources})
  list (APPEND sources ${CMAKE_CURRENT_SOURCE_DIR}/src/${source})
endforeach ()
635

636 637 638 639
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
640

641 642 643
#   Delete any src/platform.hpp left by configure
file (REMOVE ${CMAKE_CURRENT_SOURCE_DIR}/src/platform.hpp)

644 645
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)
646

647 648
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)
649

650 651 652
if (NOT ZMQ_BUILD_FRAMEWORK)
  install (FILES ${CMAKE_CURRENT_BINARY_DIR}/libzmq.pc DESTINATION lib/pkgconfig)
endif ()
653

654 655 656 657 658 659
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 ()
660

661
  add_custom_command (
Matt Arsenault's avatar
Matt Arsenault committed
662 663 664 665 666 667 668
    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})
669 670 671 672 673 674
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})
675
  string (REGEX REPLACE ".*/(.*)\\.txt" "\\1.html" html ${txt})
676 677 678
  set (src ${txt})
  set (dst doc/${html})
  add_custom_command (
679 680 681 682 683 684
    OUTPUT  ${dst}
    COMMAND ${PYTHON_EXECUTABLE}
    ARGS    -x
    ${ASCIIDOC_EXECUTABLE}
    -d manpage
    -b xhtml11
685 686
    -f ${CMAKE_CURRENT_SOURCE_DIR}/doc/asciidoc.conf
    -azmq_version=${ZMQ_VERSION}
687 688
    -o ${dst}
    ${src}
689 690
    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${src}
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
691
    COMMENT "Generating ${html}")
692 693 694 695
  if (WITH_DOC)
    list (APPEND html-docs ${CMAKE_CURRENT_BINARY_DIR}/${dst})
  endif ()
endforeach ()
696

697 698
if (ZMQ_BUILD_FRAMEWORK)
  add_custom_command (
699 700 701 702 703
    TARGET libzmq
    POST_BUILD
    COMMAND ${CMAKE_COMMAND}
    ARGS -E make_directory "${CMAKE_LIBRARY_OUTPUT_PATH}/ZeroMQ.framework/Versions/${ZMQ_VERSION}/MacOS"
    COMMENT "Perf tools")
704
endif ()
705

706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725
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 ()

726 727 728 729

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

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

779 780 781 782 783 784 785 786 787
foreach (target libzmq libzmq-static)
  target_include_directories (${target}
    PUBLIC
      $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
      $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
      $<INSTALL_INTERFACE:include>
  )
endforeach()

788
target_link_libraries (libzmq ${CMAKE_THREAD_LIBS_INIT})
789

790 791 792 793 794 795 796 797
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 ()
798

799 800 801
if (HAVE_RPCRT4)
  target_link_libraries (libzmq rpcrt4)
endif ()
802

803 804 805
if (HAVE_IPHLAPI)
  target_link_libraries (libzmq iphlpapi)
endif ()
806

807 808 809
if (RT_LIBRARY)
  target_link_libraries (libzmq ${RT_LIBRARY})
endif ()
810

811
set (perf-tools local_lat
812 813 814 815 816 817
               remote_lat
               local_thr
               remote_thr
               inproc_lat
               inproc_thr)

818 819 820 821 822
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 ()
823

824 825 826
if (WITH_PERF_TOOL)
  foreach (perf-tool ${perf-tools})
    add_executable (${perf-tool} perf/${perf-tool}.cpp)
827
    target_link_libraries (${perf-tool} libzmq ${OPTIONAL_LIBRARIES})
828

829 830 831
    if (RT_LIBRARY)
      target_link_libraries (${perf-tool} ${RT_LIBRARY})
    endif ()
832

833
    if (ZMQ_BUILD_FRAMEWORK)
Doron Somech's avatar
Doron Somech committed
834
      # Copy perf-tools binaries into Framework
835
      add_custom_command (
Doron Somech's avatar
Doron Somech committed
836 837 838 839 840 841
        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")
842 843
    else ()
      install (TARGETS ${perf-tool}
Doron Somech's avatar
Doron Somech committed
844 845
              RUNTIME DESTINATION bin
              COMPONENT PerfTools)
846 847 848
    endif ()
  endforeach ()
endif ()
849

850 851 852
#-----------------------------------------------------------------------------
# tests

853
set (ZMQ_BUILD_TESTS ON CACHE BOOL "Build the tests for ZeroMQ")
854

855 856 857 858
if (ZMQ_BUILD_TESTS)
  enable_testing () # Enable testing only works in root scope
  ADD_SUBDIRECTORY (tests)
endif ()
859

860 861
#-----------------------------------------------------------------------------
# installer
862

863 864
include(GNUInstallDirs)

865 866
if (MSVC)
  install (TARGETS libzmq libzmq-static
867
          EXPORT ${PROJECT_NAME}-targets
868 869 870
          ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
          LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
          PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
Doron Somech's avatar
Doron Somech committed
871
          COMPONENT SDK)
872 873
  if (CMAKE_BUILD_TYPE STREQUAL "Debug")
    install (TARGETS libzmq libzmq-static
874 875 876
            RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
            PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
877
            COMPONENT SDK)
878 879
    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
880
            COMPONENT SDK)
881 882 883
    endif ()
  else ()
    install (TARGETS libzmq
884 885
            RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
            PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
Doron Somech's avatar
Doron Somech committed
886
            COMPONENT Runtime)
887 888 889
  endif ()
else ()
  install (TARGETS libzmq libzmq-static
890
          EXPORT ${PROJECT_NAME}-targets
891 892 893
          RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
          ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
          LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
Doron Somech's avatar
Doron Somech committed
894
          FRAMEWORK DESTINATION "Library/Frameworks"
895
          PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
896
endif ()
897

898
# install (FILES ${public_headers}
Doron Somech's avatar
Doron Somech committed
899 900
#          DESTINATION include
#          COMPONENT SDK)
901

902 903 904
#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
905
#          COMPONENT SourceCode)
906
#endif ()
907

908 909
foreach (readme ${readme-docs})
  configure_file (${CMAKE_CURRENT_SOURCE_DIR}/${readme} ${CMAKE_CURRENT_BINARY_DIR}/${readme}.txt)
910

911
  if (NOT ZMQ_BUILD_FRAMEWORK)
912
    install (FILES ${CMAKE_CURRENT_BINARY_DIR}/${readme}.txt DESTINATION share/zmq)
913 914
  endif ()
endforeach ()
915

916 917 918 919 920
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
921

922 923 924 925 926
include(CMakePackageConfigHelpers)

# 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")

927 928 929 930
if (NOT CMAKE_VERSION VERSION_LESS 3.0)
  export(EXPORT ${PROJECT_NAME}-targets
         FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake")
endif()
931 932 933 934 935 936
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)
937 938 939
install(EXPORT ${PROJECT_NAME}-targets
        FILE ${PROJECT_NAME}Targets.cmake
        DESTINATION ${ZEROMQ_CMAKECONFIG_INSTALL_DIR})
940 941 942 943
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
              ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
              DESTINATION ${ZEROMQ_CMAKECONFIG_INSTALL_DIR})

944 945
option(ENABLE_CPACK "Enables cpack rules" ON)
if (MSVC AND ENABLE_CPACK)
946
  include (InstallRequiredSystemLibraries)
Doron Somech's avatar
Doron Somech committed
947

948 949 950 951 952
  if (CMAKE_CL_64)
    set (arch_name "x64")
  else ()
    set (arch_name "x86")
  endif ()
Doron Somech's avatar
Doron Somech committed
953

954 955
  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
956 957 958 959

  # TODO: I think this part was intended to be used when running cpack
  # separately from cmake but I don't know how that works.
  #
960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984
  # 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
985
  # There is a bug in NSI that does not handle full unix paths properly. Make
986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001
  # 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
1002 1003
    DISPLAY_NAME "ZeroMQ software development kit"
    EXPANDED)
1004
  cpack_add_component (PerfTools
Doron Somech's avatar
Doron Somech committed
1005 1006
    DISPLAY_NAME "ZeroMQ performance tools"
    INSTALL_TYPES FullInstall DevInstall)
1007
  cpack_add_component (SourceCode
Doron Somech's avatar
Doron Somech committed
1008 1009 1010
    DISPLAY_NAME "ZeroMQ source code"
    DISABLED
    INSTALL_TYPES FullInstall)
1011
  cpack_add_component (SDK
Doron Somech's avatar
Doron Somech committed
1012 1013 1014
    DISPLAY_NAME "ZeroMQ headers and libraries"
    INSTALL_TYPES FullInstall DevInstall
    GROUP Development)
1015 1016
  if (WITH_DOC)
    cpack_add_component (RefGuide
Doron Somech's avatar
Doron Somech committed
1017 1018 1019
      DISPLAY_NAME "ZeroMQ reference guide"
      INSTALL_TYPES FullInstall DevInstall
      GROUP Development)
1020 1021
  endif ()
  cpack_add_component (Runtime
Doron Somech's avatar
Doron Somech committed
1022 1023 1024
    DISPLAY_NAME "ZeroMQ runtime files"
    REQUIRED
    INSTALL_TYPES FullInstall DevInstall MinInstall)
1025
  cpack_add_install_type (FullInstall
Doron Somech's avatar
Doron Somech committed
1026
    DISPLAY_NAME "Full install, including source code")
1027
  cpack_add_install_type (DevInstall
Doron Somech's avatar
Doron Somech committed
1028
    DISPLAY_NAME "Developer install, headers and libraries")
1029
  cpack_add_install_type (MinInstall
Doron Somech's avatar
Doron Somech committed
1030
    DISPLAY_NAME "Minimal install, runtime only")
1031
endif ()
Doron Somech's avatar
Doron Somech committed
1032 1033

# Export this for library to help build this as a sub-project
1034
set (ZEROMQ_LIBRARY libzmq CACHE STRING "ZeroMQ library")
Doron Somech's avatar
Doron Somech committed
1035 1036 1037

# Workaround for MSVS10 to avoid the Dialog Hell
# FIXME: This could be removed with future version of CMake.
1038 1039 1040 1041 1042 1043
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 ()