Source dir что это
Какие есть проблемы у систем сборки языка C++?
Проблема только одна – отсутствие каких бы то ни было стандартных систем сборки. Но нас спасут нестандартные! В данном случае великий и ужасный CMake, в котором есть две переменные с не совсем очевидными отличиями.
– CMAKE_SOURCE_DIR – путь к директории исходников (директория, в которой расположен корневой файл CMakeLists.txt, с которого началась обработка);
– CMAKE_CURRENT_SOURCE_DIR – путь к текущей директории исходников (директория, в которой расположен CMakeLists.txt, который обрабатывается в данный момент).
Какую переменную лучше использовать для относительных путей в иерархии проекта?
Предположим, мы написали ещё один велосипед (но на этот раз превзошли всех предшественников в «велосипедостроении») и реализовали свой модуль суммирования переменных типа int. Структура проекта примерно такая:
Если вы, как и подобает нормальному человеку, не сразу воспринимаете вывод команды tree. Поясню: в корне проекта находится файл CMakeLists.txt и две директории – SuperProject (реализация нашего велосипеда) и Tests (так сказать, юнит-тесты). Думаю, теперь стало понятно, что где лежит.
С корневым CMakeLists.txt всё очевидно: в нём только добавляем две поддиректории (если уж совсем занудствовать, то было бы неплохо добавить минимальную требуемую версию CMake в начало файла, но опустим это во имя простоты восприятия):
С файлом CMakeLists.txt из директории SuperProject тоже всё просто:
И, наконец, самый смак: директория Tests и её файл CMakeLists.txt:
Заметили?
Мы используем CMAKE_SOURCE_DIR, чтобы собирать исходники проекта вместе с тестами. Обычно так делается для тестирования внутренних модулей продукта (иначе можно было бы просто прилинковать уже собранную библиотеку SuperProject.so(dll)).
Вроде, всё работает, проект собирается, тесты собираются (проходят или нет в данном случае неважно), можно на этом и остановиться. Но лучше подумать её разок. А в идеале попробовать использовать наш проект так, как могли бы его использовать другие члены сообщества.
Один из возможных вариантов использования – добавить наш репозиторий в свой в качестве git submodule и где-то в своём корневом CMakeLists.txt добавить команду:
Иерархия проекта нашего благодарного пользователя будет выглядеть примерно так:
Правильно, указывать она будет на директорию OtherProject, потому что именно она теперь и является хранилищем корневого файла CMakeLists.txt. А наш файл CMakeLists.txt корневым быть перестал.
В итоге на этапе CMake возникнет ошибка при выполнении вот этой строчки:
Что вполне законно, ибо корневая директория проекта теперь не содержит директорию SuperProject.
Что же делать?
Если вы читали эту заметку с начала, вероятно, вы можете заподозрить, что помочь нам призвана переменная CMAKE_CURRENT_SOURCE_DIR. И данный вывод совершенно верен!
Переменная CMAKE_CURRENT_SOURCE_DIR всегда указывает на директорию с текущим файлом CMakeFiles.txt, который в настоящий момент подвергается обработке. Использование этой переменной вместо CMAKE_SOURCE_DIR убережёт пользователей ваших супер-модулей от нервных расстройств, а вам даст дополнительный повод для гордости.
Ведь что может сравниться с ощущением того, что результаты твоей работы не пылятся на жёстком диске, а приносят пользу человечеству?
Было бы неплохо привести в конце статьи правильное решение. Можно было бы, конечно, оставить его в качестве домашнего задания. Но жестокость я оставлю для учебных занятий, а правильное решение выглядит следующим образом.
Правильное решение
В файле Tests/CMakeLists.txt следовало написать:
Есть вопрос? Напишите в комментариях!
CMake и C++ — братья навек
В процессе разработки я люблю менять компиляторы, режимы сборки, версии зависимостей, производить статический анализ, замерять производительность, собирать покрытие, генерировать документацию и т.д. И очень люблю CMake, потому что он позволяет мне делать всё то, что я хочу.
Многие ругают CMake, и часто заслуженно, но если разобраться, то не всё так плохо, а в последнее время очень даже неплохо, и направление развития вполне позитивное.
В данной заметке я хочу рассказать, как достаточно просто организовать заголовочную библиотеку на языке C++ в системе CMake, чтобы получить следующую функциональность:
Кто и так разбирается в плюсах и си-мейке может просто скачать шаблон проекта и начать им пользоваться.
Содержание
Проект изнутри
Структура проекта
Главным образом речь пойдёт о том, как организовать CMake-скрипты, поэтому они будут разобраны подробно. Остальные файлы каждый желающий может посмотреть непосредственно на странице проекта-шаблона.
Главный CMake-файл (./CMakeLists.txt)
Информация о проекте
В первую очередь нужно затребовать нужную версию системы CMake. CMake развивается, меняются сигнатуры команд, поведение в разных условиях. Чтобы CMake сразу понимал, чего мы от него хотим, нужно сразу зафиксировать наши к нему требования.
Затем обозначим наш проект, его название, версию, используемые языки и прочее (см. команду project ).
В данном случае указываем язык CXX (а это значит C++), чтобы CMake не напрягался и не искал компилятор языка C (по умолчанию в CMake включены два языка: C и C++).
Здесь же можно сразу проверить, включён ли наш проект в другой проект в качестве подпроекта. Это сильно поможет в дальнейшем.
Опции проекта
Предусмотрим две опции.
Первая опция — MYLIB_TESTING — для выключения модульных тестов. Это может понадобиться, если мы уверены, что с тестами всё в порядке, а мы хотим, например, только установить или запакетировать наш проект. Или наш проект включён в качестве подпроекта — в этом случае пользователю нашего проекта не интересно запускать наши тесты. Вы же не тестируете зависимости, которыми пользуетесь?
Кроме того, мы сделаем отдельную опцию MYLIB_COVERAGE для замеров покрытия кода тестами, но она потребует дополнительных инструментов, поэтому включать её нужно будет явно.
Опции компиляции
Разумеется, мы крутые программисты-плюсовики, поэтому хотим от компилятора максимального уровня диагностик времени компиляции. Ни одна мышь не проскочит.
Расширения тоже отключим, чтобы полностью соответствовать стандарту языка C++. По умолчанию в CMake они включены.
Основная цель
Наша библиотека состоит только из заголовочных файлов, а значит, мы не располагаем каким-либо выхлопом в виде статических или динамических библиотек. С другой стороны, чтобы использовать нашу библиотеку снаружи, её нужно установить, нужно, чтобы её можно было обнаружить в системе и подключить к своему проекту, и при этом вместе с ней были привязаны эти самые заголовки, а также, возможно, какие-то дополнительные свойства.
Для этой цели создаём интерфейсную библиотеку.
Привязываем заголовки к нашей интерфейсной библиотеке.
Установим стандарт языка. Разумеется, самый последний. При этом не просто включаем стандарт, но и распространяем его на тех, кто будет использовать нашу библиотеку. Это достигается за счёт того, что установленное свойство имеет категорию INTERFACE (см. команду target_compile_features).
Заводим псевдоним для нашей библиотеки. Причём для красоты он будет в специальном «пространстве имён». Это будет полезно, когда в нашей библиотеке появятся разные модули, и мы заходим подключать их независимо друг от друга. Как в Бусте, например.
Установка
Установка наших заголовков в систему. Тут всё просто. Говорим, что папка со всеми заголовками должна попасть в директорию include относительно места установки.
Тесты
Документация
Документация также не будет генерироваться в случае подпроекта.
Онлайн-песочница
Аналогично, онлайн-песочницы у подпроекта тоже не будет.
Скрипт для тестов (test/CMakeLists.txt)
Тестирование
Первым делом находим пакет с нужным тестовым фреймворком (замените на свой любимый).
А файлы, в которых описаны сами тесты, добавляю позже. Но так делать не обязательно.
Наконец, создаём фиктивную цель, «сборка» которой эквивалентна запуску тестов, и добавляем эту цель в сборку по умолчанию (за это отвечает атрибут ALL ). Это значит, что сборка по умолчанию инициирует запуск тестов, то есть мы никогда не забудем их запустить.
Покрытие
Скрипт для документации (doc/CMakeLists.txt)
Дальше проверяем, установлена ли пользователем переменная с языком. Если да, то не трогаем, если нет, то берём русский. Затем конфигурируем файлы системы Doxygen. Все нужные переменные, в том числе и язык попадают туда в процессе конфигурации (см. команду configure_file ).
Скрипт для онлайн-песочницы (online/CMakeLists.txt)
Проект снаружи
Теперь рассмотрим, как этим всем пользоваться.
Сборка
Сборка данного проекта, как и любого другого проекта на системе сборки CMake, состоит из двух этапов:
Генерация
Сборка проекта
Опции
MYLIB_COVERAGE
MYLIB_TESTING
MYLIB_DOXYGEN_LANGUAGE
Переключает язык документации, которую генерирует цель doc на заданный. Список доступных языков см. на сайте системы Doxygen.
По умолчанию включён русский.
Сборочные цели
По умолчанию
mylib-unit-tests
Компилирует модульные тесты. Включено по умолчанию.
check
Запускает собранные (собирает, если ещё не) модульные тесты. Включено по умолчанию.
coverage
Анализирует запущенные (запускает, если ещё не) модульные тесты на предмет покрытия кода тестами при помощи программы gcovr.
Выхлоп покрытия будет выглядеть примерно так:
Запускает генерацию документации к коду при помощи системы Doxygen.
wandbox
Ответ от сервиса выглядит примерно так:
Для этого используется сервис Wandbox. Не знаю, насколько у них резиновые сервера, но думаю, что злоупотреблять данной возможностью не стоит.
Примеры
Сборка проекта в отладочном режиме с замером покрытия
Установка проекта без предварительной сборки и тестирования
Сборка в выпускном режиме заданным компилятором
Генерирование документации на английском
Инструменты
На самом деле версия CMake 3.13 требуется только для запуска некоторых консольных команд, описанных в данной справке. С точки зрения синтаксиса CMake-скриптов достаточно версии 3.8, если генерацию вызывать другими способами.
Тестирование можно отключать (см. опцию MYLIB_TESTING ).
Для автоматической генерации онлайн-песочницы.
Статический анализ
С помощью CMake и пары хороших инструментов можно обеспечить статический анализ с минимальными телодвижениями.
Cppcheck
В CMake встроена поддержка инструмента для статического анализа Cppcheck.
Для этого нужно воспользоваться опцией _CPPCHECK»> CMAKE_CXX_CPPCHECK :
После этого статический анализ будет автоматически запускаться каждый раз во время компиляции и перекомпиляции исходников. Ничего дополнительного делать не нужно.
Clang
При помощи чудесного инструмента scan-build тоже можно запускать статический анализ в два счёта:
Послесловие
CMake — очень мощная и гибкая система, позволяющая реализовывать функциональность на любой вкус и цвет. И, хотя, синтаксис порой оставляет желать лучшего, всё же не так страшен чёрт, как его малюют. Пользуйтесь системой сборки CMake на благо общества и с пользой для здоровья.
source directory
Смотреть что такое «source directory» в других словарях:
source directory — pradinis katalogas statusas T sritis informatika apibrėžtis ↑Katalogas, iš kurio imami apdoroti skirti failai. Apdoroti failai nukreipiami į ↑paskirties katalogą. atitikmenys: angl. source directory ryšiai: dar žiūrėk – katalogas dar žiūrėk –… … Enciklopedinis kompiuterijos žodynas
Directory service — A directory service is the software system that stores, organizes and provides access to information in a directory. In software engineering, a directory is a map between names and values. It allows the lookup of values given a name, similar to a … Wikipedia
Directory Opus — Screenshot Directory Opus 9 running on Vista with coverart.jpg in folders. Developer(s) GPSoftware Stable release 10.0.2 … Wikipedia
Directory Opus — Тип Файловый менеджер Разработчик GPSoftware Операционная система Microsoft Windows, AmigaOS Последняя версия 10.2.0.0 (19 сентября 2012) Лицензия Проприетарное программное обеспечение … Википедия
Directory Opus — Entwickler GP Software (Windows) GuruMeditation (AmigaOS) Diverse (Version 4.x, AmigaOS) Aktuelle Version 10.0.2.0.4269 (9. September 2011, Windows) 5.82 (8. November 1999, AmigaOS) 4.18 (29. Dezember 2006, AmigaOS) Betriebssystem Windows,… … Deutsch Wikipedia
Directory Access Protocol — LDAP im TCP/IP‑Protokollstapel: Anwendung LDAP Transport UDP TCP Internet IP (IPv4, IPv6) Netzzugang … Deutsch Wikipedia
Directory service — Ein Verzeichnisdienst (englisch directory service) stellt in einem Netzwerk eine zentrale Sammlung an Daten bestimmter Art zur Verfügung. Die in einer hierarchischen Datenbank gespeicherten Daten können nach dem Client Server Prinzip verglichen,… … Deutsch Wikipedia
Directory traversal attack — A directory traversal (or path traversal) consists in exploiting insufficient security validation / sanitization of user supplied input file names, so that characters representing traverse to parent directory are passed through to the file APIs.… … Wikipedia
Directory traversal — A directory traversal (or path traversal) is to exploit insufficient security validation / sanitization of user supplied input file names, so that characters representing traverse to parent directory are passed through to the file APIs.The goal… … Wikipedia
Source code — For the 2011 film, see Source Code. Not to be confused with source coding. An illustration of Java source code with prologue comments indicated in red, inline comments indicated in green, and program code indicated in blue In computer science,… … Wikipedia
directory — Synonyms and related words: Almanach de Gotha, Baedeker, British Cabinet, Red Book, Royal Kalendar, Sanhedrin, Social Register, US Cabinet, Yellow Pages, account, acquaintance, advisory body, announcement, assembly, association, atlas, bench,… … Moby Thesaurus
Полное руководство по CMake. Часть вторая: Система сборки
Введение
В данной статье рассмотрено использование системы сборки CMake, применяемой в колоссальном количестве проектов на C/C++. Строго рекомендуется прочитать первую часть руководства во избежание непонимания синтаксиса языка CMake, явным образом фигурирующего на протяжении всей статьи.
Запуск CMake
Ниже приведены примеры использования языка CMake, по которым Вам следует попрактиковаться. Экспериментируйте с исходным кодом, меняя существующие команды и добавляя новые. Чтобы запустить данные примеры, установите CMake с официального сайта.
Принцип работы
Система сборки CMake представляет из себя оболочку над другими платформенно зависимыми утилитами (например, Ninja или Make). Таким образом, в самом процессе сборки, как бы парадоксально это ни звучало, она непосредственного участия не принимает.
Система сборки CMake принимает на вход файл CMakeLists.txt с описанием правил сборки на формальном языке CMake, а затем генерирует промежуточные и нативные файлы сборки в том же каталоге, принятых на Вашей платформе.
Сгенерированные файлы будут содержать конкретные названия системных утилит, директорий и компиляторов, в то время как команды CMake орудуют лишь абстрактным понятием компилятора и не привязаны к платформенно зависимым инструментам, сильно различающихся на разных операционных системах.
Проверка версии CMake
Команда cmake_minimum_required проверяет запущенную версию CMake: если она меньше указанного минимума, то CMake завершает свою работу фатальной ошибкой. Пример, демонстрирующий типичное использование данной команды в начале любого CMake-файла:
Как подметили в комментариях, команда cmake_minimum_required выставляет все флаги совместимости (смотреть cmake_policy ). Некоторые разработчики намеренно выставляют низкую версию CMake, а затем корректируют функционал вручную. Это позволяет одновременно поддерживать древние версии CMake и местами использовать новые возможности.
Оформление проекта
В начале любого CMakeLists.txt следует задать характеристики проекта командой project для лучшего оформления интегрированными средами и прочими инструментами разработки.
Запуск скриптовых файлов
Команда include заменяет строку своего вызова кодом заданного файла, действуя аналогично препроцессорной команде include языков C/C++. Этот пример запускает скриптовый файл MyCMakeScript.cmake описанной командой:
Компиляция исполняемых файлов
Компиляция библиотек
Добавление исходников к цели
Повторяющиеся вызовы команды target_sources добавляют исходные файлы к цели в том порядке, в каком они были вызваны, поэтому нижние два блока кода являются функционально эквивалентными:
Генерируемые файлы
Важно подметить, что «DLL-платформами» считаются все платформы, основанные на Windows, в том числе и Cygwin.
Компоновка с библиотеками
Стоит отметить, что модульные библиотеки не подлежат компоновке с исполняемыми файлами или другими библиотеками, так как они предназначены исключительно для загрузки техниками выполнения.
Работа с целями
Как упомянули в комментариях, цели в CMake тоже подвержены ручному манипулированию, однако весьма ограниченному.
Имеется возможность управления свойствами целей, предназначенных для задания процесса сборки проекта. Команда get_target_property присваивает предоставленной переменной значение свойства цели. Данный пример выводит значение свойства C_STANDARD цели MyTarget на экран:
Пример выше задал цели MyTarget свойства, влияющие на процесс компиляции, а именно: при компиляции цели MyTarget CMake затребует компилятора о использовании стандарта C11. Все известные именования свойств целей перечисляются на этой странице.
Также имеется возможность проверки ранее определённых целей с помощью конструкции if(TARGET ) :
Добавление подпроектов
Команда add_subdirectory побуждает CMake к незамедлительной обработке указанного файла подпроекта. Пример ниже демонстрирует применение описанного механизма:
Стоит отметить, что все переменные из родительской области видимости унаследуются добавленным каталогом, а все переменные, определённые и переопределённые в данном каталоге, будут видимы лишь ему (если ключевое слово PARENT_SCOPE не было определено аргументом команды set ). Данную особенность упомянули в комментариях к предыдущей статье.
Поиск пакетов
Команда find_package находит и загружает настройки внешнего проекта. В большинстве случаев она применяется для последующей линковки внешних библиотек, таких как Boost и GSL. Данный пример вызывает описанную команду для поиска библиотеки GSL и последующей линковки:
В общем случае, команда find_package имеет две разновидности запуска: модульную и конфигурационную. Пример выше применял модульную форму. Это означает, что во время вызова команды CMake ищет скриптовый файл вида Find
Способы включения заголовков
Команда target_include_directories влияет лишь на указанную первым аргументом цель, а на другие цели никакого воздействия не оказывается. Пример ниже демонстрирует разницу между этими двумя командами:
Установка проекта
Команда install генерирует установочные правила для Вашего проекта. Данная команда способна работать с целями, файлами, папками и многим другим. Сперва рассмотрим установку целей.
После завершения обработки CMake всех Ваших файлов Вы можете выполнить установку всех описанных объектов командой sudo checkinstall (если CMake генерирует Makefile ), или же выполнить данное действие интегрированной средой разработки, поддерживающей CMake.
Наглядный пример проекта
Данное руководство было бы неполным без демонстрации реального примера использования системы сборки CMake. Рассмотрим схему простого проекта, использующего CMake в качестве единственной системы сборки:
Заключение
Теперь Вы способны писать свои и понимать чужие CMake-файлы, а подробно прочитать про остальные механизмы Вы можете на официальном сайте.
Следующая статья данного руководства будет посвящена тестированию и созданию пакетов с помощью CMake и выйдет через неделю. До скорых встреч!
Как использовать команду DIR в Windows
К оманда DIR — это мощная функция командной строки Windows, которая перечисляет все файлы и подкаталоги, содержащиеся в определенном каталоге. Команда DIR также предлагает несколько переключателей, которые открывают некоторые функциональные возможности.
Переключатели команды DIR
Вы можете использовать команду DIR самостоятельно (просто введите «dir» в командной строке), чтобы отобразить файлы и папки в текущем каталоге. Чтобы расширить эту функциональность, Вам необходимо использовать различные ключи или параметры, связанные с этой командой.
Отображение на основе атрибутов файла
Вы можете добавить «/A», а затем буквенный код после команды DIR для отображения файлов с определенным атрибутом. Эти буквенные коды включают:
Так, например, чтобы отобразить только каталоги в текущем пути, Вы должны ввести следующую команду и затем нажать Enter:
Вы также можете комбинировать эти коды. Например, если Вы хотите показать только системные файлы, которые также скрыты, Вы можете использовать следующую команду:
Вы также можете добавить «-» (минус) перед любым из этих буквенных кодов, чтобы указать, чтобы команда DIR не отображала этот файл. Так, например, если Вы не хотите видеть какие-либо каталоги в результатах, Вы можете использовать эту команду:
Еще один совет: вместо того, чтобы комбинировать главный переключатель и код так, как мы делали в наших примерах, Вы можете использовать двоеточие, чтобы отделить переключатель от его дополнительных кодов. Например, так:
Это может сделать читаемость немного легче, но это совершенно необязательно.
Отображение разделенных результатов
Использование переключателя /b с помощью команды DIR удаляет всю лишнюю информацию, отображая только имя папок и файлов в текущем каталоге, а не такие атрибуты, как размер файла и метки времени. Введите следующую команду:
Отображение с помощью разделителя для тысячных разрядов
В современных версиях Windows командная строка показывает большие числа, разделенные запятыми (так: 25,000 вместо 25000). Это не всегда так. В более старых версиях Вам пришлось бы использовать переключатель /c для отображения этих запятых.
Зачем беспокоиться, включая его, если он уже включен по умолчанию? Потому что если по какой-либо причине Вы не хотите показывать эти запятые, Вы можете использовать этот переключатель вместе со знаком «-» минус:
Отображение результатов в столбцах
Вы можете использовать переключатель /D для отображения результатов в двух столбцах вместо одного. Когда Вы показываете результаты таким образом, командная строка не показывает дополнительную информацию о файле (размер файла и т. д.) — просто имена файлов и каталогов.
Отобразить результаты в нижнем регистре
Переключатель /L отображает все имена файлов и папок как строчные.
Отображать имена результатов справа
По умолчанию в командной строке отображаются имена файлов в крайнем правом углу. Для достижения этого эффекта использовался переключатель /N. Теперь Вы можете использовать его вместе с «-» (минус), чтобы имена файлов отображались в крайнем левом углу.
Отобразить результаты в отсортированном порядке
Вы можете использовать переключатель /O, а затем буквенный код для отображения результатов каталога, отсортированных по-разному. Эти буквенные коды включают:
Так, например, Вы можете использовать следующую команду для сортировки результатов по времени и дате, когда сначала появляются более старые записи:
Вы также можете добавить «-» (минус) до любого из указанных выше вариантов, чтобы изменить порядок. Так, например, если Вы хотите сортировать файлы по времени и дате с новыми записями, которые появляются сначала, Вы можете использовать эту команду:
Отображение результатов на одной странице за раз
В некоторых каталогах есть сотни или тысячи файлов. Вы можете использовать переключатель /P для того, чтобы командная строка приостанавливала результаты после отображения каждого экрана. Вы должны нажать клавишу, чтобы продолжить просмотр следующей страницы результатов.
Отобразить метаданные
Использование переключателя / Q в команде DIR отображает метаданные, связанные с файлами и каталогами, а также сведения о владельце.
Отображение альтернативных потоков данных (ADS)
Переключатель /R отображает любые альтернативные потоки данных (ADS), которые могут содержать файлы. ADS — это функция файловой системы NTFS, которая позволяет файлам содержать дополнительные метаданные для поиска файлов по автору и названию.
Отображение всех файлов и папок и всего содержимого
Вы можете использовать переключатель /S для рекурсивного отображения всех файлов и папок внутри текущего каталога. Это означает, что все файлы и папки в каждом подкаталоге, все файлы и папки в этих подкаталогах и т. д. будут отображаться, готовьтесь к большим объемам данных.
Показать результаты, отсортированные по времени
Использование переключателя /T вместе с буквенным кодом позволяет сортировать результаты по разным меткам времени, связанным с файлами и папками. Эти буквенные коды включают:
Так, например, для сортировки результатов по времени создания, Вы можете использовать следующую команду:
Отображение результатов в широкоформатном формате
Переключатель /W похож на /D (который показывает столбцы), но вместо этого он сортирует результаты в широком формате по горизонтали.
Показать короткие имена имен файлов
Ключ /X показывает короткое имя файла, когда длинное имя не соответствует правилам именования 8.3.
Показать страницу справки для DIR
Используйте ключ /? для отображения полезной информации о команде DIR, включая краткое описание всех переключателей, о которых мы говорили.