CMakeLists.txt 34.3 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
            target_link_libraries (libzmq ssp)
48
        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
if(CMAKE_SYSTEM_NAME STREQUAL "WindowsStore" AND CMAKE_SYSTEM_VERSION STREQUAL "10.0")
187 188 189
  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
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^sparc")
  zmq_check_cxx_flag_prepend ("-mcpu=v9")
endif ()
296

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

301

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

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

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


#-----------------------------------------------------------------------------
324 325
if (NOT CMAKE_CROSSCOMPILING)
  zmq_check_sock_cloexec ()
326
  zmq_check_o_cloexec ()
327
  zmq_check_so_bindtodevice ()
328 329 330 331 332 333 334
  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 ()
335
  zmq_check_getrandom ()
336
endif ()
337

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

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

415
    # DSO symbol visibility for openpgm
416
    if (HAVE_FLAG_VISIBILITY_HIDDEN)
417

418
    elseif (HAVE_FLAG_LDSCOPE_HIDDEN)
419
    
420 421 422
    endif ()
  endif ()
endif ()
423

424 425 426 427

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

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

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

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

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

450 451
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
452

453 454 455
#-----------------------------------------------------------------------------
# platform specifics

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

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

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


478 479 480
#-----------------------------------------------------------------------------
# source files

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

570
set (rc-sources version.rc)
Matt Arsenault's avatar
Matt Arsenault committed
571

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

581 582
  if (NOT CMAKE_SYSTEM_PROCESSOR)
    set (CMAKE_SYSTEM_PROCESSOR ${CMAKE_HOST_SYSTEM_PROCESSOR})
583 584
  endif ()

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

594 595 596 597 598 599 600
    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
601

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

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

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

613 614 615 616 617 618
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)
619

620 621 622 623 624
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
625

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

631 632 633
#-----------------------------------------------------------------------------
# source generators

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

638 639 640 641
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
642

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

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

649 650
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)
651

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

656 657 658 659 660 661
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 ()
662

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

697 698
if (ZMQ_BUILD_FRAMEWORK)
  add_custom_command (
699
    TARGET libzmq
700 701 702 703
    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
if (MSVC)
    # default for all sources is to use precompiled headers
    foreach(source ${sources})
Yann Diorcet's avatar
Yann Diorcet committed
709 710 711 712 713 714 715
        if (NOT ${source} STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}/src/precompiled.cpp")
            set_source_files_properties(${source}
                PROPERTIES
                COMPILE_FLAGS "/Yuprecompiled.hpp"
                OBJECT_DEPENDS precompiled.hpp
                )
        endif()
716 717 718 719 720
    endforeach()
    # create precompiled header
    set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/src/precompiled.cpp
        PROPERTIES
        COMPILE_FLAGS "/Ycprecompiled.hpp"
Yann Diorcet's avatar
Yann Diorcet committed
721
        OBJECT_OUTPUTS precompiled.hpp
722 723 724 725 726 727 728 729
        )
    # 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 ()

730 731 732

#-----------------------------------------------------------------------------
# output
733 734 735 736 737 738
option(BUILD_SHARED "Whether or not to build the shared object"  ON)
option(BUILD_STATIC "Whether or not to build the static archive" ON)

list(APPEND target_outputs "")

if (BUILD_SHARED)
739
  list(APPEND target_outputs "libzmq")
740 741 742
endif()

if (BUILD_STATIC)
743
  list(APPEND target_outputs "libzmq-static")
744
endif()
745

746
if (MSVC)
747 748 749
  # Suppress linker warnings caused by #ifdef omission
  # of file content.
  set( CMAKE_STATIC_LINKER_FLAGS /ignore:4221 )
750
  if (BUILD_SHARED)
751 752 753
    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
