.PHONY = all clean format

CC = clang++-19
CCFLAGS += -g3 -gdwarf-4 -std=c++2b -Wall -Wextra

all: udp_send udp_receive tcp_sendrecv tcp_echo_server

# executables
tcp_echo_server: tcp_echo_server.o nixnet.a
	${CC} ${CCFLAGS} -o $@ $^

tcp_sendrecv: tcp_sendrecv.o nixnet.a
	${CC} ${CCFLAGS} -o $@ $^

udp_send: udp_send.o nixnet.a
	${CC} ${CCFLAGS} -o $@ $^

udp_receive: udp_receive.o nixnet.a
	${CC} ${CCFLAGS} -o $@ $^

# objs
tcp_echo_server.o: tcp_echo_server.cpp nixnet/TcpListener.hpp nixnet/TcpStream.hpp nixnet/SocketAddr.hpp nixnet/errno.hpp
	${CC} ${CCFLAGS} -c $< 

tcp_sendrecv.o: tcp_sendrecv.cpp nixnet/TcpStream.hpp nixnet/SocketAddr.hpp nixnet/errno.hpp
	${CC} ${CCFLAGS} -c $< 

udp_send.o: udp_send.cpp nixnet/UdpSocket.hpp nixnet/SocketAddr.hpp nixnet/errno.hpp
	${CC} ${CCFLAGS} -c $< 

udp_receive.o: udp_receive.cpp nixnet/UdpSocket.hpp nixnet/SocketAddr.hpp nixnet/errno.hpp
	${CC} ${CCFLAGS} -c $< 

#nixnet stuff

# combines all the .o files into a single "combined .o" file called an archive (.a) file
nixnet.a: nixnet/TcpListener.o nixnet/TcpStream.o nixnet/UdpSocket.o nixnet/SocketAddr.o nixnet/errno.o
	ar rc $@ $^

#nixnet objs
nixnet/TcpListener.o: nixnet/TcpListener.cpp nixnet/TcpListener.hpp nixnet/TcpStream.hpp nixnet/errno.hpp nixnet/SocketAddr.hpp
	${CC} ${CCFLAGS} -o $@ -c $< 

nixnet/TcpStream.o: nixnet/TcpStream.cpp nixnet/TcpStream.hpp nixnet/errno.hpp nixnet/SocketAddr.hpp
	${CC} ${CCFLAGS} -o $@ -c $< 

nixnet/UdpSocket.o: nixnet/UdpSocket.cpp nixnet/UdpSocket.hpp nixnet/errno.hpp nixnet/SocketAddr.hpp
	${CC} ${CCFLAGS} -o $@ -c $< 

nixnet/SocketAddr.o: nixnet/SocketAddr.cpp nixnet/SocketAddr.hpp nixnet/errno.hpp
	${CC} ${CCFLAGS} -o $@ -c $< 

nixnet/errno.o: nixnet/errno.cpp nixnet/errno.hpp
	${CC} ${CCFLAGS} -o $@ -c $< 

clean:
	rm udp_send udp_receive tcp_sendrecv tcp_echo_server nixnet/*.o *.o nixnet.a

format:
	clang-format-15 -i --verbose --style=Chromium *.cpp nixnet/*.cpp nixnet/*.hpp
