Как использовать AC_CONFIG_SUBDIR для упаковки библиотек C и Fortran вместе, где C зависит от библиотеки Fortran? - PullRequest
0 голосов
/ 24 октября 2018

У меня есть библиотека C, GPTL, которая построена с помощью libtool.(https://github.com/jmrosinski/GPTL)

У меня есть библиотека-обертка на языке Fortran, GPTL-fortran, которая вызывает библиотеку C. (https://github.com/NOAA-GSD/GPTL-fortran)

У меня есть третье репозиторий github, GPTL-all. (https://github.com/NOAA-GSD/GPTL-all). Я хотел бы использовать AC_CONFIG_SUBDIR, чтобы GPTL-all собирал библиотеки C и Fortran.

Проблема заключается в том, что библиотека Fortran зависит от библиотеки C. При сборке отдельно Cсначала создается и устанавливается библиотека, затем создается библиотека Fortran с CPPFLAGS и LDFLAGS, которые указывают на местоположение установленной библиотеки C.

Есть ли способ добиться этого с помощью комбинированного пакета, устанавливающего Cи библиотеки Fortran?

Вот что у меня пока есть:

# This is the autoconf file for GPTL-all, a combined C and Fortran
# library distribution.

AC_PREREQ([2.69])
AC_INIT([GPTL-all], [1.0.0], [edward.ha@noaa.gov])

# Find out about the host we're building on.
AC_CANONICAL_HOST

# Find out about the target we're building for.
AC_CANONICAL_TARGET

# Initialize automake.
AM_INIT_AUTOMAKE([foreign subdir-objects])

# Keep macros in an m4 directory.
AC_CONFIG_MACRO_DIR([m4])

# Set up libtool.
LT_PREREQ([2.4])
LT_INIT()

AC_CONFIG_FILES([Makefile])

AC_CONFIG_SUBDIRS([GPTL
                   GPTL-fortran])
AC_OUTPUT

Но это не удается. Когда я запускаю configure, он запускает настройку библиотеки C просто отлично. Но конфигурация библиотеки fortran не удаетсяпотому что он проверяет наличие библиотеки C:

checking for GPTLinitialize in -lgptl... no
configure: error: Can't find or link to the GPTL C library.
configure: error: ./configure failed for GPTL-fortran

Как заставить GPTL-fortran зависеть от GPTL?

1 Ответ

0 голосов
/ 30 ноября 2018

Я сделал это, добавив новый параметр в сборку библиотеки Fortran:

# When built as part of the combined C/Fortran library distribution,
# the fortran library needs to be built with
# --enable-package-build. This tells the fortran library where to find
# the C library.
AC_ARG_ENABLE([package-build],
  [AS_HELP_STRING([--enable-package-build],
    [Set internally for package builds, should not be used by user.])])
test "x$enable_package_build" = xyes || enable_package_build=no
AM_CONDITIONAL([BUILD_PACKAGE], [test "x$enable_package_build" = xyes])

# Find the GPTL C library, unless this is a combined C/Fortran library
# build.
if test $enable_package_build = no; then
   AC_CHECK_LIB([gptl], [GPTLinitialize], [],
                        [AC_MSG_ERROR([Can't find or link to the GPTL C library.])])
fi

При запуске этой конфигурации из конфигурации объединенной библиотеки я добавляю эту дополнительную опцию:

# Add this arg for the fortran build, to tell it to use the C library
# we just built.
ac_configure_args="$ac_configure_args --enable-package-build"

# Build the GPTL Fortran library.
AC_CONFIG_SUBDIRS([GPTL-fortran])

И в тестовом каталоге GPTL-fortran Makefile.am я добавил следующее:

# For combined C/Fortran builds, find the C library.
if BUILD_PACKAGE
LDADD = ${top_builddir}/../GPTL/src/libgptl.la
endif

Поэтому, когда происходит сборка пакета, он ищет в ../GPTL/src библиотеку GPTL и дляне-пакетные сборки, библиотека GPTL C находится в configure.ac.

...