LOCALBASE?=	/usr/local
CXXFLAGS+=	-std=c++17 -Wall -Wextra -Wno-deprecated-declarations \
		-Wno-unused-parameter
CPPFLAGS+=	-DBUILD_SCM_REVISION=\"c7e8e73\" \
		-DBUILD_SCM_STATUS=\"Modified\" \
		-DNDEBUG -DENVOY_SSL_VERSION=\"BoringSSL\" \
		-DSPDLOG_FMT_EXTERNAL -DENVOY_ENABLE_QUIC \
		-DENVOY_ADMIN_HTML \
		-I.. -I../api -I../bazel/external/http_parser \
		-I../../cel-cpp-11f9d66 \
		-I../../quiche-37de4f7 \
		-I../../quiche-37de4f7/quiche/common/platform/default \
		-I../.. -I$(LOCALBASE)/include
LDFLAGS+=	-L$(LOCALBASE)/lib
CCACHE?=	$(shell command -v ccache)

api_OBJS=	envoy/admin/v2alpha/certs.pb.o \
		envoy/admin/v2alpha/clusters.pb.o \
		envoy/admin/v2alpha/config_dump.pb.o \
		envoy/admin/v2alpha/memory.pb.o \
		envoy/admin/v2alpha/metrics.pb.o \
		envoy/admin/v2alpha/mutex_stats.pb.o \
		envoy/admin/v2alpha/server_info.pb.o \
		envoy/admin/v3/certs.pb.o \
		envoy/admin/v3/clusters.pb.o \
		envoy/admin/v3/config_dump.pb.o \
		envoy/admin/v3/config_dump_shared.pb.o \
		envoy/admin/v3/init_dump.pb.o \
		envoy/admin/v3/listeners.pb.o \
		envoy/admin/v3/memory.pb.o \
		envoy/admin/v3/metrics.pb.o \
		envoy/admin/v3/mutex_stats.pb.o \
		envoy/admin/v3/server_info.pb.o \
		envoy/admin/v3/tap.pb.o \
		envoy/annotations/deprecation.pb.o \
		envoy/annotations/resource.pb.o \
		envoy/api/v2/auth/cert.pb.o \
		envoy/api/v2/auth/common.pb.o \
		envoy/api/v2/auth/secret.pb.o \
		envoy/api/v2/auth/tls.pb.o \
		envoy/api/v2/cds.pb.o \
		envoy/api/v2/cluster.pb.o \
		envoy/api/v2/cluster/circuit_breaker.pb.o \
		envoy/api/v2/cluster/filter.pb.o \
		envoy/api/v2/cluster/outlier_detection.pb.o \
		envoy/api/v2/core/address.pb.o \
		envoy/api/v2/core/backoff.pb.o \
		envoy/api/v2/core/base.pb.o \
		envoy/api/v2/core/config_source.pb.o \
		envoy/api/v2/core/event_service_config.pb.o \
		envoy/api/v2/core/grpc_service.pb.o \
		envoy/api/v2/core/health_check.pb.o \
		envoy/api/v2/core/http_uri.pb.o \
		envoy/api/v2/core/protocol.pb.o \
		envoy/api/v2/core/socket_option.pb.o \
		envoy/api/v2/discovery.pb.o \
		envoy/api/v2/eds.pb.o \
		envoy/api/v2/endpoint.pb.o \
		envoy/api/v2/endpoint/endpoint.pb.o \
		envoy/api/v2/endpoint/endpoint_components.pb.o \
		envoy/api/v2/endpoint/load_report.pb.o \
		envoy/api/v2/lds.pb.o \
		envoy/api/v2/listener.pb.o \
		envoy/api/v2/listener/listener.pb.o \
		envoy/api/v2/listener/listener_components.pb.o \
		envoy/api/v2/listener/udp_listener_config.pb.o \
		envoy/api/v2/ratelimit/ratelimit.pb.o \
		envoy/api/v2/rds.pb.o \
		envoy/api/v2/route.pb.o \
		envoy/api/v2/route/route.pb.o \
		envoy/api/v2/route/route_components.pb.o \
		envoy/api/v2/scoped_route.pb.o \
		envoy/config/accesslog/v2/als.pb.o \
		envoy/config/accesslog/v2/file.pb.o \
		envoy/config/accesslog/v3/accesslog.pb.o \
		envoy/config/bootstrap/v2/bootstrap.pb.o \
		envoy/config/bootstrap/v3/bootstrap.pb.o \
		envoy/config/cluster/v3/circuit_breaker.pb.o \
		envoy/config/cluster/v3/cluster.pb.o \
		envoy/config/cluster/v3/filter.pb.o \
		envoy/config/cluster/v3/outlier_detection.pb.o \
		envoy/config/common/key_value/v3/config.pb.o \
		envoy/config/common/matcher/v3/matcher.pb.o \
		envoy/config/common/mutation_rules/v3/mutation_rules.pb.o \
		envoy/config/core/v3/address.pb.o \
		envoy/config/core/v3/backoff.pb.o \
		envoy/config/core/v3/base.pb.o \
		envoy/config/core/v3/config_source.pb.o \
		envoy/config/core/v3/event_service_config.pb.o \
		envoy/config/core/v3/extension.pb.o \
		envoy/config/core/v3/grpc_service.pb.o \
		envoy/config/core/v3/health_check.pb.o \
		envoy/config/core/v3/http_uri.pb.o \
		envoy/config/core/v3/protocol.pb.o \
		envoy/config/core/v3/proxy_protocol.pb.o \
		envoy/config/core/v3/resolver.pb.o \
		envoy/config/core/v3/socket_option.pb.o \
		envoy/config/core/v3/substitution_format_string.pb.o \
		envoy/config/core/v3/udp_socket_config.pb.o \
		envoy/config/endpoint/v3/endpoint.pb.o \
		envoy/config/endpoint/v3/endpoint_components.pb.o \
		envoy/config/endpoint/v3/load_report.pb.o \
		envoy/config/filter/accesslog/v2/accesslog.pb.o \
		envoy/config/filter/fault/v2/fault.pb.o \
		envoy/config/filter/http/fault/v2/fault.pb.o \
		envoy/config/filter/http/transcoder/v2/transcoder.pb.o \
		envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.pb.o \
		envoy/config/filter/network/redis_proxy/v2/redis_proxy.pb.o \
		envoy/config/filter/network/tcp_proxy/v2/tcp_proxy.pb.o \
		envoy/config/grpc_credential/v3/aws_iam.pb.o \
		envoy/config/grpc_credential/v3/file_based_metadata.pb.o \
		envoy/config/listener/v2/api_listener.pb.o \
		envoy/config/listener/v3/api_listener.pb.o \
		envoy/config/listener/v3/listener.pb.o \
		envoy/config/listener/v3/listener_components.pb.o \
		envoy/config/listener/v3/quic_config.pb.o \
		envoy/config/listener/v3/udp_listener_config.pb.o \
		envoy/config/metrics/v2/metrics_service.pb.o \
		envoy/config/metrics/v2/stats.pb.o \
		envoy/config/metrics/v3/metrics_service.pb.o \
		envoy/config/metrics/v3/stats.pb.o \
		envoy/config/overload/v2alpha/overload.pb.o \
		envoy/config/overload/v3/overload.pb.o \
		envoy/config/ratelimit/v3/rls.pb.o \
		envoy/config/rbac/v3/rbac.pb.o \
		envoy/config/route/v3/route.pb.o \
		envoy/config/route/v3/route_components.pb.o \
		envoy/config/route/v3/scoped_route.pb.o \
		envoy/config/tap/v3/common.pb.o \
		envoy/config/trace/v2/datadog.pb.o \
		envoy/config/trace/v2/dynamic_ot.pb.o \
		envoy/config/trace/v2/http_tracer.pb.o \
		envoy/config/trace/v2/lightstep.pb.o \
		envoy/config/trace/v2/opencensus.pb.o \
		envoy/config/trace/v2/service.pb.o \
		envoy/config/trace/v2/trace.pb.o \
		envoy/config/trace/v2/zipkin.pb.o \
		envoy/config/trace/v3/dynamic_ot.pb.o \
		envoy/config/trace/v3/http_tracer.pb.o \
		envoy/config/trace/v3/opentelemetry.pb.o \
		envoy/data/accesslog/v2/accesslog.pb.o \
		envoy/data/accesslog/v3/accesslog.pb.o \
		envoy/data/cluster/v2alpha/outlier_detection_event.pb.o \
		envoy/data/cluster/v3/outlier_detection_event.pb.o \
		envoy/data/core/v2alpha/health_check_event.pb.o \
		envoy/data/core/v3/health_check_event.pb.o \
		envoy/data/dns/v3/dns_table.pb.o \
		envoy/data/tap/v3/common.pb.o \
		envoy/data/tap/v3/http.pb.o \
		envoy/data/tap/v3/transport.pb.o \
		envoy/data/tap/v3/wrapper.pb.o \
		envoy/extensions/access_loggers/file/v3/file.pb.o \
		envoy/extensions/access_loggers/filters/cel/v3/cel.pb.o \
		envoy/extensions/access_loggers/grpc/v3/als.pb.o \
		envoy/extensions/access_loggers/open_telemetry/v3/logs_service.pb.o \
		envoy/extensions/access_loggers/stream/v3/stream.pb.o \
		envoy/extensions/bootstrap/internal_listener/v3/internal_listener.pb.o \
		envoy/extensions/clusters/aggregate/v3/cluster.pb.o \
		envoy/extensions/clusters/dynamic_forward_proxy/v3/cluster.pb.o \
		envoy/extensions/clusters/redis/v3/redis_cluster.pb.o \
		envoy/extensions/common/async_files/v3/async_file_manager.pb.o \
		envoy/extensions/common/dynamic_forward_proxy/v3/dns_cache.pb.o \
		envoy/extensions/common/ratelimit/v3/ratelimit.pb.o \
		envoy/extensions/common/tap/v3/common.pb.o \
		envoy/extensions/compression/brotli/compressor/v3/brotli.pb.o \
		envoy/extensions/compression/brotli/decompressor/v3/brotli.pb.o \
		envoy/extensions/compression/gzip/compressor/v3/gzip.pb.o \
		envoy/extensions/compression/gzip/decompressor/v3/gzip.pb.o \
		envoy/extensions/compression/zstd/compressor/v3/zstd.pb.o \
		envoy/extensions/compression/zstd/decompressor/v3/zstd.pb.o \
		envoy/extensions/config/validators/minimum_clusters/v3/minimum_clusters.pb.o \
		envoy/extensions/early_data/v3/default_early_data_policy.pb.o \
		envoy/extensions/filters/common/dependency/v3/dependency.pb.o \
		envoy/extensions/filters/common/fault/v3/fault.pb.o \
		envoy/extensions/filters/http/upstream_codec/v3/upstream_codec.pb.o \
		envoy/extensions/filters/listener/http_inspector/v3/http_inspector.pb.o \
		envoy/extensions/filters/listener/local_ratelimit/v3/local_ratelimit.pb.o \
		envoy/extensions/filters/listener/original_dst/v3/original_dst.pb.o \
		envoy/extensions/filters/listener/original_src/v3/original_src.pb.o \
		envoy/extensions/filters/listener/proxy_protocol/v3/proxy_protocol.pb.o \
		envoy/extensions/filters/listener/tls_inspector/v3/tls_inspector.pb.o \
		envoy/extensions/filters/network/connection_limit/v3/connection_limit.pb.o \
		envoy/extensions/filters/network/direct_response/v3/config.pb.o \
		envoy/extensions/filters/network/echo/v3/echo.pb.o \
		envoy/extensions/filters/network/ext_authz/v3/ext_authz.pb.o \
		envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.o \
		envoy/extensions/filters/network/local_ratelimit/v3/local_rate_limit.pb.o \
		envoy/extensions/filters/network/mongo_proxy/v3/mongo_proxy.pb.o \
		envoy/extensions/filters/network/ratelimit/v3/rate_limit.pb.o \
		envoy/extensions/filters/network/rbac/v3/rbac.pb.o \
		envoy/extensions/filters/network/redis_proxy/v3/redis_proxy.pb.o \
		envoy/extensions/filters/network/sni_cluster/v3/sni_cluster.pb.o \
		envoy/extensions/filters/network/sni_dynamic_forward_proxy/v3/sni_dynamic_forward_proxy.pb.o \
		envoy/extensions/filters/network/tcp_proxy/v3/tcp_proxy.pb.o \
		envoy/extensions/filters/network/thrift_proxy/v3/route.pb.o \
		envoy/extensions/filters/network/thrift_proxy/v3/thrift_proxy.pb.o \
		envoy/extensions/filters/network/zookeeper_proxy/v3/zookeeper_proxy.pb.o \
		envoy/extensions/filters/udp/dns_filter/v3/dns_filter.pb.o \
		envoy/extensions/filters/udp/udp_proxy/v3/route.pb.o \
		envoy/extensions/filters/udp/udp_proxy/v3/udp_proxy.pb.o \
		envoy/extensions/formatter/metadata/v3/metadata.pb.o \
		envoy/extensions/formatter/req_without_query/v3/req_without_query.pb.o \
		envoy/extensions/health_checkers/redis/v3/redis.pb.o \
		envoy/extensions/health_checkers/thrift/v3/thrift.pb.o \
		envoy/extensions/http/custom_response/local_response_policy/v3/local_response_policy.pb.o \
		envoy/extensions/http/custom_response/redirect_policy/v3/redirect_policy.pb.o \
		envoy/extensions/http/early_header_mutation/header_mutation/v3/header_mutation.pb.o \
		envoy/extensions/http/header_formatters/preserve_case/v3/preserve_case.pb.o \
		envoy/extensions/http/header_validators/envoy_default/v3/header_validator.pb.o \
		envoy/extensions/http/original_ip_detection/custom_header/v3/custom_header.pb.o \
		envoy/extensions/http/original_ip_detection/xff/v3/xff.pb.o \
		envoy/extensions/http/stateful_session/cookie/v3/cookie.pb.o \
		envoy/extensions/http/stateful_session/header/v3/header.pb.o \
		envoy/extensions/internal_redirect/allow_listed_routes/v3/allow_listed_routes_config.pb.o \
		envoy/extensions/internal_redirect/previous_routes/v3/previous_routes_config.pb.o \
		envoy/extensions/internal_redirect/safe_cross_scheme/v3/safe_cross_scheme_config.pb.o \
		envoy/extensions/key_value/file_based/v3/config.pb.o \
		envoy/extensions/load_balancing_policies/common/v3/common.pb.o \
		envoy/extensions/load_balancing_policies/least_request/v3/least_request.pb.o \
		envoy/extensions/load_balancing_policies/maglev/v3/maglev.pb.o \
		envoy/extensions/load_balancing_policies/random/v3/random.pb.o \
		envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.pb.o \
		envoy/extensions/load_balancing_policies/round_robin/v3/round_robin.pb.o \
		envoy/extensions/matching/common_inputs/environment_variable/v3/input.pb.o \
		envoy/extensions/matching/common_inputs/network/v3/network_inputs.pb.o \
		envoy/extensions/matching/common_inputs/ssl/v3/ssl_inputs.pb.o \
		envoy/extensions/matching/input_matchers/consistent_hashing/v3/consistent_hashing.pb.o \
		envoy/extensions/matching/input_matchers/ip/v3/ip.pb.o \
		envoy/extensions/network/dns_resolver/apple/v3/apple_dns_resolver.pb.o \
		envoy/extensions/network/dns_resolver/cares/v3/cares_dns_resolver.pb.o \
		envoy/extensions/network/dns_resolver/getaddrinfo/v3/getaddrinfo_dns_resolver.pb.o \
		envoy/extensions/network/socket_interface/v3/default_socket_interface.pb.o \
		envoy/extensions/path/match/uri_template/v3/uri_template_match.pb.o \
		envoy/extensions/path/rewrite/uri_template/v3/uri_template_rewrite.pb.o \
		envoy/extensions/quic/connection_id_generator/v3/envoy_deterministic_connection_id_generator.pb.o \
		envoy/extensions/quic/crypto_stream/v3/crypto_stream.pb.o \
		envoy/extensions/quic/proof_source/v3/proof_source.pb.o \
		envoy/extensions/quic/server_preferred_address/v3/fixed_server_preferred_address_config.pb.o \
		envoy/extensions/rate_limit_descriptors/expr/v3/expr.pb.o \
		envoy/extensions/regex_engines/v3/google_re2.pb.o \
		envoy/extensions/request_id/uuid/v3/uuid.pb.o \
		envoy/extensions/resource_monitors/downstream_connections/v3/downstream_connections.pb.o \
		envoy/extensions/resource_monitors/fixed_heap/v3/fixed_heap.pb.o \
		envoy/extensions/resource_monitors/injected_resource/v3/injected_resource.pb.o \
		envoy/extensions/retry/host/omit_host_metadata/v3/omit_host_metadata_config.pb.o \
		envoy/extensions/retry/priority/previous_priorities/v3/previous_priorities_config.pb.o \
		envoy/extensions/stat_sinks/graphite_statsd/v3/graphite_statsd.pb.o \
		envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.pb.o \
		envoy/extensions/transport_sockets/internal_upstream/v3/internal_upstream.pb.o \
		envoy/extensions/transport_sockets/proxy_protocol/v3/upstream_proxy_protocol.pb.o \
		envoy/extensions/transport_sockets/quic/v3/quic_transport.pb.o \
		envoy/extensions/transport_sockets/raw_buffer/v3/raw_buffer.pb.o \
		envoy/extensions/transport_sockets/starttls/v3/starttls.pb.o \
		envoy/extensions/transport_sockets/tap/v3/tap.pb.o \
		envoy/extensions/transport_sockets/tcp_stats/v3/tcp_stats.pb.o \
		envoy/extensions/transport_sockets/tls/v3/common.pb.o \
		envoy/extensions/transport_sockets/tls/v3/secret.pb.o \
		envoy/extensions/transport_sockets/tls/v3/tls.pb.o \
		envoy/extensions/udp_packet_writer/v3/udp_default_writer_factory.pb.o \
		envoy/extensions/upstreams/http/generic/v3/generic_connection_pool.pb.o \
		envoy/extensions/upstreams/http/http/v3/http_connection_pool.pb.o \
		envoy/extensions/upstreams/http/tcp/v3/tcp_connection_pool.pb.o \
		envoy/extensions/upstreams/http/v3/http_protocol_options.pb.o \
		envoy/extensions/upstreams/tcp/generic/v3/generic_connection_pool.pb.o \
		envoy/extensions/upstreams/tcp/v3/tcp_protocol_options.pb.o \
		envoy/extensions/watchdog/profile_action/v3/profile_action.pb.o \
		envoy/service/accesslog/v2/als.pb.o \
		envoy/service/accesslog/v3/als.pb.o \
		envoy/service/auth/v3/attribute_context.pb.o \
		envoy/service/auth/v3/external_auth.pb.o \
		envoy/service/cluster/v3/cds.pb.o \
		envoy/service/discovery/v2/ads.pb.o \
		envoy/service/discovery/v2/hds.pb.o \
		envoy/service/discovery/v2/sds.pb.o \
		envoy/service/discovery/v3/ads.pb.o \
		envoy/service/discovery/v3/discovery.pb.o \
		envoy/service/endpoint/v3/eds.pb.o \
		envoy/service/endpoint/v3/leds.pb.o \
		envoy/service/extension/v3/config_discovery.pb.o \
		envoy/service/health/v3/hds.pb.o \
		envoy/service/listener/v3/lds.pb.o \
		envoy/service/load_stats/v2/lrs.pb.o \
		envoy/service/load_stats/v3/lrs.pb.o \
		envoy/service/metrics/v2/metrics_service.pb.o \
		envoy/service/metrics/v3/metrics_service.pb.o \
		envoy/service/ratelimit/v2/rls.pb.o \
		envoy/service/ratelimit/v3/rls.pb.o \
		envoy/service/route/v3/rds.pb.o \
		envoy/service/route/v3/srds.pb.o \
		envoy/service/runtime/v3/rtds.pb.o \
		envoy/service/secret/v3/sds.pb.o \
		envoy/type/hash_policy.pb.o \
		envoy/type/http.pb.o \
		envoy/type/http/v3/cookie.pb.o \
		envoy/type/http/v3/path_transformation.pb.o \
		envoy/type/matcher/metadata.pb.o \
		envoy/type/matcher/number.pb.o \
		envoy/type/matcher/regex.pb.o \
		envoy/type/matcher/string.pb.o \
		envoy/type/matcher/v3/filter_state.pb.o \
		envoy/type/matcher/v3/http_inputs.pb.o \
		envoy/type/matcher/v3/metadata.pb.o \
		envoy/type/matcher/v3/number.pb.o \
		envoy/type/matcher/v3/path.pb.o \
		envoy/type/matcher/v3/regex.pb.o \
		envoy/type/matcher/v3/string.pb.o \
		envoy/type/matcher/v3/value.pb.o \
		envoy/type/matcher/value.pb.o \
		envoy/type/metadata/v2/metadata.pb.o \
		envoy/type/metadata/v3/metadata.pb.o \
		envoy/type/percent.pb.o \
		envoy/type/range.pb.o \
		envoy/type/semantic_version.pb.o \
		envoy/type/tracing/v2/custom_tag.pb.o \
		envoy/type/tracing/v3/custom_tag.pb.o \
		envoy/type/v3/hash_policy.pb.o \
		envoy/type/v3/http.pb.o \
		envoy/type/v3/http_status.pb.o \
		envoy/type/v3/percent.pb.o \
		envoy/type/v3/range.pb.o \
		envoy/type/v3/ratelimit_unit.pb.o \
		envoy/type/v3/semantic_version.pb.o \
		envoy/type/v3/token_bucket.pb.o \
		envoy/watchdog/v3/abort_action.pb.o \
		google/api/annotations.pb.o \
		google/api/expr/v1alpha1/checked.pb.o \
		google/api/expr/v1alpha1/syntax.pb.o \
		google/api/http.pb.o \
		google/rpc/status.pb.o \
		io/prometheus/client/metrics.pb.o \
		opencensus/proto/trace/v1/trace_config.pb.o \
		opentelemetry/proto/collector/logs/v1/logs_service.pb.o \
		opentelemetry/proto/collector/trace/v1/trace_service.pb.o \
		opentelemetry/proto/common/v1/common.pb.o \
		opentelemetry/proto/logs/v1/logs.pb.o \
		opentelemetry/proto/resource/v1/resource.pb.o \
		opentelemetry/proto/trace/v1/trace.pb.o \
		src/proto/grpc/health/v1/health.pb.o \
		udpa/annotations/migrate.pb.o \
		udpa/annotations/security.pb.o \
		udpa/annotations/sensitive.pb.o \
		udpa/annotations/status.pb.o \
		udpa/annotations/versioning.pb.o \
		udpa/type/v1/typed_struct.pb.o \
		validate/validate.pb.o \
		xds/annotations/v3/status.pb.o \
		xds/core/v3/authority.pb.o \
		xds/core/v3/cidr.pb.o \
		xds/core/v3/collection_entry.pb.o \
		xds/core/v3/context_params.pb.o \
		xds/core/v3/extension.pb.o \
		xds/core/v3/resource_locator.pb.o \
		xds/core/v3/resource_name.pb.o \
		xds/type/matcher/v3/ip.pb.o \
		xds/type/matcher/v3/matcher.pb.o \
		xds/type/matcher/v3/regex.pb.o \
		xds/type/matcher/v3/string.pb.o \
		xds/type/v3/typed_struct.pb.o

