Fortran: жестко закодируйте некоторый код в зависимости от переменной среды

#binary #fortran #environment #hardcode

#двоичный #fortran #Окружающая среда #жестко запрограммируйте

Вопрос:

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

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

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

Ответ №1:

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

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

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

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

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

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

Комментарии:

1. Хорошо, спасибо, это было то, что я искал 🙂 Просто небольшое дополнение: флаг «-fpp» также необходим (в mpif90) для передачи флагов препроцессора через «-Dvarname» в обычных файлах .f 🙂

Ответ №2:

Как часть стандарта 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
  

Комментарии:

1. Однако это не переменные среды.

2. Спасибо за сообщение, но сообщение из MSB прекрасно справилось с задачей 🙂

3. Нет, и MSB работает гораздо более широко; один из кодов, над которыми я работал, использовал это (опять же, для информации о компиляторе). Но если вы действительно хотите «скомпилировать с» информацией, это сработает (скоро …)

Ответ №3:

Нет, только самые новые компиляторы Fortran предоставляют такую функцию.

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

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

Отредактировано для отражения компиляторов Fortran 2008

Комментарии:

1. На самом деле, все компиляторы fortran2008 поставляются именно с опцией «compiled-with»…

2. @Jonathan: Сколько компиляторов fortran 2008 вы знаете? 😉

3. @eriktous: по общему признанию, недостаточно. Но большинство из них реализуют некоторое растущее подмножество….