Windows Builds

Overview

This document attempts to track Windows builds for Bioconductor packages for the devel and release branches:

  • http://bioc.r-universe.dev builds the Bioconductor devel branch
  • http://bioc-release.r-universe.dev builds the Bioconductor release branch

Because R universe build for multiple versions of R whereas Bioconductor branches build for a specific version, the following tables display only the package builds corresponding the Bioconductor branch’s specific R version.

A URL may be generated to download a snapshot; however, for a large number of files, it may be better to download individual files.

Code
library(universe)
library(BiocPkgTools)
library(dplyr)
library(DT)
library(tibble)

# set max.print to get all packages
options(max.print = 3000L)

#' Get x.y version of R
#'
#' @returns character x.y
#' 
#' @examples
#' r_xy_ver("4.5.2")
r_xy_ver <- function(x) {
    xyz <- strsplit(x[[1]], "\\.")
    paste(xyz[[1]][1], xyz[[1]][2], sep=".")
}

#' Generates the URL to retrieve the snapshot of a universe
#' 
#' NOTE: This will likely not work for a large number of packages
#'
#' @uni character name of the universe
#' @r_versions character R versions
#' @oses character comma separated string of oses without spaces; any combination 
#'     of src,win,mac,linux,wasm,docs
#' @pkgs character a string of comma-separated package names without spaces or a
#'     character vector of package names
#'
#' @return character url to download snapshot
#' 
#' @examples
#' make_snapshot_url("bioc", "4.6", "win", "bedbaser")
make_snapshot_url <- function(uni, r_versions = NULL, oses = NULL, pkgs = NULL) {
    suffix <- ""

    if (!is.null(oses)) {
        suffix <- ifelse(suffix == "", paste0("zip?types=", oses),
                         paste0(suffix, "&types=", oses))
    }

    if (!is.null(r_versions)) {
        versions <- sapply(strsplit(r_versions, ",[ ]*")[[1]], r_xy_ver) |>
            unname() |>
            paste(collapse = ",")
        suffix <- ifelse(suffix == "",
                         paste0("zip?binaries=", versions),
                         paste0(suffix, "&binaries=", versions))
    }
    if (!is.null(pkgs)) {
        if (length(pkgs) > 1)
            pkgs <- paste0(pkgs, collapse = ",")
        suffix <- paste0(suffix, "&packages=", pkgs, collapse="")
    }
    paste0("https://", uni, ".r-universe.dev/api/snapshot/", suffix)
}

uni_pkg_file <- function(pkg, os, bin_ver) {
    if (os == "windows")
        ext <- "zip"
    else if (os == "macosx")
        ext <- "tgz"
    else
        ext <- "tar.gz"
    paste0(pkg, "_", bin_ver, ".", ext)
}

uni_repo_url <- function(uni, os, r_version) {
    if (os == "macosx")
        repo_path <- paste(c("bin", os, "big-sur-x86_64"), collapse = "/")
    else if (os == "windows")
        repo_path <- paste(c("bin", os), collapse = "/")
    else
        repo_path <- "src"
    root <- paste0("https://", uni, ".r-universe.dev")
    paste(c(root, repo_path, "contrib", r_xy_ver(r_version), ""), collapse = "/")
}

get_binary_os <- function(os) {
    if (os %in% c("windows", "macos"))
        os <- substr(os, 1, 3)
    os
}

