惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google DeepMind News
Google DeepMind News
博客园 - 聂微东
Microsoft Azure Blog
Microsoft Azure Blog
V
Visual Studio Blog
IT之家
IT之家
博客园 - 【当耐特】
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
B
Blog
爱范儿
爱范儿
阮一峰的网络日志
阮一峰的网络日志
云风的 BLOG
云风的 BLOG
Vercel News
Vercel News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
H
Help Net Security
J
Java Code Geeks
aimingoo的专栏
aimingoo的专栏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
B
Blog RSS Feed
Blog — PlanetScale
Blog — PlanetScale
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research

I'm OWenT

国产大模型(GLM 5.1、Kimi K2.6)真实场景效果和 Coding Plan 额度测试 新版本libatapp的连接管理——从etcd服务发现到拓扑驱动的自动重连 新版本libatbus的设计变更——从树形路由到拓扑驱动 Protobuf又一坑 - C++标准和ABI兼容性 AI真好用-给Blog主题统一加mermaid,chart.js,excalidraw,draw.io的多种引入方式支持 给内网部署Squid-通用HTTP下载缓存 UE使用CodeChecker和clang-tidy生成静态分析报告 找出UE的循环依赖 C++小协程栈和临时变量及作用域的栈溢出问题分析 游戏服务的可观测性能力建设(C++生态) 指标上报的多线程优化和多拉取源点优化 协程(libcopp)的Channel功能和CPU命中率优化 通用RPC代码生成器 实现strong_rc_ptr(比shared_ptr更快的引用计数智能指针) 手夯一个STL allocator和对象内存分析组件 std::condition_variable 的信号丢失问题 踩坑一处(GCC)STL std::async 实现BUG导致的crash问题 GCC 14的一个warning to error BUG 给xresloader(Excel导表工具)增强UE读表支持(包含蓝图,Blueprint) Opentelemetry社区在gRPC的几个链接问题(静态库和动态库混用,musl工具链,符号裁剪) Excel转表工具(xresloader)的新验证器(验证外部Excel和文本数据,唯一性和自定义规则) protobuf v22和gRPC v1.55版本升级的依赖变化和upb适配 关于protobuf近期版本(v20/v3.20+)和 gRPC v1.54版本在某些编译环境下的一些链接和编译问题 xresloader-Excel导表工具链的近期变更汇总 打通游戏服务端框架的C++20协程改造的最后一环 Opentelemetry-cpp的Logs模块标准更新(涉及近期版本:1.8-1.9的BREAK CHANGES) 给cmake-toolset和工具链(curl等)加HTTP/2和HTTP/3支持 又开新坑之 coredns 插件: nftables和filter 关于opentelemetry-cpp社区对于C++ Head Only组件单例和符号可见性的讨论小记 填个转表工具 xresloader 去年的坑(数组尾部裁剪)
记录一些bazel适配用编译选项
owent · 2022-02-15 · via I'm OWenT

blog-website

之前搞 opentelemetry-cpp 的时候接触了下 bazel 构建系统。这玩意儿用起来有一点坑,特别是使用自定义编译环境的时候。

在使用我自己编译的很新版本的 GCCclang+libc++ 的时候,涉及对libssp的检测和 LD_LIBRARY_PATH 环境变量在 bazel 中各个步骤中的传递,这里记录一下适配脚本。

BAZEL_OPTIONS="--copt=-DENABLE_METRICS_PREVIEW --copt=-DENABLE_LOGS_PREVIEW"
BAZEL_TEST_OPTIONS="$BAZEL_OPTIONS --test_output=errors"
BAZEL_STARTUP_OPTIONS="--output_user_root=$HOME/.cache/bazel/$BK_CI_BUILD_ID"

# https://github.com/bazelbuild/bazel/issues/4341
BAZEL_MACOS_OPTIONS="--features=-supports_dynamic_linker --linkopt -lpthread --linkopt -liconv --linkopt -lresolv --linkopt -ldl --linkopt -lm"
BAZEL_MACOS_OPTIONS="--host_linkopt -lpthread --host_linkopt -liconv --host_linkopt -lresolv --host_linkopt -ldl --host_linkopt -lm"
BAZEL_LINUX_GCC_OPTIONS=""

