#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, содержащую необходимую информацию. Добавить в сборку проекта:
- Запуск программы для захвата переменной среды и записи подпрограммы
- Скомпилируйте подпрограмму
- Свяжите объект с остальной частью проекта.
Отредактировано для отражения компиляторов Fortran 2008
Комментарии:
1. На самом деле, все компиляторы fortran2008 поставляются именно с опцией «compiled-with»…
2. @Jonathan: Сколько компиляторов fortran 2008 вы знаете? 😉
3. @eriktous: по общему признанию, недостаточно. Но большинство из них реализуют некоторое растущее подмножество….