get_uni_pkgs <- function(uni, uni_branch, r_version, os, bioc_version) {
    ru_info <- universe::universe_all_packages(uni, limit = 3000L)
    bbs_info <- BiocPkgTools::biocPkgList(version = bioc_version,
                                          repo="BioCsoft")

    builds <- data.frame(Package = "",
                         Version = "",
                         JobUrl = "",
                         JobCheck = "",
                         BinariesCheck = "",
                         BinariesUrl = "",
                         BinariesBuildDate = "",
                         BinariesStatus = "",
                         RU_commit = "",
                         BBS_commit = "",
                         MD5sum = "",
                         RemoteSha = "",
                         RemoteUrl = "",
                         Published = "",
                         File = "",
                         Url = "")

    uni_repo <- uni_repo_url(uni, os, r_version)

    for (i in seq_along(ru_info)) {
      jobid <- ""
      jobcheck <- ""
      binaries_buildurl <- ""
      binaries_status <- ""
      binaries_check <- ""
      binaries_builddate <- ""
      binaries_version <- ""
      
      for (j in seq_along(ru_info[[i]]$`_jobs`)) {
        job <- ru_info[[i]]$`_jobs`[[j]]
        if (job$config == paste(os, uni_branch, sep = "-") && job$r == r_version) {
          jobid <- as.character(job$job)
          jobcheck <- job$check
          break
        }
      }
      
      for (k in seq_along(ru_info[[i]]$`_binaries`)) {
        binary <- ru_info[[i]]$`_binaries`[[k]]
        if (binary$os == get_binary_os(os) && binary$r == r_version) {
          ru_commit <- as.character(binary$commit)
          binaries_buildurl <- binary$buildurl
          binaries_status <- binary$status
          binaries_check <- binary$check
          binaries_builddate <- binary$date
          binaries_version <- binary$version
          break
        }
      }
      
      if (is.null(ru_commit))
          ru_commit <- ""
      
      bbs_commit <- bbs_info |>
        dplyr::filter(Package == ru_info[[i]]$Package) |>
        dplyr::pull(git_last_commit)

      pkg_file <- uni_pkg_file(ru_info[[i]]$Package, os, binaries_version)
      url <- paste0(uni_repo, pkg_file)
      link <- paste0("<a href='", url, "'>", pkg_file, "</a>")
      builds <- tibble::add_row(builds,
                                Package = ru_info[[i]]$Package,
                                Version = ru_info[[i]]$Version,
                                JobUrl = ifelse(!is.null(ru_info[[i]]$`_buildurl`),
                                                paste0("<a href='",
                                                       ru_info[[i]]$`_buildurl`, "/job/",
                                                       jobid, "'>", jobcheck,
                                                       "</a>"),
                                                ""),
                                JobCheck = jobcheck,
                                BinariesCheck = binaries_check,
                                BinariesUrl = ifelse(binaries_status == "success",
                                                     paste0("<a href='",
                                                            binaries_buildurl,
                                                            "'>", binaries_check,
                                                            "</a>"),
                                                     paste0("<a href='",
                                                            binaries_buildurl,
                                                            "'>", binaries_status,
                                                            "</a>")),
                                RU_commit = substr(ru_commit, 1, 7),
                                BBS_commit = bbs_commit,
                                MD5sum = substr(ru_info[[i]]$MD5sum, 1, 7),
                                RemoteSha = substr(ru_info[[i]]$RemoteSha, 1, 7),
                                RemoteUrl = ru_info[[i]]$RemoteUrl,
                                Published = ru_info[[i]]$`_published`,
                                BinariesBuildDate = binaries_builddate,
                                BinariesStatus = binaries_status,
                                Url = ifelse(jobcheck == "FAIL", "", url),
                                File = ifelse(jobcheck == "FAIL", "", link))
    }
    
    # drop blank first row
    builds <- builds[c(-1), ]
    
    builds |>
      dplyr::arrange(Package)
}

Bioconductor Devel on bioc.r-universe.dev

Devel Windows

Code
uni_devel_pkgs <- get_uni_pkgs("bioc", "devel", "4.6.0", "windows", "3.23")

devel_uni_pkgs <- dplyr::rename(uni_devel_pkgs, "Latest Check" = JobUrl,
                                "Binary Check" = BinariesUrl) |>
      dplyr::select(Package, Version, "Latest Check", "Binary Check",
                    BinariesBuildDate, RU_commit, BBS_commit, File)

DT::datatable(devel_uni_pkgs, escape = FALSE)

Devel Windows: Passing with same commit hash as in BBS

The following packages have the same commit hash in R-Universe and the BBS. They also pass the latest R CMD check and their binary also passes R CMD check with a value of NOTE, WARNING, or OK.

Code
viable_devel_candidates <- uni_devel_pkgs |>
    dplyr::filter(BBS_commit == RU_commit, 
                  BinariesCheck %in% c("NOTE", "WARNING", "OK"),
                  JobCheck %in% c("NOTE", "WARNING", "OK"),
                  BinariesStatus == "success") |>
    dplyr::rename("Latest Check" = JobUrl, "Binary Check" = BinariesUrl) |>
    dplyr::select(Package, Version, "Latest Check", "Binary Check",
                  BinariesBuildDate, RU_commit, BBS_commit, Published, File,
                  Url)

DT::datatable(viable_devel_candidates, escape = FALSE)

Bioconductor Devel: Windows Failures

The following packages are failing on Windows.

Code
failing_windows <- uni_devel_pkgs |>
    dplyr::filter(JobCheck == "ERROR" | BinariesCheck == "ERROR",
                  BinariesStatus != "success") |>
    dplyr::rename("Latest Check" = JobUrl, "Binary Check" = BinariesUrl) |>
    dplyr::select(Package, Version, "Latest Check", "Binary Check",
                  BinariesBuildDate, RU_commit, BBS_commit, File)

DT::datatable(failing_windows, escape = FALSE)

