CMakeLists.txt 11.6 KB
Newer Older
1
# CMake build script for ZeroMQ on Windows
2 3 4 5

cmake_minimum_required (VERSION 2.8)
project (ZeroMQ)

6
include (${CMAKE_SOURCE_DIR}/cmake/Modules/TestZMQVersion.cmake)
7

8 9 10
option (WITH_DOC "Build Reference Guide documentation (requires DocBook)" OFF)
option (WITH_OPENPGM "Build with support for OpenPGM" OFF)

11
# WARNING: Windows Python will override Cygwin yet not work with Asciidoc.
12
#find_package (PythonInterp REQUIRED)
13
# Workaround, manually set Python location
14
set(PYTHON_EXECUTABLE c:/cygwin/bin/python2.6.exe CACHE FILEPATH "Python interpreter executable")
15
# TODO: Replace with FindAsciidoc.cmake
16
set(ASCIIDOC_EXECUTABLE c:/cygwin/bin/asciidoc CACHE FILEPATH "AsciiDoc executable")
17

18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
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 121)
	if (CMAKE_CL_64)
		find_path(OPENPGM_ROOT include/pgm/pgm.h
			PATHS
			"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Miru\\OpenPGM ${OPENPGM_VERSION_MAJOR}.${OPENPGM_VERSION_MINOR}.${OPENPGM_VERSION_MICRO}]"
			NO_DEFAULT_PATH
			)
	else (CMAKE_CL_64)
		find_path(OPENPGM_ROOT include/pgm/pgm.h
			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
			)
	endif (CMAKE_CL_64)
	message(STATUS "OpenPGM detected - ${OPENPGM_ROOT}")
	set(OPENPGM_INCLUDE_DIRS ${OPENPGM_ROOT}/include)
	set(OPENPGM_LIBRARY_DIRS ${OPENPGM_ROOT}/lib)
	set(OPENPGM_LIBRARIES
		optimized libpgm${_zmq_COMPILER}-mt-${OPENPGM_VERSION_MAJOR}_${OPENPGM_VERSION_MINOR}_${OPENPGM_VERSION_MICRO}.lib
		debug libpgm${_zmq_COMPILER}-mt-gd-${OPENPGM_VERSION_MAJOR}_${OPENPGM_VERSION_MINOR}_${OPENPGM_VERSION_MICRO}.lib)
endif (WITH_OPENPGM)
44 45

mark_as_advanced(PYTHON_EXECUTABLE ASCIIDOC_EXECUTABLE)
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

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

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

   del CMakeCache.txt
   mkdir cmake-make
   cd cmake-make
   cmake ..
")
endif(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})

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

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Release CACHE STRING
      "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
      FORCE)
endif(NOT CMAKE_BUILD_TYPE)

set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
set(LIBRARY_OUTPUT_PATH  ${CMAKE_BINARY_DIR}/lib)

#-----------------------------------------------------------------------------
# platform specifics

add_definitions(
        -DWIN32
	-DDLL_EXPORT
79
# NB: May require tweaking for highly connected applications.
80
	-DFD_SETSIZE=1024
81
	-D_CRT_SECURE_NO_WARNINGS
82 83
)

84 85 86 87 88 89 90 91 92 93
# Parallel make.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")

# Optimization flags.
# http://msdn.microsoft.com/en-us/magazine/cc301698.aspx
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GL")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG")
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /LTCG")
set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS_RELEASE} /LTCG")

94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
#-----------------------------------------------------------------------------
# source files

