= Программный проект и иерархия каталогов :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` используется для установки стороннего программного обеспечения. В рамках данной иерархии предполагается, что каждый программный продукт располагается в собственном каталоге. При таком типе сборки обычно используются дополнительные методы (статическая компоновка, включение в состав пакета своего набора динамических библиотек) для обеспечения работы пакета в операционных системам с отличающимся составом библиотек и другим циклом обновления; * системная иерархия в домашнем каталоге пользователя не имеет определённого стандарта, обычно производители дистрибутивов предлагают использовать для исполняемых файлов каталоги `$HOME/bin` или `$HOME/.local/bin`. Система автоматизации сборки программного обеспечения `CMake` позволяет организовать окружение подобное перечисленным выше. На этапе сборки проекта можно создать структуру каталогов, которая будет отвечать требованиям по логическому разделению файлов на исполняемые, заголовочные, библиотеки, файлы настроек и т.д. Для обеспечения единообразной работы вне зависимости от варианта иерархии каталогов, в которой находится исполняемый файл, можно выполнять автоматическую настройку на работу в текущем окружении. В библиотеке 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() | Полный путь к исполняемому файлу |===