Understanding the error

For more details about the error, click on the link. The Latest Check will go to the latest GitHub Action Workflow run’s R CMD check on the package whereas the Binary Check will go to the GitHub Action Workflow associated with the R CMD check associated with the binary. It may not take you to the specific location of the error. You need to look at the Build R-release for Windows (on left), which builds the same package version as Bioconductor devel for the correct version of R. You can then either expand the Annotations or expand R CMD check to see more details about the error. You must be logged in to see more details.

annotations

r_cmd_check

Bioconductor Release on bioc-release.r-universe.dev

Code
uni_release_pkgs <- get_uni_pkgs("bioc-release", "release", "4.5.2", "windows", "3.22")

release_uni_pkgs <- dplyr::rename(uni_release_pkgs, "Latest Check" = JobUrl,
                                  "Binary Check" = BinariesUrl) |>
      dplyr::select(Package, Version, "Latest Check", "Binary Check",
                    BinariesBuildDate, RU_commit, BBS_commit, File)

DT::datatable(release_uni_pkgs, escape = FALSE)

Bioconductor Release: Passing with same commit hash as in BBS

Code
viable_release_candidates <- uni_release_pkgs |>
    dplyr::filter(BBS_commit == RU_commit, 
                  BinariesCheck %in% c("NOTE", "WARNING", "OK"),
                  JobCheck %in% c("NOTE", "WARNING", "OK"),
                  BinariesStatus == "success") |>
    dplyr::rename("Latest Check" = JobUrl, "Binary Check" = BinariesUrl) |>
    dplyr::select(Package, Version, "Latest Check", "Binary Check",
                  BinariesBuildDate, RU_commit, BBS_commit, Published, File,
                  Url)

DT::datatable(viable_release_candidates, escape = FALSE)

Downloading Packages

Code
# Download devel packages
curl::multi_download(viable_devel_candidates$Url)

# Download release packages

curl::multi_download(viable_release_candidates$Url)

sessionInfo()

Code
sessionInfo()
R version 4.5.2 (2025-10-31)
Platform: x86_64-pc-linux-gnu
Running under: Ubuntu 24.04.3 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so;  LAPACK version 3.12.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

time zone: Etc/UTC
tzcode source: system (glibc)

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] tibble_3.3.0         DT_0.34.0            dplyr_1.1.4         
[4] BiocPkgTools_1.27.12 htmlwidgets_1.6.4    universe_1.0.0      

loaded via a namespace (and not attached):
 [1] bslib_0.9.0         xfun_0.54           httr2_1.2.1        
 [4] websocket_1.4.4     gh_1.5.0            processx_3.8.6     
 [7] Biobase_2.70.0      tzdb_0.5.0          crosstalk_1.2.2    
[10] ps_1.9.1            vctrs_0.6.5         tools_4.5.2        
[13] bitops_1.0-9        generics_0.1.4      stats4_4.5.2       
[16] curl_7.0.0          RUnit_0.4.33.1      RSQLite_2.4.5      
[19] blob_1.2.4          pkgconfig_2.0.3     dbplyr_2.5.1       
[22] graph_1.88.1        lifecycle_1.0.4     stringr_1.6.0      
[25] compiler_4.5.2      chromote_0.5.1      biocViews_1.78.0   
[28] sass_0.4.10         htmltools_0.5.8.1   RCurl_1.98-1.17    
[31] yaml_2.3.11         jquerylib_0.1.4     tidyr_1.3.1        
[34] pillar_1.11.1       later_1.4.4         cachem_1.1.0       
[37] tidyselect_1.2.1    rvest_1.0.5         digest_0.6.39      
[40] stringi_1.8.7       purrr_1.2.0         fastmap_1.2.0      
[43] cli_3.6.5           magrittr_2.0.4      RBGL_1.86.0        
[46] XML_3.99-0.20       withr_3.0.2         readr_2.1.6        
[49] filelock_1.0.3      promises_1.5.0      rappdirs_0.3.3     
[52] bit64_4.6.0-1       lubridate_1.9.4     timechange_0.3.0   
[55] rmarkdown_2.30      httr_1.4.7          igraph_2.2.1       
[58] bit_4.6.0           otel_0.2.0          hms_1.1.4          
[61] memoise_2.0.1       evaluate_1.0.5      knitr_1.50         
[64] BiocFileCache_3.0.0 rlang_1.1.6         Rcpp_1.1.0         
[67] glue_1.8.0          DBI_1.2.3           BiocManager_1.30.27
[70] xml2_1.5.1          BiocGenerics_0.56.0 jsonlite_2.0.0     
[73] R6_2.6.1