# Our gcc/llvm
for EXTRA_LD_LIBRARY_PATH in $(echo "$LD_LIBRARY_PATH" | tr ':' ' '); do
  BAZEL_LINUX_GCC_OPTIONS="$BAZEL_LINUX_GCC_OPTIONS --host_linkopt=-Wl,-rpath,$EXTRA_LD_LIBRARY_PATH --host_linkopt=-L$EXTRA_LD_LIBRARY_PATH --linkopt=-L$EXTRA_LD_LIBRARY_PATH"
done

if [[ -z "$USE_CC" ]]; then
  which clang >/dev/null 2>&1
  if [[ $? -eq 0 ]]; then
    USE_CC=clang
  else
    USE_CC=gcc
  fi
fi


USE_CC_BASENAME="$(basename "$USE_CC")"

if [[ "x${USE_CC_BASENAME:0:3}" == "xgcc" ]]; then
  USE_CC_FULLPATH="$(which "$USE_CC")"
  for TEST_GCC_FLAGS in "-Wno-unused-function" "-Wno-error=stringop-overflow" "-Wno-error=array-parameter"; do
    TEST_GCC_FLAGS_SUCCESS=1
    echo "" | "$USE_CC" -E "$TEST_GCC_FLAGS" - >/dev/null 2>&1 || TEST_GCC_FLAGS_SUCCESS=0
    if [[ $TEST_GCC_FLAGS_SUCCESS -ne 0 ]]; then
      BAZEL_LINUX_GCC_OPTIONS="$BAZEL_LINUX_GCC_OPTIONS --copt $TEST_GCC_FLAGS"
    fi
  done
  # Test libssp/-fstack-protector-strong/-fstack-protector-all
  HAVE_LIBSSP=1
  echo "#include <iostream>
  int main () { return 0; }
  " | "${USE_CC/%gcc/g++}" -x c++ -lssp -o run-test-gcc-with-ssp.exe - || HAVE_LIBSSP=0
  if [[ $HAVE_LIBSSP -eq 1 ]]; then
    BAZEL_LINUX_GCC_OPTIONS="$BAZEL_LINUX_GCC_OPTIONS --linkopt -lssp --host_linkopt -lssp"
    rm -f run-test-gcc-with-ssp.exe
  fi
  HAVE_FSTACK_PROTECTOR_STRONG=1
  echo "" | "$USE_CC" -E "-fstack-protector-strong" - >/dev/null 2>&1 || HAVE_FSTACK_PROTECTOR_STRONG=0
  if [[ $HAVE_FSTACK_PROTECTOR_STRONG -eq 1 ]]; then
    BAZEL_LINUX_GCC_OPTIONS="$BAZEL_LINUX_GCC_OPTIONS --copt -fstack-protector-strong --host_copt -fstack-protector-strong --linkopt -fstack-protector-strong --host_linkopt -fstack-protector-strong"
  else
    BAZEL_LINUX_GCC_OPTIONS="$BAZEL_LINUX_GCC_OPTIONS --copt -fstack-protector-all --host_copt -fstack-protector-all --linkopt -fstack-protector-all --host_linkopt -fstack-protector-all"
  fi
  BAZEL_OPTIONS="$BAZEL_OPTIONS $BAZEL_LINUX_GCC_OPTIONS"
  BAZEL_TEST_OPTIONS="$BAZEL_TEST_OPTIONS $BAZEL_LINUX_GCC_OPTIONS"
