make check fails -- how to debug

classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

make check fails -- how to debug

Barris, Wes
I am trying to build R-3.6.2 on a Linux system running CentOS 7.7.1908.  "make check" fails.  How can I troubleshoot this to find out what is wrong?

R_PAPERSIZE=letter
cd R-3.6.2
mkdir CentOS
../configure --with-x=no --enable-R-shlib
make
make check
.
.
.
running code in '../../tests/array-subset.R' ... OK
running code in '../../tests/reg-tests-1a.R' ... OK
running code in '../../tests/reg-tests-1b.R' ... OK
running code in '../../tests/reg-tests-1c.R' ... OK
running code in '../../tests/reg-tests-1d.R' ... OK
running code in '../../tests/reg-tests-2.R' ... OK
  comparing 'reg-tests-2.Rout' to '../../tests/reg-tests-2.Rout.save' ... OK
running code in '../../tests/reg-examples1.R' ... OK
running code in '../../tests/reg-examples2.R' ... OK
running code in '../../tests/reg-packages.R' ...make[3]: *** [reg-packages.Rout] Error 1
make[3]: Leaving directory `/usr/local/src/stats/R-3.6.2/CentOS/tests'
make[2]: *** [test-Reg] Error 2
make[2]: Leaving directory `/usr/local/src/stats/R-3.6.2/CentOS/tests'
make[1]: *** [test-all-basics] Error 1
make[1]: Leaving directory `/usr/local/src/stats/R-3.6.2/CentOS/tests'
make: *** [check] Error 2
--
Wes Barris

----------------------------------------------------------------------
This email and any files transmitted with it are confide...{{dropped:11}}

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|

Re: make check fails -- how to debug

Duncan Murdoch-2
On 11/02/2020 4:26 p.m., Barris, Wes wrote:

> I am trying to build R-3.6.2 on a Linux system running CentOS 7.7.1908.  "make check" fails.  How can I troubleshoot this to find out what is wrong?
>
> R_PAPERSIZE=letter
> cd R-3.6.2
> mkdir CentOS
> ../configure --with-x=no --enable-R-shlib
> make
> make check
> .
> .
> .
> running code in '../../tests/array-subset.R' ... OK
> running code in '../../tests/reg-tests-1a.R' ... OK
> running code in '../../tests/reg-tests-1b.R' ... OK
> running code in '../../tests/reg-tests-1c.R' ... OK
> running code in '../../tests/reg-tests-1d.R' ... OK
> running code in '../../tests/reg-tests-2.R' ... OK
>    comparing 'reg-tests-2.Rout' to '../../tests/reg-tests-2.Rout.save' ... OK
> running code in '../../tests/reg-examples1.R' ... OK
> running code in '../../tests/reg-examples2.R' ... OK
> running code in '../../tests/reg-packages.R' ...make[3]: *** [reg-packages.Rout] Error 1
> make[3]: Leaving directory `/usr/local/src/stats/R-3.6.2/CentOS/tests'
> make[2]: *** [test-Reg] Error 2
> make[2]: Leaving directory `/usr/local/src/stats/R-3.6.2/CentOS/tests'
> make[1]: *** [test-all-basics] Error 1
> make[1]: Leaving directory `/usr/local/src/stats/R-3.6.2/CentOS/tests'
> make: *** [check] Error 2
>

At the end of that run, you'll see the log of the failed test in
tests/reg-packages.Rout.fail (or some name a lot like that).  You'll
have to figure out why it failed from that log.

Duncan Murdoch

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|

Re: make check fails -- how to debug

Ivan Krylov
In reply to this post by Barris, Wes
On Tue, 11 Feb 2020 21:26:33 +0000
"Barris, Wes" <[hidden email]> wrote:

> running code in '../../tests/reg-packages.R' ...make[3]: ***
> [reg-packages.Rout] Error 1

tests/Makefile.common has the following in the .R.Rout rule:

        @$(ECHO) $(ECHO_N) "running code in '$<' ...$(ECHO_C)" > $@.log
        @$(R) < $< > $@.fail 2>&1 || (cat $@.log && rm $@.log && exit 1)

> How can I troubleshoot this to find out what is wrong?

Take a look at tests/reg-packages.Rout.fail, it should contain all
output produced by tests/reg-packages.R when it ran.

--
Best regards,
Ivan

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|

Re: make check fails -- how to debug

Barris, Wes
Thanks Ivan.  Here is the contents of reg-packages.Rout.fail.  I'm not sure exactly what part of this is the fatal error:



R version 3.6.2 (2019-12-12) -- "Dark and Stormy Night"
Copyright (C) 2019 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> .R_LIBS <- function(libp = .libPaths()) { # (>> in utils?)
+     libp <- libp[! libp %in% .Library]
+     if(length(libp))
+         paste(libp, collapse = .Platform$path.sep)
+     else "" # character(0) is invalid for Sys.setenv()
+ }
> Sys.setenv(R_LIBS = .R_LIBS() # for build.pkg() & install.packages()
+          , R_BUILD_ENVIRON = "nothing" # avoid ~/.R/build.environ which might set R_LIBS
+          , R_ENVIRON = "none"
+          , R_PROFILE = "none"
+            )