754 755 756 757 758 759 760 761 762 763
      PUBLIC_HEADER "${public_headers}"
      RELEASE_POSTFIX "${MSVC_TOOLSET}-mt-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}"
      RELWITHDEBINFO_POSTFIX "${MSVC_TOOLSET}-mt-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}"
      DEBUG_POSTFIX "${MSVC_TOOLSET}-mt-gd-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}"
      RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin"
      COMPILE_DEFINITIONS "DLL_EXPORT"
      OUTPUT_NAME "libzmq")
  endif()
  
  if (BUILD_STATIC)
764 765
    add_library (libzmq-static STATIC ${sources})
    set_target_properties (libzmq-static PROPERTIES
766 767 768 769 770 771 772
      PUBLIC_HEADER "${public_headers}"
      RELEASE_POSTFIX "${MSVC_TOOLSET}-mt-s-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}"
      RELWITHDEBINFO_POSTFIX "${MSVC_TOOLSET}-mt-s-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}"
      DEBUG_POSTFIX "${MSVC_TOOLSET}-mt-sgd-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}"
      COMPILE_FLAGS "/DZMQ_STATIC"
      OUTPUT_NAME "libzmq")
  endif()
773
else ()
774
  if (BUILD_SHARED)
775
    add_library (libzmq SHARED ${sources} ${public_headers} ${html-docs} ${readme-docs} ${zmq-pkgconfig})
776
    # NOTE: the SOVERSION MUST be the same as the one generated by libtool!
777
    set_target_properties (libzmq PROPERTIES
778 779 780
                          COMPILE_DEFINITIONS "DLL_EXPORT"
                          PUBLIC_HEADER "${public_headers}"
                          VERSION ${ZMQ_VERSION}
781
                          SOVERSION "5.1.3"
Yann Diorcet's avatar
Yann Diorcet committed
782 783
                          OUTPUT_NAME "zmq"
                          PREFIX "lib")
784
    if (ZMQ_BUILD_FRAMEWORK)
785
      set_target_properties (libzmq PROPERTIES
Doron Somech's avatar
Doron Somech committed
786 787 788
                            FRAMEWORK TRUE
                            MACOSX_FRAMEWORK_IDENTIFIER "org.zeromq.libzmq"
                            MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${ZMQ_VERSION}
789
                            MACOSX_FRAMEWORK_BUNDLE_VERSION ${ZMQ_VERSION})
790
      set_source_files_properties (${html-docs} PROPERTIES
Doron Somech's avatar
Doron Somech committed
791
                                  MACOSX_PACKAGE_LOCATION doc)
792
      set_source_files_properties (${readme-docs} PROPERTIES
Doron Somech's avatar
Doron Somech committed
793
                                  MACOSX_PACKAGE_LOCATION etc)
794
      set_source_files_properties (${zmq-pkgconfig} PROPERTIES
Doron Somech's avatar
Doron Somech committed
795
                                  MACOSX_PACKAGE_LOCATION lib/pkgconfig)
796
    endif ()
797 798 799
  endif()

  if (BUILD_STATIC)
800 801
    add_library (libzmq-static STATIC ${sources} ${public_headers} ${html-docs} ${readme-docs} ${zmq-pkgconfig})
    set_target_properties (libzmq-static PROPERTIES
802
      PUBLIC_HEADER "${public_headers}"
803
      COMPILE_DEFINITIONS "ZMQ_STATIC"
Yann Diorcet's avatar
Yann Diorcet committed
804 805
      OUTPUT_NAME "zmq"
      PREFIX "lib")
806
  endif()
807
endif ()
808

809
foreach (target ${target_outputs})
810 811 812 813 814 815 816 817
  target_include_directories (${target}
    PUBLIC
      $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
      $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
      $<INSTALL_INTERFACE:include>
  )
endforeach()

818
if (BUILD_SHARED)
819
  target_link_libraries (libzmq ${CMAKE_THREAD_LIBS_INIT})
820

821
  if (SODIUM_FOUND)
822
    target_link_libraries (libzmq ${SODIUM_LIBRARIES})
823 824
  endif ()
  if (HAVE_WS2_32)
