bin_PROGRAMS+= src/or/tor
noinst_LIBRARIES += \
	src/or/libtor.a
if UNITTESTS_ENABLED
noinst_LIBRARIES += \
	src/or/libtor-testing.a
endif
if COVERAGE_ENABLED
noinst_PROGRAMS+= src/or/tor-cov
endif

if BUILD_NT_SERVICES
tor_platform_source=src/or/ntmain.c
else
tor_platform_source=
endif

EXTRA_DIST+= src/or/ntmain.c src/or/Makefile.nmake

LIBTOR_A_SOURCES = \
	src/or/addressmap.c				\
	src/or/bridges.c				\
	src/or/channel.c				\
	src/or/channelpadding.c				\
	src/or/channeltls.c				\
	src/or/circpathbias.c				\
	src/or/circuitbuild.c				\
	src/or/circuitlist.c				\
	src/or/circuitmux.c				\
	src/or/circuitmux_ewma.c			\
	src/or/circuitstats.c				\
	src/or/circuituse.c				\
	src/or/command.c				\
	src/or/config.c					\
	src/or/confparse.c				\
	src/or/connection.c				\
	src/or/connection_edge.c			\
	src/or/connection_or.c				\
	src/or/conscache.c				\
	src/or/consdiff.c				\
	src/or/consdiffmgr.c				\
	src/or/control.c				\
	src/or/cpuworker.c				\
	src/or/directory.c				\
	src/or/dirserv.c				\
	src/or/dns.c					\
	src/or/dnsserv.c				\
	src/or/dos.c					\
	src/or/fp_pair.c				\
	src/or/geoip.c					\
	src/or/entrynodes.c				\
	src/or/ext_orport.c				\
	src/or/git_revision.c				\
	src/or/hibernate.c				\
	src/or/hs_cache.c				\
	src/or/hs_cell.c				\
	src/or/hs_circuit.c				\
	src/or/hs_circuitmap.c				\
	src/or/hs_client.c				\
	src/or/hs_common.c				\
	src/or/hs_config.c				\
	src/or/hs_control.c				\
	src/or/hs_descriptor.c				\
	src/or/hs_ident.c				\
	src/or/hs_intropoint.c				\
	src/or/hs_ntor.c				\
	src/or/hs_service.c				\
	src/or/hs_stats.c				\
	src/or/keypin.c					\
	src/or/main.c					\
	src/or/microdesc.c				\
	src/or/networkstatus.c				\
	src/or/nodelist.c				\
	src/or/onion.c					\
	src/or/onion_fast.c				\
	src/or/onion_tap.c				\
	src/or/transports.c				\
	src/or/parsecommon.c			\
	src/or/periodic.c				\
	src/or/protover.c				\
	src/or/protover_rust.c				\
	src/or/proto_cell.c				\
	src/or/proto_control0.c				\
	src/or/proto_ext_or.c				\
	src/or/proto_http.c				\
	src/or/proto_socks.c				\
	src/or/policies.c				\
	src/or/reasons.c				\
	src/or/relay.c					\
	src/or/relay_crypto.c				\
	src/or/rendcache.c				\
	src/or/rendclient.c				\
	src/or/rendcommon.c				\
	src/or/rendmid.c				\
	src/or/rendservice.c				\
	src/or/rephist.c				\
	src/or/replaycache.c				\
	src/or/router.c					\
	src/or/routerkeys.c				\
	src/or/routerlist.c				\
	src/or/routerparse.c				\
	src/or/routerset.c				\
	src/or/scheduler.c				\
	src/or/scheduler_kist.c				\
	src/or/scheduler_vanilla.c			\
	src/or/shared_random_client.c			\
	src/or/statefile.c				\
	src/or/status.c					\
	src/or/torcert.c				\
	src/or/tor_api.c				\
	src/or/voting_schedule.c			\
	src/or/onion_ntor.c				\
	$(tor_platform_source)