>
> ## PR 1271  detach("package:base") crashes R.
> tools::assertError(detach("package:base"))
>
>
> ## invalid 'lib.loc'
> stopifnot(length(installed.packages("mgcv")) == 0)
> ## gave a low-level error message
>
>
> ## package.skeleton() with metadata-only code
> ## work in current (= ./tests/ directory):
> tmp <- tempfile()
> writeLines(c('setClass("foo", contains="numeric")',
+              'setMethod("show", "foo",',
+              '          function(object) cat("I am a \\"foo\\"\\n"))'),
+            tmp)
> if(file.exists("myTst")) unlink("myTst", recursive=TRUE)
> package.skeleton("myTst", code_files = tmp)# with a file name warning
Creating directories ...
Creating DESCRIPTION ...
Creating NAMESPACE ...
Creating Read-and-delete-me ...
Copying code files ...
Making help files ...
Done.
Further steps are described in './myTst/Read-and-delete-me'.
Warning message:
In package.skeleton("myTst", code_files = tmp) :
  Invalid file name(s) for R code in ./myTst/R:
  'file62e012b0d16'
 are now renamed to 'z<name>.R'
> file.copy(tmp, (tm2 <- paste(tmp,".R", sep="")))
[1] TRUE
> unlink("myTst", recursive=TRUE)
> op <- options(warn=2) # *NO* "invalid file name" warning {failed in 2.7.[01]}:
> package.skeleton("myTst", code_files = tm2)
Creating directories ...
Creating DESCRIPTION ...
Creating NAMESPACE ...
Creating Read-and-delete-me ...
Copying code files ...
Making help files ...
Done.
Further steps are described in './myTst/Read-and-delete-me'.
> options(op)
> ##_2_ only a class, no generics/methods:
> writeLines(c('setClass("DocLink",',
+              'representation(name="character",',
+              '               desc="character"))'), tmp)
> if(file.exists("myTst2")) unlink("myTst2", recursive=TRUE)
> package.skeleton("myTst2", code_files = tmp)
Creating directories ...
Creating DESCRIPTION ...
Creating NAMESPACE ...
Creating Read-and-delete-me ...
Copying code files ...
Making help files ...
Done.
Further steps are described in './myTst2/Read-and-delete-me'.
Warning message:
In package.skeleton("myTst2", code_files = tmp) :
  Invalid file name(s) for R code in ./myTst2/R:
  'file62e012b0d16'
 are now renamed to 'z<name>.R'
> ##- end_2_ # failed in R 2.11.0
> stopifnot(1 == grep("setClass",
+  readLines(list.files("myTst/R", full.names=TRUE))),
+  c("foo-class.Rd","show-methods.Rd") %in% list.files("myTst/man"))
> ## failed for several reasons in R < 2.7.0
> ##
> ## Part 2: -- build, install, load and "inspect" the package:
> build.pkg <- function(dir) {
+     stopifnot(dir.exists(dir), file.exists(DESC <- file.path(dir, "DESCRIPTION")))
+     pkgName <- sub("^[A-Za-z]+: ", "", grep("^Package: ", readLines(DESC), value=TRUE))
+     patt <- paste(pkgName, ".*tar\\.gz$", sep="_")
+     unlink(dir('.', pattern = patt))
+     Rcmd <- paste(shQuote(file.path(R.home("bin"), "R")), "CMD")
+     r <- system(paste(Rcmd, "build --keep-empty-dirs", shQuote(dir)),
+                 intern = TRUE)
+     ## return name of tar file built
+     structure(dir('.', pattern = patt), log3 = r)
+ }
> build.pkg("myTst")

[1] "myTst_1.0.tar.gz"
attr(,"log3")
[1] "* checking for file 'myTst/DESCRIPTION' ... OK"                          
[2] "* preparing 'myTst':"                                                    
[3] "* checking DESCRIPTION meta-information ... OK"                          
[4] "* installing the package to process help pages"                          
[5] "* saving partial Rd database"                                            
[6] "* checking for LF line-endings in source and make files and shell scripts"
[7] "* checking for empty or unneeded directories"                            
[8] "* building 'myTst_1.0.tar.gz'"                                            
> ## clean up any previous attempt (which might have left a 00LOCK)
> unlink("myLib", recursive = TRUE)
> dir.create("myLib")
> install.packages("myTst", lib = "myLib", repos=NULL, type = "source") # with warnings
* installing *source* package 'myTst' ...
** using staged installation
** R
** byte-compile and prepare package for lazy loading
** help
Warning: /usr/local/src/stats/R-3.6.2/CentOS/tests/myTst/man/myTst-package.Rd:27: All text must be in a section
Warning: /usr/local/src/stats/R-3.6.2/CentOS/tests/myTst/man/myTst-package.Rd:28: All text must be in a section
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (myTst)
> print(installed.packages(lib.loc= "myLib", priority= "NA"))## (PR#13332)
      Package LibPath Version Priority Depends   Imports LinkingTo Suggests
myTst "myTst" "myLib" "1.0"   NA       "methods" NA      NA        NA      
      Enhances License                     License_is_FOSS
myTst NA       "What license is it under?" NA            
      License_restricts_use OS_type MD5sum NeedsCompilation Built  
myTst NA                    NA      NA     NA               "3.6.2"
> stopifnot(require("myTst",lib = "myLib"))
Loading required package: myTst

