# This Jamfile requires boost-build v2 to build.
# The version shipped with boost 1.34.0

import modules ;
import path ;
import os ;
import errors ;
import feature : feature ;
import package ;
import virtual-target ;

BOOST_ROOT = [ modules.peek : BOOST_ROOT ] ;
CXXFLAGS = [ modules.peek : CXXFLAGS ] ;
LDFLAGS = [ modules.peek : LDFLAGS ] ;

ECHO "CXXFLAGS =" $(CXXFLAGS) ;
ECHO "LDFLAGS =" $(LDFLAGS) ;
ECHO "OS =" [ os.name ] ;

if $(BOOST_ROOT)
{
	ECHO "building boost from source directory: " $(BOOST_ROOT) ;

	use-project /boost : $(BOOST_ROOT) ;
	alias boost_system : /boost/system//boost_system : : : <include>$(BOOST_ROOT) ;
}
else
{
	local boost-lib-search-path =
		<search>/opt/local/lib
		<search>/usr/lib
		<search>/usr/local/lib
		<search>/sw/lib
		<search>/usr/g++/lib
		;

	local boost-include-path =
		<include>/opt/local/include
		<include>/usr/local/include
		<include>/usr/sfw/include
	;

	# the names are decorated in MacPorts
	lib boost_system : : <target-os>darwin <name>boost_system-mt $(boost-lib-search-path)
		: : $(boost-include-path) ;

	lib boost_system : : <name>boost_system $(boost-lib-search-path)
		: : $(boost-include-path) ;
}

VERSION = 1.2.0 ;

# rule for linking the correct libraries depending
# on features and target-os
rule linking ( properties * )
{
	local result ;

	# ssl=openssl => crypto=libcrypto
	# this match the previous behavior
	if <ssl>openssl in $(properties)
		&& ! <crypto>libcrypto in $(properties)
	{
		ECHO "with ssl=openssl the value for crypto must be libcrypto" ;
		result += <build>no ;
	}

	# openssl libraries, if enabled
	if <ssl>openssl in $(properties)
	{
		# exclude gcc from a regular windows build to make mingw
		# link against the regular unix library name
		if <target-os>windows in $(properties)
			&& ! <toolset>gcc in $(properties)
		{
			result += <library>ssleay32
				<library>advapi32
				<library>user32
				<library>shell32
				<library>gdi32
			;
		}
		else
		{
			result += <library>ssl ;
		}
	}

	if <crypto>libcrypto in $(properties)
	{
		# exclude gcc from a regular windows build to make mingw
		# link against the regular unix library name
		if <target-os>windows in $(properties)
			&& ! <toolset>gcc in $(properties)
		{
			# it should be possible to cleanup this list, but this is safe for now
			result += <library>libeay32
				<library>advapi32
				<library>user32
				<library>shell32
				<library>gdi32
			;
		}
		else
		{
			result += <library>crypto ;
		}
	}

	if <simulator>on in $(properties)
	{
		result += <library>/libsimulator//simulator ;
	}

	if <target-os>windows in $(properties)
		&& ( <asserts>on in $(properties)
			|| <asserts>production in $(properties)
			|| <pool-allocators>debug in $(properties)
			|| <allocator>debug in $(properties)
			|| <asio-debugging>on in $(properties) )
	{
		result += <library>dbghelp ;
	}

	# gcrypt libraries, if enabled
	if <crypto>libgcrypt in $(properties)
	{
		# on mac os x, adding the /opt/local/include path
		# would include openssl headers incompatible with
		# the system library. Only add this include path
		# if we're not using openssl (which we're most
		# likely not if we're using libgcrypt)
		result += <library>gcrypt ;
	}

	if <target-os>windows in $(properties)
		|| <target-os>cygwin in $(properties)
	{
		# socket functions on windows require winsock libraries
		result += <library>ws2_32
			<library>wsock32
			<library>iphlpapi
			<define>WIN32_LEAN_AND_MEAN
			<define>__USE_W32_SOCKETS
			<define>WIN32
			<define>_WIN32
		;

		# when DHT is enabled, we need ed25519 which in turn
		# needs entropy
		if ! <dht>off in $(properties)
		{
			result += <library>advapi32 ;
		}

		# default to windows vista
		if <windows-version>default in $(properties)
		{
			result += <define>_WIN32_WINNT=0x0600 ;
		}
	}

	if <target-os>beos in $(properties)
	{
		result += <library>netkit <library>gcc ;
	}

	if <target-os>solaris in $(properties)
	{
		result += <library>libsocket <library>libnsl ;
	}

	if <iconv>on in $(properties)
	{
		result += <library>libiconv ;
	}

	if ( <toolset>gcc in $(properties)
			|| <toolset>clang in $(properties) )
		&& <target-os>linux in $(properties)
		&& ( <asserts>on in $(properties)
			|| <asserts>production in $(properties)
			|| <pool-allocators>debug in $(properties)
			|| <allocator>debug in $(properties)
			|| <asio-debugging>on in $(properties) )
	{
		# for backtraces in assertion failures
		# which only works on ELF targets with gcc
		result += <linkflags>-export-dynamic <linkflags>-rdynamic ;
	}

	if <boost-link>static in $(properties)
	{
		if <link>shared in $(properties)
		{
			# if libtorrent is being built as a shared library
			# but we're linking against boost statically, we still
			# need to make boost think it's being built as a shared
			# library, so that it properly exports its symbols
			result += <define>BOOST_ALL_DYN_LINK ;
			result += <library>boost_system/<link>static/<define>BOOST_ALL_DYN_LINK ;
		}
		else
		{
			result += <library>boost_system/<link>static ;
		}

		if <toolset>gcc in $(properties)
			&& ! <target-os>windows in $(properties)
			&& <link>shared in $(properties)
		{
			result += <fpic>on ;
		}

	}
	else if <boost-link>shared in $(properties)
	{
		result += <library>boost_system/<link>shared ;
	}
	else
	{
		result += <library>boost_system ;
	}

	result += <define>BOOST_ALL_NO_LIB
		<define>BOOST_MULTI_INDEX_DISABLE_SERIALIZATION
		;

	return $(result) ;
}