source_OBJS=	$(common_SRCS:.cc=.o) \
		$(exe_SRCS:.cc=.o) \
		$(extensions_SRCS:.cc=.o) \
		$(server_SRCS:.cc=.o)

external_OBJS=	../bazel/external/http_parser/http_parser.o \
		$(addprefix ../../cel-cpp-11f9d66/,$(cel_cpp_SRCS:.cc=.o)) \
		$(addprefix ../../,$(googleurl_SRCS:.cc=.o)) \
		$(quiche_SRCS:.cc=.o)

common_SRCS=	$(wildcard common/access_log/*.cc) \
			   common/api/api_impl.cc \
			   common/api/posix/os_sys_calls_impl.cc \
		$(wildcard common/buffer/*.cc) \
		$(wildcard common/chromium_url/*.cc) \
		$(wildcard common/common/*.cc) \
			   common/common/posix/thread_impl.cc \
		$(wildcard common/config/*.cc) \
		$(wildcard common/config/xds_mux/*.cc) \
			   common/conn_pool/conn_pool_base.cc \
		$(wildcard common/event/*.cc) \
			   common/event/posix/signal_impl.cc \
		$(wildcard common/filesystem/*.cc) \
			   common/filesystem/kqueue/watcher_impl.cc \
		$(wildcard common/filesystem/posix/*.cc) \
			   common/filter/config_discovery_impl.cc \
		$(wildcard common/formatter/*.cc) \
		$(wildcard common/grpc/*.cc) \
			   common/html/utility.cc \
		$(wildcard common/http/*.cc) \
		$(wildcard common/http/http1/*.cc) \
		$(wildcard common/http/http2/*.cc) \
		$(wildcard common/http/http3/*.cc) \
		$(wildcard common/init/*.cc) \
		$(wildcard common/json/*.cc) \
			   common/local_reply/local_reply.cc \
		$(wildcard common/memory/*.cc) \
		$(wildcard common/network/*.cc) \
			   common/network/dns_resolver/dns_factory_util.cc \
			   common/profiler/profiler.cc \
		$(wildcard common/protobuf/*.cc) \
			   common/quic/active_quic_listener.cc \
			   common/quic/client_codec_impl.cc \
			   common/quic/client_connection_factory_impl.cc \
		$(wildcard common/quic/envoy_quic_*.cc) \
		$(wildcard common/quic/platform/*.cc) \
		$(wildcard common/quic/quic_*.cc) \
			   common/quic/send_buffer_monitor.cc \
		$(wildcard common/rds/*.cc) \
		$(wildcard common/router/*.cc) \
		$(wildcard common/runtime/*.cc) \
		$(wildcard common/secret/*.cc) \
		$(wildcard common/signal/*.cc) \
		$(wildcard common/singleton/*.cc) \
		$(wildcard common/ssl/*.cc) \
		$(wildcard common/stats/*.cc) \
		$(wildcard common/stream_info/*.cc) \
		$(wildcard common/tcp*/*.cc) \
			   common/thread_local/thread_local_impl.cc \
		$(wildcard common/tracing/*.cc) \
		$(wildcard common/upstream/*.cc) \
		$(wildcard common/version/*.cc)

exe_SRCS=	$(wildcard exe/*.cc) \
		exe/posix/platform_impl.cc

extensions_SRCS=\
		$(wildcard extensions/access_loggers/[^w]*/*.cc) \
		$(wildcard extensions/access_loggers/filters/cel/*.cc) \
		$(wildcard extensions/bootstrap/internal_listener/*.cc) \
		$(wildcard extensions/clusters/*/*.cc) \
		$(wildcard extensions/common/async_files/*.cc) \
		$(wildcard extensions/common/aws/*.cc) \
		$(wildcard extensions/common/dynamic_forward_proxy/*.cc) \
		$(wildcard extensions/common/matcher/*.cc) \
		extensions/common/proxy_protocol/proxy_protocol_header.cc \
		$(wildcard extensions/common/redis/*.cc) \
		$(wildcard extensions/common/tap/*.cc) \
		$(wildcard extensions/compression/*/*/*.cc) \
		$(wildcard extensions/config/validators/minimum_clusters/*.cc) \
		$(wildcard extensions/config_subscription/*/*.cc) \
		extensions/early_data/default_early_data_policy.cc \
		$(wildcard extensions/filters/common/expr/*.cc) \
		extensions/filters/common/ext_authz/check_request_utils.cc \
		extensions/filters/common/ext_authz/ext_authz_grpc_impl.cc \
		extensions/filters/common/fault/fault_config.cc \
		$(wildcard extensions/filters/common/*ratelimit/*.cc) \
		extensions/filters/common/mutation_rules/mutation_rules.cc \
		$(wildcard extensions/filters/common/original_src/*.cc) \
		$(wildcard extensions/filters/common/rbac/*.cc) \
		$(wildcard extensions/filters/listener/*/*.cc) \
		$(wildcard extensions/filters/network/common/redis/*.cc) \
		$(wildcard extensions/filters/network/connection_limit/*.cc) \
		$(wildcard extensions/filters/network/direct_response/*.cc) \
		$(wildcard extensions/filters/network/echo/*.cc) \
		$(wildcard extensions/filters/network/ext_authz/*.cc) \
		extensions/filters/network/http_connection_manager/config.cc \
		$(wildcard extensions/filters/network/*ratelimit/*.cc) \
		$(wildcard extensions/filters/network/mongo_proxy/*.cc) \
		$(wildcard extensions/filters/network/rbac/*.cc) \
		$(wildcard extensions/filters/network/redis_proxy/*.cc) \
		$(wildcard extensions/filters/network/sni_*/*.cc) \
		$(wildcard extensions/filters/network/tcp_proxy/*.cc) \
		extensions/filters/network/thrift_proxy/app_exception_impl.cc \
		extensions/filters/network/thrift_proxy/decoder.cc \
		$(wildcard extensions/filters/network/zookeeper_proxy/*.cc) \
		$(wildcard extensions/filters/udp/*/*.cc) \
		extensions/filters/udp/udp_proxy/router/router_impl.cc \
		$(wildcard extensions/formatter/*/*.cc) \
		$(wildcard extensions/grpc_credentials/*/*.cc) \
		$(wildcard extensions/health_checkers/*/*.cc) \
		$(wildcard extensions/http/custom_response/*/*.cc) \
		$(wildcard extensions/http/early_header_mutation/header_mutation/*.cc) \
		$(wildcard extensions/http/header_formatters/preserve_case/*.cc) \
		$(wildcard extensions/http/header_validators/envoy_default/*.cc) \
		$(wildcard extensions/http/original_ip_detection/*/*.cc) \
		$(wildcard extensions/http/stateful_session/*/*.cc) \
		$(wildcard extensions/internal_redirect/*/*.cc) \
		$(wildcard extensions/io_socket/user_space/*.cc) \
		extensions/key_value/file_based/config.cc \
		$(wildcard extensions/listener_managers/*/*.cc) \
		$(wildcard extensions/load_balancing_policies/*/config.cc) \
		$(wildcard extensions/matching/*/*/*.cc) \
		$(wildcard extensions/network/dns_resolver/[^a]*/*.cc) \
		$(wildcard extensions/path/*/uri_template/*.cc) \
		$(wildcard extensions/path/uri_template_lib/*.cc) \
		$(wildcard extensions/quic/connection_id_generator/*.cc) \
		$(wildcard extensions/quic/crypto_stream/*.cc) \
		extensions/quic/proof_source/envoy_quic_proof_source_factory_impl.cc \
		extensions/quic/server_preferred_address/fixed_server_preferred_address_config.cc \
		extensions/rate_limit_descriptors/expr/config.cc \
		extensions/request_id/uuid/config.cc \
		$(wildcard extensions/resource_monitors/*/*.cc) \
		$(wildcard extensions/retry/host/omit_host_metadata/*.cc) \
		$(wildcard extensions/retry/priority/*/*.cc) \
		$(wildcard extensions/stat_sinks/common/statsd/*.cc) \
		$(wildcard extensions/stat_sinks/hystrix/*.cc) \
		$(wildcard extensions/stat_sinks/metrics_service/*.cc) \
		$(wildcard extensions/stat_sinks/*statsd/*.cc) \
		extensions/tracers/common/ot/opentracing_driver_impl.cc \
		$(wildcard extensions/tracers/dynamic_ot/*.cc) \
		$(wildcard extensions/tracers/opentelemetry/*.cc) \
		extensions/transport_sockets/common/passthrough.cc \
		$(wildcard extensions/transport_sockets/http_11_proxy/*.cc) \
		$(wildcard extensions/transport_sockets/internal_upstream/*.cc) \
		$(wildcard extensions/transport_sockets/proxy_protocol/*.cc) \
		extensions/transport_sockets/raw_buffer/config.cc \
		$(wildcard extensions/transport_sockets/starttls/*.cc) \
		$(wildcard extensions/transport_sockets/tap/*.cc) \
		$(wildcard extensions/transport_sockets/tcp_stats/*.cc) \
		$(wildcard extensions/transport_sockets/tls/*.cc) \
		extensions/transport_sockets/tls/cert_validator/factory.cc \
		$(wildcard extensions/transport_sockets/tls/ocsp/*.cc) \
		extensions/transport_sockets/tls/private_key/private_key_manager_impl.cc \
		$(wildcard extensions/udp_packet_writer/*/*.cc) \
		$(wildcard extensions/upstreams/*/*/*.cc) \
		$(wildcard extensions/upstreams/*/config.cc) \
		$(wildcard extensions/watchdog/profile_action/*.cc)

skiptests = $(filter-out %_fuzzer.cc %_test.cc,$(wildcard $(1)))

quiche_SRCS=	$(call skiptests,quiche/balsa/*.cc) \
		$(call skiptests,quiche/common/*.cc) \
		quiche/common/platform/api/quiche_file_utils.cc \
		quiche/common/platform/api/quiche_hostname_utils.cc \
		quiche/common/platform/api/quiche_mutex.cc \
		quiche/common/platform/default/quiche_platform_impl/quiche_file_utils_impl.cc \
		quiche/common/platform/default/quiche_platform_impl/quiche_mutex_impl.cc \
		quiche/common/platform/default/quiche_platform_impl/quiche_time_utils_impl.cc \
		quiche/http2/adapter/callback_visitor.cc \
		quiche/http2/adapter/event_forwarder.cc \
		quiche/http2/adapter/header_validator.cc \
		quiche/http2/adapter/http2_protocol.cc \
		quiche/http2/adapter/http2_util.cc \
		quiche/http2/adapter/nghttp2_adapter.cc \
		quiche/http2/adapter/nghttp2_callbacks.cc \
		quiche/http2/adapter/nghttp2_data_provider.cc \
		quiche/http2/adapter/nghttp2_session.cc \
		quiche/http2/adapter/nghttp2_util.cc \
		quiche/http2/adapter/noop_header_validator.cc \
		quiche/http2/adapter/oghttp2_adapter.cc \
		quiche/http2/adapter/oghttp2_session.cc \
		quiche/http2/adapter/oghttp2_util.cc \
		quiche/http2/adapter/window_manager.cc \
		quiche/http2/core/http2_trace_logging.cc \
		$(call skiptests,quiche/http2/decoder/*.cc) \
		$(wildcard quiche/http2/decoder/payload_decoders/*_payload_decoder.cc) \
		$(call skiptests,quiche/http2/hpack/decoder/hpack_*.cc) \
		quiche/http2/hpack/http2_hpack_constants.cc \
		quiche/http2/hpack/huffman/hpack_huffman_decoder.cc \
		quiche/http2/hpack/huffman/hpack_huffman_encoder.cc \
		quiche/http2/hpack/huffman/huffman_spec_tables.cc \
		quiche/http2/hpack/varint/hpack_varint_decoder.cc \
		quiche/http2/hpack/varint/hpack_varint_encoder.cc \
		quiche/http2/http2_constants.cc \
		quiche/http2/http2_structures.cc \
		quiche/quic/core/chlo_extractor.cc \
		$(call skiptests,quiche/quic/core/congestion_control/*.cc) \
		$(call skiptests,quiche/quic/core/crypto/*.cc) \
		quiche/quic/core/deterministic_connection_id_generator.cc \
		$(wildcard quiche/quic/core/frames/quic_*frame.cc) \
		$(call skiptests,quiche/quic/core/http/*.cc) \
		quiche/quic/core/legacy_quic_stream_id_manager.cc \
		quiche/quic/core/proto/cached_network_parameters.pb.cc \
		quiche/quic/core/proto/crypto_server_config.pb.cc \
		quiche/quic/core/proto/source_address_token.pb.cc \
		$(call skiptests,quiche/quic/core/qpack/*.cc) \
		quiche/quic/core/quic_ack_listener_interface.cc \
		quiche/quic/core/quic_alarm.cc \
		quiche/quic/core/quic_bandwidth.cc \
		quiche/quic/core/quic_buffered_packet_store.cc \
		$(call skiptests,quiche/quic/core/quic_c*.cc) \
		quiche/quic/core/quic_data_reader.cc \
		quiche/quic/core/quic_data_writer.cc \
		quiche/quic/core/quic_datagram_queue.cc \
		quiche/quic/core/quic_dispatcher.cc \
		quiche/quic/core/quic_error_codes.cc \
		quiche/quic/core/quic_flow_controller.cc \
		quiche/quic/core/quic_framer.cc \
		quiche/quic/core/quic_idle_network_detector.cc \
		quiche/quic/core/quic_mtu_discovery.cc \
		quiche/quic/core/quic_network_blackhole_detector.cc \
		quiche/quic/core/quic_packet_creator.cc \
		quiche/quic/core/quic_packet_number.cc \
		quiche/quic/core/quic_packets.cc \
		quiche/quic/core/quic_path_validator.cc \
		quiche/quic/core/quic_ping_manager.cc \
		quiche/quic/core/quic_received_packet_manager.cc \
		$(call skiptests,quiche/quic/core/quic_s*.cc) \
		quiche/quic/core/quic_tag.cc \
		quiche/quic/core/quic_time.cc \
		quiche/quic/core/quic_time_wait_list_manager.cc \
		quiche/quic/core/quic_transmission_info.cc \
		quiche/quic/core/quic_types.cc \
		quiche/quic/core/quic_unacked_packet_map.cc \
		quiche/quic/core/quic_utils.cc \
		quiche/quic/core/quic_version_manager.cc \
		quiche/quic/core/quic_versions.cc \
		quiche/quic/core/quic_write_blocked_list.cc \
		quiche/quic/core/tls_chlo_extractor.cc \
		quiche/quic/core/tls_client_handshaker.cc \
		quiche/quic/core/tls_handshaker.cc \
		quiche/quic/core/tls_server_handshaker.cc \
		quiche/quic/core/uber_quic_stream_id_manager.cc \
		quiche/quic/core/uber_received_packet_manager.cc \
		quiche/quic/platform/api/quic_socket_address.cc \
		$(call skiptests,quiche/spdy/core/hpack/*.cc) \
		quiche/spdy/core/http2_frame_decoder_adapter.cc \
		quiche/spdy/core/http2_header_block.cc \
		quiche/spdy/core/http2_header_storage.cc \
		quiche/spdy/core/recording_headers_handler.cc \
		quiche/spdy/core/spdy_alt_svc_wire_format.cc \
		quiche/spdy/core/spdy_frame_builder.cc \
		quiche/spdy/core/spdy_framer.cc \
		quiche/spdy/core/spdy_protocol.cc \
		quiche/spdy/core/spdy_simple_arena.cc

server_SRCS=	server/active_udp_listener.cc \
		$(filter-out %_no_html.cc,$(wildcard server/admin/*.cc)) \
		server/api_listener_impl.cc \
		server/backtrace.cc \
		$(wildcard server/config_validation/*.cc) \
		server/configuration_impl.cc \
		server/drain_manager_impl.cc \
		server/factory_context_impl.cc \
		server/guarddog_impl.cc \
		server/options_impl.cc \
		server/options_impl_platform_default.cc \
		server/overload_manager_impl.cc \
		server/proto_descriptors.cc \
		server/regex_engine.cc \
		server/server.cc \
		server/ssl_context_manager.cc \
		server/utils.cc \
		server/worker_impl.cc

cel_cpp_SRCS=	base/ast.cc \
		base/internal/managed_memory.cc \
		eval/compiler/constant_folding.cc \
		eval/compiler/flat_expr_builder.cc \
		eval/compiler/qualified_reference_resolver.cc \
		eval/compiler/resolver.cc \
		eval/eval/attribute_trail.cc \
		eval/eval/attribute_utility.cc \
		eval/eval/comprehension_step.cc \
		eval/eval/const_value_step.cc \
		eval/eval/container_access_step.cc \
		eval/eval/create_list_step.cc \
		eval/eval/create_struct_step.cc \
		eval/eval/evaluator_core.cc \
		eval/eval/evaluator_stack.cc \
		eval/eval/expression_build_warning.cc \
		eval/eval/function_step.cc \
		eval/eval/ident_step.cc \
		eval/eval/jump_step.cc \
		eval/eval/logic_step.cc \
		eval/eval/select_step.cc \
		eval/eval/shadowable_value_step.cc \
		eval/eval/ternary_step.cc \
		eval/public/ast_rewrite.cc \
		eval/public/ast_traverse.cc \
		eval/public/ast_traverse_native.cc \
		eval/public/builtin_func_registrar.cc \
		eval/public/cel_attribute.cc \
		eval/public/cel_expr_builder_factory.cc \
		eval/public/cel_function.cc \
		eval/public/cel_function_registry.cc \
		eval/public/cel_number.cc \
		eval/public/cel_type_registry.cc \
		eval/public/cel_value.cc \
		eval/public/comparison_functions.cc \
		eval/public/containers/container_backed_map_impl.cc \
		eval/public/containers/field_access.cc \
		eval/public/containers/internal_field_backed_list_impl.cc \
		eval/public/containers/internal_field_backed_map_impl.cc \
		eval/public/portable_cel_expr_builder_factory.cc \
		eval/public/structs/cel_proto_wrap_util.cc \
		eval/public/structs/cel_proto_wrapper.cc \
		eval/public/structs/field_access_impl.cc \
		eval/public/structs/proto_message_type_adapter.cc \
		eval/public/structs/protobuf_descriptor_type_provider.cc \
		eval/public/unknown_function_result_set.cc \
		extensions/protobuf/memory_manager.cc \
		internal/overflow.cc \
		internal/proto_time_encoding.cc \
		internal/proto_util.cc \
		internal/utf8.cc \
		tools/flatbuffers_backed_impl.cc

googleurl_SRCS=	base/debug/crash_logging.cc \
		base/strings/string_piece.cc \
		base/strings/string_util.cc \
		base/strings/string_util_constants.cc \
		base/strings/utf_string_conversion_utils.cc \
		base/strings/utf_string_conversions.cc \
		url/gurl.cc \
		url/third_party/mozilla/url_parse.cc \
		url/url_canon.cc \
		url/url_canon_etc.cc \
		url/url_canon_filesystemurl.cc \
		url/url_canon_fileurl.cc \
		url/url_canon_host.cc \
		url/url_canon_internal.cc \
		url/url_canon_ip.cc \
		url/url_canon_mailtourl.cc \
		url/url_canon_path.cc \
		url/url_canon_pathurl.cc \
		url/url_canon_query.cc \
		url/url_canon_relative.cc \
		url/url_canon_stdstring.cc \
		url/url_canon_stdurl.cc \
		url/url_constants.cc \
		url/url_idna_icu.cc \
		url/url_parse_file.cc \
		url/url_util.cc

server/admin/admin_html_util.o: server/admin/html/admin_html_gen.h

server/admin/html/admin_html_gen.h:
	cd server/admin/html && $(SHELL) generate_admin_html.sh \
	   admin_head_start.html admin.css active_stats.js \
	   active_params.html > admin_html_gen.h

# XXX: $@ does not play well with VPATH :(
%.o: %.cc
	$(CCACHE) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $(<:.cc=.o) -c $<

maybe_city = $(if $(shell nm -C common/access_log/access_log_impl.o \
	| grep ::hash_internal::CityHash),city)

ABSEIL_LIBS=\
	base $(maybe_city) cord cordz_functions cordz_info flags_commandlineflag \
	flags_internal flags_marshalling flags_parse flags_reflection \
	hash raw_hash_set spinlock_wait stacktrace status statusor \
	str_format_internal strings symbolize synchronization \
	throw_delegate time time_zone

LIBS=	$(addprefix -labsl_,$(ABSEIL_LIBS)) \
	-lbrotlidec -lbrotlienc -lcares -lcircllhist -lcrypto -lcurl \
	-levent -levent_pthreads -lfmt -lgpr -lgrpc -lgrpc++ -licuuc \
	-lnghttp2 -lopentracing -lprotobuf -lpthread -lre2 -lssl \
	-lupb -lxxhash -lyaml-cpp -lz -lzstd

VPATH=	../..

envoy: $(addprefix ../api/,$(api_OBJS)) $(source_OBJS) $(external_OBJS)
	$(CCACHE) $(CXX) $(LDFLAGS) -o $@ $^ $(LIBS) -Wl,-error-limit=0
	./$@ --version

all: envoy

.PHONY: all install