set(cxx-sources
	address.cpp
	clock.cpp
	ctx.cpp
	dealer.cpp
	decoder.cpp
	devpoll.cpp
	dist.cpp
	encoder.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
	msg.cpp
	mtrie.cpp
	object.cpp
	options.cpp
	own.cpp
	pair.cpp
	pgm_receiver.cpp
	pgm_sender.cpp
	pgm_socket.cpp
	pipe.cpp
	poll.cpp
	poller_base.cpp
	precompiled.cpp
131
	proxy.cpp
132 133 134 135
	pub.cpp
	pull.cpp
	push.cpp
	random.cpp
136 137
	raw_encoder.cpp
	raw_decoder.cpp
138 139 140 141 142 143 144 145 146 147
	reaper.cpp
	rep.cpp
	req.cpp
	router.cpp
	select.cpp
	session_base.cpp
	signaler.cpp
	socket_base.cpp
	stream_engine.cpp
	sub.cpp
148
	tcp.cpp
149 150 151 152 153
	tcp_address.cpp
	tcp_connecter.cpp
	tcp_listener.cpp
	thread.cpp
	trie.cpp
154 155
	v1_decoder.cpp
	v1_encoder.cpp
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
	xpub.cpp
	xsub.cpp
	zmq.cpp
	zmq_utils.cpp
)

set(rc-sources
	version.rc
)

include_directories(
        include
	${CMAKE_BINARY_DIR}
)
set(headers
	include/zmq.h
	include/zmq_utils.h
)
set(readme-docs
	AUTHORS
	COPYING
	COPYING.LESSER
	MAINTAINERS
	NEWS
	README
)

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

186 187 188 189 190
if(WITH_OPENPGM)
	add_definitions(
		-DZMQ_HAVE_OPENPGM
	)
	include_directories(
191
		${OPENPGM_INCLUDE_DIRS}
192 193
	)
	link_directories(
194
		${OPENPGM_LIBRARY_DIRS}
195
	)
196
	set(OPTIONAL_LIBRARIES ${OPENPGM_LIBRARIES})
197
endif(WITH_OPENPGM)
198 199 200 201

#-----------------------------------------------------------------------------
# source generators

202
foreach (source ${cxx-sources})
203 204 205
	list(APPEND sources ${CMAKE_SOURCE_DIR}/src/${source})
endforeach()

206 207 208 209 210
foreach (source ${rc-sources})
	list(APPEND sources ${CMAKE_BINARY_DIR}/${source})
	configure_file(${CMAKE_SOURCE_DIR}/src/${source}.in ${CMAKE_BINARY_DIR}/${source})
endforeach()

211 212 213 214 215 216 217 218 219 220 221
add_custom_command(
	OUTPUT ${CMAKE_BINARY_DIR}/platform.hpp
	COMMAND ${CMAKE_COMMAND}
	ARGS	-E
		copy
		${CMAKE_SOURCE_DIR}/builds/msvc/platform.hpp
		${CMAKE_BINARY_DIR}/platform.hpp
	DEPENDS ${CMAKE_SOURCE_DIR}/builds/msvc/platform.hpp
)
list(APPEND sources ${CMAKE_BINARY_DIR}/platform.hpp)

222
if (CMAKE_CL_64)
223
	set (nsis-template ${CMAKE_SOURCE_DIR}/cmake/NSIS.template64.in)
224
else (CMAKE_CL_64)
225
	set (nsis-template ${CMAKE_SOURCE_DIR}/cmake/NSIS.template32.in)
226
endif (CMAKE_CL_64)
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
add_custom_command(
	OUTPUT ${CMAKE_BINARY_DIR}/NSIS.template.in
	COMMAND ${CMAKE_COMMAND}
	ARGS    -E
		copy
		${nsis-template}
		${CMAKE_BINARY_DIR}/NSIS.template.in
	DEPENDS ${nsis-template}
)

file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/doc)
file(GLOB docs RELATIVE ${CMAKE_BINARY_DIR}/ "${CMAKE_SOURCE_DIR}/doc/*.txt")
set (html-docs)
foreach (txt ${docs})
	string (REGEX REPLACE ".*/(.*)\\.txt" "\\1.html" html ${txt})
	set (src ${txt})
	set (dst doc/${html})
	add_custom_command(
		OUTPUT  ${dst}
		COMMAND ${PYTHON_EXECUTABLE}
		ARGS    -x
			${ASCIIDOC_EXECUTABLE}
			-d manpage
			-b xhtml11
			-f ${CMAKE_SOURCE_DIR}/doc/asciidoc.conf
252
			-azmq_version=${ZMQ_VERSION_MAJOR}.${ZMQ_VERSION_MINOR}.${ZMQ_VERSION_PATCH}
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
			-o ${dst}
			${src}
		DEPENDS ${CMAKE_BINARY_DIR}/${src}
		WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
		COMMENT "Generating ${html}"
	)
	if (WITH_DOC)
		list(APPEND html-docs ${CMAKE_BINARY_DIR}/${dst})
	endif (WITH_DOC)
