autotools
을 사용하는 경로, 특히 autoconf
을 사용하려면 다음 코드를 작성하면됩니다.
dnl -*- Autoconf -*-
dnl Process this file with autoconf to produce a configure script.
dnl
AC_PREREQ(2.61)
AC_INIT([test], [0.0.1], [[email protected]])
# Define our M4 macro directory
AC_CONFIG_MACRO_DIR([m4])
# Put our generated config header in the source directory
AC_CONFIG_HEADERS([src/config.h])
# Make sure we have a fortran compiler
AC_PROG_FC([ifort xlf pgfortran gfortran])
AC_LANG([Fortran])
AC_FC_FREEFORM
# Check for newunit option to open()
AX_F08_NEWUNIT
AC_OUTPUT
m4/
하위 디렉토리에있는 ax_f08_newunit.m4
매크로를 만듭니다
는 configure.ac
가 만듭니다. 내가 지정한 곳이기 때문에 매크로가 configure.ac
에 있습니다
AC_DEFUN([AX_F08_NEWUNIT], [
AC_REQUIRE([AC_PROG_FC])
AC_LANG_PUSH([Fortran])
AC_MSG_CHECKING([for NEWUNIT support])
AC_COMPILE_IFELSE([
program conftest
integer :: i
open(newunit=i,file='test')
end program conftest],
[ax_f08_newunit=yes], [ax_f08_newunit=no])
AC_LANG_POP([Fortran])
if test "x$ax_f08_newunit" = "xyes"; then
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_NEWUNIT], [1], [NEWUNIT support])
else
AC_MSG_RESULT([no])
fi
])
그런 다음 모든 일반적인 autotools
루틴을 따르
checking for Fortran compiler default output file name... a.out
checking whether the Fortran compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU Fortran compiler... no
checking whether ifort accepts -g... yes
checking for Fortran flag needed to allow free-form source... -FR
checking for NEWUNIT support... yes
configure: creating ./config.status
config.status: creating src/config.h
: 다음
aclocal -I m4
autoheader
autoconf
당신이 ./configure
를 실행할 수 있습니다, 이것은 내 출력
마지막으로 src/config.h
파일에는 다음을 가져야합니다.
/* src/config.h. Generated from config.h.in by configure. */
/* src/config.h.in. Generated from configure.ac by autoheader. */
/* NEWUNIT support */
#define HAVE_NEWUNIT 1
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "[email protected]"
/* Define to the full name of this package. */
#define PACKAGE_NAME "test"
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "test 0.0.1"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "test"
/* Define to the version of this package. */
#define PACKAGE_VERSION "0.0.1"
물론 소스 코드는 전처리기를 통해 실행되어야합니다. 예를 src/test.F90
를 들어
program test
#include "config.h"
integer :: i
#ifdef HAVE_NEWUNIT
open(newunit=i,file='data')
#else
i = 7
open(unit=i,file='data')
#endif
end program test
자본 F는 파일을 사전 처리해야 의미 이해 ifort
테스트 프로그램을 컴파일.
그런 것은 표준화되어 있지 않습니다. –
C 컴파일러에 액세스 할 수있는 경우이를 사용하여 매크로 (gcc -E)를 사전 처리 한 다음 포트란 컴파일러를 사용하여 출력을 컴파일 할 수 있습니다. – cup
Fortran 전 처리기가 표준화되지 않았기 때문에 가장 간단한 매크로 만 대부분의 컴파일러에서 작동 할 수 있습니다. 이것은 단순한'# ifdef'를위한 것입니다. 그러나 예를 들어 인텔의 fpp는 연속 문자로 '&'를 인식하는 반면 gcc의 전 처리기는 Fortran을 인식하지 못하기 때문에 그렇지 않습니다. –