#
# Modules are conditionnally compiled in tor starting here. We add the C files
# only if the modules has been enabled at configure time. We always add the
# source files of every module to libtor-testing.a so we can build the unit
# tests for everything. See the UNITTESTS_ENABLED branch below.
#
LIBTOR_TESTING_A_SOURCES = $(LIBTOR_A_SOURCES)

# The Directory Authority module.
MODULE_DIRAUTH_SOURCES = \
	src/or/dirauth/dircollate.c				\
	src/or/dirauth/dirvote.c				\
	src/or/dirauth/shared_random.c				\
	src/or/dirauth/shared_random_state.c
if BUILD_MODULE_DIRAUTH
LIBTOR_A_SOURCES += $(MODULE_DIRAUTH_SOURCES)
endif

src_or_libtor_a_SOURCES = $(LIBTOR_A_SOURCES)
if UNITTESTS_ENABLED

# Add the sources of the modules that are needed for tests to work here.
LIBTOR_TESTING_A_SOURCES += $(MODULE_DIRAUTH_SOURCES)

src_or_libtor_testing_a_SOURCES = $(LIBTOR_TESTING_A_SOURCES)
else
src_or_libtor_testing_a_SOURCES =
endif

src_or_tor_SOURCES = src/or/tor_main.c
AM_CPPFLAGS += -I$(srcdir)/src/or -Isrc/or

src/or/tor_main.$(OBJEXT) \
  src/or/src_or_tor_cov-tor_main.$(OBJEXT): micro-revision.i

AM_CPPFLAGS += -DSHARE_DATADIR="\"$(datadir)\""		\
		-DLOCALSTATEDIR="\"$(localstatedir)\""	\
		-DBINDIR="\"$(bindir)\""

src_or_libtor_testing_a_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_CPPFLAGS)
src_or_libtor_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)

# -L flags need to go in LDFLAGS. -l flags need to go in LDADD.
# This seems to matter nowhere but on windows, but I assure you that it
# matters a lot there, and is quite hard to debug if you forget to do it.


src_or_tor_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ @TOR_LDFLAGS_libevent@
src_or_tor_LDADD = src/or/libtor.a src/common/libor.a src/common/libor-ctime.a \
	src/common/libor-crypto.a $(LIBKECCAK_TINY) $(LIBDONNA) \
	src/common/libor-event.a src/trunnel/libor-trunnel.a \
	src/trace/libor-trace.a \
	$(rust_ldadd) \
	@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \
	@TOR_LIB_WS32@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ \
	@CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ \
	@TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@

if COVERAGE_ENABLED
src_or_tor_cov_SOURCES = src/or/tor_main.c
src_or_tor_cov_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_CPPFLAGS)
src_or_tor_cov_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
src_or_tor_cov_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ @TOR_LDFLAGS_libevent@
src_or_tor_cov_LDADD = src/or/libtor-testing.a src/common/libor-testing.a \
	src/common/libor-ctime-testing.a \
	src/common/libor-crypto-testing.a $(LIBKECCAK_TINY) $(LIBDONNA) \
	src/common/libor-event-testing.a src/trunnel/libor-trunnel-testing.a \
	@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \
	@TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ \
	@TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@
endif