endforeach (txt ${docs})

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

add_library(libzmq SHARED ${sources} ${html-docs} ${CMAKE_BINARY_DIR}/NSIS.template.in)
268 269 270 271
target_link_libraries(libzmq ws2_32.lib rpcrt4.lib ${OPTIONAL_LIBRARIES})
set_target_properties(libzmq PROPERTIES
	RELEASE_POSTFIX "${_zmq_COMPILER}-mt-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}"
	DEBUG_POSTFIX "${_zmq_COMPILER}-mt-gd-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}")
272

273 274
#-----------------------------------------------------------------------------
# installer
275

276
install (TARGETS libzmq ARCHIVE DESTINATION lib COMPONENT SDK)
277
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
278 279
	install (TARGETS libzmq RUNTIME DESTINATION bin COMPONENT SDK)
	install (FILES ${CMAKE_BINARY_DIR}/lib/libzmq${_zmq_COMPILER}-mt-gd-${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}.pdb DESTINATION lib COMPONENT SDK)
280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313
else (CMAKE_BUILD_TYPE STREQUAL "Debug")
	install (TARGETS libzmq RUNTIME DESTINATION bin COMPONENT Runtime)
endif (CMAKE_BUILD_TYPE STREQUAL "Debug")
install (FILES ${headers} DESTINATION include COMPONENT SDK)

set (perf-tools
	local_lat
	remote_lat
	local_thr
	remote_thr
	inproc_lat
	inproc_thr
)
if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
	foreach (perf-tool ${perf-tools})
		add_executable (${perf-tool} perf/${perf-tool}.cpp)
		target_link_libraries (${perf-tool} libzmq)
		install (TARGETS ${perf-tool} RUNTIME DESTINATION bin COMPONENT PerfTools)
	endforeach (perf-tool ${perf-tools})
