在GitHub Actions中为R包代码覆盖率禁用OpenMP的方法咨询
解决R包中OpenMP并行代码的covr覆盖率统计问题
针对你遇到的OpenMP并行代码块无法被covr统计覆盖率的问题,以下是两种在GitHub Actions覆盖率作业中禁用OpenMP的具体实现方法:
方案1:通过Makevars的环境变量控制OpenMP开关
修改包根目录下的Makevars(Linux/macOS)或Makevars.win(Windows)文件,添加条件判断逻辑,根据环境变量决定是否启用OpenMP:
# Makevars (适用于Linux/macOS) # 先默认添加OpenMP编译选项 PKG_CXXFLAGS += $(SHLIB_OPENMP_CXXFLAGS) PKG_LIBS += $(SHLIB_OPENMP_CXXFLAGS) # 当环境变量DISABLE_OPENMP存在时,移除OpenMP相关编译选项 ifdef DISABLE_OPENMP PKG_CXXFLAGS := $(filter-out $(SHLIB_OPENMP_CXXFLAGS),$(PKG_CXXFLAGS)) PKG_LIBS := $(filter-out $(SHLIB_OPENMP_CXXFLAGS),$(PKG_LIBS)) endif
然后在GitHub Actions的覆盖率作业中,设置DISABLE_OPENMP环境变量即可:
jobs: coverage: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: r-lib/actions/setup-r@v2 - name: Install dependencies run: | install.packages(c("covr", "testthat", "remotes")) remotes::install_deps(dependencies = TRUE) - name: Run coverage without OpenMP env: DISABLE_OPENMP: "true" run: | covr::codecov()
这种方案的好处是本地测试时也可以通过export DISABLE_OPENMP=true编译不带OpenMP的版本,方便调试。
方案2:直接在GitHub Actions的YAML中覆盖编译变量
无需修改包内的Makevars文件,直接在覆盖率作业的环境变量中清空OpenMP相关编译选项:
jobs: coverage: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: r-lib/actions/setup-r@v2 - name: Install dependencies run: | install.packages(c("covr", "testthat", "remotes")) remotes::install_deps(dependencies = TRUE) - name: Run coverage without OpenMP env: # 直接清空OpenMP的编译标志,强制编译不启用OpenMP的版本 SHLIB_OPENMP_CXXFLAGS: "" SHLIB_OPENMP_CFLAGS: "" run: | covr::codecov()
这种方案更轻量,不需要改动包的配置文件,仅在CI的覆盖率作业中生效。
需要注意的是,如果你的Windows作业也需要处理,只需在对应的job中添加同样的环境变量设置即可,R的编译变量在各平台是统一的。
内容的提问来源于stack exchange,提问作者JRR
相关产品推荐
相关产品推荐

