为r包编写`configure`文件

时间:2018-05-26 04:18:11

标签: autoconf r-package

我正在编写一个r包,它提供libSBML C library周围的包装。

我使用rcppgsl package作为参考,查找GNU Scientific Library GSL的头文件和库文件的位置,并使用该信息编写{ {1}}脚本以及configureMakevars。我目前不在为Windows构建。在我的机器(macOS)上,Makevars.in(SBML C库)安装在通常的位置,即

标题文件位于 - libsbml

和库文件 - /usr/local/include/sbml。实际上,如果在我的包/usr/local/lib文件中使用以下内容,我可以构建我的package

Makevars

但是,我想学习如何使用CXX=clang++ PKG_CPPFLAGS= -I/usr/local/include PKG_LIBS= $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) /usr/local/lib/libsbml-static.a 脚本来查找库并使用该信息来构建包。来自configure的{​​{1}}的相关部分是

configure.ac

我在相关位置用rcppgsl替换## Check for non-standard programs: gsl-config(1) AC_PATH_PROG([GSL_CONFIG], [gsl-config]) ## If gsl-config was found, let's use it if test "${GSL_CONFIG}" != ""; then # Use gsl-config for header and linker arguments GSL_CFLAGS=`${GSL_CONFIG} --cflags` GSL_LIBS=`${GSL_CONFIG} --libs` else AC_MSG_ERROR([gsl-config not found, is GSL installed?]) fi ,即我正在使用的整个GSL_CONFIG文件粘贴在下方(最后)。

但是,我没有看到生成LIB_SBMLconfigure.acconfigure(我在Makevars中看到)。任何帮助都将受到高度赞赏!

为了完成,输出 Makevars.in(在rcppgsl中)是

ls -l | grep sbml

usr/local/include(在drwxrwxr-x 58 root admin 1856 Aug 1 2016 sbml 中)

ls -l | grep sbml

我的usr/local/lib文件 -

-rw-r--r--   1 root      wheel   7970584 Aug  2  2016 libsbml-static.a
-rwxr-xr-x   1 arcadmin  staff  10453624 Nov 25  2014 libsbml.5.11.0.dylib
-rwxr-xr-x   1 root      wheel   3813572 Aug  2  2016 libsbml.5.13.0.dylib
lrwxr-xr-x   1 root      wheel        20 Aug  1  2016 libsbml.5.dylib -> libsbml.5.13.0.dylib
-rw-r--r--   1 root      wheel  13907656 Feb 26  2015 libsbml.a
lrwxr-xr-x   1 arcadmin  staff        15 Mar 27  2015 libsbml.dylib -> libsbml.5.dylib
-rwxr-xr-x   1 root      wheel       828 Feb 26  2015 libsbml.la
-rwxrwxr-x   1 root      admin  13362732 Nov 25  2014 libsbmlj.jnilib

1 个答案:

答案 0 :(得分:2)

这是一个最小的设置:

删除src/Makevars并使用内容

创建src/Makevars.in
PKG_CPPFLAGS= @SBML_INCLUDE@
PKG_LIBS= $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) @SBML_LIBS@

我没有设置CXX,因为您无法在src/Makevars,c.f中更改它。 Package build ignores Makevars flags

创建一个最小configure.ac文件:

AC_INIT([Rcppsbml], 0.1.0)

AC_LANG(C++)
AC_REQUIRE_CPP
AC_PROG_CXX

# default values
AC_SUBST([SMBL_INCLUDE], "-I/usr/local/include")
AC_SUBST([SMBL_LIBS], "/usr/local/lib/libsbml-static.a")

# allow for override
AC_ARG_WITH([smbl],
            AC_HELP_STRING([--with-smbl=PREFIX],
                           [path to where smbl is installed]),
            [
             SMBL_INCLUDE="-I${with_smbl}/include"
             SMBL_LIBS="${with_smbl}/lib/libsbml-static.a"
            ],
            [])

# create and report output
AC_CONFIG_FILES([src/Makevars])
AC_OUTPUT
echo
echo "Final src/Makevars"
cat src/Makevars

致电autoconf以从configure模板创建configure.ac文件。您可能希望使用./configure./configure --with-smbl=/some/path检查脚本。

呼叫

R CMD build ...
R CMD check [--install-args=--configure-args=--with-smbl=/some/path] ...
R CMD INSTALL [--configure-args=--with-smbl=/some/path]...

构建,检查并安装包。

可能的扩展名:

  • 允许在静态和动态链接之间切换。
  • 检查是否可以在指定位置找到SMBL处于可用状态。

我在这里看到三个问题:

  • configure生成configure.ac 不是自动。您必须致电autoconf

  • 同样,系统不会生成Makevars.in。您必须将其作为Makevars生成configure的模板提供。

  • GSL附带gsl-config,其他图书馆使用普通pkg-config。如果您的库不支持此功能,您可以使用更传统的方式来使用默认位置或--with-...个参数提供的位置。例如,在RcppArrayFire I use中:

    AC_SUBST([AF_INCLUDE], "")
    AC_SUBST([AF_LIBS], "-laf")
    
    AS_IF([test -e "${with_arrayfire}"],
            [
             AF_INCLUDE="-I${with_arrayfire}/include ${AF_INCLUDE}"
             AF_LIBS="-L${with_arrayfire}/lib ${AF_LIBS} -Wl,-rpath,${with_arrayfire}/lib"
            ])
    

    如果目录以--with-arrayfire=/relevant/path的形式提供,则会搜索相应的子目录以查找标题和动态库。