endif (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")

file(GLOB headers "${CMAKE_SOURCE_DIR}/src/*.hpp")
install (FILES ${sources} ${headers} DESTINATION src COMPONENT SourceCode)

foreach (readme ${readme-docs})
	configure_file (${CMAKE_SOURCE_DIR}/${readme} ${CMAKE_BINARY_DIR}/${readme}.txt)
	install (FILES ${CMAKE_BINARY_DIR}/${readme}.txt DESTINATION .)
endforeach (readme ${readme-docs})
if (WITH_DOC)
	install (FILES ${html-docs} DESTINATION doc COMPONENT RefGuide)
endif (WITH_DOC)

include (InstallRequiredSystemLibraries)

314 315 316
if (CMAKE_CL_64)
	set (CPACK_NSIS_DISPLAY_NAME "ZeroMQ ${ZMQ_VERSION_MAJOR}.${ZMQ_VERSION_MINOR}.${ZMQ_VERSION_PATCH} (x64)")
        set (CPACK_PACKAGE_FILE_NAME "ZeroMQ-${ZMQ_VERSION_MAJOR}.${ZMQ_VERSION_MINOR}.${ZMQ_VERSION_PATCH}-x64")
317
	set (CPACK_INSTALL_CMAKE_PROJECTS
318 319 320 321 322 323
		"${CMAKE_SOURCE_DIR}/build/x64/v110;ZeroMQ;ALL;/"
		"${CMAKE_SOURCE_DIR}/debug/x64/v110;ZeroMQ;ALL;/"
		"${CMAKE_SOURCE_DIR}/build/x64/v100;ZeroMQ;ALL;/"
		"${CMAKE_SOURCE_DIR}/debug/x64/v100;ZeroMQ;ALL;/"
		"${CMAKE_SOURCE_DIR}/build/x64/v90;ZeroMQ;ALL;/"
		"${CMAKE_SOURCE_DIR}/debug/x64/v90;ZeroMQ;ALL;/"
324
	)
325 326 327
else (CMAKE_CL_64)
	set (CPACK_NSIS_DISPLAY_NAME "ZeroMQ ${ZMQ_VERSION_MAJOR}.${ZMQ_VERSION_MINOR}.${ZMQ_VERSION_PATCH}")
        set (CPACK_PACKAGE_FILE_NAME "ZeroMQ-${ZMQ_VERSION_MAJOR}.${ZMQ_VERSION_MINOR}.${ZMQ_VERSION_PATCH}-x86")
328
	set (CPACK_INSTALL_CMAKE_PROJECTS
329 330 331 332 333 334
		"${CMAKE_SOURCE_DIR}/build/x86/v110;ZeroMQ;ALL;/"
		"${CMAKE_SOURCE_DIR}/debug/x86/v110;ZeroMQ;ALL;/"
		"${CMAKE_SOURCE_DIR}/build/x86/v100;ZeroMQ;ALL;/"
		"${CMAKE_SOURCE_DIR}/debug/x86/v100;ZeroMQ;ALL;/"
		"${CMAKE_SOURCE_DIR}/build/x86/v90;ZeroMQ;ALL;/"
		"${CMAKE_SOURCE_DIR}/debug/x86/v90;ZeroMQ;ALL;/"
335
	)
336
endif (CMAKE_CL_64)
337
set (CMAKE_MODULE_PATH "${CMAKE_BINARY_DIR}")
338 339 340
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "ZeroMQ lightweight messaging kernel")
set (CPACK_PACKAGE_VENDOR "Miru")
set (CPACK_NSIS_CONTACT "Steven McCoy <Steven.McCoy@miru.hk>")
341
set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_BINARY_DIR}/COPYING.txt")
342 343 344 345 346 347
# There is a bug in NSI that does not handle full unix paths properly. Make
# sure there is at least one set of four (4) backlasshes.
set (CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}\\\\installer.ico")
set (CPACK_NSIS_MUI_UNIICON "${CMAKE_SOURCE_DIR}\\\\installer.ico")
set (CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}\\\\branding.bmp")
set (CPACK_NSIS_COMPRESSOR "/SOLID lzma")
348 349 350
set (CPACK_PACKAGE_VERSION_MAJOR "${ZMQ_VERSION_MAJOR}")
set (CPACK_PACKAGE_VERSION_MINOR "${ZMQ_VERSION_MINOR}")
set (CPACK_PACKAGE_VERSION_PATCH "${ZMQ_VERSION_PATCH}")
351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394

include (CPack)

cpack_add_component_group (Development
	DISPLAY_NAME "ZeroMQ software development kit"
	EXPANDED
)
cpack_add_component (PerfTools
	DISPLAY_NAME "ZeroMQ performance tools"
	INSTALL_TYPES FullInstall DevInstall
)
cpack_add_component (SourceCode
	DISPLAY_NAME "ZeroMQ source code"
	DISABLED
	INSTALL_TYPES FullInstall
)
cpack_add_component (SDK
	DISPLAY_NAME "ZeroMQ headers and libraries"
	INSTALL_TYPES FullInstall DevInstall
	GROUP Development
)
if (WITH_DOC)
	cpack_add_component (RefGuide
		DISPLAY_NAME "ZeroMQ reference guide"
		INSTALL_TYPES FullInstall DevInstall
		GROUP Development
	)
endif (WITH_DOC)
cpack_add_component (Runtime
	DISPLAY_NAME "ZeroMQ runtime files"
	REQUIRED
	INSTALL_TYPES FullInstall DevInstall MinInstall
)
cpack_add_install_type (FullInstall
	DISPLAY_NAME "Full install, including source code"
)
cpack_add_install_type (DevInstall
	DISPLAY_NAME "Developer install, headers and libraries"
)
cpack_add_install_type (MinInstall
	DISPLAY_NAME "Minimal install, runtime only"
)

# end of file