为 r 包编写 `configure` 文件
Writing `configure` file for an r package
我正在编写一个 r 包,它提供了一个围绕 libSBML
C library.
的包装器
我正在使用 rcppgsl
package 作为参考,它寻找 GNU Scientific Library GSL
的头文件和库文件的位置,并使用该信息编写configure
脚本以及 Makevars
和 Makevars.in
。我目前不为 Windows 构建。在我的机器 (macOS) 上,libsbml
(SBML C 库)安装在通常的位置,即
头文件位于 - /usr/local/include/sbml
和库文件位于 - /usr/local/lib
。实际上,如果在我的包 Makevars
文件中使用以下内容,我可以构建我的 package.
CXX=clang++
PKG_CPPFLAGS= -I/usr/local/include
PKG_LIBS= $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) /usr/local/lib/libsbml-static.a
但是,我想了解如何使用 configure
脚本查找库并使用该信息构建包。来自 rcppgsl
的 configure.ac
的相关部分是
## 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
替换了GSL_CONFIG
,即我正在使用的整个configure.ac
文件粘贴在下面(最后)。
但是,我没有看到生成 configure
、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
我的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)
这是一个最小的设置:
删除 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.ac
模板创建一个 configure
文件。您可能需要使用 ./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.ac
生成 configure
是 不是自动的 。你必须打电话给 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
,则会在相应的子目录中搜索 headers 和动态库。
我正在编写一个 r 包,它提供了一个围绕 libSBML
C library.
我正在使用 rcppgsl
package 作为参考,它寻找 GNU Scientific Library GSL
的头文件和库文件的位置,并使用该信息编写configure
脚本以及 Makevars
和 Makevars.in
。我目前不为 Windows 构建。在我的机器 (macOS) 上,libsbml
(SBML C 库)安装在通常的位置,即
头文件位于 - /usr/local/include/sbml
和库文件位于 - /usr/local/lib
。实际上,如果在我的包 Makevars
文件中使用以下内容,我可以构建我的 package.
CXX=clang++
PKG_CPPFLAGS= -I/usr/local/include
PKG_LIBS= $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) /usr/local/lib/libsbml-static.a
但是,我想了解如何使用 configure
脚本查找库并使用该信息构建包。来自 rcppgsl
的 configure.ac
的相关部分是
## 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
替换了GSL_CONFIG
,即我正在使用的整个configure.ac
文件粘贴在下面(最后)。
但是,我没有看到生成 configure
、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
我的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)
这是一个最小的设置:
删除 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.ac
模板创建一个 configure
文件。您可能需要使用 ./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.ac
生成configure
是 不是自动的 。你必须打电话给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
,则会在相应的子目录中搜索 headers 和动态库。