825
    target_link_libraries (libzmq ws2_32)
826
  elseif (HAVE_WS2)
827
    target_link_libraries (libzmq ws2)
828
  endif ()
829

830
  if (HAVE_RPCRT4)
831
    target_link_libraries (libzmq rpcrt4)
832
  endif ()
833

834
  if (HAVE_IPHLAPI)
835
    target_link_libraries (libzmq iphlpapi)
836
  endif ()
837

838
  if (RT_LIBRARY)
839
    target_link_libraries (libzmq ${RT_LIBRARY})
840
  endif ()
841
endif ()
842

843 844 845 846 847 848 849
if (BUILD_SHARED)
  set (perf-tools local_lat
                 remote_lat
                 local_thr
                 remote_thr
                 inproc_lat
                 inproc_thr)
850

851 852 853 854 855
  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 ()
856

857 858 859
  if (WITH_PERF_TOOL)
    foreach (perf-tool ${perf-tools})
      add_executable (${perf-tool} perf/${perf-tool}.cpp)
860
      target_link_libraries (${perf-tool} libzmq ${OPTIONAL_LIBRARIES})
861 862 863 864 865 866 867 868

      if (RT_LIBRARY)
        target_link_libraries (${perf-tool} ${RT_LIBRARY})
      endif ()

      if (ZMQ_BUILD_FRAMEWORK)
        # Copy perf-tools binaries into Framework
        add_custom_command (
869
          TARGET libzmq ${perf-tool}
870 871 872 873 874 875 876 877 878 879 880 881 882 883
          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")
      else ()
        install (TARGETS ${perf-tool}
                RUNTIME DESTINATION bin
                COMPONENT PerfTools)
      endif ()
    endforeach ()
  endif ()
elseif (WITH_PERF_TOOL)
  message(FATAL_ERROR "Shared library disabled - perf-tools unavailable.")
884
endif ()
885

886 887 888
#-----------------------------------------------------------------------------
# tests

889
set (ZMQ_BUILD_TESTS ON CACHE BOOL "Build the tests for ZeroMQ")
890

891 892 893 894
if (ZMQ_BUILD_TESTS)
  enable_testing () # Enable testing only works in root scope
  ADD_SUBDIRECTORY (tests)
endif ()
895

896 897
#-----------------------------------------------------------------------------
# installer
898

899 900
include(GNUInstallDirs)

901
if (MSVC)
902
  install (TARGETS ${target_outputs}
903
          EXPORT ${PROJECT_NAME}-targets
904 905 906
          ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
          LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
          PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
Doron Somech's avatar
Doron Somech committed
907
          COMPONENT SDK)
908
  if (CMAKE_BUILD_TYPE STREQUAL "Debug")
909
    install (TARGETS ${target_outputs}
910 911 912
            RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
            PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
913
            COMPONENT SDK)
914 915
    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
916
            COMPONENT SDK)
917
    endif ()
918
  elseif (BUILD_SHARED)
919
    install (TARGETS libzmq
920 921
            RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
            PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
Doron Somech's avatar
Doron Somech committed
922
            COMPONENT Runtime)
923 924
  endif ()
else ()
925
  install (TARGETS ${target_outputs}
926
          EXPORT ${PROJECT_NAME}-targets
927 928 929
          RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
          ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
          LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
Doron Somech's avatar
Doron Somech committed
930
          FRAMEWORK DESTINATION "Library/Frameworks"
931
          PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
932
endif ()
933

934
# install (FILES ${public_headers}
Doron Somech's avatar
Doron Somech committed
935 936
#          DESTINATION include
#          COMPONENT SDK)
937

938 939 940
#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
941
#          COMPONENT SourceCode)
942
#endif ()
943

944 945
foreach (readme ${readme-docs})
  configure_file (${CMAKE_CURRENT_SOURCE_DIR}/${readme} ${CMAKE_CURRENT_BINARY_DIR}/${readme}.txt)
946

947
  if (NOT ZMQ_BUILD_FRAMEWORK)
948
    install (FILES ${CMAKE_CURRENT_BINARY_DIR}/${readme}.txt DESTINATION share/zmq)
949 950
  endif ()
endforeach ()
951

952 953 954 955 956
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
957

958 959 960 961 962
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")

963 964 965 966
if (NOT CMAKE_VERSION VERSION_LESS 3.0)
  export(EXPORT ${PROJECT_NAME}-targets
         FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake")
endif()
967 968 969 970 971 972
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)
973 974 975
install(EXPORT ${PROJECT_NAME}-targets
        FILE ${PROJECT_NAME}Targets.cmake
        DESTINATION ${ZEROMQ_CMAKECONFIG_INSTALL_DIR})
976 977 978 979
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
              ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
              DESTINATION ${ZEROMQ_CMAKECONFIG_INSTALL_DIR})

