| DEBUG=0 |
| LDFLAGS=-ldl -lpthread -pie |
| CXXFLAGS = -fPIE -fno-rtti -g -Wall -Werror \ |
| -DGTEST_HAS_RTTI=0 -DTSAN_DEBUG=$(DEBUG) -DSANITIZER_DEBUG=$(DEBUG) |
| CLANG=clang |
| FILECHECK=FileCheck |
| # Silence warnings that Clang produces for gtest code. |
| # Use -Wno-attributes so that gcc doesn't complain about unknown warning types. |
| CXXFLAGS += -Wno-attributes |
| ifeq ($(DEBUG), 0) |
| CXXFLAGS += -O3 |
| endif |
| ifeq ($(CXX), $(CLANG)++) |
| CXXFLAGS+= -Wno-unused-private-field -Wno-static-in-inline -Wgnu |
| endif |
| |
| LIBTSAN=rtl/libtsan.a |
| GTEST_ROOT=third_party/googletest |
| GTEST_INCLUDE=-I$(GTEST_ROOT)/include |
| GTEST_BUILD_DIR=$(GTEST_ROOT)/build |
| GTEST_LIB_NAME=gtest-all.o |
| GTEST_LIB=$(GTEST_BUILD_DIR)/$(GTEST_LIB_NAME) |
| |
| SANITIZER_TESTS_PATH=../sanitizer_common/tests |
| SANITIZER_COMMON_TESTS_SRC=$(wildcard $(SANITIZER_TESTS_PATH)/*_test.cc) |
| SANITIZER_COMMON_EXCLUDED_TESTS=$(SANITIZER_TESTS_PATH)/sanitizer_nolibc_test.cc |
| SANITIZER_COMMON_GOOD_TESTS=$(filter-out $(SANITIZER_COMMON_EXCLUDED_TESTS), $(SANITIZER_COMMON_TESTS_SRC)) |
| SANITIZER_COMMON_TESTS_OBJ=$(patsubst %.cc,%.o,$(SANITIZER_COMMON_GOOD_TESTS)) |
| RTL_TEST_SRC=$(wildcard tests/rtl/*.cc) |
| RTL_TEST_OBJ=$(patsubst %.cc,%.o,$(RTL_TEST_SRC)) |
| UNIT_TEST_SRC=$(wildcard tests/unit/*_test.cc) |
| UNIT_TEST_OBJ=$(patsubst %.cc,%.o,$(UNIT_TEST_SRC)) |
| UNIT_TEST_HDR=$(wildcard rtl/*.h) $(wildcard ../sanitizer_common/*.h) |
| |
| INCLUDES=-Irtl -I.. -I../../include $(GTEST_INCLUDE) |
| |
| all: libtsan test |
| |
| help: |
| @ echo "A little help is always welcome!" |
| @ echo "The most useful targets are:" |
| @ echo " make install_deps # Install third-party dependencies required for building" |
| @ echo " make presubmit # Run it every time before committing" |
| @ echo |
| @ echo "For more info, see http://code.google.com/p/thread-sanitizer/wiki/Development" |
| |
| $(LIBTSAN): libtsan |
| |
| libtsan: |
| $(MAKE) -C rtl -f Makefile.old DEBUG=$(DEBUG) |
| |
| %.o: %.cc $(UNIT_TEST_HDR) $(LIBTSAN) |
| $(CXX) $(CXXFLAGS) $(CFLAGS) $(INCLUDES) -o $@ -c $< |
| |
| tsan_test: $(UNIT_TEST_OBJ) $(RTL_TEST_OBJ) \ |
| $(SANITIZER_COMMON_TESTS_OBJ) $(LIBTSAN) $(GTEST_LIB) |
| $(CXX) -Wl,--whole-archive $^ -Wl,--no-whole-archive -o $@ $(LDFLAGS) |
| |
| test: libtsan tsan_test |
| |
| run: all |
| (ulimit -s 8192; ./tsan_test) |
| CC=$(CLANG) CXX=$(CLANG)++ FILECHECK=$(FILECHECK) ./lit_tests/test_output.sh |
| |
| presubmit: |
| ../sanitizer_common/scripts/check_lint.sh |
| # Debug build with clang. |
| $(MAKE) -f Makefile.old clean |
| $(MAKE) -f Makefile.old run DEBUG=1 -j 16 CC=$(CLANG) CXX=$(CLANG)++ |
| # Release build with clang. |
| $(MAKE) -f Makefile.old clean |
| $(MAKE) -f Makefile.old run DEBUG=0 -j 16 CC=$(CLANG) CXX=$(CLANG)++ |
| # Debug build with gcc |
| $(MAKE) -f Makefile.old clean |
| $(MAKE) -f Makefile.old run DEBUG=1 -j 16 CC=gcc CXX=g++ |
| # Release build with gcc |
| $(MAKE) -f Makefile.old clean |
| $(MAKE) -f Makefile.old run DEBUG=0 -j 16 CC=gcc CXX=g++ |
| ./check_analyze.sh |
| # Sanity check for Go runtime |
| (cd go && ./buildgo.sh) |
| # Check cmake build |
| ./check_cmake.sh |
| @ echo PRESUBMIT PASSED |
| |
| install_deps: |
| rm -rf third_party |
| mkdir third_party |
| (cd third_party && \ |
| svn co -r613 http://googletest.googlecode.com/svn/trunk googletest \ |
| ) |
| |
| $(GTEST_LIB): |
| mkdir -p $(GTEST_BUILD_DIR) && \ |
| cd $(GTEST_BUILD_DIR) && \ |
| $(MAKE) -f ../make/Makefile CXXFLAGS="$(CXXFLAGS)" CFLAGS="$(CFLAGS)" CC=$(CC) CXX=$(CXX) $(GTEST_LIB_NAME) |
| |
| clean: |
| rm -f asm_*.s libtsan.nm libtsan.objdump */*.o tsan_test |
| rm -rf $(GTEST_BUILD_DIR) |
| $(MAKE) clean -C rtl -f Makefile.old |
| rm -f go/*.s |
| rm -rf build |