> sm <- findMethods(show, where= as.environment("package:myTst"))
> stopifnot(names(sm@names) == "foo")
> unlink("myTst_*")
>
> ## getPackageName()  for "package:foo":
> require('methods')
> library(tools)
> oo <- options(warn=2)
> detach("package:tools", unload=TRUE)
> options(oo)
> ## gave warning (-> Error) about creating package name
>
>
> ## More building & installing packages
> ## NB: tests were added here for 2.11.0.
> ## NB^2: do not do this in the R sources (but in a build != src directory!)
> ## and this testdir is not installed.
> if(interactive() && Sys.getenv("USER") == "maechler")
+     Sys.setenv(SRCDIR = normalizePath("~/R/D/r-devel/R/tests"))
> (pkgSrcPath <- file.path(Sys.getenv("SRCDIR"), "Pkgs"))# e.g., -> "../../R/tests/Pkgs"
[1] "../../tests/Pkgs"
> if(!file_test("-d", pkgSrcPath) && !interactive()) {
+     unlink("myTst", recursive=TRUE)
+     print(proc.time())
+     q("no")
+ }
> ## else w/o clause:
>
> do.cleanup <- !nzchar(Sys.getenv("R_TESTS_NO_CLEAN"))
> isWIN <- .Platform$OS.type == "windows"
> has.symlink <- !isWIN
> ## Installing "on to" a package existing as symlink in the lib.loc
> ## -- used to fail with misleading error message (#PR 16725):
>
> if(has.symlink && !unlink("myLib_2", recursive=TRUE) && dir.create("myLib_2") &&
+    file.rename("myLib/myTst", "myLib_2/myTst") &&
+    file.symlink("../myLib_2/myTst", "myLib/myTst"))
+     install.packages("myTst", lib = "myLib", repos=NULL, type = "source")
* installing *source* package 'myTst' ...
** using staged installation
** R
** byte-compile and prepare package for lazy loading
** help
Warning: /usr/local/src/stats/R-3.6.2/CentOS/tests/myTst/man/myTst-package.Rd:27: All text must be in a section
Warning: /usr/local/src/stats/R-3.6.2/CentOS/tests/myTst/man/myTst-package.Rd:28: All text must be in a section
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (myTst)
> ## In R <= 3.3.2 gave error with *misleading* error message:
> ## ERROR: 'myTst' is not a legal package name
>
> if(isWIN) { # (has no symlinks anyway)
+     file.copy(pkgSrcPath, tempdir(), recursive = TRUE)
+ } else { # above file.copy() not useful as it replaces symlink by copy
+     system(paste('cp -R', shQuote(pkgSrcPath), shQuote(tempdir())))
+ }
> pkgPath <- file.path(tempdir(), "Pkgs")
> if(!dir.exists(pkgPath))  {
+     message("No valid 'pkgPath' (from 'pkgSrcPath') - exit this test")
+     if(!interactive()) q("no")
+ }
>
> ## pkgB tests an empty R directory
> dir.create(file.path(pkgPath, "pkgB", "R"), recursive = TRUE,
+   showWarnings = FALSE)
> p.lis <- c(if("Matrix" %in% row.names(installed.packages(.Library)))
+                c("pkgA", "pkgB", "pkgC"),
+            "exNSS4", "exSexpr")
> InstOpts <- list("exSexpr" = "--html")
> pkgApath <- file.path(pkgPath, "pkgA")
> if("pkgA" %in% p.lis && !dir.exists(d <- pkgApath)) {
+     cat("symlink 'pkgA' does not exist as directory ",d,"; copying it\n", sep='')
+     file.copy(file.path(pkgPath, "xDir", "pkg"), to = d, recursive=TRUE)
+     ## if even the copy failed (NB: pkgB, pkgC depend on pkgA)
+     if(!dir.exists(d)) p.lis <- p.lis[!(p.lis %in% c("pkgA", "pkgB", "pkgC"))]
+ }
> dir2pkg <- function(dir) ifelse(dir == "pkgC", "PkgC", dir)
> if(is.na(match("myLib", .lP <- .libPaths()))) {
+     .libPaths(c("myLib", .lP)) # PkgC needs pkgA from there
+     .lP <- .libPaths()
+ }
> Sys.setenv(R_LIBS = .R_LIBS(.lP)) # for build.pkg() & install.packages()
> for(p in p.lis) {
+     p. <- dir2pkg(p) # 'p' is sub directory name;  'p.' is package name
+     cat("building package", p., "...\n")
+     r <- build.pkg(file.path(pkgPath, p))
+     if(!length(r)) # so some sort of failure, show log
+         cat(attr(r, "log3"), sep = "\n")
+     if(!isTRUE(file.exists(r)))
+         stop("R CMD build failed (no tarball) for package ", p)
+     ## otherwise install the tar file:
+     cat("installing package", p., "using built file", r, "...\n")
+     ## "FIXME": want to catch warnings in the "console output" of this:
+     install.packages(r, lib = "myLib", repos=NULL, type = "source",
+                      INSTALL_opts = InstOpts[[p.]])
+     stopifnot(require(p., lib = "myLib", character.only=TRUE))
+     detach(pos = match(p., sub("^package:","", search())))
+ }
building package pkgA ...

installing package pkgA using built file pkgA_1.2.tar.gz ...
* installing *source* package 'pkgA' ...
** using staged installation
** R
** data
*** moving datasets to lazyload DB
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (pkgA)
Loading required package: pkgA

Attaching package: 'pkgA'

The following object is masked from 'package:base':

    search

building package pkgB ...

installing package pkgB using built file pkgB_1.0.tar.gz ...
* installing *source* package 'pkgB' ...
** using staged installation
** help
No man pages found in package  'pkgB'
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (pkgB)
Loading required package: pkgB
building package PkgC ...

installing package PkgC using built file PkgC_1.0-0.tar.gz ...
* installing *source* package 'PkgC' ...
** using staged installation
** R
** byte-compile and prepare package for lazy loading
From .checkSubclasses(): subclass "classApp" of class "classA" is not local and is not updated for new inheritance information currently;
[where=<environment: 0x4886478>, where2=<environment: namespace:PkgC>]
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (PkgC)
Loading required package: PkgC
building package exNSS4 ...

installing package exNSS4 using built file exNSS4_1.1.tar.gz ...
* installing *source* package 'exNSS4' ...
** using staged installation
** R
** byte-compile and prepare package for lazy loading
** help
No man pages found in package  'exNSS4'
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (exNSS4)
Loading required package: exNSS4
building package exSexpr ...
Converting Rd files to LaTeX
Error in texi2dvi(file = file, pdf = TRUE, clean = clean, quiet = quiet,  :
  pdflatex is not available
Error in texi2dvi(file = file, pdf = TRUE, clean = clean, quiet = quiet,  :
  pdflatex is not available
Error in running tools::texi2pdf()
* checking for file '/tmp/Rtmp5m0Zx8/Pkgs/exSexpr/DESCRIPTION' ... OK
* preparing 'exSexpr':
* checking DESCRIPTION meta-information ... OK
* installing the package to process help pages
* saving partial Rd database
* building the PDF package manual
Hmm ... looks like a package
Creating pdf output from LaTeX ...
Error: R CMD build failed (no tarball) for package exSexpr
In addition: Warning message:
In system(paste(Rcmd, "build --keep-empty-dirs", shQuote(dir)),  :
  running command ''/usr/local/src/stats/R-3.6.2/CentOS/bin/R' CMD build --keep-empty-dirs '/tmp/Rtmp5m0Zx8/Pkgs/exSexpr'' had status 1
Execution halted

--
Wes

-----Original Message-----
From: Ivan Krylov <[hidden email]>
Sent: Wednesday, February 12, 2020 3:37 AM
To: Barris, Wes <[hidden email]>
Cc: [hidden email]
Subject: [EXTERNAL] - Re: [R] make check fails -- how to debug

On Tue, 11 Feb 2020 21:26:33 +0000
"Barris, Wes" <[hidden email]> wrote:

> running code in '../../tests/reg-packages.R' ...make[3]: ***
> [reg-packages.Rout] Error 1

tests/Makefile.common has the following in the .R.Rout rule:

        @$(ECHO) $(ECHO_N) "running code in '$<' ...$(ECHO_C)" > $@.log
        @$(R) < $< > $@.fail 2>&1 || (cat $@.log && rm $@.log && exit 1)

> How can I troubleshoot this to find out what is wrong?

Take a look at tests/reg-packages.Rout.fail, it should contain all output produced by tests/reg-packages.R when it ran.

--
Best regards,
Ivan

----------------------------------------------------------------------
This email and any files transmitted with it are confide...{{dropped:11}}

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|

Re: make check fails -- how to debug

Ivan Krylov
On Wed, 12 Feb 2020 14:20:55 +0000
"Barris, Wes" <[hidden email]> wrote:

> I'm not sure exactly what part of this is the fatal error:

One of the tests is building the package contained in
tests/Pkgs/exSexpr. For some reason, R CMD build failed to produce a
tarball for this package. Try running it yourself and see if it
produces any errors. I don't know for sure whether not being able to
run pdflatex is a blocker when building a package.

--
Best regards,
Ivan

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|

Re: make check fails -- how to debug

Barris, Wes
Thanks Ivan.

I would like to manually run the test you mentioned but I don't know how.  I'm not an R user.  I'm only trying to install the latest version on our servers for our users.  Is this what I need to type?

> pwd
/usr/local/src/stats/R-3.6.2/CentOS

./bin/R CMD ../tests/Pkgs/exSexpr

Note: I've installed the (many) rpms for texlive so that pdflatex is available.  Unfortunately, the same test continues to fail.  Here is the latest log:


R version 3.6.2 (2019-12-12) -- "Dark and Stormy Night"
Copyright (C) 2019 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> .R_LIBS <- function(libp = .libPaths()) { # (>> in utils?)
+     libp <- libp[! libp %in% .Library]
+     if(length(libp))
+         paste(libp, collapse = .Platform$path.sep)
+     else "" # character(0) is invalid for Sys.setenv()
+ }
> Sys.setenv(R_LIBS = .R_LIBS() # for build.pkg() & install.packages()
+          , R_BUILD_ENVIRON = "nothing" # avoid ~/.R/build.environ which might set R_LIBS
+          , R_ENVIRON = "none"
+          , R_PROFILE = "none"
+            )

>
> ## PR 1271  detach("package:base") crashes R.
> tools::assertError(detach("package:base"))
>
>
> ## invalid 'lib.loc'
> stopifnot(length(installed.packages("mgcv")) == 0)
> ## gave a low-level error message
>
>
> ## package.skeleton() with metadata-only code
> ## work in current (= ./tests/ directory):
> tmp <- tempfile()
> writeLines(c('setClass("foo", contains="numeric")',
+              'setMethod("show", "foo",',
+              '          function(object) cat("I am a \\"foo\\"\\n"))'),
+            tmp)
> if(file.exists("myTst")) unlink("myTst", recursive=TRUE)
> package.skeleton("myTst", code_files = tmp)# with a file name warning
Creating directories ...
Creating DESCRIPTION ...
Creating NAMESPACE ...
Creating Read-and-delete-me ...
Copying code files ...
Making help files ...
Done.
Further steps are described in './myTst/Read-and-delete-me'.
Warning message:
In package.skeleton("myTst", code_files = tmp) :
  Invalid file name(s) for R code in ./myTst/R:
  'file40a593b5a60'
 are now renamed to 'z<name>.R'
> file.copy(tmp, (tm2 <- paste(tmp,".R", sep="")))
[1] TRUE
> unlink("myTst", recursive=TRUE)
> op <- options(warn=2) # *NO* "invalid file name" warning {failed in 2.7.[01]}:
> package.skeleton("myTst", code_files = tm2)
Creating directories ...
Creating DESCRIPTION ...
Creating NAMESPACE ...
Creating Read-and-delete-me ...
Copying code files ...
Making help files ...
Done.
Further steps are described in './myTst/Read-and-delete-me'.
> options(op)
> ##_2_ only a class, no generics/methods:
> writeLines(c('setClass("DocLink",',
+              'representation(name="character",',
+              '               desc="character"))'), tmp)
> if(file.exists("myTst2")) unlink("myTst2", recursive=TRUE)
> package.skeleton("myTst2", code_files = tmp)
Creating directories ...
Creating DESCRIPTION ...
Creating NAMESPACE ...
Creating Read-and-delete-me ...
Copying code files ...
Making help files ...
Done.
Further steps are described in './myTst2/Read-and-delete-me'.
Warning message:
In package.skeleton("myTst2", code_files = tmp) :
  Invalid file name(s) for R code in ./myTst2/R:
  'file40a593b5a60'
 are now renamed to 'z<name>.R'
> ##- end_2_ # failed in R 2.11.0
> stopifnot(1 == grep("setClass",
+  readLines(list.files("myTst/R", full.names=TRUE))),
+  c("foo-class.Rd","show-methods.Rd") %in% list.files("myTst/man"))
> ## failed for several reasons in R < 2.7.0
> ##
> ## Part 2: -- build, install, load and "inspect" the package:
> build.pkg <- function(dir) {
+     stopifnot(dir.exists(dir), file.exists(DESC <- file.path(dir, "DESCRIPTION")))
+     pkgName <- sub("^[A-Za-z]+: ", "", grep("^Package: ", readLines(DESC), value=TRUE))
+     patt <- paste(pkgName, ".*tar\\.gz$", sep="_")
+     unlink(dir('.', pattern = patt))
+     Rcmd <- paste(shQuote(file.path(R.home("bin"), "R")), "CMD")
+     r <- system(paste(Rcmd, "build --keep-empty-dirs", shQuote(dir)),
+                 intern = TRUE)
+     ## return name of tar file built
+     structure(dir('.', pattern = patt), log3 = r)
+ }
> build.pkg("myTst")

[1] "myTst_1.0.tar.gz"
attr(,"log3")
[1] "* checking for file 'myTst/DESCRIPTION' ... OK"                          
[2] "* preparing 'myTst':"                                                    
[3] "* checking DESCRIPTION meta-information ... OK"                          
[4] "* installing the package to process help pages"                          
[5] "* saving partial Rd database"                                            
[6] "* checking for LF line-endings in source and make files and shell scripts"
[7] "* checking for empty or unneeded directories"                            
[8] "* building 'myTst_1.0.tar.gz'"                                            
> ## clean up any previous attempt (which might have left a 00LOCK)
> unlink("myLib", recursive = TRUE)
> dir.create("myLib")
> install.packages("myTst", lib = "myLib", repos=NULL, type = "source") # with warnings
* installing *source* package 'myTst' ...
** using staged installation
** R
** byte-compile and prepare package for lazy loading
** help
Warning: /usr/local/src/stats/R-3.6.2/CentOS/tests/myTst/man/myTst-package.Rd:27: All text must be in a section
Warning: /usr/local/src/stats/R-3.6.2/CentOS/tests/myTst/man/myTst-package.Rd:28: All text must be in a section
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (myTst)
> print(installed.packages(lib.loc= "myLib", priority= "NA"))## (PR#13332)
      Package LibPath Version Priority Depends   Imports LinkingTo Suggests
myTst "myTst" "myLib" "1.0"   NA       "methods" NA      NA        NA      
      Enhances License                     License_is_FOSS
myTst NA       "What license is it under?" NA            
      License_restricts_use OS_type MD5sum NeedsCompilation Built  
myTst NA                    NA      NA     NA               "3.6.2"
> stopifnot(require("myTst",lib = "myLib"))
Loading required package: myTst

> sm <- findMethods(show, where= as.environment("package:myTst"))
> stopifnot(names(sm@names) == "foo")
> unlink("myTst_*")
>
> ## getPackageName()  for "package:foo":
> require('methods')
> library(tools)
> oo <- options(warn=2)
> detach("package:tools", unload=TRUE)
> options(oo)
> ## gave warning (-> Error) about creating package name
>
>
> ## More building & installing packages
> ## NB: tests were added here for 2.11.0.
> ## NB^2: do not do this in the R sources (but in a build != src directory!)
> ## and this testdir is not installed.
> if(interactive() && Sys.getenv("USER") == "maechler")
+     Sys.setenv(SRCDIR = normalizePath("~/R/D/r-devel/R/tests"))
> (pkgSrcPath <- file.path(Sys.getenv("SRCDIR"), "Pkgs"))# e.g., -> "../../R/tests/Pkgs"
[1] "../../tests/Pkgs"
> if(!file_test("-d", pkgSrcPath) && !interactive()) {
+     unlink("myTst", recursive=TRUE)
+     print(proc.time())
+     q("no")
+ }
> ## else w/o clause:
>
> do.cleanup <- !nzchar(Sys.getenv("R_TESTS_NO_CLEAN"))
> isWIN <- .Platform$OS.type == "windows"
> has.symlink <- !isWIN
> ## Installing "on to" a package existing as symlink in the lib.loc
> ## -- used to fail with misleading error message (#PR 16725):
>
> if(has.symlink && !unlink("myLib_2", recursive=TRUE) && dir.create("myLib_2") &&
+    file.rename("myLib/myTst", "myLib_2/myTst") &&
+    file.symlink("../myLib_2/myTst", "myLib/myTst"))
+     install.packages("myTst", lib = "myLib", repos=NULL, type = "source")
* installing *source* package 'myTst' ...
** using staged installation
** R
** byte-compile and prepare package for lazy loading
** help
Warning: /usr/local/src/stats/R-3.6.2/CentOS/tests/myTst/man/myTst-package.Rd:27: All text must be in a section
Warning: /usr/local/src/stats/R-3.6.2/CentOS/tests/myTst/man/myTst-package.Rd:28: All text must be in a section
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (myTst)
> ## In R <= 3.3.2 gave error with *misleading* error message:
> ## ERROR: 'myTst' is not a legal package name
>
> if(isWIN) { # (has no symlinks anyway)
+     file.copy(pkgSrcPath, tempdir(), recursive = TRUE)
+ } else { # above file.copy() not useful as it replaces symlink by copy
+     system(paste('cp -R', shQuote(pkgSrcPath), shQuote(tempdir())))
+ }
> pkgPath <- file.path(tempdir(), "Pkgs")
> if(!dir.exists(pkgPath))  {
+     message("No valid 'pkgPath' (from 'pkgSrcPath') - exit this test")
+     if(!interactive()) q("no")
+ }
>
> ## pkgB tests an empty R directory
> dir.create(file.path(pkgPath, "pkgB", "R"), recursive = TRUE,
+   showWarnings = FALSE)
> p.lis <- c(if("Matrix" %in% row.names(installed.packages(.Library)))
+                c("pkgA", "pkgB", "pkgC"),
+            "exNSS4", "exSexpr")
> InstOpts <- list("exSexpr" = "--html")
> pkgApath <- file.path(pkgPath, "pkgA")
> if("pkgA" %in% p.lis && !dir.exists(d <- pkgApath)) {
+     cat("symlink 'pkgA' does not exist as directory ",d,"; copying it\n", sep='')
+     file.copy(file.path(pkgPath, "xDir", "pkg"), to = d, recursive=TRUE)
+     ## if even the copy failed (NB: pkgB, pkgC depend on pkgA)
+     if(!dir.exists(d)) p.lis <- p.lis[!(p.lis %in% c("pkgA", "pkgB", "pkgC"))]
+ }
> dir2pkg <- function(dir) ifelse(dir == "pkgC", "PkgC", dir)
> if(is.na(match("myLib", .lP <- .libPaths()))) {
+     .libPaths(c("myLib", .lP)) # PkgC needs pkgA from there
+     .lP <- .libPaths()
+ }
> Sys.setenv(R_LIBS = .R_LIBS(.lP)) # for build.pkg() & install.packages()
> for(p in p.lis) {
+     p. <- dir2pkg(p) # 'p' is sub directory name;  'p.' is package name
+     cat("building package", p., "...\n")
+     r <- build.pkg(file.path(pkgPath, p))
+     if(!length(r)) # so some sort of failure, show log
+         cat(attr(r, "log3"), sep = "\n")
+     if(!isTRUE(file.exists(r)))
+         stop("R CMD build failed (no tarball) for package ", p)
+     ## otherwise install the tar file:
+     cat("installing package", p., "using built file", r, "...\n")
+     ## "FIXME": want to catch warnings in the "console output" of this:
+     install.packages(r, lib = "myLib", repos=NULL, type = "source",
+                      INSTALL_opts = InstOpts[[p.]])
+     stopifnot(require(p., lib = "myLib", character.only=TRUE))
+     detach(pos = match(p., sub("^package:","", search())))
+ }
building package pkgA ...

installing package pkgA using built file pkgA_1.2.tar.gz ...
* installing *source* package 'pkgA' ...
** using staged installation
** R
** data
*** moving datasets to lazyload DB
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (pkgA)
Loading required package: pkgA

Attaching package: 'pkgA'

The following object is masked from 'package:base':

    search

building package pkgB ...

installing package pkgB using built file pkgB_1.0.tar.gz ...
* installing *source* package 'pkgB' ...
** using staged installation
** help
No man pages found in package  'pkgB'
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (pkgB)
Loading required package: pkgB
building package PkgC ...

installing package PkgC using built file PkgC_1.0-0.tar.gz ...
* installing *source* package 'PkgC' ...
** using staged installation
** R
** byte-compile and prepare package for lazy loading
From .checkSubclasses(): subclass "classApp" of class "classA" is not local and is not updated for new inheritance information currently;
[where=<environment: 0x36b9388>, where2=<environment: namespace:PkgC>]
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (PkgC)
Loading required package: PkgC
building package exNSS4 ...

installing package exNSS4 using built file exNSS4_1.1.tar.gz ...
* installing *source* package 'exNSS4' ...
** using staged installation
** R
** byte-compile and prepare package for lazy loading
** help
No man pages found in package  'exNSS4'
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (exNSS4)
Loading required package: exNSS4
building package exSexpr ...
Converting Rd files to LaTeX

kpathsea: Running mktextfm cmr10
/usr/share/texlive/texmf/web2c/mktexnam: Could not map source abbreviation  for cmr10.
/usr/share/texlive/texmf/web2c/mktexnam: Need to update ?
mktextfm: Running mf \mode:=ljfour; mag:=1; nonstopmode; input cmr10
/bin/mktextfm: line 96: mf: command not found
grep: cmr10.log: No such file or directory
mktextfm: `mf \mode:=ljfour; mag:=1; nonstopmode; input cmr10' failed to make cmr10.tfm.
kpathsea: Appending font creation commands to missfont.log.

kpathsea: Running mktextfm ecrm1000
/usr/share/texlive/texmf/web2c/mktexnam: Could not map source abbreviation  for ecrm1000.
/usr/share/texlive/texmf/web2c/mktexnam: Need to update ?
mktextfm: Running mf \mode:=ljfour; mag:=1; nonstopmode; input ecrm1000
/bin/mktextfm: line 96: mf: command not found
grep: ecrm1000.log: No such file or directory
mktextfm: `mf \mode:=ljfour; mag:=1; nonstopmode; input ecrm1000' failed to make ecrm1000.tfm.
Error in texi2dvi(file = file, pdf = TRUE, clean = clean, quiet = quiet,  :
  unable to run 'pdflatex' on 'Rd2.tex'

kpathsea: Running mktextfm cmr10
/usr/share/texlive/texmf/web2c/mktexnam: Could not map source abbreviation  for cmr10.
/usr/share/texlive/texmf/web2c/mktexnam: Need to update ?
mktextfm: Running mf \mode:=ljfour; mag:=1; nonstopmode; input cmr10
/bin/mktextfm: line 96: mf: command not found
grep: cmr10.log: No such file or directory
mktextfm: `mf \mode:=ljfour; mag:=1; nonstopmode; input cmr10' failed to make cmr10.tfm.
kpathsea: Appending font creation commands to missfont.log.

kpathsea: Running mktextfm ecrm1000
/usr/share/texlive/texmf/web2c/mktexnam: Could not map source abbreviation  for ecrm1000.
/usr/share/texlive/texmf/web2c/mktexnam: Need to update ?
mktextfm: Running mf \mode:=ljfour; mag:=1; nonstopmode; input ecrm1000
/bin/mktextfm: line 96: mf: command not found
grep: ecrm1000.log: No such file or directory
mktextfm: `mf \mode:=ljfour; mag:=1; nonstopmode; input ecrm1000' failed to make ecrm1000.tfm.
Error in texi2dvi(file = file, pdf = TRUE, clean = clean, quiet = quiet,  :
  unable to run 'pdflatex' on 'Rd2.tex'
Error in running tools::texi2pdf()
* checking for file '/tmp/RtmpXDYvcp/Pkgs/exSexpr/DESCRIPTION' ... OK
* preparing 'exSexpr':
* checking DESCRIPTION meta-information ... OK
* installing the package to process help pages
* saving partial Rd database
* building the PDF package manual
Hmm ... looks like a package
Creating pdf output from LaTeX ...
This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013)
 restricted \write18 enabled.
entering extended mode
(./Rd2.tex
LaTeX2e <2011/06/27>
Babel <v3.8m> and hyphenation patterns for english, dumylang, nohyphenation, lo
aded.
(/usr/share/texlive/texmf-dist/tex/latex/base/book.cls
Document Class: book 2007/10/19 v1.4h Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/bk10.clo
! Font OT1/cmr/m/n/10=cmr10 at 10.0pt not loadable: Metric (TFM) file not found
.
<to be read again>
                   relax
l.64 \normalsize
               
)) (/usr/local/src/stats/R-3.6.2/CentOS/share/texmf/tex/latex/Rd.sty
(/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty)
(/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty)
(/usr/share/texlive/texmf-dist/tex/latex/tools/bm.sty)
(/usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty)
(/usr/share/texlive/texmf-dist/tex/latex/tools/verbatim.sty)
(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty)
(/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty
(/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.def))
(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.def)
! Font T1/cmr/m/n/10=ecrm1000 at 10.0pt not loadable: Metric (TFM) file not fou
nd.
<to be read again>
                   relax
l.100 \fontencoding\encodingdefault\selectfont
                                             
) (/usr/share/texlive/texmf-dist/tex/latex/psnfss/times.sty)

! LaTeX Error: File `inconsolata.sty' not found.

Type X to quit or <RETURN> to proceed,
or enter new name. (Default extension: sty)

Enter file name:
! Emergency stop.
<read *>
         
l.287 ^^M
         
!  ==> Fatal error occurred, no output PDF file produced!
Transcript written on Rd2.log.
This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013)
 restricted \write18 enabled.
entering extended mode
(./Rd2.tex
LaTeX2e <2011/06/27>
Babel <v3.8m> and hyphenation patterns for english, dumylang, nohyphenation, lo
aded.
(/usr/share/texlive/texmf-dist/tex/latex/base/book.cls
Document Class: book 2007/10/19 v1.4h Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/bk10.clo
! Font OT1/cmr/m/n/10=cmr10 at 10.0pt not loadable: Metric (TFM) file not found
.
<to be read again>
                   relax
l.64 \normalsize
               
)) (/usr/local/src/stats/R-3.6.2/CentOS/share/texmf/tex/latex/Rd.sty
(/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty)
(/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty)
(/usr/share/texlive/texmf-dist/tex/latex/tools/bm.sty)
(/usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty)
(/usr/share/texlive/texmf-dist/tex/latex/tools/verbatim.sty)
(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty)
(/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty
(/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.def))
(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.def)
! Font T1/cmr/m/n/10=ecrm1000 at 10.0pt not loadable: Metric (TFM) file not fou
nd.
<to be read again>
                   relax
l.100 \fontencoding\encodingdefault\selectfont
                                             
) (/usr/share/texlive/texmf-dist/tex/latex/psnfss/times.sty)

! LaTeX Error: File `inconsolata.sty' not found.

Type X to quit or <RETURN> to proceed,
or enter new name. (Default extension: sty)

Enter file name:
! Emergency stop.
<read *>
         
l.287 ^^M
         
!  ==> Fatal error occurred, no output PDF file produced!
Transcript written on Rd2.log.
Error: R CMD build failed (no tarball) for package exSexpr
In addition: Warning message:
In system(paste(Rcmd, "build --keep-empty-dirs", shQuote(dir)),  :
  running command ''/usr/local/src/stats/R-3.6.2/CentOS/bin/R' CMD build --keep-empty-dirs '/tmp/RtmpXDYvcp/Pkgs/exSexpr'' had status 1
Execution halted
--
Wes

-----Original Message-----
From: Ivan Krylov <[hidden email]>
Sent: Wednesday, February 12, 2020 1:03 PM
To: Barris, Wes <[hidden email]>
Cc: [hidden email]
Subject: [EXTERNAL] - Re: Re: [R] make check fails -- how to debug

On Wed, 12 Feb 2020 14:20:55 +0000
"Barris, Wes" <[hidden email]> wrote:

> I'm not sure exactly what part of this is the fatal error:

One of the tests is building the package contained in tests/Pkgs/exSexpr. For some reason, R CMD build failed to produce a tarball for this package. Try running it yourself and see if it produces any errors. I don't know for sure whether not being able to run pdflatex is a blocker when building a package.

--
Best regards,
Ivan

----------------------------------------------------------------------
This email and any files transmitted with it are confide...{{dropped:11}}

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|

Re: make check fails -- how to debug

Ivan Krylov
On Wed, 12 Feb 2020 19:32:34 +0000
"Barris, Wes" <[hidden email]> wrote:

> I'm only trying to install the latest version on our servers for our
> users.

Are you allowed to use EPEL? This seems to be the officialy supported
way of installing latest R on CentOS [1]. It might be a good idea to
ask in R-SIG-Fedora [2] instead of R-help, too.

> Is this what I need to type?

The following command should more or less reproduce the test:

cd "$(mktemp -d)"

/usr/local/src/stats/R-3.6.2/CentOS/bin/R CMD build \
  --keep-empty-dirs /usr/local/src/stats/R-3.6.2/CentOS/tests/Pkgs/exSexpr

But the problem seems evident even without that.

> Note: I've installed the (many) rpms for texlive so that pdflatex is
> available.  Unfortunately, the same test continues to fail.  Here is
> the latest log:

<...>

> ! LaTeX Error: File `inconsolata.sty' not found.

Not sure whether Inconsolata [3] is packaged for CentOS, but it seems
to be required to build the documentation. It might be possible to
disable the use of this font [4], but I don't understand enough LaTeX
to comment on it further.

Either way, people on R-SIG-Fedora should be able to provide better
help installing latest R on a CentOS server than me.

--
Best regards,
Ivan

[1] https://cloud.r-project.org/bin/linux/redhat/README

[2] https://stat.ethz.ch/mailman/listinfo/r-sig-fedora

[3] https://www.ctan.org/tex-archive/fonts/inconsolata/

[4] https://stackoverflow.com/a/34524358

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|

Re: make check fails -- how to debug

Duncan Murdoch-2
On 12/02/2020 4:42 p.m., Ivan Krylov wrote:

> On Wed, 12 Feb 2020 19:32:34 +0000
> "Barris, Wes" <[hidden email]> wrote:
>
>> I'm only trying to install the latest version on our servers for our
>> users.
>
> Are you allowed to use EPEL? This seems to be the officialy supported
> way of installing latest R on CentOS [1]. It might be a good idea to
> ask in R-SIG-Fedora [2] instead of R-help, too.
>
>> Is this what I need to type?
>
> The following command should more or less reproduce the test:
>
> cd "$(mktemp -d)"
>
> /usr/local/src/stats/R-3.6.2/CentOS/bin/R CMD build \
>    --keep-empty-dirs /usr/local/src/stats/R-3.6.2/CentOS/tests/Pkgs/exSexpr
>
> But the problem seems evident even without that.
>
>> Note: I've installed the (many) rpms for texlive so that pdflatex is
>> available.  Unfortunately, the same test continues to fail.  Here is
>> the latest log:
>
> <...>
>
>> ! LaTeX Error: File `inconsolata.sty' not found.
>
> Not sure whether Inconsolata [3] is packaged for CentOS, but it seems
> to be required to build the documentation. It might be possible to
> disable the use of this font [4], but I don't understand enough LaTeX
> to comment on it further.
>
> Either way, people on R-SIG-Fedora should be able to provide better
> help installing latest R on a CentOS server than me.

I just had a similar error on Ubuntu.  Inconsolata is not a standard
TeXLive font, on Ubuntu you need to install texlive-fonts-extra to get it.

Duncan Murdoch

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.