cmake_minimum_required(VERSION 2.6) project(libtorrent) set(sources alert allocator assert connection_queue create_torrent disk_buffer_holder entry error_code file_storage lazy_bdecode escape_string file gzip http_connection http_stream http_parser i2p_stream identify_client ip_filter peer_connection bt_peer_connection web_peer_connection http_seed_connection instantiate_connection natpmp piece_picker policy session session_impl socks5_stream stat storage torrent torrent_handle torrent_info tracker_manager http_tracker_connection udp_tracker_connection udp_socket upnp logger file_pool lsd disk_io_thread enum_net broadcast_socket magnet_uri parse_url ConvertUTF # -- extensions -- metadata_transfer ut_pex ut_metadata smart_ban lt_trackers ) # -- kademlia -- set(kademlia_sources closest_nodes dht_tracker node refresh rpc_manager find_data node_id routing_table traversal_algorithm ) set(zlib_sources adler32 compress crc32 deflate gzio infback inffast inflate inftrees trees uncompr zutil ) set(includes include zlib) option(shared "build libtorrent as a shared library" ON) option(tcmalloc "link against google performance tools tcmalloc" OFF) option(pool-allocators "Uses a pool allocator for disk and piece buffers" ON) option(encryption "link against openssl and enable encryption" ON) option(geoip "link against LGPL GeoIP code from Maxmind, to enable geoip database support" OFF) option(dht "enable support for Mainline DHT" ON) option(resolve-countries "enable support for resolving countries from peer IPs" ON) option(unicode "enable unicode support" ON) option(deprecated-functions "enable deprecated functions for backwards compatibility" ON) option(exceptions "build with exception support" ON) option(logging "build with logging" OFF) option(verbose-logging "build with verbose logging" OFF) option(build_tests "build tests" OFF) option(build_examples "build examples" OFF) set(CMAKE_CONFIGURATION_TYPES Debug Release RelWithDebInfo) if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release FORCE) endif (NOT CMAKE_BUILD_TYPE) # add_definitions() doesn't seem to let you say wich build type to apply it to set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DTORRENT_DEBUG") set(CMAKE_C_FLAGS_RELWITHDEBINFO "-Os -g") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") if (encryption) list(APPEND sources pe_crypto) endif (encryption) if (logging) add_definitions(-DTORRENT_LOGGING) endif (logging) if (verbose-logging) add_definitions(-DTORRENT_VERBOSE_LOGGING) endif (verbose-logging) foreach(s ${sources}) list(APPEND sources2 src/${s}) endforeach(s) foreach(s ${zlib_sources}) list(APPEND zlib_sources2 zlib/${s}) endforeach(s) if (dht) foreach(s ${kademlia_sources}) list(APPEND sources2 src/kademlia/${s}) endforeach(s) else (dht) add_definitions(-DTORRENT_DISABLE_DHT) endif (dht) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") if (shared) add_library(torrent-rasterbar SHARED ${sources2} ${zlib_sources2}) else (shared) add_library(torrent-rasterbar STATIC ${sources2} ${zlib_sources2}) endif (shared) FIND_PACKAGE( Boost 1.34 COMPONENTS filesystem thread) if (NOT Boost_VERSION LESS 103500) FIND_PACKAGE( Boost 1.35 COMPONENTS filesystem thread system) endif (NOT Boost_VERSION LESS 103500) include_directories(${Boost_INCLUDE_DIR}) target_link_libraries(torrent-rasterbar ${Boost_LIBRARIES}) # this works around a bug in asio in boost-1.39 add_definitions(-DBOOST_ASIO_HASH_MAP_BUCKETS=1021) if (WIN32) target_link_libraries(torrent-rasterbar wsock32 ws2_32) endif (WIN32) if (encryption) add_definitions(-DTORRENT_USE_OPENSSL) if (WIN32) target_link_libraries(torrent-rasterbar ssleay32 libeay32 advapi32 user32 shell32 gdi32) else (WIN32) target_link_libraries(torrent-rasterbar crypto ssl) endif (WIN32) else (encryption) add_definitions(-DTORRENT_DISABLE_ENCRYPTION) list(APPEND sources sha1) endif (encryption) if (NOT pool-allocators) add_definitions(-DTORRENT_DISABLE_POOL_ALLOCATOR) endif (NOT pool-allocators) if (NOT geoip) add_definitions(-DTORRENT_DISABLE_GEO_IP) endif (NOT geoip) if (NOT resolve-countries) add_definitions(-DTORRENT_DISABLE_RESOLVE_COUNTRIES) endif (NOT resolve-countries) if (unicode) add_definitions(-DUNICODE -D_UNICODE) endif (unicode) if (NOT deprecated-functions) add_definitions(-DTORRENT_NO_DEPRECATE) endif (NOT deprecated-functions) if (exceptions) add_definitions(-fexceptions) else (exceptions) add_definitions(-fno-exceptions) endif (exceptions) if (MSVC) # disable bogus deprecation warnings on msvc8 add_definitions(-D_SCL_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_DEPRECATE) # these compiler settings just makes the compiler standard conforming add_definitions(/Zc:wchar_t /Zc:forScope) # msvc,release:/OPT:ICF=5 # msvc,release:/OPT:REF endif(MSVC) add_definitions(-D_FILE_OFFSET_BITS=64) add_definitions(-DBOOST_DISABLE_EXCEPTION) if (tcmalloc) target_link_libraries(torrent-rasterbar tcmalloc) endif (tcmalloc) target_link_libraries(torrent-rasterbar z) include_directories(${includes}) set_target_properties(torrent-rasterbar PROPERTIES SOVERSION 1 VERSION 1) set (VERSION "0.15.0") get_property (COMPILETIME_OPTIONS_LIST DIRECTORY ${CMAKE_CURRENT_SOURCE_DIRECTORY} PROPERTY COMPILE_DEFINITIONS ) foreach (s ${COMPILETIME_OPTIONS_LIST}) set (COMPILETIME_OPTIONS "${COMPILETIME_OPTIONS} -D${s}") endforeach (s) configure_file(libtorrent-rasterbar-cmake.pc.in libtorrent-rasterbar.pc) string (COMPARE EQUAL ${CMAKE_SIZEOF_VOID_P} "8" IS64BITS) if (IS64BITS AND RESPECTLIB64) set (LIBDIR "lib64") else (IS64BITS AND RESPECTLIB64) set (LIBDIR "lib") endif (IS64BITS AND RESPECTLIB64) install(TARGETS torrent-rasterbar DESTINATION ${LIBDIR} CONFIGURATIONS release) install(DIRECTORY include/libtorrent DESTINATION include PATTERN ".svn" EXCLUDE) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libtorrent-rasterbar.pc DESTINATION ${LIBDIR}/pkgconfig) # === build examples === if(build_examples) set(examples client_test dump_torrent simple_client enum_if make_torrent) foreach(s ${examples}) add_executable(${s} examples/${s}.cpp) target_link_libraries(${s} torrent-rasterbar) endforeach(s) FIND_PACKAGE( Boost 1.34 COMPONENTS program_options regex) target_link_libraries(client_test ${Boost_LIBRARIES}) include_directories(${Boost_INCLUDE_DIR}) endif(build_examples) # === build tests === if(build_tests) set(tests test_auto_unchoke test_http_connection test_buffer test_storage test_torrent test_transfer test_piece_picker test_fast_extension test_pe_crypto test_bencoding test_bdecode_performance test_primitives test_ip_filter test_hasher test_metadata_extension test_swarm test_lsd test_pex test_web_seed test_bandwidth_limiter ) add_library(test_common STATIC test/main.cpp test/setup_transfer.cpp) enable_testing() foreach(s ${tests}) add_executable(${s} test/${s}.cpp) target_link_libraries(${s} torrent-rasterbar test_common) add_test(${s} ${s}) endforeach(s) add_executable(test_upnp test/test_upnp.cpp) target_link_libraries(test_upnp torrent-rasterbar) add_executable(test_natpmp test/test_natpmp.cpp) target_link_libraries(test_natpmp torrent-rasterbar) endif(build_tests)