我正在尝试设置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构建无法在Travis上找到标头(再次,本地没有问题)?
Travis设置为here,在本地我也使用Ubuntu 16.04。
答案 0 :(得分:0)
以下是失败的构建日志的摘录:
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
(不需要"best practice",STRICT_R_HEADERS
),并在#include <hts.h>
中使用util.cpp
。但是,我不认为首先将头文件复制到inst/include
是正确的。毕竟,这些头文件并不表示您的包正在提供给其他包的API。相反,它是您打包使用的内部库的API。因此,我建议不要复制头文件并使用
PKG_CPPFLAGS = -Ihtslib -DSTRICT_R_HEADERS
在Makevars
中。
顺便说一句,Writing R Extensions提倡对目标使用不同的使用模式:
all: $(SHLIB)
$(SHLIB): <any other needed targets>
如果您按照我的建议不复制标题,那么这一点无关紧要。