Все программы для компьютера представляют собой набор команд процессора, которые состоят из определенного набора бит. Этих команд несколько сотен и с помощью них выполняются все действия на вашем компьютере. Но писать программы непосредственно с помощью этих команд сложно. Поэтому были придуманы различные языки программирования, которые проще для восприятия человеку.
Для подготовки программы к выполнению, специальная программа собирает ее из исходного кода на языке программирования в машинный код — команды процессора. Этот процесс называется компиляция. Linux — это свободное программное обеспечение, а поэтому исходные коды программ доступны всем желающим. Если программы нет в репозитории или вы хотите сделать что-то нестандартное, то вы можете выполнить компиляцию программы.
В этой статье мы рассмотрим, как выполняется компиляция программ Linux, как происходит процесс компиляции, а также рассмотрим насколько гибко вы сможете все настроить.
Подготовка системы
Сборка программ из исходников в Linux
Пользователям Linux необходимо хотя бы приблизительно знать как происходит сборка программ из исходников. Так как вы можете столкнуться стем, что вашей программы может и не быть скомпилированной под ваш дистрибутив. Сама сборка программ не сложна, и обычно описана в файле README или INSTALL, который идет вместе с пакетами для сборки. Так что, будьте внимательны.
5 причин научиться собирать софт из исходников
И так, сборку из исходников мы будем разбирать на примере программы GParted. Но, для начала давайте установим необходимые утилиты – интерпретатор и компилятор, для того, что бы можно было собирать программы. Для установки необходимых утилит вводим команду:
Debian/Ubuntu
sudo apt install build-essential automake autoconf
Arch/Manjaro
sudo pacman -S base-devel —needed
Сборка программ c Github
И начнем мы с GParted, сборку или как еще называется данный процесс – компиляцию мы будем выполнять в Ubuntu 20.04. Вы можете спросить почему именно в Ubuntu, отвечу, для Arch Linux и подобных есть AUR. Да и со сборкой программ в Arch мы разберемся чуть позже.
Там можно найти практически все программы, которые существуют для Linux. Для начала нужно скачать исходники программы, для этого переходим на сайт, скачиваем, а затем распаковываем архив. Так же можно выполнить команду:
Затем переходим в папку:
cd gparted
Теперь заглянем в файл README и посмотрим его внимательно. Если приглядеться, то можно увидеть какие зависимости необходимы доустановить:
Обратите внимания, что GPArted хорошо документированная, и для установки под каждый дистрибутив имеется инструкция с дополнительными зависимостями. Устанавливаем зависимости и выполняем команду для того, что бы у вас сформировался установочный файл:
Изучение GitHub в одном видео уроке за 15 минут!
./autogen.sh
Если проблема с зависимостями у вас останется, то вы увидите об этом вывод:
После того, как вы установите все необходимые зависимости, запускаете снова “autogen.sh”. В итоге он вам скажет что можно приступать к дальнейшим действиям:
./autogen.sh
Далее запускаем “make” и затем когда “make” выполнит свою работу, запускаем “sudo make install”. Обратите внимания, в некоторых инструкциях не упоминается о том, что нужно установку программы выполнять именно от “sudo”, а именно: “sudo make install”. Из за этого у вас могут возникнуть проблемы. И так продолжаем сборку программы вводим команды:
make sudo make install
Стоит отметить, что многие программы с открытым исходным кодом, можно найти на github. Там обычно самая последняя версия программы, по этому, если есть такая возможность, то лучше собирать программы с github.
После установки можно найти программу в меню установленных программ.
Сборка программ из архива
Распаковывать архив можно из терминала, а можно при помощи графического интерфейса, например программой Ark или Менеджер архивов. Тут все зависит от того, как вам удобней. Для того что бы распаковать архив в терминале, нужно выполнить определенную команду. На примере с GParted такой командой будет:
tar xzf gparted-1.1.0.tar.gz
Примечание, tar является утилитой командной строки для распаковки архивов. И так, затем переходим в папку с распакованной программой и смотрим какие там имеются файлы. Тут как раз имеются README:
Для наглядности я открою файл README в графической утилите Mousepad. Как вы можете заметить, в инструкции подробно прописано как устанавливать данную программу из исходников:
Для того что бы собрать данную программу, достаточно выполнить команды, которые прописаны в инструкции. Так как мы уже распаковали данный архив, пропускаем это шаг. Если вы не знаете как перейти в терминале в директорию программы, поясню. А если знаете, то пропустите данный шаг. Для того что бы перейти в терминале в нужную директорию, используется команда “cd“. Например, у вас папка с программой находится по адресу “Загрузки – папка с программой”, выполняем команду:
cd Загрузки
После чего можно посмотреть что у нас имеется в данной директории введя команду “ls“, после чего снова вводим команду “cd” и переходим в нужную нам директорию. Например:
cd gparted-1.1.0
Теперь приступаем к сборке программы GParted. Для этого вводим команды которые написаны в файле README.
./configure make make install
На этом этапе установки могут возникнуть проблемы с зависимостями. По этому их необходимо установить:
После того как все необходимые зависимости были установлены, снова запускаем “./configure” и продолжаем компиляцию программы как описано выше. А именно, после запуска “./configure” запускаем “make”, а затем “sudo make install”.
Ошибки при сборке программы
Возможно, при компилировании у вас могут возникнуть проблемы с зависимостями. Для этого надо будет устанавливать необходимые пакеты. Обычно если у вас не хватает зависимостей, вы увидите во время выполнения команды ./configure ошибки. Если же вы не знаете какой зависимости не хватает, то тут выручит поисковик.
После того как вы установите необходимые зависимости, снова необходимо запустить ./configure. А может быть и так, что у вас не будет файла ./configure, попробуйте запустить другие скрипты:
./bootstrap ./autogen.sh
Если таких скриптов вы не смогли найти, то можно выполнить последовательно следующие команды:
aclocal autoheader automake —gnu —add-missing —copy —foreign autoconf -f -Wall
В случае с дистрибутивами Arch/Manjaro необходимые пакеты вы можете подгрузить используя “Менеджер программ”, Предварительно не забыв подключить репозиторий AUR:
Пример необходимых зависимостей при установки в Manjaro программы Blender. Компиляция производилась с использованием файла PKGBUILD:
Удаление программ
Если же вы захотите в будущем удалить GParted, или какую то иную программу, оставьте папку которую скачивали. Так как только в ней есть инструкция куда устанавливались те или иные пакеты. Обычно, в файле README написано как удалять установленные программы. В случае с GParted достаточно перейти в каталог с исходниками и выполнить команду:
Сборка в Arch/Manjaro (Arch Build System – ABS)
В дистрибутивах Arch и Arch подобных есть несколько способов устанавливать программное обеспечение, собственно, как и во многих других дистрибутивах. Но, в Arch имеется AUR, это пользовательский репозиторий, где лежат программы, которые не вошли в официальные репозитории.
А так же существует способ собрать программу из исходников и вот тут вы можете столкнуться с тем, что вам попадется файл “PKGBUILD”. PKGBUILD это грубо говоря скрипт, который содержит инструкцию по скачиванию необходимых пакетов. Так же вместе с PKGBUILD могут быть и другие файлы, например “blender.desktop”. Вы можете открыть PKGBUILD и изменить необходимые параметры, но, это только при условии что вы знаете что делаете. Предположительно, вы уже перешли в каталог с исходниками программы, если же нет, сделать это можно командой в терминале “cd и путь к директории”. Для сборки пакета выполняем команду:
makepkg -si
Опишу опции которые тут применяются, опция -s произвести проверку и установку зависимостей, а опция i установку самого пакета:
Сама сборка програм из исходников может занять значительное время, в зависимости от вашего компьютера.
Заключение
Может случится и такое, что необходимые зависимости при компиляции программ вы попросту не найдете в официальных репозиториях. Для этого можно воспользоваться поиском, после чего найдя их, устанавливаете. Можно посмотреть и на сайте pkgs.org. На этом сайте вы сможете найти разного рода пакеты для множества дистрибутивов Linux для решения проблем при сборке программ.
А на этом сегодня все. Надеюсь данная статья будет вам полезна.
С уважением Cyber-X
Источник: cyber-x.ru
Использование GitHub Actions с C++ и CMake
Привет, Хабр! Предлагаю вашему вниманию перевод статьи «Using GitHub Actions with C++ and CMake» о сборке проекта на C++ с использованием GitHub Actions и CMake автора Кристиана Адама.
Использование GitHub Actions с C++ и CMake
В этом посте я хочу показать файл конфигурации GitHub Actions для проекта C++, использующего CMake.
GitHub Actions это предоставляемая GitHub инфраструктура CI/CD. Сейчас GitHub Actions предлагает следующие виртуальные машины (runners):
Windows Server 2019 | windows-latest |
Ubuntu 18.04 | ubuntu-latest or ubuntu-18.04 |
Ubuntu 16.04 | ubuntu-16.04 |
macOS Catalina 10.15 | macos-latest |
Каждая виртуальная машина имеет одинаковые доступные аппаратные ресурсы:
- 2х ядерное CPU
- 7 Гб оперативной памяти
- 14 Гб на диске SSD
Каждое задание рабочего процесса может выполняться до 6 часов.
К сожалению, когда я включил GitHub Actions в проекте C++, мне предложили такой рабочий процесс:
./configure make make check make distcheck
Это немного не то, что можно использовать с CMake.
Hello World
Я хочу собрать традиционное тестовое приложение C++:
#include int main()
Со следующим проектом CMake:
cmake_minimum_required(VERSION 3.16) project(main) add_executable(main main.cpp) install(TARGETS main) enable_testing() add_test(NAME main COMMAND main)
TL;DR смотрите проект на GitHub.
Матрица сборки
Я начал со следующей матрицы сборки:
name: CMake Build Matrix on: [push] jobs: build: name: $ < < matrix.config.name >> runs-on: $ < < matrix.config.os >> strategy: fail-fast: false matrix: config: — < name: «Windows Latest MSVC», artifact: «Windows-MSVC.tar.xz», os: windows-latest, build_type: «Release», cc: «cl», cxx: «cl», environment_script: «C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Auxiliary/Build/vcvars64.bat» >- < name: «Windows Latest MinGW», artifact: «Windows-MinGW.tar.xz», os: windows-latest, build_type: «Release», cc: «gcc», cxx: «g++» >- < name: «Ubuntu Latest GCC», artifact: «Linux.tar.xz», os: ubuntu-latest, build_type: «Release», cc: «gcc», cxx: «g++» >-
Свежие CMake и Ninja
На странице установленного ПО виртуальных машин мы видим, что CMake есть везде, но в разных версиях:
Windows Server 2019 | 3.16.0 |
Ubuntu 18.04 | 3.12.4 |
macOS Catalina 10.15 | 3.15.5 |
Это значит, что нужно будет ограничить минимальную версию CMake до 3.12 или обновить CMake.
CMake 3.16 поддерживает прекомпиляцию заголовков и Unity Builds, которые помогают сократить время сборки.
Поскольку у CMake и Ninja есть репозитории на GitHub, я решил скачать нужные релизы с GitHub.
Для написания скрипта я использовал CMake, потому что виртуальные машины по умолчанию используют свойственный им язык скриптов (bash для Linux и powershell для Windows). CMake умеет выполнять процессы, загружать файлы, извлекать архивы и делать еще много полезных вещей.
— name: Download Ninja and CMake id: cmake_and_ninja shell: cmake -P run: | set(ninja_version «1.9.0») set(cmake_version «3.16.2») message(STATUS «Using host CMake version: $») if («$ < < runner.os >>» STREQUAL «Windows») set(ninja_suffix «win.zip») set(cmake_suffix «win64-x64.zip») set(cmake_dir «cmake-$-win64-x64/bin») elseif («$ < < runner.os >>» STREQUAL «Linux») set(ninja_suffix «linux.zip») set(cmake_suffix «Linux-x86_64.tar.gz») set(cmake_dir «cmake-$-Linux-x86_64/bin») elseif («$ < < runner.os >>» STREQUAL «macOS») set(ninja_suffix «mac.zip») set(cmake_suffix «Darwin-x86_64.tar.gz») set(cmake_dir «cmake-$-Darwin-x86_64/CMake.app/Contents/bin») endif() set(ninja_url «https://github.com/ninja-build/ninja/releases/download/v$/ninja-$») file(DOWNLOAD «$» ./ninja.zip SHOW_PROGRESS) execute_process(COMMAND $ -E tar xvf ./ninja.zip) set(cmake_url «https://github.com/Kitware/CMake/releases/download/v$/cmake-$-$») file(DOWNLOAD «$» ./cmake.zip SHOW_PROGRESS) execute_process(COMMAND $ -E tar xvf ./cmake.zip) # Save the path for other steps file(TO_CMAKE_PATH «$ENV/$» cmake_dir) message(«::set-output name=cmake_dir::$») if (NOT «$ < < runner.os >>» STREQUAL «Windows») execute_process( COMMAND chmod +x ninja COMMAND chmod +x $/cmake ) endif()
Шаг настройки
Теперь, когда у меня есть CMake и Ninja, все, что мне нужно сделать, это настроить проект таким образом:
— name: Configure shell: cmake -P run: | set(ENV $ < < matrix.config.cc >>) set(ENV $ < < matrix.config.cxx >>) if («$ < < runner.os >>» STREQUAL «Windows» AND NOT «x$ < < matrix.config.environment_script >>» STREQUAL «x») execute_process( COMMAND «$ < < matrix.config.environment_script >>» set OUTPUT_FILE environment_script_output.txt ) file(STRINGS environment_script_output.txt output_lines) foreach(line IN LISTS output_lines) if (line MATCHES «^([a-zA-Z0-9_-]+)=(.*)$») set(ENV > «$») endif() endforeach() endif() file(TO_CMAKE_PATH «$ENV/ninja» ninja_program) execute_process( COMMAND $ < < steps.cmake_and_ninja.outputs.cmake_dir >>/cmake -S . -B build -D CMAKE_BUILD_TYPE=$ < < matrix.config.build_type >> -G Ninja -D CMAKE_MAKE_PROGRAM=$ RESULT_VARIABLE result ) if (NOT result EQUAL 0) message(FATAL_ERROR «Bad exit status») endif()
Я установил переменные окружения CC и CXX , а для MSVC мне пришлось выполнить скрипт vcvars64.bat , получить все переменные окружения и установить их для выполняющегося скрипта CMake.
Шаг сборки
Шаг сборки включает в себя запуск CMake с параметром —build :
— name: Build shell: cmake -P run: | set(ENV «[%f/%t %o/sec] «) if («$ < < runner.os >>» STREQUAL «Windows» AND NOT «x$ < < matrix.config.environment_script >>» STREQUAL «x») file(STRINGS environment_script_output.txt output_lines) foreach(line IN LISTS output_lines) if (line MATCHES «^([a-zA-Z0-9_-]+)=(.*)$») set(ENV > «$») endif() endforeach() endif() execute_process( COMMAND $ < < steps.cmake_and_ninja.outputs.cmake_dir >>/cmake —build build RESULT_VARIABLE result ) if (NOT result EQUAL 0) message(FATAL_ERROR «Bad exit status») endif()
Что бы увидеть скорость компиляции на разном виртуальном окружении, я установил переменную NINJA_STATUS .
Для переменных MSVC я использовал скрипт environment_script_output.txt , полученный на шаге настройки.
Шаг запуска тестов
На этом шаге вызывается ctest с передачей числа ядер процессора через аргумент -j :
— name: Run tests shell: cmake -P run: | include(ProcessorCount) ProcessorCount(N) execute_process( COMMAND $ < < steps.cmake_and_ninja.outputs.cmake_dir >>/ctest -j $ WORKING_DIRECTORY build RESULT_VARIABLE result ) if (NOT result EQUAL 0) message(FATAL_ERROR «Running tests failed!») endif()
Шаги установки, упаковки и загрузки
Эти шаги включают запуск CMake с —install , последующий вызов CMake для создания архива tar.xz и загрузку архива как артефакта сборки.
Я не стал использовать CMake в качестве языка сценариев для простых вызовов CMake с параметрами, оболочки по умолчанию прекрасно с этим справляются.
Обработка релизов
Когда вы помечаете релиз в git, вы также хотите, чтобы артефакты сборки прикрепились к релизу:
git tag -a v1.0.0 -m «Release v1.0.0» git push origin v1.0.0
Ниже приведён код для этого, который сработает, если git refpath содержит tags/v :
Это выглядит сложным, но это необходимо, так как actions/create-release можно вызвать однократно, иначе это действие закончится ошибкой. Это обсуждается в issue #14 и issue #27.
Несмотря на то, что вы можете использовать рабочий процесс до 6 часов, токен secrets.GITHUB_TOKEN действителен один час. Вы можете создать личный токен или загрузить артефакты в релиз вручную. Подробности в обсуждении сообщества GitHub.
Заключение
Включить GitHub Actions в вашем проекте на CMake становится проще, если создать файл .github/workflows/build_cmake.yml с содержимым из build_cmake.yml.
Вы можете посмотреть GitHub Actions в моем проекте Hello World GitHub.
Оригинальный текст опубликован под лицензией CC BY 4.0.
Источник: temofeev.ru