rule warnings ( properties * )
{
	local result ;

	if <warnings>off in $(properties)
	{
		return $(result) ;
	}

	if <toolset>clang in $(properties)
		|| <toolset>darwin in $(properties)
	{
		result += <cflags>-Weverything ;
		result += <cflags>-Wno-documentation ;
		result += <cxxflags>-Wno-c++98-compat-pedantic ;
		result += <cflags>-Wno-padded ;
		result += <cflags>-Wno-global-constructors ;
		result += <cxxflags>-Wno-c++98-compat ;
		result += <cflags>-Wno-exit-time-destructors ;
		result += <cflags>-Wno-documentation-unknown-command ;
		result += <cflags>-Wno-disabled-macro-expansion ;
		result += <cflags>-Wno-unused-command-line-argument ;
		result += <cflags>-Wno-error=implicit-fallthrough ;
		result += <cflags>-Wno-c++11-long-long ;
		result += <cflags>-Wno-variadic-macros ;

# in C++98 mode there's no way to silence this warning
# in the code (without final)
		result += <cflags>-Wno-non-virtual-dtor ;

# enable these warnings again, once the other ones are dealt with
		result += <cflags>-Wno-weak-vtables ;
		result += <cflags>-Wno-sign-compare ;
		result += <cflags>-Wno-sign-conversion ;
		result += <cflags>-Wno-conversion ;
	}

	if <toolset>gcc in $(properties)
	{
		result += <cflags>-Wall ;
		result += <cflags>-Wextra ;
		result += <cflags>-Wpedantic ;
#		result += <cflags>-Wmisleading-indentation ;
		result += <cflags>-Wparentheses ;
		result += <cflags>-Wvla ;
		result += <cxxflags>-Wc++11-compat ;
		result += <cflags>-Wno-format-zero-length ;
		result += <cflags>-Wno-long-long ;

# enable these warnings again, once the other ones are dealt with
		result += <cflags>-Wno-sign-compare ;
		result += <cflags>-Wno-unused-variable ;
	}

	if <toolset>msvc in $(properties)
	{
# disable warning C4503: decorated name length exceeded, name was truncated
		result += <cflags>/wd4503 ;
		result += <warnings>all ;

# enable these warnings again, once the other ones are dealt with

# disable warning C4389: signed/unsigned mismatch
		result += <cflags>/wd4389 ;
		result += <cflags>/wd4245 ;
		result += <cflags>/wd4018 ;
# disable warning C4244: 'argument' : conversion from 'int' to 'unsigned short', possible loss of data
		result += <cflags>/wd4244 ;
# disable warning C4512: assignment operator could not be generated
		result += <cflags>/wd4512 ;
# disable warning C4251: 'identifier' : class 'type' needs to have dll-interface to be used by clients of class 'type2'
		result += <cflags>/wd4251 ;
# disable warning C4275: non DLL-interface classkey 'identifier' used as base for DLL-interface classkey 'identifier'
		result += <cflags>/wd4275 ;
# disable warning C4373: virtual function overrides, previous versions of the compiler did not override when parameters only differed by const/volatile qualifiers
		result += <cflags>/wd4373 ;
	}

	return $(result) ;
}

