7.11. Параметры, относящиеся к конкретной фазе
7.11.1. Замена программы для одной или нескольких фаз
-
-pgmL ⟨cmd⟩ -
Использовать ⟨cmd⟩ как обработчик предварительной обработки.
-
-pgmP ⟨cmd⟩ -
Использовать ⟨cmd⟩ как препроцессор C (только с
-cpp).
-
-pgmc ⟨cmd⟩ -
Использовать ⟨cmd⟩ как компилятор C.
-
-pgmlo ⟨cmd⟩ -
Использовать ⟨cmd⟩ как оптимизатор LLVM.
-
-pgmlc ⟨cmd⟩ -
Использовать ⟨cmd⟩ как компилятор LLVM.
-
-pgms ⟨cmd⟩ -
Использовать ⟨cmd⟩ как разделитель.
-
-pgma ⟨cmd⟩ -
Использовать ⟨cmd⟩ как ассемблер.
-
-pgml ⟨cmd⟩ -
Использовать ⟨cmd⟩ как компоновщик.
-
-pgmlm ⟨cmd⟩ -
Использовать ⟨cmd⟩ как компоновщик при слиянии объектных файлов (например, при генерации объединённых объектов для загрузки в GHCi).
-
-pgmdll ⟨cmd⟩ -
Использовать ⟨cmd⟩ как генератор DLL.
-
-pgmF ⟨cmd⟩ -
Использовать ⟨cmd⟩ как препроцессор (только с
-F).
-
-pgmwindres ⟨cmd⟩ -
Использовать ⟨cmd⟩ для встраивания манифестов в Windows. Обычно это программа
windres, поставляемая с установкой GHC. См.-fno-embed-manifestв Параметры, влияющие на компоновку.
-
-pgmlibtool ⟨cmd⟩ -
Использовать ⟨cmd⟩ как команду libtool (только при использовании
-staticlib).
-
-pgmi ⟨cmd⟩ -
Использовать ⟨cmd⟩ как внешнюю команду интерпретатора (см. Запуск интерпретатора в отдельном процессе). По умолчанию:
ghc-iserv-profесли включен-prof,ghc-iserv-dynесли включен-dynamicилиghc-iservв противном случае.
7.11.2. Принудительное применение параметров к конкретной фазе
Параметры можно принудительно передать конкретной фазе компиляции, используя следующие флаги:
-
-optL ⟨option⟩ -
Передать ⟨option⟩ обработчику предварительной обработки.
-
-optP ⟨option⟩ -
Передать ⟨option⟩ в CPP (имеет смысл только если
-cppтакже включен).
-
-optF ⟨option⟩ -
Передать ⟨option⟩ пользовательскому препроцессору (см. Параметры, влияющие на препроцессор Haskell).
-
-optc ⟨option⟩ -
Передать ⟨option⟩ компилятору C.
-
-optcxx ⟨option⟩ -
Передать ⟨option⟩ компилятору C++.
-
-optlo ⟨option⟩ -
Передать ⟨option⟩ оптимизатору LLVM.
-
-optlc ⟨option⟩ -
Передать ⟨option⟩ компилятору LLVM.
-
-opta ⟨option⟩ -
Передать ⟨option⟩ ассемблеру.
-
-optl ⟨option⟩ -
Передать ⟨option⟩ компоновщику.
-
-optlm ⟨option⟩ -
Передать ⟨option⟩ компоновщику при слиянии объектных файлов. В случае стандартного компоновщика в стиле
ldэтот параметр, как правило, должен включать флаг-r.
-
-optdll ⟨option⟩ -
Передать ⟨option⟩ генератору DLL.
-
-optwindres ⟨option⟩ -
Передать ⟨option⟩ в
windresпри встраивании манифестов в Windows. См.-fno-embed-manifestв Параметры, влияющие на компоновку.
-
-opti ⟨option⟩ -
Передать ⟨option⟩ дочернему процессу интерпретатора (см. Запуск интерпретатора в отдельном процессе). Частое использование — передача параметров RTS, например,
-opti+RTS -opti-A64m, или включение подробности-opti-v, чтобы увидеть сообщения, обменивающиеся между GHC и интерпретатором.
Например, чтобы принудительно передать параметр -Ewurble ассемблеру, сообщите драйверу -opta-Ewurble (дефис перед E обязателен).
GHC — это сама программа Haskell, поэтому если нужно передать параметры непосредственно в систему выполнения GHC, можно заключить их в +RTS ... -RTS (см. Запуск скомпилированной программы).
7.11.3. Параметры, влияющие на препроцессор C
-
CPP -
- Since
-
6.8.1
Языковая расширение
CPPвключает препроцессор C. Это можно преобразовать в командную строку, добавив перед ней-X; Например:$ ghc -XCPP foo.hs
Языковое расширение
CPPтакже можно включить с помощью директивы LANGUAGE; Например:{-# LANGUAGE CPP #-}
-
-cpp -
Препроцессор C cpp выполняется над вашим кодом Haskell, если задан параметр
-cppили расширение-XCPP. Если вы не строите большую систему с существенными дозами условной компиляции, вам это не нужно.
-
-D⟨symbol⟩[=⟨value⟩] -
Определяет макрос ⟨symbol⟩ стандартным образом. Если значение не указано, оно принимается как
1. Например,-DUSE_MYLIBэквивалентно-DUSE_MYLIB=1.Примечание
-D⟨symbol⟩[=⟨value⟩]не влияет на-Dмакросы, передаваемые компилятору C при компиляции неописанного сборки! В этом случае используйте обходной путь-optc-Dfoo… (см. Принудительное применение параметров к конкретной фазе).
-
-U⟨symbol⟩ -
Отменяет определение макроса ⟨symbol⟩ стандартным образом.
-
-I⟨dir⟩ -
Указывает директорию, в которой искать
#includeфайлы, как и в C.
Драйвер GHC определяет несколько макросов при обработке исходного кода Haskell (.hs или .lhs файлы).
7.11.3.1. Стандартные макросы CPP
Ниже приведены символы, определенные GHC. Для проверки, какие символы определены вашей локальной установкой GHC, полезен следующий трюк:
$ ghc -E -optP-dM -cpp foo.hs $ cat foo.hspp
(вам нужен файл foo.hs, но он фактически не используется).
-
__GLASGOW_HASKELL__ -
Для версии
x.y.zGHC, значение__GLASGOW_HASKELL__— целое число ⟨xyy⟩ (если ⟨y⟩ — однозначное число, добавляется ведущий ноль; например, для версии 6.2 GHC,__GLASGOW_HASKELL__==602). Дополнительная информация в Политика нумерации версий GHC.Надеюсь,
__GLASGOW_HASKELL__будет не определено во всех остальных реализациях, поддерживающих предобработку в стиле C.Примечание
Сопоставимые символы для других систем:
__HUGS__для Hugs,__NHC__для nhc98 и__HBC__для hbc.Примечание. Этот макрос устанавливается при предобработке как исходного кода Haskell, так и исходного кода C, включая код C, сгенерированный из модуля Haskell (т.е.
.hs,.lhs,.cи.hcфайлы). -
__GLASGOW_HASKELL_PATCHLEVEL1__; __GLASGOW_HASKELL_PATCHLEVEL2__ -
Эти макросы доступны начиная с GHC 7.10.1.
Для трёхчастных номеров версий GHC
x.y.z, значение__GLASGOW_HASKELL_PATCHLEVEL1__— целое число ⟨z⟩.Для четырёхчастных номеров версий GHC
x.y.z.z', значение__GLASGOW_HASKELL_PATCHLEVEL1__— целое число ⟨z⟩, а значение__GLASGOW_HASKELL_PATCHLEVEL2__устанавливается в целое число ⟨z’⟩.Эти макросы предоставляются для достижения большей точности, чем у
__GLASGOW_HASKELL__. Как правило, это не требуется, так как большинство API, как ожидается, остаются стабильными между выпусками с исправлениями, но иногда для исправления ошибок необходимы внутренние изменения API. Условные компиляции на уровне исправления могут быть полезны для обхода ошибок в более старых версиях.Подсказка
Эти макросы устанавливаются при предобработке как исходного кода Haskell, так и исходного кода C, включая код C, сгенерированный из модуля Haskell (т.е.
.hs,.lhs,.cи.hcфайлы). -
MIN_VERSION_GLASGOW_HASKELL(x,y,z,z') -
Этот макрос доступен начиная с GHC 7.10.1.
Этот макрос предоставляется для удобства написания условных компиляций, проверяющих, используемая версия GHC — версия
x.y.z.z'или более поздняя.Если требуется совместимость с компиляторами Haskell (включая GHC до версии 7.10.1), которые не определяют
MIN_VERSION_GLASGOW_HASKELL, необходимо убедиться в наличии макросаMIN_VERSION_GLASGOW_HASKELLперед его вызовом, например:#if defined(MIN_VERSION_GLASGOW_HASKELL) #if MIN_VERSION_GLASGOW_HASKELL(7,10,2,0) /* code that applies only to GHC 7.10.2 or later */ #endif #endif
Подсказка
Этот макрос устанавливается при предобработке как исходного кода Haskell, так и исходного кода C, включая код C, сгенерированный из модуля Haskell (т.е.
.hs,.lhs,.cи.hcфайлы). -
__GLASGOW_HASKELL_TH__ -
Устанавливается в
1, если компилятор поддерживает Template Haskell, и в0, если нет. Последний случай — для компилятора стадии 1 во время загрузки или на архитектурах, где интерпретатор недоступен. -
__GLASGOW_HASKELL_LLVM__ -
Определяется только при указании
-fllvm. Когда GHC использует версиюx.y.zLLVM, значение__GLASGOW_HASKELL_LLVM__— целое число ⟨xyy⟩ (если ⟨y⟩ — однозначное число, добавляется ведущий ноль; например, при использовании версии 3.7 LLVM,__GLASGOW_HASKELL_LLVM__==307). -
__PARALLEL_HASKELL__ -
Определяется только при использовании
-parallel! Этот символ определён при предобработке Haskell (входной файл) и предобработке C (выходной файл GHC). -
os_HOST_OS=1 -
Этот define позволяет условную компиляцию на основе операционной системы, где ⟨os⟩ — имя текущей операционной системы (например,
linux,mingw32для Windows,solaris, и т.д.). -
arch_HOST_ARCH=1 -
Этот define позволяет условную компиляцию на основе архитектуры хоста, где ⟨arch⟩ — имя текущей архитектуры (например,
i386,x86_64,powerpc,sparc, и т.д.). -
VERSION_pkgname -
Этот макрос доступен начиная с GHC 8.0. Определяется для каждого экспонируемого пакета. Этот макрос расширяется до строки, записывающей версию
pkgname, которая экспонируется для импорта модуля. Его поведение идентично макросамVERSION_pkgnameопределённых Cabal. -
MIN_VERSION_pkgname(x,y,z) -
Этот макрос доступен начиная с GHC 8.0. Определяется для каждого экспонируемого пакета. Этот макрос предоставляется для удобства написания условных компиляций, проверяющих, что версия пакета —
x.y.zили более поздняя. Его поведение идентично макросамMIN_VERSION_pkgnameопределённых Cabal.
7.11.3.2. CPP и разрывы строк
Небольшое предупреждение: -cpp не дружелюбен к «разрывам строк». Другими словами, такие строки:
strmod = "\ \ p \ \ "
не работают с -cpp; /usr/bin/cpp опускает пары обратная косая черта-новая строка.
Однако, похоже, что если вы добавите пробел в конце строки, то cpp (по крайней мере, GNU cpp и, возможно, другие cpps) оставляет пары обратная косая черта-пробел в покое, и разрыв строки работает как ожидается.
7.11.4. Параметры, влияющие на предобработчик Haskell
-
-F -
Пользовательский предобработчик запускается над вашим файлом исходного кода Haskell только если указан параметр
-F.Запуск пользовательского предобработчика во время компиляции в некоторых случаях уместен и полезен. Параметр
-Fпозволяет запустить предобработчик как часть общей системы компиляции GHC, что имеет преимущество перед отдельным запуском предобработчика Haskell — он работает в режиме интерпретации и вы можете продолжать пользоваться преимуществами проверки перекомпиляции GHC.Предобработчик запускается непосредственно перед тем, как собственно компилятор Haskell обработает входные данные Haskell, но после удаления размеченных данных и (возможно) обработки входных данных Haskell с помощью предобработчика C.
Используйте
-pgmF ⟨cmd⟩для выбора программы, которая будет использоваться в качестве предобработчика. При вызове предобработчик ⟨cmd⟩ получает как минимум три аргумента командной строки: первый аргумент — имя исходного файла, второй — имя файла, содержащего входные данные, а третий — имя файла, в который ⟨cmd⟩ должен записать свой вывод.Дополнительные аргументы предобработчика можно передать с помощью параметра
-optF ⟨option⟩. Они передаются ⟨cmd⟩ в командной строке после трёх стандартных аргументов ввода и вывода.Пример предобработчика — преобразование файлов исходного кода в ожидаемый GHC формат кодировки, например, создайте скрипт
convert.shсодержащий строки:#!/bin/sh ( echo "{-# LINE 1 \"$2\" #-}" ; iconv -f l1 -t utf-8 $2 ) > $3и передайте
-F -pgmF convert.shв GHC. Параметр-f l1сообщает iconv преобразовать ваш файл Latin-1, предоставленный в аргументе$2, в UTF-8 кодировку. Результат перенаправляется в аргумент$3. Параметрecho "{-# LINE 1 \"$2\" #-}"просто гарантирует, что ваши позиции ошибок будут отображены как в исходном файле.
7.11.5. Параметры, влияющие на генерацию кода
-
-fasm -
Используйте собственный генератор кода GHC генератор кода для нативных систем вместо компиляции через LLVM.
-fasm— значение по умолчанию.
-
-fllvm -
Компилировать через LLVM вместо использования генератора кода для нативных систем. Это, как правило, займёт немного больше времени, чем генератор кода для нативных систем. Полученный код, как правило, имеет ту же скорость или быстрее, чем два других генератора кода. Для компиляции через LLVM исполняемые файлы opt и llc LLVM должны находиться в
PATH.Примечание
Обратите внимание, что эта версия GHC ожидает LLVM версии 9 серии.
-
-fno-code -
Пропустить генерацию кода (и все последующие этапы) полностью. Это полезно, если вас интересует только проверка типов кода.
-
-fwrite-interface -
Всегда создавать файлы интерфейса. GHC обычно автоматически создаёт файлы интерфейса, но этот флаг полезен с
-fno-code, который обычно подавляет генерацию файлов интерфейса. Это полезно, если вы хотите проверять типы несколько раз с GHC без компиляции зависимостей.
-
-fobject-code -
Генерировать объектный код. Это значение по умолчанию вне GHCi и может использоваться в GHCi для генерации объектного кода вместо байткода.
-
-fbyte-code -
Генерировать байткод вместо объектного кода. Это значение по умолчанию в GHCi. Байткод в настоящее время можно использовать только в интерактивном интерпретаторе, а не сохранять на диск. Этот параметр полезен только для обратного действия
-fobject-code.
-
-fPIC -
Генерировать позиционно-независимый код (код, который можно поместить в общие библиотеки). В настоящее время это работает в Linux x86 и x86-64. В Windows позиционно-независимый код никогда не используется, поэтому флаг является бесполезным на этой платформе.
-
-fexternal-dynamic-refs -
При генерации кода предполагать, что сущности, импортированные из другого модуля, могут быть динамически связаны. Этот флаг автоматически включён параметром
-dynamic.
-
-fPIE -
Генерирует код таким образом, чтобы он мог быть связан в позиционно-независимый исполняемый файл. В настоящее время это работает в Linux x86 и x86-64. В Windows позиционно-независимый код никогда не используется, поэтому флаг является бесполезным на этой платформе. Для связывания конечного исполняемого файла используйте
-pie.
-
-dynamic -
Создаёт код для динамической компоновки. Это может значительно уменьшить размер кода, но может замедлить межмодульные вызовы нелинейных функций. Может возникнуть ряд проблем при объединении
-sharedс этим флагом, связанных с компоновкой RTS в Linux. См. #10352.Обратите внимание, что использование этого параметра при компоновке приводит к тому, что GHC связывается с динамическими библиотеками.
-
-dynamic-too -
Генерирует как динамические, так и статические объектные файлы в одной загрузке GHC. Этот параметр функционально эквивалентен запуску GHC дважды, второй раз добавляя
-dynamic -osuf dyn_o -hisuf dyn_hi.Несмотря на то, что он эквивалентен запуску GHC дважды, использование
-dynamic-tooболее эффективно, потому что предыдущие этапы компилятора до генерации кода выполняются только один раз.При использовании
-dynamic-too, параметры-dyno,-dynosuf, и-dynhisufсоответствуют-o,-osuf, и-hisufсоответственно, но применяются к динамической компиляции.
7.11.6. Параметры, влияющие на компоновку
GHC должен связать ваш код с различными библиотеками, возможно, включая: предоставленные пользователем, предоставленные GHC и системные (-lm библиотека математических функций, например).
-
-l ⟨lib⟩ -
Подключает библиотеку ⟨lib⟩. В системах Unix это будет файл, называемый
liblib.aилиliblib.so, расположенный где-то в пути к каталогам библиотек.Из-за печального состояния большинства линковщиков UNIX порядок таких параметров важен. Если библиотека ⟨foo⟩ использует библиотеку ⟨bar⟩, то, как правило,
-l ⟨foo⟩должна следовать перед-l ⟨bar⟩в командной строке.Есть ещё одна проблема, которую следует учитывать при использовании внешних библиотек: если библиотека содержит функцию
main(), то это вызовет конфликт связывания с собственной функцией GHCmain()(например,libf2cиliblимеют свои собственныеmain()).Вы можете использовать внешнюю главную функцию, если инициализируете RTS вручную и передадите
-no-hs-main. См. также Использование собственной main().
-
-c -
Пропускает этап компоновки. Этот параметр можно использовать с
--make, чтобы избежать автоматической компоновки, которая происходит, если программа содержит модульMain.
-
-package ⟨name⟩ -
Если вы используете Haskell «пакет» (см. Пакеты), не забудьте добавить соответствующий
-packageпараметр при компоновке программы: это вызовет связывание необходимых библиотек с программой. Если забыть-packageпараметр, вероятно, появятся многостраничные ошибки компоновки.
-
-framework ⟨name⟩ -
Только для Darwin/OS X/iOS, подключает фреймворк ⟨name⟩. Этот параметр соответствует параметру
-frameworkдля Apple’s Linker. Обратите внимание, что фреймворки и пакеты — это разные вещи; фреймворки не содержат никакого Haskell-кода. Скорее, они являются способом Apple упаковывать динамические библиотеки. Для связывания с Apple’s «Carbon» API, например, используется-framework Carbon.
-
-staticlib -
Связывает все переданные файлы в статическую библиотеку, подходящую для компоновки. Для управления именем используйте параметр
-o ⟨file⟩как обычно. По умолчанию имя равноliba.a.
-
-L ⟨dir⟩ -
Где находятся пользовательские библиотеки… Добавьте каталог ⟨dir⟩ в путь к каталогам библиотек.
-
-framework-path ⟨dir⟩ -
Только для Darwin/OS X/iOS, добавляет каталог ⟨dir⟩ в путь к каталогам фреймворков. Этот параметр соответствует параметру
-Fдля Apple’s Linker (-Fуже имеет другое значение для GHC).
-
-split-sections -
Размещает каждую сгенерированную функцию или элемент данных в отдельную секцию в выходном файле, если целевой объект поддерживает произвольные секции. Имя функции или имя элемента данных определяет имя секции в выходном файле.
При компоновке линковщик может автоматически удалить все неиспользуемые секции и тем самым создать более компактные исполняемые файлы.
-
-static -
Указывает линковщику избегать динамических Haskell-библиотек, если это возможно. Это значение по умолчанию.
-
-dynamic -
Этот флаг указывает GHC связываться с динамическими Haskell-библиотеками. Этот флаг влияет только на выбор зависимых библиотек, а не на форму текущей цели (см. -shared). См. Использование динамических библиотек о том, как их создать.
Обратите внимание, что этот параметр также влияет на генерацию кода (см. выше).
-
Вместо создания исполняемого файла, GHC производит динамическую библиотеку с этим флагом линковщика. В зависимости от целевой операционной системы это может быть ELF DSO, DLL Windows или Mac OS dylib. GHC скрывает детали операционной системы под этим единообразным флагом.
Флаги
-dynamicи-staticуправляют тем, связывается ли полученный динамический объект статически или динамически с Haskell-пакетными библиотеками, заданными как параметр-package ⟨pkg⟩. Библиотеки, не относящиеся к Haskell, связываются так, как обычно связывал бы gcc в вашей системе, например, в большинстве систем ELF линковщик использует динамические библиотеки, если они найдены.Объектные файлы, связанные с динамическими объектами, должны быть скомпилированы с
-fPIC, см. Параметры, влияющие на генерацию кода.При создании динамических объектов для пакетов Haskell, динамический объект должен иметь правильное имя, чтобы GHC распознал динамический объект при связывании с этим пакетом. См. изменение имени динамического объекта.
-
-dynload -
Этот флаг выбирает один из нескольких режимов поиска динамических библиотек во время выполнения. См. Поиск динамических библиотек во время выполнения для описания каждого режима.
-
-main-is ⟨thing⟩ -
В Haskell по умолчанию программа должна иметь функцию
mainв модулеMain. При тестировании часто удобно изменить функцию, которая является «главной», и флаг-main-isпозволяет это сделать. Значение ⟨thing⟩ может быть одним из:- Идентификатор в нижнем регистре
foo. GHC предполагает, что основная функция —Main.foo. - Имя модуля
A. GHC предполагает, что основная функция —A.main. - Квалифицированное имя
A.foo. GHC предполагает, что основная функция —A.foo.
Строго говоря,
-main-isне является флагом стадии компоновки; он не оказывает никакого влияния на этап компоновки. Флаг должен быть указан при компиляции модуля, содержащего указанную основную функцию (например, модульAв двух последних пунктах выше). Он не имеет эффекта для других модулей и поэтому может быть безопасно предоставлен дляghc --make. Однако, если все модули в остальном обновлены, вам может потребоваться принудительно перекомпилировать как модуль, где новый «main» находится, так и модуль, где «main» функция использовалась ранее;ghcнедостаточно умён, чтобы понять, что нужно перекомпилировать оба. Вы можете принудительно перекомпилировать, удалив объектный файл или используя флаг-fforce-recomp. - Идентификатор в нижнем регистре
-
-no-hs-main -
В случае, если вы хотите включить скомпилированный код ghc в качестве части другой программы (не Haskell), RTS не будет предоставлять своё определение
main()во время линковки, вам придётся сделать это самостоятельно. Чтобы сообщить об этом компилятору при линковке, используйте-no-hs-main. Также см. Использование собственной функции main().Обратите внимание, что поскольку команда, передаваемая линковщику, довольно сложная, вам, вероятно, следует использовать
ghcдля окончательной линковки вашего приложения «смешанного языка». Однако это не обязательно, просто попробуйте выполнить линковку один раз с-v, чтобы увидеть, какие параметры драйвер передаёт линковщику.Флаг
-no-hs-mainтакже может быть использован, чтобы убедить компилятор выполнить шаг линковки в режиме--make, когда нет модуля HaskellMain(обычно компилятор не пытается выполнить линковку, если нет модуляMain).Флаги
-rtsopts[=⟨none|some|all|ignore|ignoreAll⟩]и-with-rtsopts=⟨opts⟩не имеют эффекта, когда используются с-no-hs-main, потому что они реализуются путём изменения определенияmain, генерируемого GHC. См. Использование собственной функции main() для того, как получить эффект-rtsopts[=⟨none|some|all|ignore|ignoreAll⟩]и-with-rtsopts=⟨opts⟩при использовании собственной функцииmain.
-
-debug -
Скомпилируйте программу с отладочной версией системного времени выполнения. Отладочная система времени выполнения включает множество утверждений и проверок на корректность, а также предоставляет дополнительные параметры для вывода отладочной информации во время выполнения (запустите программу с
+RTS -?, чтобы увидеть список).
-
-threaded -
Скомпилируйте программу с «потоковой» версией системного времени выполнения. Потоковая система времени выполнения так называется потому, что она управляет несколькими потоками ОС, в отличие от стандартной системы времени выполнения, которая является чисто однопотоковой.
Обратите внимание, что вам не нужно
-threadedдля использования конкурентности; однопотоковая система времени выполнения поддерживает конкурентность между потоками Haskell без проблем.Потоковая система времени выполнения обеспечивает следующие преимущества:
- Она позволяет использовать опцию RTS
-N ⟨x⟩, которая позволяет потокам выполняться параллельно на многопроцессорном или многоядерном компьютере. См. Использование параллелизма SMP. - Если поток делает вызов внешней функции (и вызов не помечен
unsafe), то другие потоки Haskell в программе продолжат выполняться, пока вызов внешней функции не завершится. Кроме того, потоковые функции Haskell могут вызываться из нескольких потоков ОС одновременно. См. Многопоточность и FFI.
- Она позволяет использовать опцию RTS
-
-eventlog -
Скомпилируйте программу с «событийной» версией системного времени выполнения. Программа, скомпилированная таким образом, может генерировать трассировку событий (например, старт/стоп потока) в двоичный файл
program.eventlog, который затем может быть интерпретирован различными инструментами. См. Отслеживание для получения дополнительной информации.-eventlogможет использоваться с-threaded. Она подразумевается-debug.
-
-rtsopts[=⟨none|some|all|ignore|ignoreAll⟩] -
- По умолчанию
-
some
Этот параметр влияет на обработку параметров управления RTS, заданных либо в командной строке, либо через переменную среды
GHCRTS. Существует три варианта:-
-rtsopts=none -
Отключить всю обработку опций RTS. Если
+RTSпоявляется где-либо в командной строке, программа завершит работу с сообщением об ошибке. Если переменная средыGHCRTSустановлена, программа выведет предупреждение,GHCRTSбудет проигнорировано, и программа выполнится в обычном режиме. -
-rtsopts=ignore -
Отключает всю обработку опций RTS. В отличие от
noneэто обращается со всеми флагами RTS, появляющимися в командной строке, так же, как с обычными аргументами. (Передаёт их вашей программе в качестве аргументов).GHCRTSпараметры будут обработаны нормально. -
-rtsopts=ignoreAll -
То же, что
ignore, но также игнорируетGHCRTS. -
-rtsopts=some -
[Это значение по умолчанию] Включить только «безопасные» параметры RTS: (В настоящее время только
-?и--info.) Любые другие параметры RTS в командной строке или в переменной средыGHCRTSприведут к аварийному завершению программы с сообщением об ошибке. -
-rtsopts=all or just -rtsopts -
Включить всю обработку параметров RTS, как в командной строке, так и через переменную среды
GHCRTS.
В GHC 6.12.3 и более ранних версиях по умолчанию обрабатывались все параметры RTS. Однако, поскольку параметры RTS могут использоваться для записи данных логов в произвольные файлы в контексте безопасности запущенной программы, существует потенциальная проблема безопасности. По этой причине GHC 7.0.1 и более поздние версии по умолчанию используют
-rtsopts=some.Обратите внимание, что
-rtsoptsне имеет эффекта, когда используется с-no-hs-main; см. Использование собственной функции main() для получения подробностей.-rtsoptsне влияет на параметры RTS, переданные через-with-rtsopts; они используются независимо от-rtsopts.
-
-with-rtsopts=⟨opts⟩ -
Этот параметр позволяет установить параметры RTS по умолчанию во время линковки. Например,
-with-rtsopts="-H128m"устанавливает размер кучи по умолчанию в 128 МБ. Это всегда будет размер кучи по умолчанию для этой программы, если пользователь не переопределит его. (В зависимости от настроек параметра-rtsoptsпользователь может не иметь возможности изменять параметры RTS во время выполнения, в этом случае-with-rtsoptsбудет единственным способом их настройки.)Используйте флаг времени выполнения
--infoдля исполняемого файла, чтобы увидеть параметры, установленные с-with-rtsopts.Обратите внимание, что
-with-rtsoptsне имеет эффекта, когда используется с-no-hs-main; см. Использование собственной функции main() для получения подробностей.
-
-no-rtsopts-suggestions -
Этот параметр отключает предложения RTS о линковке с
-rtsopts[=⟨none|some|all|ignore|ignoreAll⟩], когда они недоступны. Эти предложения были бы бесполезны, если пользователи установили программы Haskell через свои менеджеры пакетов. При включенном этом параметре эти предложения не будут появляться. Рекомендуется для распространения библиотек для сборки с помощью либо-rtsopts, либо-no-rtsopts-suggestions.
-
-fno-gen-manifest -
В Windows GHC обычно генерирует файл манифеста при линковке двоичного файла. Файл манифеста размещается в файле
prog.exe.manifest`, где ⟨prog.exe⟩ — имя исполняемого файла. Файл манифеста в настоящее время служит только для одной цели: он отключает «обнаружение установщика» в Windows Vista, которое пытается повысить привилегии для исполняемых файлов с определёнными именами (например, содержащими «установить», «установка» или «патч»). Без файла манифеста для отключения обнаружения установщика попытка запуска исполняемого файла, который Windows считает установщиком, вернёт код ошибки доступа к ресурсу вызывающей программе. В зависимости от вызывающей программы, результатом может быть диалоговое окно, спрашивающее пользователя об увеличении привилегий, или просто ошибка «Доступ запрещён».Обнаружение установщика также может быть отключено глобально для системы с помощью панели управления безопасностью, но GHC по умолчанию генерирует исполняемые файлы, не зависящие от того, отключил ли пользователь обнаружение установщиков.
Флаг
-fno-gen-manifestотключает генерацию файла манифеста. Одна из причин сделать это — если у вас есть свой собственный файл манифеста.В будущем GHC может использовать файл манифеста для других целей, например, для указания местоположения зависимых DLL.
-fno-gen-manifestтакже подразумевает-fno-embed-manifest, см. ниже.
-
-fno-embed-manifest -
Файл манифеста, который GHC генерирует при компоновке бинарника на Windows, по умолчанию также встраивается в сам исполняемый файл. Это означает, что бинарник можно распространять, не предоставляя файл манифеста. Встраивание выполняется с помощью запуска windres; чтобы увидеть, что именно GHC делает для встраивания манифеста, используйте флаг
-v. Установка GHC поставляется со своей копиейwindresпо этой причине.См. также
-pgmwindres ⟨cmd⟩(Замена программы для одной или нескольких фаз) и-optwindres ⟨option⟩(Принудительное применение опций к конкретной фазе).
-
DLL на Windows обычно связываются путем ссылки на соответствующую
.libили.dll.a— так называемую библиотеку импорта. GHC обычно генерирует такой файл для каждой DLL, которую вы создаёте, компилируя в режиме-shared. Однако иногда вам не хочется платить за место на диске, создавая эту библиотеку импорта, которая может быть существенной — она может потребовать столько же места, сколько и сам код, так как DLL Haskell обычно экспортируют много символов.Пока вы довольны возможностью связываться с DLL только с помощью
GetProcAddressи друзей, вы можете использовать флаг-fno-shared-implibдля отключения создания библиотеки импорта полностью.
-
-dylib-install-name ⟨path⟩ -
В Darwin/OS X динамические библиотеки в момент построения маркируются «именем установки», которое является конечным путём установки файла библиотеки. Любые библиотеки или исполняемые файлы, которые впоследствии ссылаются на неё, получат этот путь как место расположения для поиска во время выполнения. По умолчанию, ghc устанавливает имя установки в место, где библиотека построена. Эта опция позволяет переопределить её указанным путём к файлу. (Она передаёт
-install_nameлинковщику Apple.) Игнорируется на других платформах.
-
-rdynamic -
Это указывает линковщику добавить все символы, а не только используемые, в таблицу динамических символов. В настоящее время только Linux и Windows/MinGW32. Это эквивалентно использованию
-optl -rdynamicв Linux и-optl -export-all-symbolsв Windows.
-
-fwhole-archive-hs-libs -
При компоновке исполняемого бинарника этот флаг вставляет
-Wl,--whole-archiveперед любыми-lфлагами для библиотек Haskell, а-Wl,--no-whole-archiveпосле них (в OS X флаг-Wl,-all_load, нет эквивалента для-Wl,--no-whole-archive). Этот флаг также отключает использование-Wl,--gc-sections(-Wl,-dead_stripв OS X).Это для специализированных приложений, которые могут потребовать символы, определённые в этих библиотеках Haskell во время выполнения, даже если они не ссылаются на них никаким другим кодом, связанным в исполняемый файл. Если вы используете
-fwhole-archive-hs-libs, вы, вероятно, также захотите-rdynamic.
-
-pie -
- Since
-
8.2.2
Это указывает линковщику создать исполняемый файл независимый от позиции. Этот флаг действителен только при создании исполняемых файлов, и весь объектный код, который связывается, должен быть создан с помощью
-fPIE.Исполняемые файлы, независимые от позиции, требуются некоторыми платформами, так как они позволяют реализовать рандомизацию расположения адресного пространства (ASLR) — распространённую меру безопасности. Они также могут быть полезными, так как их можно динамически загрузить и использовать как общие библиотеки другими исполняемыми файлами.
Исполняемые файлы, независимые от позиции, должны быть динамически связанными (например, построены с помощью
-dynamicи только загружаться в другие динамически связанные исполняемые файлы, чтобы убедиться, что только одинlibHSrtsприсутствует, если загружен в адресное пространство другого процесса Haskell.Кроме того, возможно, вам нужно использовать флаг
-rdynamic, чтобы убедиться, что символы не удаляются из ваших PIE объектов.
-
-keep-cafs -
- Since
-
8.8.1
Отключает обычное поведение RTS по сбору мусора CAFs (постоянные прикладные формы, другими словами, выражения верхнего уровня). Эта опция полезна для специализированных приложений, которые выполняют динамическую привязку во время выполнения, где код, динамически привязанный в будущем, может потребовать значения CAF, который в противном случае был бы собран мусором.
© 2002–2007 The University Court of the University of Glasgow. All rights reserved.
Licensed under the Glasgow Haskell Compiler License.
https://downloads.haskell.org/~ghc/8.10.2/docs/html/users_guide/phases.html