all: benchmark unit

LIBABSEIL:=benchmarks/dependencies/abseil-cpp/build/absl/strings/libabsl_strings.a
LIBABSEIL_INCLUDE:=-Ibenchmarks/dependencies/abseil-cpp
LIBABSEIL_LIBS:=-Lbenchmarks/dependencies/abseil-cpp/build/absl/base -Lbenchmarks/dependencies/abseil-cpp/build/absl/strings  -Lbenchmarks/dependencies/abseil-cpp/build/absl/numeric/  -labsl_strings   -labsl_raw_logging_internal -labsl_throw_delegate -labsl_int128


LIBDOUBLE:=benchmarks/dependencies/double-conversion/libdouble-conversion.a
LIBDOUBLE_INCLUDE:=-Ibenchmarks/dependencies/double-conversion
LIBDOUBLE_LIBS:=-Lbenchmarks/dependencies/double-conversion -ldouble-conversion


headers:=  include/fast_double_parser.h 

benchmark: ./benchmarks/benchmark.cpp $(headers) $(LIBABSEIL)  $(LIBDOUBLE) $(headers)
	$(CXX) -O2 -std=c++14 -march=haswell -o benchmark ./benchmarks/benchmark.cpp -Wall -Iinclude   $(LIBABSEIL_INCLUDE)  $(LIBDOUBLE_INCLUDE) $(LIBDOUBLE_LIBS) $(LIBABSEIL_LIBS)   -lm


unit: ./tests/unit.cpp $(headers) 
	$(CXX) -O2 -std=c++14 -march=native -o unit ./tests/unit.cpp -Wall -Iinclude 


bench: benchmark
	./benchmark 
	./benchmark benchmarks/data/canada.txt

submodules:
	-git submodule update --init --recursive
	-touch submodules


$(LIBABSEIL):submodules
	rm -r -f benchmarks/dependencies/abseil-cpp/build && cd benchmarks/dependencies/abseil-cpp && mkdir build && cd build && cmake .. -DABSL_RUN_TESTS=OFF -DABSL_USE_GOOGLETEST_HEAD=OFF -DCMAKE_CXX_STANDARD=14 -DCMAKE_BUILD_TYPE=Release && cmake --build . --target base && cmake --build . --target strings

$(LIBDOUBLE):submodules
	cd benchmarks/dependencies/double-conversion && cmake .  -DCMAKE_BUILD_TYPE=Release && make

clean:
	rm -r -f benchmark unit benchmarks/dependencies/abseil-cpp/build