980 981
option(ENABLE_CPACK "Enables cpack rules" ON)
if (MSVC AND ENABLE_CPACK)
982
  include (InstallRequiredSystemLibraries)
Doron Somech's avatar
Doron Somech committed
983

984 985 986 987 988
  if (CMAKE_CL_64)
    set (arch_name "x64")
  else ()
    set (arch_name "x86")
  endif ()
Doron Somech's avatar
Doron Somech committed
989

990 991
  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
992 993 994 995

  # TODO: I think this part was intended to be used when running cpack
  # separately from cmake but I don't know how that works.
  #
996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020
  # 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
1021
  # There is a bug in NSI that does not handle full unix paths properly. Make
1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037
  # 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
1038 1039
    DISPLAY_NAME "ZeroMQ software development kit"
    EXPANDED)
1040
  cpack_add_component (PerfTools
Doron Somech's avatar
Doron Somech committed
1041 1042
    DISPLAY_NAME "ZeroMQ performance tools"
    INSTALL_TYPES FullInstall DevInstall)
1043
  cpack_add_component (SourceCode
Doron Somech's avatar
Doron Somech committed
1044 1045 1046
    DISPLAY_NAME "ZeroMQ source code"
    DISABLED
    INSTALL_TYPES FullInstall)
1047
  cpack_add_component (SDK
Doron Somech's avatar
Doron Somech committed
1048 1049 1050
    DISPLAY_NAME "ZeroMQ headers and libraries"
    INSTALL_TYPES FullInstall DevInstall
    GROUP Development)
1051 1052
  if (WITH_DOC)
    cpack_add_component (RefGuide
Doron Somech's avatar
Doron Somech committed
1053 1054 1055
      DISPLAY_NAME "ZeroMQ reference guide"
      INSTALL_TYPES FullInstall DevInstall
      GROUP Development)
1056 1057
  endif ()
  cpack_add_component (Runtime
Doron Somech's avatar
Doron Somech committed
1058 1059 1060
    DISPLAY_NAME "ZeroMQ runtime files"
    REQUIRED
    INSTALL_TYPES FullInstall DevInstall MinInstall)
1061
  cpack_add_install_type (FullInstall
Doron Somech's avatar
Doron Somech committed
1062
    DISPLAY_NAME "Full install, including source code")
1063
  cpack_add_install_type (DevInstall
Doron Somech's avatar
Doron Somech committed
1064
    DISPLAY_NAME "Developer install, headers and libraries")
1065
  cpack_add_install_type (MinInstall
Doron Somech's avatar
Doron Somech committed
1066
    DISPLAY_NAME "Minimal install, runtime only")
1067
endif ()
Doron Somech's avatar
Doron Somech committed
1068 1069

# Export this for library to help build this as a sub-project
1070
set (ZEROMQ_LIBRARY libzmq CACHE STRING "ZeroMQ library")
Doron Somech's avatar
Doron Somech committed
1071 1072 1073

# Workaround for MSVS10 to avoid the Dialog Hell
# FIXME: This could be removed with future version of CMake.
1074 1075 1076 1077 1078 1079
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 ()