- GNU Make Tutorial
- Why Make?
- Installing Make
- Getting Started With Makefile
- Rules, Targets And Dependencies
- Variables
- Cleaning The Environment
- Expanding Our Example To Solve More Problems
- Conclusion
- Компиляция и установка программ из исходников
- Содержание
- Распаковка
- Сборка пакета
- Установка
- Правильная установка(Вариант №1)
- Правильная установка(Вариант №2)
- Установка (вариант №3)
- Неправильная установка
- Ошибки
- Необходимое программное обеспечение
- Установка GNU GCC Компилятора и среды разработки на Ubuntu Linux
- Вам необходимо установить следующие пакеты на Debian и Ubuntu Linux:
- Установка компиляторов с помощью команды apt
- Проверка установки
- Установка страниц dev man на Ubuntu Linux
GNU Make Tutorial
GNU Make is a tool that helps to generate executable programs from source code and also process other non-source files from the project. Make gets the logic of building the executables and processing other non-source files from a file called a makefile or a Makefile.
Why Make?
Make is the de-facto tool for building executable programs from source code in the world of open source.
Make enables end users to build executable programs without knowing technical details of how to build them.
All the details of how to build executables and process non-source files are listed in the makefile – so the process becomes repeatable by all people or systems trying to build a project.
If a codebase is very big then it is time consuming and problematic building an executable from from scratch when the change in source code is very small. Make takes care of that. It tracks which files are changed and resolve dependency accordingly to build rebuild the specific part of the program.
Make is programming language agnostic. It does not care what programming language or which dialect of them you are using. Makefile is a text file of shell commands organized structurally with dependency and other logic for building the program and managing other non-source files. As it is a bunch of shell commands, it can run anywhere shell command runs. Windows do not run linux shell commands by default, but you can do it with specialized version of it for Windows.
During building executable programs many intermediate files are created that need not be there when the building is finished. Make deletes those files automatically. It helps keep the environment clean and saves a lot of valuable time.
Installing Make
Make alone is not enough to build programs. To build programs from source you need to have compilers and other tools installed on your system. So, we need the full suite of development tools for our purpose.
To compile sources on Linux, there is a package called “build-essential” on Debian-based systems (e.g. Ubuntu, Linux Mint, etc) and “Development Tools” on Red Hat and CentOS.
To install this on Debian based systems:
To install this on CentOS and Red Hat run:
Getting Started With Makefile
Let’s get started by writing a hello world program with the C programming language.
The main function of our C program will reside inside hellomain.c. The content of the file should look like the following:
This code includes the header file hellofun.h that contains the declaration of a function called hello_fun(). The content of hellofun.h is:
The definition of my_fun() lives inside hellofun.c:
This is a very simple program and we could compile it with gcc with just one line of command. But, real life programs are not as simple and as small as this. Things get complex really soon. Below, I am going to write the necessary makefile script for compiling this hello world program. I will explain different parts of it in subsequent sections.
Keep this code in a file called makefile (without any file extension). Put the file in the directory where the C files are. Point your command line in this directory. On the command line write make and press enter. An executable file called hello will be generated in the current directory. You can verify the result by running the executable with the following command.
Rules, Targets And Dependencies
A makefile script is a collection of rules. The rules instruct Make how to build a target or output from source or other files. The rule also specifies dependencies of the target. The dependency rules must be executed first depending on whether that is already processed by looking at the time stamps. In our example makefile above, we have a rule with target named hellomain and its dependencies. The target name is separated by a colon from the dependency list. The shell commands that will be executed are listed in the following line. The shell commands must start with a tab character.
If you specify no parameter with the make command then the first target is executed. In our example we did not specify any parameter and we had hellomain as the first and only target.
Variables
Variable are great way of writing value once and using them numerous times without repeating the value over and over again. It helps us keep our code DRY (Do Not Repeat Yourself). If you ever need to change some value all over the script, you just need to change that in one place to reflect the change everywhere if you are using variable.
In our example we used gcc as the compiler, but we may need to change the compiler to something else. So, we can keep the compiler name in a variable. Also, we can keep the compiler flags in another variable to reuse that. For setting a value to a variable we use equal sign (=) and to read that variable we use $(variable_name).
Cleaning The Environment
We often may need to clean our environment. If we want every piece of our project to be rebuilt from scratch, we need to clean it. In our simple example the only file that is generated is the hello executable. Without deleting that manually, we can delete that with make. So, we can create a rule for that and name the target as clean.
The shell command in the clean target is just the age old shell command rm. Now, from the command line execute:
Look at the current directory to see that the hello executable file is gone.
Expanding Our Example To Solve More Problems
In our simple hello world compilation example we have a problem that we have not solved yet. hellomain target looks at hellomian.c and hellofun.c files’ time stamps the next time you try to recompile it with make or make hellomain. So, if you change any of those two files, they will be recompiled. But, if you change hellofun.h then it will not recompile. That’s unexpected!
Again, we have skipped an intermediate level. We did not generate the object files and directly generated the executable. But, behind the scene the object files are created in a temporary directory and deleted. We want to generate the object files before building the executable. This time we are naming the main target as all
Run the make command again to see if your program builds successfully or not. Run the hello executable to verify the result. Look at the current directory and you will see that objects files are created. We have added one more line to the clean target to clean up object files. This makefile script will help recompile the hello world program even if the hellofun.h file is modified.
Conclusion
Make is one of the most essential tools for linux users and programmers. If you are an end user then knowledge of make will help you fix many broken things in your world of linux. If you are a programmer then you just cannot walk away by writing the code and let your users figure out how to compile that source code to executables. You must create a makefile script for the end users, so that they do not play some guess game to compile your source to executables.
Источник
Компиляция и установка программ из исходников
Содержание
Не редко необходимые пакеты можно найти только в виде исходных текстов, в данной статье описывается метод установки пакета из исходных текстов.
Распаковка
Программы обычно распространяются в упакованных архивах, это файлы с расширениями
Нужно понимать отличие между архиватором и упаковщиком.
Для архивации директорий и файлов используется программа tar; результатом её работы является файл с расширением .tar. Грубо говоря, это копия файловой системы — директорий и файлов с их атрибутами и правами доступа, помещённая в один файл.
Данный файл по размеру будет чуть больше, чем суммарный размер файлов, которые были архивированы. Поэтому (а может и по другой причине) используют упаковщики — программы, которые позволяют уменьшить размер файла без потери данных.
Программа tar умеет распаковывать, поэтому не нужно вызывать gunzip, а можно просто указать программе tar, что файл нужно cначала распаковать. Например, команда
сразу распакует и разархивирует. Отличие файлов с расширениями
лишь в том, что использовались разные упаковщики, программа tar определяет метод сжатия автоматически и дополнительных опций в данном случае не требуется.
После распаковки необходимо перейти в полученный каталог, все описываемые ниже команды выполняются в каталоге с исходными текстами пакета.
Сборка пакета
Для сборки программ в GNU/Linux используется (в основном) программа make, которая запускает инструкции из Makefile, но поскольку дистрибутивов GNU/Linux много, и они все разные, то для того чтобы собрать программу, нужно для каждого дистрибутива отдельно прописывать пути,где какие лежат библиотеки и заголовочные файлы. Программисты не могут изучать каждый дистрибутив и для каждого отдельно создавать Makefile. Поэтому придумали конфигураторы, которые «изучают» систему, и в соответствии с полученными знаниями создают Makefile. Но на конфигураторе они не остановились и придумали конфигураторы конфигураторов …на этом они остановились
Для сборки нам нужны компиляторы: они прописаны в зависимостях пакета build-essential, так что достаточно установить его со всеми зависимостями. Ещё нужны autoconf и automake.
Итак, чтобы собрать что-то из исходников, нужно сначала собрать конфигуратор; как собрать конфигуратор, описано в файле configure.in. Для сборки конфигуратора необходимо выполнить
Если таких скриптов в архиве не оказалось, то можно выполнить последовательно следующие команды:
Все эти команды используют файл configure.in. После выполнения этих команд создастся файл configure. После этого необходимо запустить конфигуратор для проверки наличия всех зависимостей, а также установки дополнительных опций сборки (если возможно) и просмотра результата установки (опционально- может не быть)
Конфигуратор построит Makefile основываясь на полученных знаниях и файле makefile.am. Можно передать конфигуратору опции, предусмотренные в исходниках программы, которые позволяют включать/отключать те или иные возможности программы, обычно узнать о них можно командой
Также есть набор стандартных опций, вроде
, которая указывает, какой каталог использовать для установки. Для Ubuntu обычно
БЕЗ слеша в конце! Теперь можно запустить процесс сборки самой программы командой
Для сборки достаточно привелегий обычного пользователя. Окончанием сборки можно считать момент, когда команды в консоли перестанут «беспорядочно» выполняться и не будет слова error. Теперь всё скомпилировано и готово для установки.
Установка
Усилия потраченные на Правильную установку в последствии с лихвой окупятся в случае удаления или обновления устанавливаемого программного обеспечения.
Правильная установка(Вариант №1)
Установка при помощи утилиты checkinstall. Для установки выполните
Для создания и установки deb-пакета необходимо выполнить
Правильная установка(Вариант №2)
Быстрое создание deb-пакета «вручную».
Установка (вариант №3)
Процедура создания deb-пакета подробно описана в данной статье.
Неправильная установка
Для установки необходимо выполнить
Для удаления пакета, установленного данным способом необходимо выполнить в корневой директории исходников программы (там где вы запускали make install).
Ошибки
Часто на этапе конфигурации конфигуратор сообщает, что нехватает той или иной библиотеки. Название библиотеки, которое он сообщает, не всегда соответствует названию пакета в Ubuntu. Из собственного опыта могу посоветовать поискать в Синаптике нужный пакет, исключив префикс lib, если нашлось несколько пакетов различающихся приставкой -dev в названии, то вам нужно установить именно -dev пакет (обычно он тянет за собой и не -dev пакет). Можно ещё поискать с помощью http://packages.ubuntu.com/, введя имя библиотеки в поиск по содержимому пакетов, аналогично, если найдётся dev и не dev, нужны оба . Ну или просто поискать в Google.
Необходимое программное обеспечение
Пакеты с буквами mm в конце описания — это пакеты для C++ программ. Список для bmpx, но подойдёт почти для любой GTK2/Gnome программы. Так что если не получается собрать, то посмотрите на этот список и сверьте с тем что у вас установлено.
Источник
Установка GNU GCC Компилятора и среды разработки на Ubuntu Linux
Как установить компилятор GNU / GCC (C и C ++) и связанные с ним инструменты (например, make, debugger, man pages) в операционной системе Ubuntu Linux с использованием параметров командной строки?
Вам необходимо установить следующие пакеты на Debian и Ubuntu Linux:
Build-essential package — Устанавливает следующую коллекцию для компиляции c / c ++-программ на Ubuntu Linux, включая:
- libc6-dev – стандартная C библиотека.
- gcc – C компилятор.
- g++ – C++ компилятор.
- make – GNU делает утилиту для поддержки групп программ.
- dpkg-dev – Инструменты разработки пакетов Debian.
В принципе, build-essential пакет содержит информационный список пакетов, которые считаются необходимыми для создания пакетов Ubuntu, включая gcc-компилятор, make и другие необходимые инструменты. Этот пакет также зависит от пакетов в этом списке, чтобы упростить установку build-essential пакетов. В этом руководстве вы узнаете об установке компилятора GNU C и компилятора GNU C ++ на Ubuntu Linux.
Установка компиляторов с помощью команды apt
Откройте приложение терминала и введите следующее apt command /apt-get command :
Пример вывода данных:
Рис.01: Как я устанавливаю инструменты разработки на Ubuntu Linux?
Проверка установки
Введите следующую команду:
Рис.02: Поиск установленной версии make и gcc
Установка страниц dev man на Ubuntu Linux
Введите следующую команду:
Чтобы посмотреть запросы библиотеки (функция в библиотеках программы) введите:
Источник