3.1.2. Файлы модулей

На верх  Назад  Вперёд

Когда вы компилируете модуль или программу, которым требуются другие модули, компилятор будет искать откомпилированные версии модулей по следующим путям:

1.Текущий каталог

2.Каталог, где размещены исходные файлы

3.Каталог, где размещены исполняемые файлы компилятора

4.Каталог, указанный для поиска модулей

Вы можете добавить каталог для поиска модулей с помощью параметра –Fu (см. 5.1.3. Параметры, касающиеся файлов и каталогов). Каждый элемент этого параметра будет вставлять каталог в список путей поиска модулей таким образом, что последний указанный в командной строке путь будет просматриваться первым.

Компилятор добавляет несколько путей в путь поиска модулей:

1.Содержимое переменной окружения XXUNITS, где XX должно быть заменено на одно из поддерживаемых значений: GO32V2, LINUX, WIN32, OS2, BEOS, FREEBSD, SUNOS, DARWIN (список зависит от платформы).

2.Стандартный каталог модулей. Этот каталог определяется переменной окружения FPCDIR. Если эта переменная не определена, то ей присваивается значение по умолчанию:

oДля LINUX:
/usr/local/lib/fpc/FPCVERSION или
/usr/lib/fpc/FPCVERSION (какой будет найден первым).

oДля других операционных систем:
Каталог исполняемых файлов компилятора с добавлением ’../’ к пути, если путь существует. Для Windows это будет: C:\FPC\2.6\units\i386-win32 (это справедливо, если компилятор установлен в каталог C:\FPC\2.6 ).

После определения этих каталогов, следующие пути добавляются в путь поиска:

(a) FPCDIR/units/FPCTARGET

(b) FPCDIR/units/FPCTARGET/rtl

Здесь TARGET должно быть заменено на имя цель вашей компиляции – это комбинация процессора и операционной системы, например

/usr/local/lib/fpc/2.6/units/i386-linux/

или

/usr/local/lib/fpc/2.6/units/i386-win32/

Параметр ‑Fu принимает одиночный подстановочный символ *, который будет заменён всеми найденными каталогами, кроме самого указанного каталога. Например, передать каталоги

rtl/units/i386-linux
fcl/units/i386-linux
packages/base
packages/extra

можно командой

fpc -Fu "*/units/i386-linux"

и это будет иметь тот же эффект, что и команда

fpc -Furtl/units/i386-linux -Fufcl/units/i386-linux

так как оба каталога rtl и fcl содержат подкаталог units/i386-linux. Каталог packages не будет добавлен, так как он не содержит подкаталог units/i386-linux.

Следующая команда

fpc -Fu "units/i386-linux/*"

добавляет все подкаталоги, которые имеются в каталоге units/i386-linux, но не добавляет сам каталог units/i386-linux, поэтому вы должны добавить его вручную, если это потребуется:

fpc -Fu "units/i386-linux" -Fu "units/i386-linux/*"

Учтите, что (для оптимизации) компилятор будет отбрасывать все несуществующие пути из пути поиска, то есть существование пути (после подстановочного символа и расширения переменной окружения) будет проверяться.

Вы можете посмотреть пути, которые будут проверяться компилятором с помощью параметра -vu.

В операционных системах, где имена файлов чувствительны к регистру символов (таких как UNIX и LINUX), компилятор будет:

1.Искать оригинальное имя файла, то есть файл с именем в сохранённом регистре

2.Искать файл с именем в верхнем регистре

3.Искать файл с именем в нижнем регистре

Это необходимо, так как Pascal нечувствителен к регистру операторы Uses Unit1 или uses unit1 имеют одинаковый эффект.

Вначале выполняется поиск файлов с расширением .ppu (откомпилированный модуль), .pp, а затем с расширением .pas.

Например, предположим, что файлу foo.pp необходим модуль bar. Тогда команда

fpc -Fu.. -Fuunits foo.pp

укажет компилятору, что нужно искать модуль bar в следующих местах:

1.В текущем каталоге.

2.В каталоге, где расположены исполняемые файлы компилятора (не для LINUX).

3.В родительском каталоге текущей директории.

4.В подкаталоге units текущей директории

5.В стандартном каталоге модулей

Имена модулей, которые содержат более 8 символов, сначала будут искаться по полному имени. Если по полному имени модуль не будет найден, то имя будет обрезано до 8 символов и компилятор снова попытается найти модуль во всех указанных директориях, но уже с сокращённым именем файла.

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

Если компилятор не нашёл откомпилированную версию модуля или был указан параметр –B, то компилятор в той же манере будет искать исходный файл и пытаться перекомпилировать его.

Рекомендуется устанавливать путь поиска модулей в конфигурационном файле fpc.cfg. Если вы это сделаете, то вам не придётся определять путь поиска модулей в командной строке каждый раз, когда вы выполняете компиляцию.