Ада-95. Компилятор GNAT

       

Автоматическое создание списка каталогов


Для большинства файлов Makefile, возникает необходимость перечисления списка каталогов и сохранения этого списка в какой-либо переменной.

Для небольших проектов чаще всего такое перечисление проще выполнять вручную, поскольку после этого сохраняется полное управление над правильностью порядка перечисления этих каталогов.

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

Показанный ниже пример файла Makefile

демонстрирует использование двух различных способов автоматического создания списка каталогов.

Первый способ, который является менее общим, обеспечивает более полное управление над списком каталогов.

Он использует шаблонные символы, которые будут автоматически расширены утилитой GNU make.

Недостатком этого способа является то, что необходимо более явное указание организации структуры проекта, например, указание глубины вложенности иерархии каталогов проекта, или указание того, что проект расположен в различных иерархиях каталогов.

Второй способ - более общий.

Он требует использования внешней программы find, которая стандартна для большинства систем UNIX.

Все подкаталоги, которые расположены внутри корневого каталога проекта, будут добавлены в список каталогов проекта.

# Показанный ниже пример основывается на следующей иерархии каталогов, # причем, все каталоги могут содержать произвольное количество файлов: # ROOT_DIRECTORY -> a -> aa -> aaa # -> ab # -> ac # -> b -> ba -> baa # -> bb # -> bc # Этот файл Makefile создает переменную с именем DIRS, которая может # быть использована в любой момент, когда необходим список каталогов # (см. другие примеры)

# Корневой каталог иерархии каталогов проекта ROOT_DIRECTORY=.

#### # Первый способ: явно определяет список каталогов. # Он позволяет определять любое подмножество необходимых каталогов. ####

DIRS := a/aa/ a/ab/ b/ba/

#### # Второй способ: использует шаблоны # Примечательно, что аргументы показанных ниже шаблонов # должны звканчиваться символом '/'. # Поскольку шаблоны также возвращают имена файлов, их необходимо # отфильтровывать, чтобы избежать дублирование имен каталогов. # Для этого используются встроенные функции make dir и sort. # Это устанавливает переменную DIRS в следующее значение (примечательно, что # каталоги aaa и baa не будут указаны до тех пор, пока не будут # изменены аргументы шаблона). # DIRS= ./a/a/ ./b/ ./a/aa/ ./a/ab/ ./a/ac/ ./b/ba/ ./b/bb/ ./b/bc/ ####

DIRS := ${sort ${dir ${wildcard ${ROOT_DIRECTORY}/*/ ${ROOT_DIRECTORY}/*/*/}}}

#### # Третий способ: использует внешнюю программу # Эта команда будет более быстро выполняться на локальных дисках. # В результате выполнения этой команды переменная DIIRS будет # установлена в следующее значение: # DIRS= ./a ./a/aa ./a/aa/aaa ./a/ab ./a/ac ./b ./b/ba ./b/ba/baa ./b/bb ./b/bc ####

DIRS := ${shell find ${ROOT_DIRECTORY} -type d -print}



Содержание раздела