# rule for adding the right source files
# depending on target-os and features
rule building ( properties * )
{
	local result ;

	if <toolset>msvc in $(properties)
	{
		# allow larger .obj files (with more sections)
		result += <cflags>/bigobj ;
	}

	if ( <variant>debug in $(properties)
		&& ( <toolset>clang in $(properties)
			|| <toolset>gcc in $(properties)
			|| <toolset>darwin in $(properties) ) )
	{
		result += <cflags>-ftrapv ;
	}

	if ( <asserts>production in $(properties)
		|| <asserts>on in $(properties) )
	{
		result += <source>src/assert.cpp ;
	}

	if <encryption>on in $(properties)
	{
		result += <source>src/pe_crypto.cpp ;
	}

	if <crypo>built-in in $(properties)
	{
		result += <source>src/sha1.cpp ;
	}

	if ( <toolset>darwin in $(properties)
		|| <toolset>gcc in $(properties)
		|| <toolset>clang in $(propertoes)
		|| <toolset>clang-darwin in $(propertoes) )
		&& <link>shared in $(properties)
		# on GCC, enabling debugging in libstdc++
		# breaks the ABI and its ability to appear
		# in shared object interfaces, so when it's
		# enabled, just export everything (since we're)
		# probably not a production build anyway
		&& ! <debug-iterators>on in $(properties)
	{
		# hide non-external symbols
		result += <cflags>-fvisibility=hidden ;
		result += <cxxflags>-fvisibility-inlines-hidden ;

		if ( <toolset>gcc in $(properties) )
		{
			result += <linkflags>-Wl,-Bsymbolic ;
		}
	}

	return $(result) ;
}

rule tag ( name : type  ? : property-set )
{
	name = [ virtual-target.add-prefix-and-suffix $(name) : $(type) : $(property-set) ] ;

	if $(type) = SHARED_LIB &&
		( ! ( [ $(property-set).get <target-os> ] in windows cygwin ) )
	{
		name = $(name).$(VERSION) ;
	}

	return $(name) ;
}

feature ipv6 : on off : composite propagated link-incompatible ;
feature.compose <ipv6>off : <define>TORRENT_USE_IPV6=0 ;

feature sanitize : off address bounds undefined thread rtc : composite propagated link-incompatible ;
# sanitize is a clang and GCC feature
feature.compose <sanitize>bounds : <cflags>-fsanitize=bounds <cflags>-fsanitize-undefined-trap-on-error <linkflags>-fsanitize=bounds <linkflags>-fsanitize-undefined-trap-on-error ;
feature.compose <sanitize>undefined : <cflags>-fsanitize=undefined <linkflags>-fsanitize=undefined ;
feature.compose <sanitize>thread : <cflags>-fsanitize=thread <linkflags>-fsanitize=thread ;
feature.compose <sanitize>address : <cflags>-fsanitize=address <linkflags>-fsanitize=address ;
# RTC (runtime check) is an msvc feature
feature.compose <sanitize>rtc : <cflags>/RTCc <cflags>/RTCsu ;

feature fiemap : off on : composite propagated ;
feature.compose <fiemap>on : <define>HAVE_LINUX_FIEMAP_H ;

feature file-leak-logging : off on : composite propagated ;
feature.compose <file-leak-logging>on : <define>TORRENT_DEBUG_FILE_LEAKS=1 ;

feature i2p : on off : composite propagated ;
feature.compose <i2p>on : <define>TORRENT_USE_I2P=1 ;
feature.compose <i2p>off : <define>TORRENT_USE_I2P=0 ;

feature iconv : auto on off : composite propagated ;
feature.compose <iconv>on : <define>TORRENT_USE_ICONV=1 ;
feature.compose <iconv>off : <define>TORRENT_USE_ICONV=0 ;

feature memory-optimization : off on : composite propagated link-incompatible ;
feature.compose <memory-optimization>on : <define>TORRENT_OPTIMIZE_MEMORY_USAGE ;

