diff --git a/.bazelrc b/.bazelrc index bdb2bfc..54cfe97 100644 --- a/.bazelrc +++ b/.bazelrc @@ -13,3 +13,5 @@ build --features=per_object_debug_info # Enable header processing, required for layering checks with parse_header. build --process_headers_in_dependencies + +import %workspace%/tools/bazel.rc diff --git a/BUILD.bazel b/BUILD.bazel index 5903898..25c091f 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -113,7 +113,10 @@ cc_library( "test/integration/implptr/implptr_test_classes.hh", ], includes = ["test/integration/implptr"], - deps = [":ImplPtr"], + deps = [ + ":Export", + ":ImplPtr", + ], ) cc_test( @@ -122,6 +125,7 @@ cc_test( srcs = ["test/integration/implptr/ImplPtr_TEST.cc"], deps = [ ":implptr_test_classes", + "@googletest//:gtest", "@googletest//:gtest_main", ], ) @@ -131,6 +135,7 @@ cc_test( srcs = ["src/Environment_TEST.cc"], deps = [ ":Environment", + "@googletest//:gtest", "@googletest//:gtest_main", ], ) @@ -140,7 +145,7 @@ cc_binary( srcs = ["test/integration/subprocess/subprocess_main.cc"], deps = [ ":Environment", - "//cli", + "//cli:cli11", ], ) @@ -149,8 +154,10 @@ cc_test( srcs = ["test/integration/subprocess_TEST.cc"], local_defines = ['SUBPROCESS_EXECUTABLE_PATH=\\"subprocess_main\\"'], deps = [ - ":gz-utils", + ":Environment", + ":Subprocess", ":subprocess_main", + "@googletest//:gtest", "@googletest//:gtest_main", ], ) diff --git a/cli/BUILD.bazel b/cli/BUILD.bazel index 9b3bcc8..3d57df4 100644 --- a/cli/BUILD.bazel +++ b/cli/BUILD.bazel @@ -17,6 +17,7 @@ cc_library( "-parse_headers", ], includes = ["include/vendored-cli"], + visibility = ["//visibility:public"], ) cc_library( @@ -45,7 +46,9 @@ cc_test( name = "cli_TEST", srcs = ["src/cli_TEST.cc"], deps = [ - ":cli", + ":GzFormatter", + ":cli11", + "@googletest//:gtest", "@googletest//:gtest_main", ], ) diff --git a/log/BUILD.bazel b/log/BUILD.bazel index 5a878d0..876d7d5 100644 --- a/log/BUILD.bazel +++ b/log/BUILD.bazel @@ -44,7 +44,13 @@ cc_library( ], includes = ["include"], visibility = ["//visibility:public"], - deps = [":SplitSink"], + deps = [ + ":Export", + ":SplitSink", + "//:Config", + "//:ImplPtr", + "@spdlog", + ], ) cc_library( @@ -61,7 +67,9 @@ cc_test( srcs = ["src/SplitSink_TEST.cc"], visibility = ["//visibility:public"], deps = [ - ":log", + ":SplitSink", + "@googletest//:gtest", "@googletest//:gtest_main", + "@spdlog", ], ) diff --git a/tools/BUILD.bazel b/tools/BUILD.bazel new file mode 100644 index 0000000..65eee96 --- /dev/null +++ b/tools/BUILD.bazel @@ -0,0 +1,5 @@ +sh_binary( + name = "asan", + srcs = ["asan.sh"], + data = ["asan.supp"], +) diff --git a/tools/asan.sh b/tools/asan.sh new file mode 100755 index 0000000..130b669 --- /dev/null +++ b/tools/asan.sh @@ -0,0 +1,10 @@ +#!/bin/bash +me=$(python3 -c 'import os; print(os.path.realpath("'"$0"'"))') +mydir=$(dirname "$me") +export ASAN_OPTIONS="$ASAN_OPTIONS:check_initialization_order=1:detect_container_overflow=0:detect_invalid_pointer_pairs=1:detect_stack_use_after_return=1:strict_init_order=1:strict_string_checks=1:strip_path_prefix=/proc/self/cwd/:suppressions=$mydir/asan.supp" +# LSan is run with ASan by default, ASAN_OPTIONS can't be used to suppress LSan +# errors +export LSAN_OPTIONS="$LSAN_OPTIONS:strip_path_prefix=/proc/self/cwd/:suppressions=$mydir/lsan.supp" +# Ensure executable named llvm-symbolizer is on the PATH. +export PATH="$PATH:/usr/lib/llvm-14/bin:/usr/lib/llvm-12/bin:/usr/local/opt/llvm/bin" +"$@" diff --git a/tools/asan.supp b/tools/asan.supp new file mode 100644 index 0000000..e69de29 diff --git a/tools/bazel.rc b/tools/bazel.rc new file mode 100644 index 0000000..f4eaee2 --- /dev/null +++ b/tools/bazel.rc @@ -0,0 +1,36 @@ +common:clang --repo_env=CC=clang-15 +common:clang --repo_env=CXX=clang++-15 +build:clang --action_env=CC=clang-15 +build:clang --action_env=CXX=clang++-15 +build:clang --host_action_env=CC=clang-15 +build:clang --host_action_env=CXX=clang++-15 + +### ASan build. Clang only. ### +build:asan --build_tests_only +build:asan --copt=-g +# https://github.com/google/sanitizers/wiki/AddressSanitizer#faq +build:asan --copt=-fno-common +build:asan --copt=-fsanitize=address +build:asan --copt=-fsanitize-address-use-after-scope +build:asan --copt=-fstandalone-debug +build:asan --copt=-O0 +build:asan --copt=-fno-omit-frame-pointer +build:asan --linkopt=-fsanitize=address +build:asan --linkopt=-fsanitize-address-use-after-scope +build:asan --run_under=//tools:asan +build:asan --test_env=ASAN_OPTIONS +build:asan --test_env=LSAN_OPTIONS +build:asan --test_env=ASAN_SYMBOLIZER_PATH +build:asan --test_env=LSAN_SYMBOLIZER_PATH +# LSan is run with ASan by default +build:asan --test_tag_filters=-gurobi,-mosek,-snopt,-no_asan,-no_lsan +build:asan --test_lang_filters=-sh,-py +# Typical slowdown introduced by AddressSanitizer is 2x. +# See https://clang.llvm.org/docs/AddressSanitizer.html +build:asan --test_timeout=150,750,2250,9000 # 2.5x +build:asan --define=USING_SANITIZER=ON +# Due to https://sourceware.org/bugzilla/show_bug.cgi?id=25975, we see ... +# ld.gold: warning: Cannot export local symbol __asan_extra_spill_area +# ... spammed millions of times in ASan builds. The only way to silence that +# warning is to silence ALL WARNINGS AT ALL EVER in ASan builds. +build:asan --auto_output_filter=all