elif [[ "x${USE_CC_BASENAME:0:5}" == "xclang" ]]; then
  USE_CC_FULLPATH="$(which "$USE_CC")"
  if [[ "x$GCC_HOME_DIR" == "x" ]] || [[ ! -e "$GCC_HOME_DIR" ]]; then
    GCC_HOME_DIR="/opt/gcc-latest";
  fi
  if [[ ! -e "$GCC_HOME_DIR" ]]; then
    GCC_HOME_DIR="/usr/local/gcc-latest";
  fi
  if [[ -e "$GCC_HOME_DIR" ]] && [[ "${USE_CC_FULLPATH:0:10}" == "/opt/llvm-" ]]; then
    if [[ "x$CXXFLAGS" == "x" ]]; then
      export CXXFLAGS="--gcc-toolchain=$GCC_HOME_DIR"
    else
      export CXXFLAGS="$CXXFLAGS --gcc-toolchain=$GCC_HOME_DIR"
    fi
    if [[ "x$CFLAGS" == "x" ]]; then
      export CFLAGS="--gcc-toolchain=$GCC_HOME_DIR"
    else
      export CFLAGS="$CFLAGS --gcc-toolchain=$GCC_HOME_DIR"
    fi
    # BAZEL_LINUX_GCC_OPTIONS="$BAZEL_LINUX_GCC_OPTIONS --cxxopt -stdlib=libc++"
  fi

  for TEST_GCC_FLAGS in "-Wno-unused-function" "-Wno-error=unused-command-line-argument"; do
    TEST_GCC_FLAGS_SUCCESS=1
    echo "" | "$USE_CC" -E "$TEST_GCC_FLAGS" - >/dev/null 2>&1 || TEST_GCC_FLAGS_SUCCESS=0
    if [[ $TEST_GCC_FLAGS_SUCCESS -ne 0 ]]; then
      BAZEL_LINUX_GCC_OPTIONS="$BAZEL_LINUX_GCC_OPTIONS --copt $TEST_GCC_FLAGS"
    fi
  done
  BAZEL_OPTIONS="$BAZEL_OPTIONS $BAZEL_LINUX_GCC_OPTIONS"
  BAZEL_TEST_OPTIONS="$BAZEL_TEST_OPTIONS $BAZEL_LINUX_GCC_OPTIONS"
fi

然后,就可以直接使用以下脚本启动 bazel :

# ============ build & test ============
if [[ "x$USE_CC" != "x" ]]; then
  export CC="$USE_CC"
fi
bazel fetch //...
bazel $BAZEL_STARTUP_OPTIONS build $BAZEL_OPTIONS //...
bazel $BAZEL_STARTUP_OPTIONS test $BAZEL_TEST_OPTIONS //...

# ============ asan ============
# See https://github.com/google/sanitizers/issues/764 when run under docker
if [[ "x$USE_CC" != "x" ]]; then
  export CC="$USE_CC"
fi
bazel fetch //...
bazel $BAZEL_STARTUP_OPTIONS test --config=asan $BAZEL_TEST_OPTIONS --linkopt -static-libasan //...
if [[ $RETRY_CLEAN -eq 1 ]]; then
  echo "AddressSantinizer results:"
  (
    cd bazel-out
    find . -name test.log -exec bash -c 'echo "============  $@ ============"; cat $@; echo "------------  $@ ------------"' _ {} \;
  )
fi

# ============ tsan ============
if [[ "x$USE_CC" != "x" ]]; then
  export CC="$USE_CC"
fi
bazel fetch //...
bazel $BAZEL_STARTUP_OPTIONS test --config=tsan $BAZEL_TEST_OPTIONS //...
if [[ $RETRY_CLEAN -eq 1 ]]; then
  echo "ThreadSantinizer results:"
  (
    cd bazel-out
    find . -name test.log -exec bash -c 'echo "============  $@ ============"; cat $@; echo "------------  $@ ------------"' _ {} \;
  )
fi

# ============ valgrind ============
if [[ "x$USE_CC" != "x" ]]; then
  export CC="$USE_CC"
fi
bazel fetch //...
bazel $BAZEL_STARTUP_OPTIONS build $BAZEL_OPTIONS //...
bazel $BAZEL_STARTUP_OPTIONS test --run_under="/usr/bin/valgrind --leak-check=full --error-exitcode=1 --suppressions=\"${PWD}/ci/valgrind-suppressions\"" $BAZEL_TEST_OPTIONS //...

# ============ benchmark ============
if [[ "x$USE_CC" != "x" ]]; then
  export CC="$USE_CC"
fi
[ -z "${BENCHMARK_DIR}" ] && export BENCHMARK_DIR=$HOME/benchmark
bazel fetch //...
bazel $BAZEL_STARTUP_OPTIONS build $BAZEL_OPTIONS -c opt -- $(bazel query 'attr("tags", "benchmark_result", ...)')
echo "Benchmark results in $BENCHMARK_DIR:"
(
  cd bazel-bin
  find . -name \*_result.txt -exec bash -c \
    'echo "$@" && mkdir -p "$BENCHMARK_DIR/$(dirname "$@")" && \
      cp "$@" "$BENCHMARK_DIR/$@" && chmod +w "$BENCHMARK_DIR/$@"' _ {} \;
)