feature asserts : off on production system : composite propagated ;
feature.compose <asserts>on : <define>TORRENT_USE_ASSERTS=1 ;
feature.compose <asserts>production : <define>TORRENT_USE_ASSERTS=1 <define>TORRENT_PRODUCTION_ASSERTS=1 ;
feature.compose <asserts>system : <define>TORRENT_USE_ASSERTS=1 <define>TORRENT_USE_SYSTEM_ASSERTS=1 ;

feature windows-version : default vista win7 xp : composite propagated link-incompatible ;
feature.compose <windows-version>vista : <define>_WIN32_WINNT=0x0600 ;
feature.compose <windows-version>win7 : <define>_WIN32_WINNT=0x0601 ;
feature.compose <windows-version>xp : <define>_WIN32_WINNT=0x0501 ;

feature extensions : on off : composite propagated link-incompatible ;
feature.compose <extensions>off : <define>TORRENT_DISABLE_EXTENSIONS ;

feature asio-debugging : off on : composite propagated link-incompatible ;
feature.compose <asio-debugging>on : <define>TORRENT_ASIO_DEBUGGING ;

feature picker-debugging : off on : composite propagated link-incompatible ;
feature.compose <picker-debugging>on : <define>TORRENT_DEBUG_REFCOUNTS ;

feature simulator : off on : composite propagated link-incompatible ;
feature.compose <simulator>on : <define>TORRENT_BUILD_SIMULATOR ;

# deprecated use allocator=pool instead
feature pool-allocators : on off debug : composite propagated link-incompatible ;
feature.compose <pool-allocators>off : <define>TORRENT_DISABLE_POOL_ALLOCATOR ;
feature.compose <pool-allocators>debug : <define>TORRENT_DISABLE_POOL_ALLOCATOR <define>TORRENT_DEBUG_BUFFERS ;

feature allocator : pool system debug : composite propagated ;
feature.compose <allocator>system : <define>TORRENT_DISABLE_POOL_ALLOCATOR ;
feature.compose <allocator>debug : <define>TORRENT_DISABLE_POOL_ALLOCATOR <define>TORRENT_DEBUG_BUFFERS ;

feature piece-allocator : valloc memalign posix_memalign : composite propagated ;
feature.compose <piece-allocator>memalign : <define>TORRENT_USE_MEMALIGN=1 ;
feature.compose <piece-allocator>posix_memalign : <define>TORRENT_USE_POSIX_MEMALIGN=1 ;

feature invariant-checks : off on full : composite propagated link-incompatible ;
feature.compose <invariant-checks>on : <define>TORRENT_USE_INVARIANT_CHECKS=1 ;
feature.compose <invariant-checks>full : <define>TORRENT_USE_INVARIANT_CHECKS=1 <define>TORRENT_EXPENSIVE_INVARIANT_CHECKS ;

feature disk-stats : off on : composite propagated link-incompatible ;
feature.compose <disk-stats>on : <define>TORRENT_DISK_STATS ;

feature utp-log : off on : composite propagated link-incompatible ;
feature.compose <utp-log>on : <define>TORRENT_UTP_LOG_ENABLE ;

feature simulate-slow-read : off on : composite propagated ;
feature.compose <simulate-slow-read>on : <define>TORRENT_SIMULATE_SLOW_READ ;

feature logging : on off : composite propagated link-incompatible ;
feature.compose <logging>off : <define>TORRENT_DISABLE_LOGGING ;

feature dht : on off : composite propagated link-incompatible ;
feature.compose <dht>off : <define>TORRENT_DISABLE_DHT ;

feature encryption : on off : composite propagated link-incompatible ;
feature.compose <encryption>off : <define>TORRENT_DISABLE_ENCRYPTION ;

feature mutable-torrents : on off : composite propagated link-incompatible ;
feature.compose <mutable-torrents>off : <define>TORRENT_DISABLE_MUTABLE_TORRENTS ;

feature crypto : built-in libcrypto libgcrypt : composite propagated ;
feature.compose <crypto>libcrypto : <define>TORRENT_USE_LIBCRYPTO ;
feature.compose <crypto>libgcrypt : <define>TORRENT_USE_LIBGCRYPT ;

feature ssl : off openssl : composite propagated ;
feature.compose <ssl>openssl : <define>TORRENT_USE_OPENSSL <define>OPENSSL_NO_SSL2 ;

feature character-set : unicode ansi : composite propagated link-incompatible ;
feature.compose <character-set>unicode : <define>_UNICODE <define>UNICODE ;

