首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为r包编写“配置”文件

为r包编写“配置”文件
EN

Stack Overflow用户
提问于 2018-05-26 04:18:10
回答 1查看 1.3K关注 0票数 9

我正在编写一个r包,它为libSBML C 图书馆提供了一个包装器。

我使用rcppgsl 套餐作为引用,它查找GNU科学图书馆GSL的头文件和库文件的位置,并使用这些信息编写configure脚本以及MakevarsMakevars.in。我目前并不是在为Windows构建。在我的机器(macOS)上,libsbml (SBML库)安装在通常的位置,即

头文件位于- /usr/local/include/sbml

以及- /usr/local/lib的库文件。实际上,如果在包Makevars文件中使用以下内容,则可以构建套餐

代码语言:javascript
复制
CXX=clang++
PKG_CPPFLAGS= -I/usr/local/include
PKG_LIBS= $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) /usr/local/lib/libsbml-static.a

但是,我想了解如何使用configure脚本查找库并使用这些信息构建包。configure.ac的相关部分来自rcppgsl

代码语言:javascript
复制
## 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

我在相关位置用LIB_SBML替换了LIB_SBML,即我正在使用的整个configure.ac文件粘贴在下面(最后)。

但是,我没有看到生成configureMakevarsMakevars.in (我在rcppgsl中看到了这一点)。这里的任何帮助都是非常感谢的!

为了完成,ls -l | grep sbml的输出(在usr/local/include中)是

代码语言:javascript
复制
drwxrwxr-x   58 root      admin    1856 Aug  1  2016 sbml

ls -l | grep sbml (在usr/local/lib中)是

代码语言:javascript
复制
-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

我的configure.ac文件--

代码语言:javascript
复制
## Process this file with autoconf to produce a configure script.
##
## Configure.ac for RcppSBML
##
## Copyright (C) 2010         Romain Francois and Dirk Eddelbuettel
## Copyright (C) 2014 - 2015  Dirk Eddelbuettel
##
## Licensed under GNU GPL 2 or later

# The version set here will propagate to other files from here
AC_INIT([Rcppsbml], 0.1.0)

# Checks for common programs using default macros
AC_PROG_CC

## Use gsl-config to find arguments for compiler and linker flags
##
## Check for non-standard programs: gsl-config(1)
AC_PATH_PROG([LIB_SBML], [libsbml])
## If gsl-config was found, let's use it
if test "${LIB_SBML}" != ""; then
    # Use gsl-config for header and linker arguments
    SBML_CFLAGS=`${LIB_SBML} --cflags`
    SBML_LIBS=`${LIB_SBML} --libs`
else
    AC_MSG_ERROR([libsbml not found, is SBML installed?])
fi

# Now substitute these variables in src/Makevars.in to create src/Makevars
AC_SUBST(LIB_SBML)
AC_SUBST(LIB_SBML)

AC_OUTPUT(src/Makevars)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-27 20:03:17

这里是一个最小的设置:

删除src/Makevars并创建包含内容的src/Makevars.in

代码语言:javascript
复制
PKG_CPPFLAGS= @SBML_INCLUDE@
PKG_LIBS= $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) @SBML_LIBS@

我不设置CXX,因为您不能在src/Makevars,c.f中更改它。包生成忽略Makevars标志

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

代码语言:javascript
复制
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.ac模板创建一个configure文件。您可能需要使用./configure./configure --with-smbl=/some/path检查脚本。

打电话

代码语言:javascript
复制
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中: AC_SUBST(AF_INCLUDE,"") AC_SUBST(AF_LIBS,"-laf") AS_IF(测试-e "${with_arrayfire}",AF_INCLUDE="-I${with_arrayfire}/include ${AF_INCLUDE}“AF_LIBS="-L${with_arrayfire}/lib ${/lib}/lib,,${en19 20#}”) 如果以--with-arrayfire=/relevant/path的形式提供目录,则搜索适当的子目录以查找标头和动态库。
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50539270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档