Skip to content

Commit c777ff7

Browse files
committed
fix(ci): 修复 Ubuntu runner 上 riscv-tests benchmarks 链接 libm 失败
问题:CI 在编译 benchmarks 时报错 cannot find -lm,说明 picolibc 的库目录与 workflow 中硬编码路径不一致。 改动: 1) 为 Setup RISC-V libc 步骤增加 bash 严格模式(set -euo pipefail)。 2) 动态探测 picolibc include 目录;目录不存在时回退到 dpkg -L 查询。 3) 动态探测 rv64/lp64d 对应的 libm.a,并导出其目录到 LIBRARY_PATH,避免硬编码路径失效。 4) 检测 riscv64-unknown-elf-gcc 可用的 picolibc.specs;可用则用于 benchmarks 编译,不可用则回退默认 gcc。 5) benchmarks 构建步骤改为使用 RISCV_GCC_BENCHMARK,保证与上一步探测结果一致。 影响:仅 CI 环境准备与构建命令,未改动模拟器功能代码。
1 parent 7df1ff5 commit c777ff7

1 file changed

Lines changed: 35 additions & 4 deletions

File tree

.github/workflows/ci.yml

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,40 @@ jobs:
3434
sudo install -m 644 /tmp/gtest/lib/libgtest*.a /usr/lib
3535
3636
- name: Setup RISC-V libc include/lib paths
37+
shell: bash
3738
run: |
38-
echo "CPATH=/usr/lib/picolibc/riscv64-unknown-elf/include" >> "${GITHUB_ENV}"
39-
echo "C_INCLUDE_PATH=/usr/lib/picolibc/riscv64-unknown-elf/include" >> "${GITHUB_ENV}"
40-
echo "LIBRARY_PATH=/usr/lib/picolibc/riscv64-unknown-elf/lib/rv64imafdc/lp64d" >> "${GITHUB_ENV}"
39+
set -euo pipefail
40+
41+
include_dir="/usr/lib/picolibc/riscv64-unknown-elf/include"
42+
if [[ ! -d "${include_dir}" ]]; then
43+
include_dir="$(dpkg -L picolibc-riscv64-unknown-elf | grep '/include$' | head -n1)"
44+
fi
45+
46+
libm_path="$(find /usr/lib/picolibc/riscv64-unknown-elf/lib -path '*rv64*lp64d*/libm.a' -print | head -n1 || true)"
47+
if [[ -z "${libm_path}" ]]; then
48+
libm_path="$(dpkg -L picolibc-riscv64-unknown-elf | grep '/libm\.a$' | grep 'rv64' | grep 'lp64d' | head -n1 || true)"
49+
fi
50+
if [[ -z "${libm_path}" ]]; then
51+
echo "ERROR: 未找到 rv64/lp64d 的 picolibc libm.a,请检查 runner 上的 picolibc 包内容" >&2
52+
exit 1
53+
fi
54+
lib_dir="$(dirname "${libm_path}")"
55+
56+
echo "CPATH=${include_dir}" >> "${GITHUB_ENV}"
57+
echo "C_INCLUDE_PATH=${include_dir}" >> "${GITHUB_ENV}"
58+
echo "LIBRARY_PATH=${lib_dir}" >> "${GITHUB_ENV}"
59+
60+
specs_file="$(riscv64-unknown-elf-gcc -print-file-name=picolibc.specs)"
61+
if [[ "${specs_file}" != "picolibc.specs" && -f "${specs_file}" ]]; then
62+
echo "RISCV_GCC_BENCHMARK=riscv64-unknown-elf-gcc -specs=${specs_file}" >> "${GITHUB_ENV}"
63+
echo "Detected picolibc specs: ${specs_file}"
64+
else
65+
echo "RISCV_GCC_BENCHMARK=riscv64-unknown-elf-gcc" >> "${GITHUB_ENV}"
66+
echo "picolibc.specs not found in GCC search path, fallback to default gcc + LIBRARY_PATH"
67+
fi
68+
69+
echo "Detected include dir: ${include_dir}"
70+
echo "Detected lib dir: ${lib_dir}"
4171
4272
- name: Init Submodules
4373
run: git submodule update --init --recursive
@@ -53,7 +83,8 @@ jobs:
5383
run: |
5484
make -C riscv-tests/benchmarks -f Makefile \
5585
src_dir="${GITHUB_WORKSPACE}/riscv-tests/benchmarks" \
56-
XLEN=64
86+
XLEN=64 \
87+
RISCV_GCC="${RISCV_GCC_BENCHMARK}"
5788
5889
- name: Configure
5990
run: cmake -S . -B build

0 commit comments

Comments
 (0)