feature deprecated-functions : on off : composite propagated link-incompatible ;
feature.compose <deprecated-functions>off : <define>TORRENT_NO_DEPRECATE ;

feature boost-link : default static shared : propagated composite ;

feature debug-iterators : off on : composite propagated link-incompatible ;
feature.compose <debug-iterators>on : <define>_SCL_SECURE=1 <define>_GLIBCXX_DEBUG
	<define>_GLIBCXX_DEBUG_PEDANTIC ;

feature fpic : off on : composite propagated link-incompatible ;
feature.compose <fpic>on : <cflags>-fPIC ;
feature.compose <fpic>off : <toolset>darwin:<cflags>-mdynamic-no-pic ;

feature profile-calls : off on : composite propagated link-incompatible ;
feature.compose <profile-calls>on : <define>TORRENT_PROFILE_CALLS=1 ;

# controls whether or not to export some internal
# libtorrent functions. Used for unit testing
feature export-extra : off on : composite propagated ;
# export some internal libtorrent functions
# in order to me able to unit test them.
# this is off by default to keep the export
# symbol table reasonably small
feature.compose <export-extra>on : <define>TORRENT_EXPORT_EXTRA ;


# this is a trick to get filename paths to targets to become shorter
# making it possible to build on windows, especially mingw seems particular
# for release builds, disable optimizations as they bump GCC over the edge of
# allowed memory usage on travis-ci
variant test_release : release
	: <asserts>production <debug-symbols>on
	<invariant-checks>full <boost-link>shared <optimization>off
	<export-extra>on <debug-iterators>on <threading>multi
	<inlining>off
	;
variant test_debug : debug
	: <logging>on <disk-stats>on
	<allocator>debug
	<invariant-checks>full <boost-link>shared
	<export-extra>on <debug-iterators>on <threading>multi <asserts>on
	;
variant test_barebones : debug
	: <ipv6>off <dht>off <extensions>off <logging>off <boost-link>shared
	<deprecated-functions>off <invariant-checks>off
	<export-extra>on <debug-iterators>on <threading>multi <asserts>on
	;
variant test_arm : debug
	: <ipv6>off <dht>off <extensions>off <logging>off
	<deprecated-functions>off <invariant-checks>off
	<export-extra>on <asserts>on
	;

# required for openssl on windows
lib ssleay32 : : <name>ssleay32 ;
lib libeay32 : : <name>libeay32 ;
lib advapi32 : : <name>advapi32 ;
lib user32 : : <name>user32 ;
lib shell32 : : <name>shell32 ;
lib gdi32 : : <name>gdi32 ;
lib dbghelp : : <name>dbghelp ;

# required for networking on beos
lib netkit : : <name>net <search>/boot/system/lib <link>shared ;
lib gcc : : <name>gcc <link>static ;

# when using iconv
lib libiconv : : <name>iconv <link>shared <search>/usr/local/lib ;

# openssl on linux/bsd/macos etc.
lib gcrypt : : <name>gcrypt <link>shared <search>/opt/local/lib <search>/usr/local/lib : : <include>/opt/local/include <include>/usr/local/include ;
lib z : : <link>shared <name>z <search>/usr/lib ;
lib crypto : : <name>crypto <link>shared <use>z <search>/opt/local/lib <search>/usr/local/lib : : <include>/opt/local/include <include>/usr/local/include ;
lib ssl : : <name>ssl <link>shared <use>crypto <search>/opt/local/lib <search>/usr/local/lib : : <include>/opt/local/include <include>/usr/local/include ;
lib dl : : <link>shared <name>dl ;

# time functions used on linux require librt
lib librt : : <name>rt <link>shared ;

lib libsocket : : <use>libnsl <name>socket <link>shared <search>/usr/sfw/lib <link>shared ;
lib libnsl : : <name>nsl <link>shared <search>/usr/sfw/lib <link>shared ;

# socket libraries on windows
lib wsock32 : : <name>wsock32 <link>shared ;
lib ws2_32 : : <name>ws2_32 <link>shared ;
lib iphlpapi : : <name>iphlpapi <link>shared ;