ORHEADERS = \
	src/or/addressmap.h				\
	src/or/auth_dirs.inc				\
	src/or/bridges.h				\
	src/or/channel.h				\
	src/or/channelpadding.h				\
	src/or/channeltls.h				\
	src/or/circpathbias.h				\
	src/or/circuitbuild.h				\
	src/or/circuitlist.h				\
	src/or/circuitmux.h				\
	src/or/circuitmux_ewma.h			\
	src/or/circuitstats.h				\
	src/or/circuituse.h				\
	src/or/command.h				\
	src/or/config.h					\
	src/or/confparse.h				\
	src/or/connection.h				\
	src/or/connection_edge.h			\
	src/or/connection_or.h				\
	src/or/conscache.h				\
	src/or/consdiff.h				\
	src/or/consdiffmgr.h				\
	src/or/control.h				\
	src/or/cpuworker.h				\
	src/or/directory.h				\
	src/or/dirserv.h				\
	src/or/dns.h					\
	src/or/dns_structs.h				\
	src/or/dnsserv.h				\
	src/or/dos.h					\
	src/or/ext_orport.h				\
	src/or/fallback_dirs.inc			\
	src/or/fp_pair.h				\
	src/or/geoip.h					\
	src/or/entrynodes.h				\
	src/or/git_revision.h				\
	src/or/hibernate.h				\
	src/or/hs_cache.h				\
	src/or/hs_cell.h				\
	src/or/hs_circuit.h				\
	src/or/hs_circuitmap.h				\
	src/or/hs_client.h				\
	src/or/hs_common.h				\
	src/or/hs_config.h				\
	src/or/hs_control.h				\
	src/or/hs_descriptor.h				\
	src/or/hs_ident.h				\
	src/or/hs_intropoint.h				\
	src/or/hs_ntor.h				\
	src/or/hs_stats.h				\
	src/or/hs_service.h				\
	src/or/keypin.h					\
	src/or/main.h					\
	src/or/microdesc.h				\
	src/or/networkstatus.h				\
	src/or/nodelist.h				\
	src/or/ntmain.h					\
	src/or/onion.h					\
	src/or/onion_fast.h				\
	src/or/onion_ntor.h				\
	src/or/onion_tap.h				\
	src/or/or.h					\
	src/or/transports.h				\
	src/or/parsecommon.h			\
	src/or/periodic.h				\
	src/or/policies.h				\
	src/or/protover.h				\
	src/or/proto_cell.h				\
	src/or/proto_control0.h				\
	src/or/proto_ext_or.h				\
	src/or/proto_http.h				\
	src/or/proto_socks.h				\
	src/or/reasons.h				\
	src/or/relay.h					\
	src/or/relay_crypto.h				\
	src/or/rendcache.h				\
	src/or/rendclient.h				\
	src/or/rendcommon.h				\
	src/or/rendmid.h				\
	src/or/rendservice.h				\
	src/or/rephist.h				\
	src/or/replaycache.h				\
	src/or/router.h					\
	src/or/routerkeys.h				\
	src/or/routerlist.h				\
	src/or/routerkeys.h				\
	src/or/routerset.h				\
	src/or/routerparse.h				\
	src/or/scheduler.h				\
	src/or/shared_random_client.h			\
	src/or/statefile.h				\
	src/or/status.h					\
	src/or/torcert.h				\
	src/or/tor_api_internal.h			\
	src/or/voting_schedule.h

# We add the headers of the modules even though they are disabled so we can
# properly compiled the entry points stub.

# The Directory Authority module headers.
ORHEADERS += \
	src/or/dirauth/dircollate.h				\
	src/or/dirauth/dirvote.h				\
	src/or/dirauth/mode.h					\
	src/or/dirauth/shared_random.h				\
	src/or/dirauth/shared_random_state.h

# This may someday want to be an installed file?
noinst_HEADERS += src/or/tor_api.h

noinst_HEADERS += $(ORHEADERS) micro-revision.i

micro-revision.i: FORCE
	$(AM_V_at)rm -f micro-revision.tmp; \
	if test -r "$(top_srcdir)/.git" && \
			test -x "`which git 2>&1;true`"; then \
		HASH="`cd "$(top_srcdir)" && git rev-parse --short=16 HEAD`"; \
		echo \"$$HASH\" > micro-revision.tmp; \
	fi; \
	if test ! -f micro-revision.tmp; then \
		if test ! -f micro-revision.i; then \
			echo '""' > micro-revision.i; \
		fi; \
	elif test ! -f micro-revision.i || \
			test x"`cat micro-revision.tmp`" != x"`cat micro-revision.i`"; then \
		mv micro-revision.tmp micro-revision.i; \
	fi; \
	rm -f micro-revision.tmp; \
	true

CLEANFILES+= micro-revision.i src/or/micro-revision.i micro-revision.tmp

FORCE:
