Fortran: Жесткий код некоторого кода в зависимости от переменной среды - PullRequest
2 голосов
/ 13 апреля 2011

Привет, если env var "XYZ" установлен во время компиляции, я хочу, чтобы часть:

write (STDOUT,*) "Compiled with XYZ"
here one more function call bla()

была скомпилирована в двоичный файл.Если нет, то нет.Есть ли способ сделать это?Большое спасибо!

Ответы [ 3 ]

7 голосов
/ 13 апреля 2011

Вы не можете проверять переменные окружения во время компиляции, но вы можете передавать опции в предварительную обработку, называемую компилятором. Это не сильно документировано, но работает по крайней мере с gfortran и intel ifort. В строке компиляции используйте, или нет, «-DMYOPTION» (или любое другое имя параметра, которое вы выберете). Тогда в коде:

#ifdef MYOPTION
Fortran source code
#else
Fortran source code
#endif

Очевидно, что строки препроцессора должны начинаться с первого столбца.

Если вы используете тип файла "F90", препроцессор будет автоматически вызываться, в противном случае вы можете использовать опцию компилятора для вызова этого шага.

Может быть, это будет отвечать вашим потребностям? Если нет, то вы можете использовать командный сценарий для проверки переменной среды и использовать различные команды компиляции в зависимости от ее значения, чтобы метод препроцессора отвечал на переменную среды.

Конечно, вы можете проверять переменные среды во время выполнения с помощью встроенной get_environment_variable .. просто используя операторы if для ответа на значение, может быть проще.

1 голос
/ 13 апреля 2011

Как часть стандарта Fortran 2008, существуют встроенные функции для поиска параметров компилятора и версии, с которой он был скомпилирован. опции компилятора и версия компилятора . Компиляторы Fortran постепенно приходят в соответствие с новым стандартом; У gfortran он есть, он не похож на ifort 12:

program compilerinfo
    use iso_fortran_env
    implicit none

    print *,'This program was compiled with ', compiler_version()
    print *,'with flags ', compiler_options()
end program compilerinfo

и работает дает

$ ./compilerinfo
 This program was compiled with GCC version 4.6.0
 with flags -mtune=generic -march=x86-64
0 голосов
/ 13 апреля 2011

Нет Такая возможность есть только в новейших компиляторах Фортрана.

Ближайшим механизмом было бы написание программы, которая получает переменную окружения и записывает подпрограмму Fortran, содержащую необходимую информацию. Добавить в проект build:

  1. Запуск программы для захвата переменной среды и записи подпрограммы
  2. Скомпилировать подпрограмму
  3. Свяжите объект с остальной частью проекта.

Отредактировано с учетом компиляторов Fortran 2008+

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...