(please keep me CCd, I am not subscribed) Dear R developers,
At the Reproducible Builds project we've been trying to get build tools and packages generate bit-for-bit identical output, even under different build paths. This is beneficial for users because they can more easily compare their builds with others, as well as other reasons. At the moment about 400 out of 26000 Debian packages are unreproducible due to how R writes paths.rds files as well as RDB files. An example diff is here: https://tests.reproducible-builds.org/debian/rb-pkg/unstable/amd64/diffoscope-results/r-cran-tensor.html I've attached a patch (applies to both 3.3.3 and 3.4) that fixes this issue; however I know it's not perfect and would welcome feedback on how to make it acceptable to the R project. For example, I've tried to limit the effects of the patch only to the RDB loading/saving code, but I'm not familiar with the codebase so it would be good if someone could verify that I did this correctly. Then, ideally we would also add some tests to ensure that unreproduciblity does not crop back in "by accident". R code heavily relies on absolute paths, and I went down several dead-ends chasing and editing variables containing absolute paths, before I finally managed to get this working patch, so I suspect that without specific reproducibility tests, this issue might recur in the future. I've checked that the existing tests still pass, with this patch applied to the Debian package. I have some errors like: - Warning message: - In utils::packageDescription(basename(dir), dirname(dir)) : - no package 'cluster' was found -* checking R files for non-ASCII characters ... OK -* checking R files for syntax errors ... OK :* checking whether the package can be loaded ... ERROR but I also get the same errors when I build the unpatched Debian package. And if I run e.g. `Rscript -e 'library(cluster)'` with a patched Rscript, there is no error and the exit code is 0. Ximin -- GPG: ed25519/56034877E1F87C35 GPG: rsa4096/1318EFAC5FBBDBCE https://github.com/infinity0/pubkeys.git
diff -u r-base-3.3.3/debian/changelog r-base-3.3.3/debian/changelog --- r-base-3.3.3.orig/src/library/base/R/namespace.R +++ r-base-3.3.3/src/library/base/R/namespace.R @@ -190,7 +190,8 @@ loadNamespace <- function (package, lib.loc = NULL, keep.source = getOption("keep.source.pkgs"), - partial = FALSE, versionCheck = NULL) + partial = FALSE, versionCheck = NULL, + relpath = FALSE) { libpath <- attr(package, "LibPath") package <- as.character(package)[[1L]] @@ -246,9 +247,9 @@ attr(dimpenv, "name") <- paste("lazydata", name, sep = ":") setNamespaceInfo(env, "lazydata", dimpenv) setNamespaceInfo(env, "imports", list("base" = TRUE)) - ## this should be an absolute path - setNamespaceInfo(env, "path", - normalizePath(file.path(lib, name), "/", TRUE)) + path <- if (relpath) file.path(".", name) + else normalizePath(file.path(lib, name), "/", TRUE) + setNamespaceInfo(env, "path", path) setNamespaceInfo(env, "dynlibs", NULL) setNamespaceInfo(env, "S3methods", matrix(NA_character_, 0L, 3L)) env$.__S3MethodsTable__. <- --- r-base-3.3.3.orig/src/library/tools/R/admin.R +++ r-base-3.3.3/src/library/tools/R/admin.R @@ -785,7 +785,6 @@ .install_package_Rd_objects <- function(dir, outDir, encoding = "unknown") { - dir <- file_path_as_absolute(dir) mandir <- file.path(dir, "man") manfiles <- if(!dir.exists(mandir)) character() else list_files_with_type(mandir, "docs") --- r-base-3.3.3.orig/src/library/tools/R/makeLazyLoad.R +++ r-base-3.3.3/src/library/tools/R/makeLazyLoad.R @@ -29,7 +29,7 @@ if (packageHasNamespace(package, dirname(pkgpath))) { if (! is.null(.getNamespace(as.name(package)))) stop("namespace must not be already loaded") - ns <- suppressPackageStartupMessages(loadNamespace(package, lib.loc, keep.source, partial = TRUE)) + ns <- suppressPackageStartupMessages(loadNamespace(package, lib.loc, keep.source, partial = TRUE, relpath = TRUE)) makeLazyLoadDB(ns, dbbase, compress = compress) } else --- r-base-3.3.3.orig/src/library/tools/R/parseRd.R +++ r-base-3.3.3/src/library/tools/R/parseRd.R @@ -62,6 +62,7 @@ basename <- basename(srcfile$filename) srcfile$encoding <- encoding srcfile$Enc <- "UTF-8" + srcfile$wd <- "." if (encoding == "ASCII") { if (any(is.na(iconv(lines, "", "ASCII"))))
______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel