【问题标题】:Travis CI can't find header files in R package subdirectoryTravis CI 在 R 包子目录中找不到头文件
【发布时间】:2019-04-17 17:59:14
【问题描述】:

我正在尝试设置 Travis-CI 来构建 this R 包。该包使用以下步骤在本地构建,这些步骤与 Travis 上的构建过程非常相似(构建失败here):

git clone --depth=50 --branch=master https://github.com/weinstockj/htslibr.git weinstockj/htslibr
cd weinstockj/htslibr/
git submodule update --init --recursive
cd htslibr/
R -e 'install.packages("Rcpp")'
R CMD build .

Travis 失败并出现错误,表明它找不到位于 htslibr/src 子目录中的头文件。为什么 R CMD build 无法在 Travis 上找到标头(同样,本地没有问题)?

Travis 设置为 here ,在本地我也在使用 Ubuntu 16.04。

【问题讨论】:

    标签: r travis-ci r-package


    【解决方案1】:

    这里是失败构建日志的摘录:

    mkdir -p /tmp/Rtmpy1bhv4/Rinst23036acf1e4/htslibr/inst/include
    cp htslib/htslib/*.h /tmp/Rtmpy1bhv4/Rinst23036acf1e4/htslibr/inst/include
    g++ -std=gnu++11 -I"/home/travis/R-bin/lib/R/include" -DNDEBUG  -I"/usr/local/lib/R/site-library/Rcpp/include" -I/home/travis/R-bin/include   -fpic  -g -O2 -c RcppExports.cpp -o RcppExports.o
    g++ -std=gnu++11 -I"/home/travis/R-bin/lib/R/include" -DNDEBUG  -I"/usr/local/lib/R/site-library/Rcpp/include" -I/home/travis/R-bin/include   -fpic  -g -O2 -c util.cpp -o util.o
    util.cpp:2:24: fatal error: htslib/hts.h: No such file or directory
    

    我们看到,虽然标头被复制到 /tmp/Rtmpy1bhv4/Rinst23036acf1e4/htslibr/inst/include,但该目录不在包含路径上。您可以通过添加来解决此问题

    PKG_CPPFLAGS = -I../inst/include -DSTRICT_R_HEADERS
    

    Makevars(不需要STRICT_R_HEADERS,但"best practice")并在util.cpp中使用#include <hts.h>。但是,我不相信首先将头文件复制到inst/include 是正确的。毕竟,这些头文件并不代表您的包提供给其他包的 API。相反,它是您打包使用的库的 API在内部。因此,我建议不要复制头文件并使用

    PKG_CPPFLAGS = -Ihtslib -DSTRICT_R_HEADERS
    

    Makevars

    顺便说一句,Writing R Extensions 提倡对目标使用不同的使用模式:

    all: $(SHLIB)
    $(SHLIB): <any other needed targets>
    

    尽管如果您按照我的建议不要复制标题,这一点是无关紧要的。

    【讨论】:

    • 感谢您的关注。我试过你的建议 - 不幸的是同样的错误:travis-ci.com/weinstockj/htslibr/jobs/194016747
    • @JoshW。对,我忽略了用于include 的相对路径。我已经更正了答案并添加了另一种可能性。
    • 我在PKG_LIBS中添加了那个,以及“-Lhtslib”,现在它找到了头文件。感谢您的回答。现在创建共享库后找不到 .so 文件:travis-ci.com/weinstockj/htslibr/jobs/194034525。认为这可以通过将 rpath 添加到 PKG_LIBS 来解决?
    • @JoshW。通常会构建一个静态库 (.a),c.f. github.com/rstub/swephR/blob/master/src/Makevars.in。使用rpath 可能会起作用,但我不确定它的便携性如何。此外,您还必须安装 libhts.so 以及软件包,默认情况下不会这样做。它在本地工作可能意味着您在标准位置安装了htslib,对吧?
    • 使用 rpath 的想法来自这里 - cran.rstudio.com/doc/manuals/r-release/…。如果它不是完全便携的,我认为现在还可以。 htslib 未安装在本地标准位置。
    猜你喜欢
    • 2020-05-14
    • 2014-04-21
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2014-06-17
    相关资源
    最近更新 更多