# Makefile -- a clumsy makefile for the C unit tests for generated trunnel
#   code.
#
# Copyright 2014 The Tor Project, Inc.
# See LICENSE file for copying information.

MORE_CFLAGS=-fno-inline --coverage

CC=gcc
CFLAGS=-g -O0 -fstack-protector-all -Wstack-protector -fwrapv --param ssp-buffer-size=1 -fPIE -fasynchronous-unwind-tables -Wall -fno-strict-aliasing -Wno-deprecated-declarations -W -Wfloat-equal -Wundef -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2 -Wwrite-strings -Wmissing-declarations -Wredundant-decls -Wnested-externs -Wbad-function-cast -Wswitch-enum -Werror -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition -Waddress -Wmissing-noreturn -Wstrict-overflow=1 -I . -I ./include -DTRUNNEL_DEBUG_FAILING_ALLOC -DTRUNNEL_CHECK_ENCODED_LEN $(MORE_CFLAGS)
#OTHER_FLAGS= -Qunused-arguments -Wshorten-64-to-32

TEST_OBJS = \
    c/test.o \
    c/test_numbers.o \
    c/test_restricted.o \
    c/test_strings.o \
    c/test_eos.o \
    c/test_extends.o \
    c/test_leftover_messages.o \
    c/test_leftover_union.o \
    c/test_nested.o \
    c/test_fixedarray.o \
    c/test_vararray.o \
    c/test_union_nolen.o \
    c/test_union_withlen.o \
    c/test_union_defaults.o \
    c/test_contexts_support.o \
    c/test_contexts_uniontag.o \
    c/test_contexts_varsize.o \
    c/test_contexts_varsize2.o \
    c/test_contexts_complex.o \
    c/test_remainder_repeats.o \
    c/test_positions.o \
    c/test_util.o

BOILERPLATE_FILES=\
    ./include/trunnel.c \
    ./include/trunnel.h \
    ./include/trunnel-impl.h \

OBJS=tinytest/tinytest.o \
    valid/simple.o \
    valid/derived.o \
    valid/opaque.o \
    valid/leftover.o \
    valid/contexts.o \
    valid/positions.o \
    ./include/trunnel.o \
    $(TEST_OBJS)

all: ctest

ctest: $(OBJS)
	$(CC) $(CFLAGS) -o ctest $(OBJS)

clean:
	rm -f $(OBJS) ctest

reset-gcov:
	rm -f */*.gcda ../*/*.gcda

distclean: clean
	rm -f valid/*.[ch] include/*.[ch]

test: ctest
	./ctest

valid/simple.o: valid/simple.h valid/simple.c
valid/derived.o: valid/derived.h valid/derived.c
valid/opaque.o: valid/opaque.h valid/opaque.h
valid/leftover.o: valid/leftover.h valid/leftover.c
valid/contexts.o: valid/contexts.h
valid/positions.o: valid/positions.h
$(TEST_OBJS) : tinytest/tinytest.h tinytest/tinytest_macros.h valid/simple.h valid/derived.h
$(OBJS) : include/trunnel.h include/trunnel-impl.h
tinytest/tinytest.o: tinytest/tinytest.h tinytest/tinytest_macros.h

valid/simple.c valid/simple.h: valid/simple.trunnel ../lib/trunnel/*py
	PYTHONPATH=../lib:${PYTHONPATH} python -m trunnel valid/simple.trunnel

valid/derived.c valid/derived.h: valid/derived.trunnel ../lib/trunnel/*py
	PYTHONPATH=../lib:${PYTHONPATH} python -m trunnel valid/derived.trunnel

valid/opaque.c valid/opaque.h: valid/opaque.trunnel ../lib/trunnel/*py
	PYTHONPATH=../lib:${PYTHONPATH} python -m trunnel valid/opaque.trunnel

valid/leftover.c valid/leftover.h: valid/leftover.trunnel ../lib/trunnel/*py
	PYTHONPATH=../lib:${PYTHONPATH} python -m trunnel valid/leftover.trunnel

valid/contexts.c valid/contexts.h: valid/contexts.trunnel ../lib/trunnel/*py
	PYTHONPATH=../lib:${PYTHONPATH} python -m trunnel valid/contexts.trunnel

valid/positions.c valid/positions.h: valid/positions.trunnel ../lib/trunnel/*py
	PYTHONPATH=../lib:${PYTHONPATH} python -m trunnel valid/positions.trunnel

$(BOILERPLATE_FILES): ../lib/trunnel/*py ../lib/trunnel/data/*.[ch]
	PYTHONPATH=../lib:${PYTHONPATH} python -m trunnel --target-dir=./include --write-c-files
