为 r 包编写 `configure` 文件

SN2*_*248 8 autoconf r-package sbml

我正在编写一个 r 包,它为libSBMLC提供了一个包装器。

我使用该rcppgsl 作为参考,它查找头文件和 GNU 科学库的库文件的位置,GSL并使用该信息编写configure脚本MakevarsMakevars.in. 我目前不是为 Windows 构建。在我的机器(macOS)上,libsbml(SBML C 库)安装在通常的位置,即

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

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

CXX=clang++
PKG_CPPFLAGS= -I/usr/local/include
PKG_LIBS= $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) /usr/local/lib/libsbml-static.a
Run Code Online (Sandbox Code Playgroud)

但是,我想学习如何使用configure脚本来查找库并使用该信息来构建包。configure.acfrom的相关部分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
Run Code Online (Sandbox Code Playgroud)

我在相关地方替换GSL_CONFIGLIB_SBML,即configure.ac我使用的整个文件粘贴在下面(在最后)。

不过,我没有看到configureMakevarsMakevars.in正在生成(我看到rcppgsl)。任何帮助在这里将不胜感激!

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

drwxrwxr-x   58 root      admin    1856 Aug  1  2016 sbml
Run Code Online (Sandbox Code Playgroud)

ls -l | grep sbml(in 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
Run Code Online (Sandbox Code Playgroud)

我的configure.ac档案——

## 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)
Run Code Online (Sandbox Code Playgroud)

Ral*_*ner 8

这是一个最小的设置:

删除src/Makevars和创建src/Makevars.in内容

PKG_CPPFLAGS= @SBML_INCLUDE@
PKG_LIBS= $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) @SBML_LIBS@
Run Code Online (Sandbox Code Playgroud)

我没有设置,CXX因为你不能在src/Makevars,cf Package build ignore 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
Run Code Online (Sandbox Code Playgroud)

调用autoconfconfigure从您的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]...
Run Code Online (Sandbox Code Playgroud)

构建、检查和安装包。

可能的扩展:

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

我在这里看到三个问题:

  • 的产生configureconfigure.ac不是自动的。你必须打电话autoconf

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

  • GSL 随附gsl-config,其他库使用一般的pkg-config. 如果您的库不支持此功能,您可以使用更传统的方式来使用默认位置或提供--with-...参数的位置。例如在RcppArrayFire 我使用

    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"
            ])
    
    Run Code Online (Sandbox Code Playgroud)

    如果目录作为 提供--with-arrayfire=/relevant/path,则在适当的子目录中搜索头文件和动态库。

  • 只是想补充一点,对于软件包开发人员来说,有一个关于“autoconf”和“configure”的非常有用的教程,位于 https://unconj.ca/blog/an-autoconf-primer-for-r-package-authors.html (2认同)