SOURCES =
	alert
	alert_manager
	allocator
	announce_entry
	assert
	bandwidth_limit
	bandwidth_manager
	bandwidth_queue_entry
	bdecode
	bitfield
	block_cache
	bloom_filter
	chained_buffer
	choker
	close_reason
	cpuid
	crc32c
	create_torrent
	disk_buffer_holder
	disk_buffer_pool
	disk_io_job
	disk_io_thread
	disk_io_thread_pool
	disk_job_pool
	entry
	error_code
	file_storage
	lazy_bdecode
	escape_string
	string_util
	file
	gzip
	hasher
	hex
	http_connection
	http_stream
	http_parser
	identify_client
	ip_filter
	ip_voter
	merkle
	peer_connection
	platform_util
	bt_peer_connection
	web_connection_base
	web_peer_connection
	http_seed_connection
	peer_connection_handle
	i2p_stream
	instantiate_connection
	natpmp
	packet_buffer
	piece_picker
	peer_list
	proxy_base
	puff
	random
	read_resume_data
	receive_buffer
	resolve_links
	session
	session_handle
	session_impl
	session_call
	settings_pack
	sha1_hash
	socket_io
	socket_type
	socks5_stream
	stat
	storage
	torrent
	torrent_handle
	torrent_info
	torrent_peer
	torrent_peer_allocator
	torrent_status
	time
	tracker_manager
	http_tracker_connection
	udp_tracker_connection
	sha1
	timestamp_history
	udp_socket
	upnp
	utf8
	utp_socket_manager
	utp_stream
	file_pool
	lsd
	enum_net
	broadcast_socket
	magnet_uri
	parse_url
	ConvertUTF
	xml_parse
	version
	peer_class
	peer_class_set
	part_file
	stat_cache
	request_blocks
	session_stats
	performance_counters
	resolver
	session_settings
	proxy_settings
	file_progress

# -- extensions --
	ut_pex
	ut_metadata
	smart_ban
	;

KADEMLIA_SOURCES =
	dht_storage
	dht_tracker
	msg
	node
	node_entry
	refresh
	rpc_manager
	find_data
	node_id
	routing_table
	traversal_algorithm
	dos_blocker
	get_peers
	item
	get_item
	put_data
	;

ED25519_SOURCES =
	add_scalar
	fe
	ge
	key_exchange
	keypair
	sc
	seed
	sha512
	sign
	verify
	;

local usage-requirements =
	<include>./include
	<include>./include/libtorrent
	<include>/usr/sfw/include
# freebsd doesn't seem to include this automatically
# and iconv.h is installed there
	<include>/usr/local/include
	<variant>release:<define>NDEBUG
	<define>_FILE_OFFSET_BITS=64
	<define>BOOST_EXCEPTION_DISABLE
# enable cancel support in asio
	<define>BOOST_ASIO_ENABLE_CANCELIO
# make sure asio uses std::chrono
	<define>BOOST_ASIO_HAS_STD_CHRONO
	<conditional>@linking
# these compiler settings just makes the compiler standard conforming
	<toolset>msvc:<cflags>/Zc:wchar_t
	<toolset>msvc:<cflags>/Zc:forScope
# msvc optimizations
	<toolset>msvc,<variant>release:<linkflags>/OPT:ICF=5
	<toolset>msvc,<variant>release:<linkflags>/OPT:REF

	# disable bogus deprecation warnings on msvc8
	<toolset>msvc:<define>_SCL_SECURE_NO_DEPRECATE
	<toolset>msvc:<define>_CRT_SECURE_NO_DEPRECATE

	<cxxflags>$(CXXFLAGS)
	<linkflags>$(LDFLAGS)
	;

project torrent ;

lib torrent

	: # sources
	src/$(SOURCES).cpp

	: # requirements
	<include>./ed25519/src
	<threading>multi
	<define>TORRENT_BUILDING_LIBRARY
	<link>shared:<define>TORRENT_BUILDING_SHARED
	<define>BOOST_NO_DEPRECATED
	<link>shared:<define>BOOST_SYSTEM_SOURCE

	<dht>on:<source>src/kademlia/$(KADEMLIA_SOURCES).cpp
	<dht>on:<source>ed25519/src/$(ED25519_SOURCES).cpp
	<variant>debug:<asserts>on
	<variant>debug:<invariant-checks>on

	<conditional>@building
	<conditional>@warnings
	<cxxflags>$(CXXFLAGS)

	<tag>@tag

	$(usage-requirements)

	: # default build
	<threading>multi

	: # usage requirements
	$(usage-requirements)
	<link>shared:<define>TORRENT_LINKING_SHARED

	;

headers = [ path.glob-tree include/libtorrent : *.hpp ] ;

package.install install
	: <install-source-root>libtorrent
	:
	: torrent
	: $(headers)
	;