Autoconf 매크로
autoconf
를 사용하는 응용 프로그램들은 표준 매크로 AC_CHECK_LIB
를 사용해
configure
스크립트에서 GSL를 자동으로 링크할 수 있습니다. 라이브러리는 CBLAS와
수학 라이브러리들에 대해서도 자체적으로 의존하고 있기 때문에 의존 라이브러리들을 libgsl
을
링크하기 전에 가져오도록 해야합니다. 이를 수행할 수 있는 명령어는 다음과 같습니다.
명령어들은 configure.ac
파일에 작성되어야합니다.
AC_CHECK_LIB([m],[cos])
AC_CHECK_LIB([gslcblas],[cblas_dgemm])
AC_CHECK_LIB([gsl],[gsl_blas_dgemm])
libm
와 libgslcblas
를 libgsl
이전에 배치시켜야 함을 기억해야합니다.
다른 순서로 배열하면 작동하지 않을 것입니다. 구성(configure) 단계에서 라이브러리를 찾을 수 있다면
다음과 같은 출력을 내보냅니다.
checking for cos in -lm... yes
checking for cblas_dgemm in -lgslcblas... yes
checking for gsl_blas_dgemm in -lgsl... yes
라이브러리를 찾을 수 있다면 검증 프로그램이
매크로 HAVE_LIBGSL
, HAVE_LIBGSLCBLAS
, HAVE_LIBM
를 정의하고
변수 LIBS
에 -lgsl -lgslcblas -lm
옵션들을 추가합니다.
위의 검증 과정은 어느 버전의 라이브러리에서도 사용 가능합니다.
이 과정은 보편적으로 사용할 수 있고, 함수의 버전은 중요하지 않습니다.
파일 내에는 대체 매크로 gsl.m4
가 있어 특정 라이브러리의 버전을 검사할 수도 있습니다.
이 매크로를 사용하기 위해서는 위의 검증 과정을 기술하는 명령어들 대신
다음의 명령어들을 configure.in
에 추가하면 됩니다.
AX_PATH_GSL(GSL_VERSION,
[action-if-found],
[action-if-not-found])
GSL_VERSION
인자는 major.minor
나 major.minor.micro
형식의
2-3 자리 정수 값을 가져야 합니다. 이는 필요한 라이브러리 베포판의 버전 숫자를 가르킵니다.
action-if-not-found
에 대해 일반적으로 많이 쓰이는 설정은
AC_MSG_ERROR(could not find required version of GSL)
Makefile.am
파일에 변수 GSL_LIBS
와 GSL_CFLAGS
를 추가해
제대로 된 컴파일러 옵션들을 얻을 수 있습니다. GSL_LIBS
는 gsl-config --libs
를
만들고, GSL_CFLAGS
는 gsl-config --cflags
를 만들어줍니다.
예를 들어서
libfoo_la_LDFLAGS = -lfoo $(GSL_LIBS) -lgslcblas
참고
매크로 AX_PATH_GSL
는 C 컴파일러를 필요로 함을 유의해야 합니다.
따라서 이 매크로는 configure.in
파일 내에
매크로 AC_LANG_CPLUSPLUS
전에 기술되어야 합니다.
이 매크로는 C++로 쓰인 프로그램에 쓰입니다.
inline
기능을 검사하기 위해서는 다음의 명령어들을 configure.in
에
작성하고,
AC_C_INLINE
if test "$ac_cv_c_inline" != no ; then
AC_DEFINE(HAVE_INLINE,1)
AC_SUBST(HAVE_INLINE)
fi
이러면 매크로가 컴파일 옵션에 정의됩니다 아니면 다른 라이브러리 헤더들
보다 config.h
를 먼저 포함하는 형식으로 검사할 수도 있습니다.
다음 autoconf
검증 명령어들은 extern inline
를 검사합니다.
dnl Check for "extern inline", using a modified version
dnl of the test for AC_C_INLINE from acspecific.mt
dnl
AC_CACHE_CHECK([for extern inline], ac_cv_c_extern_inline,
[ac_cv_c_extern_inline=no
AC_TRY_COMPILE([extern $ac_cv_c_inline double foo(double x);
extern $ac_cv_c_inline double foo(double x) { return x+1.0; };
double foo (double x) { return x + 1.0; };],
[ foo(1.0) ],
[ac_cv_c_extern_inline="yes"])
])
if test "$ac_cv_c_extern_inline" != no ; then
AC_DEFINE(HAVE_INLINE,1)
AC_SUBST(HAVE_INLINE)
fi
autoconf
를 사용하면 대체 함수들을 자동으로 적용 되도록 할 수 있습니다.
예를 들어, BSD 함수 hypot
이 사용가능한지 아닌지 확인하기 위해서
작성하는 응용프로그램의 설정파일 configure.in
에 다음 명령어를 넣을 수 있습니다.
AC_CHECK_FUNCS(hypot)
그리고 파일 config.h.in
에 다음 매크로를 정의해 줍시다.
/* Substitute gsl_hypot for missing system hypot */
#ifndef HAVE_HYPOT
#define hypot gsl_hypot
#endif
이 과정을 거치면 응용 프로그램 소스 파일들에서 #include <config.h>
를 사용해
:fun`hypot` 를 사용할 수 없는 상황에서 :fun`gsl_hypot` 로 :fun`hypot` 를 대체할 수 있습니다.