Написание файла `configure` для r пакета - PullRequest
0 голосов
/ 26 мая 2018

Я пишу пакет r, который предоставляет оболочку для библиотеки libSBML C .

Я использую пакет rcppgsl в качестве справочного материала, который ищет расположение заголовочных файлов и файлов библиотеки для научной библиотеки GNU GSL и использует эту информацию для написания сценария configure и Makevars и Makevars.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

Однако я хочу научиться использовать скрипт configureнайти библиотеку и использовать эту информацию для сборки пакета.Соответствующая часть 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_SBML в соответствующих местах, т. Е. Весь файл configure.ac, который я использую, вставлен ниже (вконец).

Однако я не вижу генерируемых configure, Makevars и Makevars.in (что я вижу в rcppgsl).Любая помощь здесь будет принята с благодарностью!

Ради завершения вывод ls -l | grep sbmlusr/local/include) будет

drwxrwxr-x   58 root      admin    1856 Aug  1  2016 sbml

и ls -l | grep sbml (в * 1049)*)

-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)

1 Ответ

0 голосов
/ 27 мая 2018

Здесь минимальная настройка:

Удалить src/Makevars и создать src/Makevars.in с контентом

PKG_CPPFLAGS= @SBML_INCLUDE@
PKG_LIBS= $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) @SBML_LIBS@

Я не устанавливаю CXX, поскольку вы не можете изменить это в src/Makevars, cf Сборка пакета игнорирует флаги Makevars .

Создайте минимальный 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 я использую :

    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, то в соответствующих подкаталогах ищутся заголовки и динамические библиотеки.

...