2020-04-11 17:09:43 +00:00
|
|
|
|
= Программный проект и иерархия каталогов
|
|
|
|
|
:title-separator: {sp}|
|
|
|
|
|
:category: Программирование
|
|
|
|
|
:tags: Linux, программирование, cmake
|
|
|
|
|
|
|
|
|
|
Для операционных систем типа Linux принят стандарт
|
|
|
|
|
https://ru.wikipedia.org/wiki/FHS[FHS] («стандарт иерархии файловой
|
|
|
|
|
системы»), унифицирующий местонахождение файлов и каталогов с общим
|
|
|
|
|
назначением в файловой системе. Полная текущая версия стандарта
|
|
|
|
|
находится http://refspecs.linuxfoundation.org/fhs.shtml[здесь].
|
|
|
|
|
|
|
|
|
|
В соответствии с данным стандартом, а также принятыми в ведущих
|
|
|
|
|
дистрибутивах правилами размещения исполняемых файлов в каталогах
|
|
|
|
|
пользователей, можно выделить следующие типы расположения:
|
|
|
|
|
|
|
|
|
|
* системная иерархия в каталоге `/usr` используется для установки
|
|
|
|
|
бинарных пакетов для данного дистрибутива;
|
|
|
|
|
|
|
|
|
|
* системная иерархия в каталоге `/usr/local` используется для установки
|
|
|
|
|
программного обеспечения системным администратором без использования
|
|
|
|
|
пакетов (не рекомендуется для использования из-за проблем поддержки
|
|
|
|
|
в актуальном состоянии);
|
|
|
|
|
|
|
|
|
|
* системная иерархия в каталоге `/opt` используется для установки
|
|
|
|
|
стороннего программного обеспечения. В рамках данной иерархии
|
|
|
|
|
предполагается, что каждый программный продукт располагается в
|
|
|
|
|
собственном каталоге. При таком типе сборки обычно используются
|
|
|
|
|
дополнительные методы (статическая компоновка, включение в состав
|
|
|
|
|
пакета своего набора динамических библиотек) для обеспечения работы
|
2020-04-11 20:09:16 +00:00
|
|
|
|
пакета в операционных системам с отличающимся составом библиотек
|
2020-04-11 17:09:43 +00:00
|
|
|
|
и другим циклом обновления;
|
|
|
|
|
|
|
|
|
|
* системная иерархия в домашнем каталоге пользователя не имеет
|
|
|
|
|
определённого стандарта, обычно производители дистрибутивов
|
|
|
|
|
предлагают использовать для исполняемых файлов каталоги
|
|
|
|
|
`$HOME/bin` или `$HOME/.local/bin`.
|
|
|
|
|
|
2020-04-11 20:09:16 +00:00
|
|
|
|
Система автоматизации сборки программного обеспечения `CMake` позволяет
|
|
|
|
|
организовать окружение подобное перечисленным выше. На этапе сборки
|
|
|
|
|
проекта можно создать структуру каталогов, которая будет отвечать
|
|
|
|
|
требованиям по логическому разделению файлов на исполняемые,
|
|
|
|
|
заголовочные, библиотеки, файлы настроек и т.д.
|
2020-04-11 17:09:43 +00:00
|
|
|
|
|
2020-04-11 20:58:43 +00:00
|
|
|
|
Для обеспечения единообразной работы вне зависимости от варианта
|
|
|
|
|
иерархии каталогов, в которой находится исполняемый файл, можно
|
|
|
|
|
выполнять автоматическую настройку на работу в текущем окружении.
|
|
|
|
|
|
2020-04-13 06:08:14 +00:00
|
|
|
|
В библиотеке https://git.246060.ru/f1x1t/myxlib[myxlib] реализован
|
|
|
|
|
класс, который анализирует расположение и окружение исполняемого
|
|
|
|
|
файла и предоставляет методы для получения имён каталогов,
|
|
|
|
|
соответствующих текущему окружению. Названия методов и описания
|
|
|
|
|
возвращаемых значений приведены в таблице
|
|
|
|
|
|
|
|
|
|
[cols="2m,4",options="header",]
|
|
|
|
|
|===
|
|
|
|
|
| Метод | Описание
|
|
|
|
|
| binaryDirectory() | Полный путь к каталогу с исполняемым файлом
|
|
|
|
|
| userConfigDirectory() | Полный путь к пользовательскому каталогу с файлами настройки
|
|
|
|
|
| systemConfigDirectory() | Полный путь к системному каталогу с файлами настройки
|
|
|
|
|
| configFilePath() | Полный путь к файлу настройки
|
|
|
|
|
| userVarDataDirectory() | Полный путь к пользовательскому каталогу с изменяемыми файлами
|
|
|
|
|
| systemVarDataDirectory() | Полный путь к системному каталогу с изменяемыми файлами
|
|
|
|
|
| userConstDataDirectory() | Полный путь к пользовательскому каталогу с неизменяемыми файлами
|
|
|
|
|
| systemConstDataDirectory() | Полный путь к системному каталогу с неизменяемыми файлами
|
|
|
|
|
| userLogDirectory() | Полный путь к пользовательскому каталогу с журналами работы
|
|
|
|
|
| systemLogDirectory() | Полный путь к системному каталогу с журналами работы
|
|
|
|
|
| tempDirectory() | Полный путь к каталогу с временными файлами
|
|
|
|
|
| homeDirectory() | Полный путь к домашнему каталогу текущего пользователя
|
|
|
|
|
| projectName() | Имя подкаталога для проекта
|
|
|
|
|
| executableFileName() | Имя исполняемого файла
|
|
|
|
|
| executableFilePath() | Полный путь к исполняемому файлу
|
|
|
|
|
|===
|