| |
| .PHONY: clean deepclean |
| |
| # Disable -Wsign-compare because StringPiece currently unhelpfully defines |
| # size() as ssize_t instad of size_t. |
| CXXFLAGS=-std=c++11 -W -Wall -Wno-sign-compare -g -I third_party/re2 -I. -Isrc |
| RE2_H=third_party/re2/re2/re2.h |
| RE2_A=third_party/re2/obj/libre2.a |
| |
| bloaty: src/main.cc src/libbloaty.a $(RE2_A) |
| $(CXX) $(GC_SECTIONS) $(CXXFLAGS) -O2 -o $@ $^ -lpthread |
| |
| OBJS=src/bloaty.o src/dwarf.o src/elf.o src/macho.o |
| |
| $(OBJS): %.o : %.cc src/bloaty.h src/dwarf_constants.h $(RE2_H) |
| $(CXX) $(CXXFLAGS) -O2 -c -o $@ $< |
| |
| src/libbloaty.a: $(OBJS) |
| ar rcs $@ $^ |
| |
| third_party/re2/obj/libre2.a: third_party/re2/Makefile |
| $(MAKE) -C third_party/re2 CPPFLAGS="-ffunction-sections -fdata-sections -g" |
| |
| # These targets share a pattern match to coerce make into only executing once |
| # See this discussion: http://stackoverflow.com/a/3077254/1780018 |
| third%party/re2/Makefile third%party/re2/re2/re2.h third%party/googletest/CMakeLists.txt third%party/libFuzzer/build.sh: .gitmodules |
| git submodule init && git submodule update |
| @# Ensure .gitmodules cannot be newer |
| touch -r .gitmodules $@ |
| |
| clean: |
| rm -f bloaty src/*.o src/*.a |
| rm -f tests/range_map_test tests/bloaty_test tests/bloaty_misc_test |
| rm -rf *.dSYM |
| |
| deepclean: clean |
| rm -rf third_party/re2 third_party/googletest third_party/libFuzzer |
| |
| ## Tests ####################################################################### |
| |
| TESTFLAGS=-Ithird_party/googletest/googletest/include -Ithird_party/googletest/googlemock/include |
| TESTLIBS=src/libbloaty-test.a $(RE2_A) third_party/googletest/googlemock/gtest/libgtest_main.a third_party/googletest/googlemock/gtest/libgtest.a |
| |
| ifeq ($(CXX), clang++) |
| TESTFLAGS += -fsanitize=address |
| endif |
| |
| TESTOBJS=$(OBJS:src/%.o=src/%.test.o) |
| |
| $(TESTOBJS): %.test.o : %.cc src/bloaty.h src/dwarf_constants.h $(RE2_H) |
| $(CXX) $(CXXFLAGS) $(TESTFLAGS) -c -o $@ $< |
| |
| src/libbloaty-test.a: $(TESTOBJS) |
| ar rcs $@ $^ |
| |
| test: tests/range_map_test tests/bloaty_test tests/bloaty_misc_test |
| TOP=`pwd`; \ |
| tests/range_map_test && \ |
| (cd tests/testdata/linux-x86_64 && $$TOP/tests/bloaty_test) && \ |
| (cd tests/testdata/linux-x86 && $$TOP/tests/bloaty_test) && \ |
| (cd tests/testdata/misc && $$TOP/tests/bloaty_misc_test) |
| |
| tests/range_map_test: tests/range_map_test.cc $(TESTLIBS) |
| $(CXX) $(CXXFLAGS) $(TESTFLAGS) -o $@ $^ -lpthread |
| |
| tests/bloaty_test: tests/bloaty_test.cc $(TESTLIBS) |
| $(CXX) $(CXXFLAGS) $(TESTFLAGS) -o $@ $^ -lpthread |
| |
| tests/bloaty_misc_test: tests/bloaty_misc_test.cc $(TESTLIBS) |
| $(CXX) $(CXXFLAGS) $(TESTFLAGS) -o $@ $^ -lpthread |
| |
| third_party/googletest/googlemock/gtest/libgtest_main.a: third_party/googletest/CMakeLists.txt |
| cd third_party/googletest && cmake . && $(MAKE) |
| |
| ## Fuzzing ##################################################################### |
| |
| FUZZFLAGS=-fsanitize=address -fsanitize-coverage=trace-pc-guard |
| TESTCMD=-fsanitize-coverage=trace-pc-guard -c -x c++ /dev/null -o /dev/null 2> /dev/null |
| TESTRESULT=$(shell $(CXX) $(TESTCMD) && echo ok) |
| ifeq ($(TESTRESULT), ok) |
| fuzz: tests/fuzz_target |
| else |
| fuzz: |
| echo "Fuzzing requires that CXX is a very recent Clang (ie from svn" |
| false |
| endif |
| |
| LIBFUZZER=third_party/libFuzzer/libFuzzer.a |
| FUZZLIBS=$(BLOATYLIBS) $(LIBFUZZER) |
| |
| FUZZOBJS=$(OBJS:src/%.o=src/%.fuzz.o) |
| |
| $(FUZZOBJS): %.fuzz.o : %.cc src/bloaty.h src/dwarf_constants.h $(RE2_H) |
| $(CXX) $(CXXFLAGS) $(FUZZFLAGS) -c -o $@ $< |
| |
| src/libbloaty-fuzz.a: $(FUZZOBJS) |
| ar rcs $@ $^ |
| |
| $(LIBFUZZER): third_party/libFuzzer/build.sh |
| cd third_party/libFuzzer && ./build.sh |
| |
| tests/fuzz_target: tests/fuzz_target.cc src/libbloaty-fuzz.a $(LIBFUZZER) $(RE2_A) |
| $(CXX) $(CXXFLAGS) $(FUZZFLAGS) -o $@ $^ -lpthread |